@burdenoff/microfe-vibecontrols 2026.623.1 → 2026.623.2

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 (293) hide show
  1. package/dist/components/actions/ActionCard.js +2 -2
  2. package/dist/components/actions/ActionCard.js.map +1 -1
  3. package/dist/components/actions/ExecutionHistory.js +1 -1
  4. package/dist/components/actions/ExecutionHistory.js.map +1 -1
  5. package/dist/components/agent-manager/AgentManagerAdminBar.js +1 -1
  6. package/dist/components/agent-manager/AgentManagerAdminBar.js.map +1 -1
  7. package/dist/components/agent-manager/AgentManagerChatPane.js +2 -2
  8. package/dist/components/agent-manager/AgentManagerChatPane.js.map +1 -1
  9. package/dist/components/agent-manager/AgentManagerInputArea.js +4 -4
  10. package/dist/components/agent-manager/AgentManagerInputArea.js.map +1 -1
  11. package/dist/components/agent-manager/AgentManagerLayout.js +1 -1
  12. package/dist/components/agent-manager/AgentManagerLayout.js.map +1 -1
  13. package/dist/components/agent-manager/AgentManagerMessageItem.js +1 -1
  14. package/dist/components/agent-manager/AgentManagerMessageItem.js.map +1 -1
  15. package/dist/components/agent-manager/AgentManagerSidebar.js +5 -5
  16. package/dist/components/agent-manager/AgentManagerSidebar.js.map +1 -1
  17. package/dist/components/agent-manager/AgentManagerTab.js +1 -1
  18. package/dist/components/agent-manager/AgentManagerTab.js.map +1 -1
  19. package/dist/components/agent-manager/AgentManagerTabBar.js +1 -1
  20. package/dist/components/agent-manager/AgentManagerTabBar.js.map +1 -1
  21. package/dist/components/agent-manager/BridleConfigPanel.js +23 -23
  22. package/dist/components/agent-manager/BridleConfigPanel.js.map +1 -1
  23. package/dist/components/agent-manager/PluginInstallModal.js +1 -1
  24. package/dist/components/agent-manager/PluginInstallModal.js.map +1 -1
  25. package/dist/components/agent-manager/ProfilesPanel.js +5 -5
  26. package/dist/components/agent-manager/ProfilesPanel.js.map +1 -1
  27. package/dist/components/agent-manager/controls/AutonomySelector.js +1 -1
  28. package/dist/components/agent-manager/controls/AutonomySelector.js.map +1 -1
  29. package/dist/components/agent-manager/controls/SdkSelector.js +1 -1
  30. package/dist/components/agent-manager/controls/SdkSelector.js.map +1 -1
  31. package/dist/components/agent-manager/controls/VoiceToggle.js +1 -1
  32. package/dist/components/agent-manager/controls/VoiceToggle.js.map +1 -1
  33. package/dist/components/agent-manager/detail/SessionConfigPanel.js +6 -6
  34. package/dist/components/agent-manager/detail/SessionConfigPanel.js.map +1 -1
  35. package/dist/components/agent-manager/detail/SessionLogsPanel.js +5 -5
  36. package/dist/components/agent-manager/detail/SessionLogsPanel.js.map +1 -1
  37. package/dist/components/agent-manager/detail/SessionToolsPanel.js +1 -1
  38. package/dist/components/agent-manager/detail/SessionToolsPanel.js.map +1 -1
  39. package/dist/components/agent-manager/dialogs/NewSessionDialog.js +2 -2
  40. package/dist/components/agent-manager/dialogs/NewSessionDialog.js.map +1 -1
  41. package/dist/components/agent-manager/dialogs/RenameSessionDialog.js +1 -1
  42. package/dist/components/agent-manager/dialogs/RenameSessionDialog.js.map +1 -1
  43. package/dist/components/agents/AgentCard.js +14 -11
  44. package/dist/components/agents/AgentCard.js.map +1 -1
  45. package/dist/components/ai/AIContextsTab.js +1 -1
  46. package/dist/components/ai/AIContextsTab.js.map +1 -1
  47. package/dist/components/ai/AIOverviewTab.js +4 -4
  48. package/dist/components/ai/AIOverviewTab.js.map +1 -1
  49. package/dist/components/ai/AIPlanPanel.js +4 -4
  50. package/dist/components/ai/AIPlanPanel.js.map +1 -1
  51. package/dist/components/ai/AIPlaygroundTab.js +1 -1
  52. package/dist/components/ai/AIPlaygroundTab.js.map +1 -1
  53. package/dist/components/ai/AIPromptsTab.js +2 -2
  54. package/dist/components/ai/AIPromptsTab.js.map +1 -1
  55. package/dist/components/ai/AIProviderCredentialsCard.js +4 -4
  56. package/dist/components/ai/AIProviderCredentialsCard.js.map +1 -1
  57. package/dist/components/ai/AIQueueTab.js +4 -4
  58. package/dist/components/ai/AIQueueTab.js.map +1 -1
  59. package/dist/components/ai/AISessionsTab.js +4 -4
  60. package/dist/components/ai/AISessionsTab.js.map +1 -1
  61. package/dist/components/ai/AITasksTab.js +1 -1
  62. package/dist/components/ai/AITasksTab.js.map +1 -1
  63. package/dist/components/ai/ClaudeCredentialsCard.js +3 -3
  64. package/dist/components/ai/ClaudeCredentialsCard.js.map +1 -1
  65. package/dist/components/ai/PluginHarnessPicker.js +3 -3
  66. package/dist/components/ai/PluginHarnessPicker.js.map +1 -1
  67. package/dist/components/analytics/AnalyticsBreakdownChart.js +8 -8
  68. package/dist/components/analytics/AnalyticsBreakdownChart.js.map +1 -1
  69. package/dist/components/analytics/AnalyticsTimeSeriesChart.js +5 -5
  70. package/dist/components/analytics/AnalyticsTimeSeriesChart.js.map +1 -1
  71. package/dist/components/audit/AuditDeleteDialog.js +2 -2
  72. package/dist/components/audit/AuditDeleteDialog.js.map +1 -1
  73. package/dist/components/audit/AuditExportButton.js +5 -5
  74. package/dist/components/audit/AuditExportButton.js.map +1 -1
  75. package/dist/components/audit/AuditLogDetail.js +9 -9
  76. package/dist/components/audit/AuditLogDetail.js.map +1 -1
  77. package/dist/components/audit/AuditLogFilters.js +1 -1
  78. package/dist/components/audit/AuditLogFilters.js.map +1 -1
  79. package/dist/components/audit/AuditLogStats.js +1 -1
  80. package/dist/components/audit/AuditLogStats.js.map +1 -1
  81. package/dist/components/audit/AuditLogTable.js +28 -28
  82. package/dist/components/audit/AuditLogTable.js.map +1 -1
  83. package/dist/components/catalog/CatalogCard.js +3 -3
  84. package/dist/components/catalog/CatalogCard.js.map +1 -1
  85. package/dist/components/catalog/CatalogForm.js +1 -1
  86. package/dist/components/catalog/CatalogForm.js.map +1 -1
  87. package/dist/components/common/ActionAgentTargetNotice.js +6 -6
  88. package/dist/components/common/ActionAgentTargetNotice.js.map +1 -1
  89. package/dist/components/common/CommandEditor.js +1 -1
  90. package/dist/components/common/CommandEditor.js.map +1 -1
  91. package/dist/components/docs/DocsPageTree.js +1 -1
  92. package/dist/components/docs/DocsPageTree.js.map +1 -1
  93. package/dist/components/docs/DocsPreviewPanel.js +1 -1
  94. package/dist/components/docs/DocsPreviewPanel.js.map +1 -1
  95. package/dist/components/docs/DocsRevisionHistory.js +4 -4
  96. package/dist/components/docs/DocsRevisionHistory.js.map +1 -1
  97. package/dist/components/docs/DocsSettingsPanel.js +7 -7
  98. package/dist/components/docs/DocsSettingsPanel.js.map +1 -1
  99. package/dist/components/docs/DocsTabPanel.js +1 -1
  100. package/dist/components/docs/DocsTabPanel.js.map +1 -1
  101. package/dist/components/graph/ConnectionPermissionsDialog.js +2 -2
  102. package/dist/components/graph/ConnectionPermissionsDialog.js.map +1 -1
  103. package/dist/components/graph/MeshDeployWizard.js +3 -3
  104. package/dist/components/graph/MeshDeployWizard.js.map +1 -1
  105. package/dist/components/graph/MeshRequestPanel.js +2 -2
  106. package/dist/components/graph/MeshRequestPanel.js.map +1 -1
  107. package/dist/components/idp-components/ComponentCard.js +5 -5
  108. package/dist/components/idp-components/ComponentCard.js.map +1 -1
  109. package/dist/components/idp-components/ComponentForm.js +1 -1
  110. package/dist/components/idp-components/ComponentForm.js.map +1 -1
  111. package/dist/components/idp-components/DependencyGraphTab.js +7 -7
  112. package/dist/components/idp-components/DependencyGraphTab.js.map +1 -1
  113. package/dist/components/logs/LogViewer.js +14 -14
  114. package/dist/components/logs/LogViewer.js.map +1 -1
  115. package/dist/components/notes/NoteCard.js +1 -1
  116. package/dist/components/notes/NoteCard.js.map +1 -1
  117. package/dist/components/notes/NoteEditor.js +2 -2
  118. package/dist/components/notes/NoteEditor.js.map +1 -1
  119. package/dist/components/notes/NoteList.js +1 -1
  120. package/dist/components/notes/NoteList.js.map +1 -1
  121. package/dist/components/notes/NotesTabPanel.js +1 -1
  122. package/dist/components/notes/NotesTabPanel.js.map +1 -1
  123. package/dist/components/scorecard/ScorecardEmptyState.js +1 -1
  124. package/dist/components/scorecard/ScorecardEmptyState.js.map +1 -1
  125. package/dist/components/scorecard/ScorecardPanel.js +3 -3
  126. package/dist/components/scorecard/ScorecardPanel.js.map +1 -1
  127. package/dist/components/security/SecurityScanList.js +11 -11
  128. package/dist/components/security/SecurityScanList.js.map +1 -1
  129. package/dist/components/sessions/SessionCard.js +26 -19
  130. package/dist/components/sessions/SessionCard.js.map +1 -1
  131. package/dist/components/sessions/SessionStatusBadge.js +7 -7
  132. package/dist/components/sessions/SessionStatusBadge.js.map +1 -1
  133. package/dist/components/shared/AgentSelector.js +4 -4
  134. package/dist/components/shared/AgentSelector.js.map +1 -1
  135. package/dist/components/shared/AgentSetupBanner.js +3 -3
  136. package/dist/components/shared/AgentSetupBanner.js.map +1 -1
  137. package/dist/components/shared/Card.js +4 -4
  138. package/dist/components/shared/Card.js.map +1 -1
  139. package/dist/components/shared/ErrorState.js +15 -9
  140. package/dist/components/shared/ErrorState.js.map +1 -1
  141. package/dist/components/shared/FilterDropdown.js +2 -2
  142. package/dist/components/shared/FilterDropdown.js.map +1 -1
  143. package/dist/components/shared/PageSkeleton.js +6 -6
  144. package/dist/components/shared/PageSkeleton.js.map +1 -1
  145. package/dist/components/shared/SearchInput.js +1 -1
  146. package/dist/components/shared/SearchInput.js.map +1 -1
  147. package/dist/components/shared/StatCard.js +7 -7
  148. package/dist/components/shared/StatCard.js.map +1 -1
  149. package/dist/components/templates/PublishTemplateForm.js +2 -2
  150. package/dist/components/templates/PublishTemplateForm.js.map +1 -1
  151. package/dist/components/templates/TemplateCard.js +5 -5
  152. package/dist/components/templates/TemplateCard.js.map +1 -1
  153. package/dist/components/templates/TemplateWizard.js +2 -2
  154. package/dist/components/templates/TemplateWizard.js.map +1 -1
  155. package/dist/components/tunnels/DomainVerificationBadge.js +4 -4
  156. package/dist/components/tunnels/DomainVerificationBadge.js.map +1 -1
  157. package/dist/components/tunnels/ProviderBadge.js +1 -1
  158. package/dist/components/tunnels/ProviderBadge.js.map +1 -1
  159. package/dist/components/tunnels/TunnelCard.js +16 -16
  160. package/dist/components/tunnels/TunnelCard.js.map +1 -1
  161. package/dist/components/tunnels/TunnelCreateWizard.js +1 -1
  162. package/dist/components/tunnels/TunnelCreateWizard.js.map +1 -1
  163. package/dist/components/tunnels/TunnelPublicAccessPanel.js +1 -1
  164. package/dist/components/tunnels/TunnelPublicAccessPanel.js.map +1 -1
  165. package/dist/components/tunnels/TunnelStatusBadge.js +4 -4
  166. package/dist/components/tunnels/TunnelStatusBadge.js.map +1 -1
  167. package/dist/components/vibecalendar/LogsDrawer.js +2 -2
  168. package/dist/components/vibecalendar/LogsDrawer.js.map +1 -1
  169. package/dist/components/vibecalendar/ScheduleTaskModal.js +5 -5
  170. package/dist/components/vibecalendar/ScheduleTaskModal.js.map +1 -1
  171. package/dist/components/vibecalendar/VibeCalAgendaView.js +2 -2
  172. package/dist/components/vibecalendar/VibeCalAgendaView.js.map +1 -1
  173. package/dist/components/vibecalendar/VibeCalDayView.js +3 -3
  174. package/dist/components/vibecalendar/VibeCalDayView.js.map +1 -1
  175. package/dist/components/vibecalendar/VibeCalMonthView.js +1 -1
  176. package/dist/components/vibecalendar/VibeCalMonthView.js.map +1 -1
  177. package/dist/components/vibecalendar/VibeCalWeekView.js +4 -4
  178. package/dist/components/vibecalendar/VibeCalWeekView.js.map +1 -1
  179. package/dist/components/vibecalendar/VibeCalendarHeader.js +4 -4
  180. package/dist/components/vibecalendar/VibeCalendarHeader.js.map +1 -1
  181. package/dist/components/vibecalendar/VibeTaskBlock.js +2 -2
  182. package/dist/components/vibecalendar/VibeTaskBlock.js.map +1 -1
  183. package/dist/components/vibecalendar/types.js +6 -6
  184. package/dist/components/vibecalendar/types.js.map +1 -1
  185. package/dist/components/vibedeck/VibeDeckButtonForm.js +9 -9
  186. package/dist/components/vibedeck/VibeDeckButtonForm.js.map +1 -1
  187. package/dist/components/vibedeck/VibeDeckButtonTile.js +6 -6
  188. package/dist/components/vibedeck/VibeDeckButtonTile.js.map +1 -1
  189. package/dist/components/vibedeck/VibeDeckExecutionLog.js +10 -10
  190. package/dist/components/vibedeck/VibeDeckExecutionLog.js.map +1 -1
  191. package/dist/components/vibedeck/VibeDeckForm.js +8 -8
  192. package/dist/components/vibedeck/VibeDeckForm.js.map +1 -1
  193. package/dist/components/vibedeck/VibeDeckGrid.js +2 -2
  194. package/dist/components/vibedeck/VibeDeckGrid.js.map +1 -1
  195. package/dist/components/vibedeck/VibeDeckPublicLinkPanel.js +2 -2
  196. package/dist/components/vibedeck/VibeDeckPublicLinkPanel.js.map +1 -1
  197. package/dist/components/vibedeck/VibeDeckSwitcher.js +8 -8
  198. package/dist/components/vibedeck/VibeDeckSwitcher.js.map +1 -1
  199. package/dist/components/vibes/VibeCard.js +22 -18
  200. package/dist/components/vibes/VibeCard.js.map +1 -1
  201. package/dist/components/vibes/VibeList.js +16 -12
  202. package/dist/components/vibes/VibeList.js.map +1 -1
  203. package/dist/pages/ActionsPage.js +4 -3
  204. package/dist/pages/ActionsPage.js.map +1 -1
  205. package/dist/pages/AgentDetailsPage.js +9 -9
  206. package/dist/pages/AgentDetailsPage.js.map +1 -1
  207. package/dist/pages/AgentsLandingPage.js +4 -4
  208. package/dist/pages/AgentsLandingPage.js.map +1 -1
  209. package/dist/pages/AgentsPage.js +14 -14
  210. package/dist/pages/AgentsPage.js.map +1 -1
  211. package/dist/pages/AnalyticsPage.js +8 -8
  212. package/dist/pages/AnalyticsPage.js.map +1 -1
  213. package/dist/pages/CatalogDetailPage.js +11 -11
  214. package/dist/pages/CatalogDetailPage.js.map +1 -1
  215. package/dist/pages/CatalogPage.js +12 -9
  216. package/dist/pages/CatalogPage.js.map +1 -1
  217. package/dist/pages/ComponentDetailPage.js +7 -7
  218. package/dist/pages/ComponentDetailPage.js.map +1 -1
  219. package/dist/pages/ComponentsPage.js +12 -9
  220. package/dist/pages/ComponentsPage.js.map +1 -1
  221. package/dist/pages/EnvTopologyPage.js +2 -2
  222. package/dist/pages/EnvTopologyPage.js.map +1 -1
  223. package/dist/pages/GettingStartedPage.js +12 -12
  224. package/dist/pages/GettingStartedPage.js.map +1 -1
  225. package/dist/pages/HealthPage.js +12 -12
  226. package/dist/pages/HealthPage.js.map +1 -1
  227. package/dist/pages/LogsPage.js +4 -4
  228. package/dist/pages/LogsPage.js.map +1 -1
  229. package/dist/pages/NoteDetailsPage.js +5 -5
  230. package/dist/pages/NoteDetailsPage.js.map +1 -1
  231. package/dist/pages/OverviewPage.js +74 -41
  232. package/dist/pages/OverviewPage.js.map +1 -1
  233. package/dist/pages/PluginsCatalogPage.js +6 -3
  234. package/dist/pages/PluginsCatalogPage.js.map +1 -1
  235. package/dist/pages/ScheduledJobDetailPage.js +7 -7
  236. package/dist/pages/ScheduledJobDetailPage.js.map +1 -1
  237. package/dist/pages/SessionDetailsPage.js +21 -21
  238. package/dist/pages/SessionDetailsPage.js.map +1 -1
  239. package/dist/pages/SessionsPage.js +20 -20
  240. package/dist/pages/SessionsPage.js.map +1 -1
  241. package/dist/pages/SettingsPage.js +64 -52
  242. package/dist/pages/SettingsPage.js.map +1 -1
  243. package/dist/pages/SharedSessionPage.js +21 -21
  244. package/dist/pages/SharedSessionPage.js.map +1 -1
  245. package/dist/pages/SharedVibeDeckPage.js +5 -5
  246. package/dist/pages/SharedVibeDeckPage.js.map +1 -1
  247. package/dist/pages/TargetDetailsPage.js +56 -65
  248. package/dist/pages/TargetDetailsPage.js.map +1 -1
  249. package/dist/pages/TargetsPage.js +4 -4
  250. package/dist/pages/TargetsPage.js.map +1 -1
  251. package/dist/pages/TemplateDetailPage.js +10 -10
  252. package/dist/pages/TemplateDetailPage.js.map +1 -1
  253. package/dist/pages/TemplatesPage.js +6 -5
  254. package/dist/pages/TemplatesPage.js.map +1 -1
  255. package/dist/pages/VibeAuditPage.js +3 -3
  256. package/dist/pages/VibeAuditPage.js.map +1 -1
  257. package/dist/pages/VibeCalendarPage.js +3 -3
  258. package/dist/pages/VibeCalendarPage.js.map +1 -1
  259. package/dist/pages/VibeDeckPage.js +3 -3
  260. package/dist/pages/VibeDeckPage.js.map +1 -1
  261. package/dist/pages/VibeDetailsPage.js +15 -15
  262. package/dist/pages/VibeDetailsPage.js.map +1 -1
  263. package/dist/pages/VibeTaskDetailPage.js +5 -5
  264. package/dist/pages/VibeTaskDetailPage.js.map +1 -1
  265. package/dist/pages/VibesPage.js +18 -18
  266. package/dist/pages/VibesPage.js.map +1 -1
  267. package/dist/pages/WebhooksPage.js +11 -11
  268. package/dist/pages/WebhooksPage.js.map +1 -1
  269. package/dist/pages/ai/AIBookmarksPage.js +1 -1
  270. package/dist/pages/ai/AIBookmarksPage.js.map +1 -1
  271. package/dist/pages/ai/AISessionDetailPage.js +6 -6
  272. package/dist/pages/ai/AISessionDetailPage.js.map +1 -1
  273. package/dist/pages/tunnels/AuditTab.js +1 -1
  274. package/dist/pages/tunnels/AuditTab.js.map +1 -1
  275. package/dist/pages/tunnels/DomainsTab.js +1 -1
  276. package/dist/pages/tunnels/DomainsTab.js.map +1 -1
  277. package/dist/pages/tunnels/ProvidersTab.js +1 -1
  278. package/dist/pages/tunnels/ProvidersTab.js.map +1 -1
  279. package/dist/pages/tunnels/SessionsTab.js +1 -1
  280. package/dist/pages/tunnels/SessionsTab.js.map +1 -1
  281. package/dist/pages/tunnels/TunnelDetailsPage.js +3 -3
  282. package/dist/pages/tunnels/TunnelDetailsPage.js.map +1 -1
  283. package/dist/pages/tunnels/UsageTab.js +1 -1
  284. package/dist/pages/tunnels/UsageTab.js.map +1 -1
  285. package/dist/pages/tunnels/tabs/TunnelDomainsTab.js +16 -16
  286. package/dist/pages/tunnels/tabs/TunnelDomainsTab.js.map +1 -1
  287. package/dist/pages/tunnels/tabs/TunnelOverviewTab.js +1 -1
  288. package/dist/pages/tunnels/tabs/TunnelOverviewTab.js.map +1 -1
  289. package/dist/pages/tunnels/tabs/TunnelSessionsTab.js +52 -49
  290. package/dist/pages/tunnels/tabs/TunnelSessionsTab.js.map +1 -1
  291. package/dist/pages/tunnels/tabs/TunnelSettingsTab.js +9 -9
  292. package/dist/pages/tunnels/tabs/TunnelSettingsTab.js.map +1 -1
  293. package/package.json +1 -1
@@ -47,7 +47,7 @@ function u({ currentDate: u, occurrences: d, onTriggerNow: f, onViewLogs: p, onV
47
47
  children: c.map((e) => {
48
48
  let n = y(e), c = _ && e === v;
49
49
  return /* @__PURE__ */ s("div", {
50
- className: `flex border-b border-border-default ${c ? "bg-action-primary-bg/5" : ""}`,
50
+ className: `flex border-b border-border-default ${c ? "bg-[var(--color-accent-soft)]" : ""}`,
51
51
  style: { minHeight: n.length > 0 ? "auto" : "48px" },
52
52
  children: [/* @__PURE__ */ s("div", {
53
53
  className: "w-20 flex-shrink-0 text-right pr-3 pt-1.5 border-r border-border-default",
@@ -105,14 +105,14 @@ function u({ currentDate: u, occurrences: d, onTriggerNow: f, onViewLogs: p, onV
105
105
  f && /* @__PURE__ */ o("button", {
106
106
  type: "button",
107
107
  onClick: () => f(c.id),
108
- className: "p-1.5 rounded hover:bg-bg-secondary transition-colors",
108
+ className: "p-1.5 rounded hover:bg-bg-surface transition-colors",
109
109
  title: "Trigger Now",
110
110
  children: /* @__PURE__ */ o(a, { size: 14 })
111
111
  }),
112
112
  /* @__PURE__ */ o("button", {
113
113
  type: "button",
114
114
  onClick: () => p(c),
115
- className: "p-1.5 rounded hover:bg-bg-secondary transition-colors",
115
+ className: "p-1.5 rounded hover:bg-bg-surface transition-colors",
116
116
  title: "View Logs",
117
117
  children: /* @__PURE__ */ o(i, { size: 14 })
118
118
  }),
@@ -1 +1 @@
1
- {"version":3,"file":"VibeCalDayView.js","names":[],"sources":["../../../src/components/vibecalendar/VibeCalDayView.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport { Play, Eye, ChevronRight } from 'lucide-react';\nimport { STATUS_COLORS } from './types';\nimport type { CalendarOccurrence, VibeCalendarTask } from './types';\nimport { useTr } from '../../shared/hooks/useTr';\n\ninterface VibeCalDayViewProps {\n currentDate: Date;\n occurrences: CalendarOccurrence[];\n onTriggerNow?: (taskId: string) => void;\n onViewLogs: (task: VibeCalendarTask) => void;\n onViewDetail: (taskId: string) => void;\n}\n\nconst HOURS = Array.from({ length: 24 }, (_, i) => i);\n\nfunction formatHour(hour: number): string {\n if (hour === 0) return '12 AM';\n if (hour < 12) return `${hour} AM`;\n if (hour === 12) return '12 PM';\n return `${hour - 12} PM`;\n}\n\nexport function VibeCalDayView({\n currentDate,\n occurrences,\n onTriggerNow,\n onViewLogs,\n onViewDetail,\n}: VibeCalDayViewProps) {\n const tr = useTr();\n const today = new Date();\n\n const isToday =\n currentDate.getFullYear() === today.getFullYear() &&\n currentDate.getMonth() === today.getMonth() &&\n currentDate.getDate() === today.getDate();\n\n const nowHour = today.getHours();\n\n const getOccurrencesForHour = (hour: number): CalendarOccurrence[] =>\n occurrences.filter((occ) => {\n const d = new Date(occ.occurrenceAt);\n return (\n d.getFullYear() === currentDate.getFullYear() &&\n d.getMonth() === currentDate.getMonth() &&\n d.getDate() === currentDate.getDate() &&\n d.getHours() === hour\n );\n });\n\n // Count total tasks for the day\n const dayOccurrences = useMemo(\n () =>\n occurrences.filter((occ) => {\n const d = new Date(occ.occurrenceAt);\n return (\n d.getFullYear() === currentDate.getFullYear() &&\n d.getMonth() === currentDate.getMonth() &&\n d.getDate() === currentDate.getDate()\n );\n }),\n [occurrences, currentDate]\n );\n\n return (\n <div className=\"flex-1 flex flex-col overflow-hidden\">\n {/* Day summary header */}\n <div className=\"flex items-center justify-between px-4 py-2 border-b border-border-default flex-shrink-0\">\n <div className=\"flex items-center gap-3\">\n <div\n className={`flex flex-col items-center px-3 py-1.5 rounded-lg ${\n isToday ? 'bg-action-primary-bg text-action-primary-text' : 'bg-bg-sunken'\n }`}\n >\n <span className=\"text-xs font-medium\">\n {currentDate.toLocaleDateString('en-US', { weekday: 'short' })}\n </span>\n <span className=\"text-lg font-bold\">{currentDate.getDate()}</span>\n </div>\n <div>\n <span className=\"text-sm text-text-secondary\">\n {dayOccurrences.length}{' '}\n {dayOccurrences.length !== 1\n ? tr('vibecontrols.calendar.day.tasksScheduled', 'tasks scheduled')\n : tr('vibecontrols.calendar.day.taskScheduled', 'task scheduled')}\n </span>\n </div>\n </div>\n </div>\n\n {/* Time grid - scrollable */}\n <div className=\"flex-1 overflow-auto\">\n <div className=\"relative\">\n {HOURS.map((hour) => {\n const hourOccurrences = getOccurrencesForHour(hour);\n const isCurrent = isToday && hour === nowHour;\n\n return (\n <div\n key={hour}\n className={`flex border-b border-border-default ${\n isCurrent ? 'bg-action-primary-bg/5' : ''\n }`}\n style={{ minHeight: hourOccurrences.length > 0 ? 'auto' : '48px' }}\n >\n {/* Time label */}\n <div className=\"w-20 flex-shrink-0 text-right pr-3 pt-1.5 border-r border-border-default\">\n <span\n className={`text-xs ${isCurrent ? 'text-action-primary-text font-semibold' : 'text-text-tertiary'}`}\n >\n {formatHour(hour)}\n </span>\n {isCurrent && (\n <div className=\"mt-0.5 text-[10px] text-action-primary-text\">NOW</div>\n )}\n </div>\n\n {/* Tasks */}\n <div className=\"flex-1 p-1 space-y-1\">\n {hourOccurrences.map((occ, j) => {\n const task = occ.task;\n const statusColor =\n STATUS_COLORS[occ.execution?.status || task.status] || STATUS_COLORS.PENDING;\n const time = new Date(occ.occurrenceAt).toLocaleTimeString('en-US', {\n hour: '2-digit',\n minute: '2-digit',\n });\n\n return (\n <div\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n (() => onViewDetail(task.id))();\n }\n }}\n key={`${task.id}-${j}`}\n onClick={() => onViewDetail(task.id)}\n className={`flex items-center gap-3 px-3 py-2.5 rounded-lg border cursor-pointer ${statusColor} hover:opacity-90 transition-opacity`}\n >\n {/* Time */}\n <div className=\"w-14 text-xs font-mono text-text-secondary flex-shrink-0\">\n {time}\n </div>\n\n {/* Info */}\n <div className=\"flex-1 min-w-0\">\n <h4 className=\"font-medium text-sm text-text-primary truncate\">\n {task.title}\n </h4>\n <div className=\"flex items-center gap-2 mt-0.5\">\n <span className=\"text-xs text-text-tertiary font-mono truncate\">\n {task.taskConfig.taskType === 'WEBHOOK'\n ? `${task.taskConfig.webhookMethod || 'POST'} ${task.taskConfig.webhookUrl}`\n : task.taskConfig.command || 'Script'}\n </span>\n <span className=\"text-xs text-text-tertiary flex-shrink-0\">\n {task.cronExpression\n ? 'Cron'\n : task.rrule\n ? 'Recurrence'\n : 'One Time'}\n </span>\n </div>\n </div>\n\n {/* Status badge */}\n <span className=\"text-xs px-2 py-0.5 rounded-full border flex-shrink-0\">\n {occ.execution?.status || task.status}\n </span>\n\n {/* Actions */}\n <div\n className=\"flex items-center gap-1 flex-shrink-0\"\n onClick={(e) => e.stopPropagation()}\n >\n {onTriggerNow && (\n <button\n type=\"button\"\n onClick={() => onTriggerNow(task.id)}\n className=\"p-1.5 rounded hover:bg-bg-secondary transition-colors\"\n title=\"Trigger Now\"\n >\n <Play size={14} />\n </button>\n )}\n <button\n type=\"button\"\n onClick={() => onViewLogs(task)}\n className=\"p-1.5 rounded hover:bg-bg-secondary transition-colors\"\n title=\"View Logs\"\n >\n <Eye size={14} />\n </button>\n <ChevronRight size={14} className=\"text-text-tertiary\" />\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"VibeCalDayView.js","names":[],"sources":["../../../src/components/vibecalendar/VibeCalDayView.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport { Play, Eye, ChevronRight } from 'lucide-react';\nimport { STATUS_COLORS } from './types';\nimport type { CalendarOccurrence, VibeCalendarTask } from './types';\nimport { useTr } from '../../shared/hooks/useTr';\n\ninterface VibeCalDayViewProps {\n currentDate: Date;\n occurrences: CalendarOccurrence[];\n onTriggerNow?: (taskId: string) => void;\n onViewLogs: (task: VibeCalendarTask) => void;\n onViewDetail: (taskId: string) => void;\n}\n\nconst HOURS = Array.from({ length: 24 }, (_, i) => i);\n\nfunction formatHour(hour: number): string {\n if (hour === 0) return '12 AM';\n if (hour < 12) return `${hour} AM`;\n if (hour === 12) return '12 PM';\n return `${hour - 12} PM`;\n}\n\nexport function VibeCalDayView({\n currentDate,\n occurrences,\n onTriggerNow,\n onViewLogs,\n onViewDetail,\n}: VibeCalDayViewProps) {\n const tr = useTr();\n const today = new Date();\n\n const isToday =\n currentDate.getFullYear() === today.getFullYear() &&\n currentDate.getMonth() === today.getMonth() &&\n currentDate.getDate() === today.getDate();\n\n const nowHour = today.getHours();\n\n const getOccurrencesForHour = (hour: number): CalendarOccurrence[] =>\n occurrences.filter((occ) => {\n const d = new Date(occ.occurrenceAt);\n return (\n d.getFullYear() === currentDate.getFullYear() &&\n d.getMonth() === currentDate.getMonth() &&\n d.getDate() === currentDate.getDate() &&\n d.getHours() === hour\n );\n });\n\n // Count total tasks for the day\n const dayOccurrences = useMemo(\n () =>\n occurrences.filter((occ) => {\n const d = new Date(occ.occurrenceAt);\n return (\n d.getFullYear() === currentDate.getFullYear() &&\n d.getMonth() === currentDate.getMonth() &&\n d.getDate() === currentDate.getDate()\n );\n }),\n [occurrences, currentDate]\n );\n\n return (\n <div className=\"flex-1 flex flex-col overflow-hidden\">\n {/* Day summary header */}\n <div className=\"flex items-center justify-between px-4 py-2 border-b border-border-default flex-shrink-0\">\n <div className=\"flex items-center gap-3\">\n <div\n className={`flex flex-col items-center px-3 py-1.5 rounded-lg ${\n isToday ? 'bg-action-primary-bg text-action-primary-text' : 'bg-bg-sunken'\n }`}\n >\n <span className=\"text-xs font-medium\">\n {currentDate.toLocaleDateString('en-US', { weekday: 'short' })}\n </span>\n <span className=\"text-lg font-bold\">{currentDate.getDate()}</span>\n </div>\n <div>\n <span className=\"text-sm text-text-secondary\">\n {dayOccurrences.length}{' '}\n {dayOccurrences.length !== 1\n ? tr('vibecontrols.calendar.day.tasksScheduled', 'tasks scheduled')\n : tr('vibecontrols.calendar.day.taskScheduled', 'task scheduled')}\n </span>\n </div>\n </div>\n </div>\n\n {/* Time grid - scrollable */}\n <div className=\"flex-1 overflow-auto\">\n <div className=\"relative\">\n {HOURS.map((hour) => {\n const hourOccurrences = getOccurrencesForHour(hour);\n const isCurrent = isToday && hour === nowHour;\n\n return (\n <div\n key={hour}\n className={`flex border-b border-border-default ${\n isCurrent ? 'bg-[var(--color-accent-soft)]' : ''\n }`}\n style={{ minHeight: hourOccurrences.length > 0 ? 'auto' : '48px' }}\n >\n {/* Time label */}\n <div className=\"w-20 flex-shrink-0 text-right pr-3 pt-1.5 border-r border-border-default\">\n <span\n className={`text-xs ${isCurrent ? 'text-action-primary-text font-semibold' : 'text-text-tertiary'}`}\n >\n {formatHour(hour)}\n </span>\n {isCurrent && (\n <div className=\"mt-0.5 text-[10px] text-action-primary-text\">NOW</div>\n )}\n </div>\n\n {/* Tasks */}\n <div className=\"flex-1 p-1 space-y-1\">\n {hourOccurrences.map((occ, j) => {\n const task = occ.task;\n const statusColor =\n STATUS_COLORS[occ.execution?.status || task.status] || STATUS_COLORS.PENDING;\n const time = new Date(occ.occurrenceAt).toLocaleTimeString('en-US', {\n hour: '2-digit',\n minute: '2-digit',\n });\n\n return (\n <div\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n (() => onViewDetail(task.id))();\n }\n }}\n key={`${task.id}-${j}`}\n onClick={() => onViewDetail(task.id)}\n className={`flex items-center gap-3 px-3 py-2.5 rounded-lg border cursor-pointer ${statusColor} hover:opacity-90 transition-opacity`}\n >\n {/* Time */}\n <div className=\"w-14 text-xs font-mono text-text-secondary flex-shrink-0\">\n {time}\n </div>\n\n {/* Info */}\n <div className=\"flex-1 min-w-0\">\n <h4 className=\"font-medium text-sm text-text-primary truncate\">\n {task.title}\n </h4>\n <div className=\"flex items-center gap-2 mt-0.5\">\n <span className=\"text-xs text-text-tertiary font-mono truncate\">\n {task.taskConfig.taskType === 'WEBHOOK'\n ? `${task.taskConfig.webhookMethod || 'POST'} ${task.taskConfig.webhookUrl}`\n : task.taskConfig.command || 'Script'}\n </span>\n <span className=\"text-xs text-text-tertiary flex-shrink-0\">\n {task.cronExpression\n ? 'Cron'\n : task.rrule\n ? 'Recurrence'\n : 'One Time'}\n </span>\n </div>\n </div>\n\n {/* Status badge */}\n <span className=\"text-xs px-2 py-0.5 rounded-full border flex-shrink-0\">\n {occ.execution?.status || task.status}\n </span>\n\n {/* Actions */}\n <div\n className=\"flex items-center gap-1 flex-shrink-0\"\n onClick={(e) => e.stopPropagation()}\n >\n {onTriggerNow && (\n <button\n type=\"button\"\n onClick={() => onTriggerNow(task.id)}\n className=\"p-1.5 rounded hover:bg-bg-surface transition-colors\"\n title=\"Trigger Now\"\n >\n <Play size={14} />\n </button>\n )}\n <button\n type=\"button\"\n onClick={() => onViewLogs(task)}\n className=\"p-1.5 rounded hover:bg-bg-surface transition-colors\"\n title=\"View Logs\"\n >\n <Eye size={14} />\n </button>\n <ChevronRight size={14} className=\"text-text-tertiary\" />\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -33,7 +33,7 @@ function o({ currentDate: o, occurrences: s, onTriggerNow: c, onViewLogs: l, onV
33
33
  children: y.map((e, a) => {
34
34
  let o = e ? b(e) : [], s = o.length - 3;
35
35
  return /* @__PURE__ */ r("div", {
36
- className: `border-b border-r border-border-default p-1 ${e === null ? "bg-bg-sunken" : "bg-bg-surface"} ${x(e) ? "bg-action-primary-bg/5" : ""}`,
36
+ className: `border-b border-r border-border-default p-1 ${e === null ? "bg-bg-sunken" : "bg-bg-surface"} ${x(e) ? "bg-[var(--color-accent-soft)]" : ""}`,
37
37
  children: e !== null && /* @__PURE__ */ i(n, { children: [/* @__PURE__ */ r("span", {
38
38
  className: `inline-flex items-center justify-center size-6 text-xs rounded-full ${x(e) ? "bg-action-primary-bg text-action-primary-text font-bold" : "text-text-secondary"}`,
39
39
  children: e
@@ -1 +1 @@
1
- {"version":3,"file":"VibeCalMonthView.js","names":[],"sources":["../../../src/components/vibecalendar/VibeCalMonthView.tsx"],"sourcesContent":["import { VibeTaskBlock } from './VibeTaskBlock';\nimport type { CalendarOccurrence, VibeCalendarTask } from './types';\nimport { useTr } from '../../shared/hooks/useTr';\n\ninterface VibeCalMonthViewProps {\n currentDate: Date;\n occurrences: CalendarOccurrence[];\n onTriggerNow?: (taskId: string) => void;\n onViewLogs: (task: VibeCalendarTask) => void;\n onViewDetail: (taskId: string) => void;\n}\n\nconst DAYS_OF_WEEK = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\n\nexport function VibeCalMonthView({\n currentDate,\n occurrences,\n onTriggerNow,\n onViewLogs,\n onViewDetail,\n}: VibeCalMonthViewProps) {\n const tr = useTr();\n const year = currentDate.getFullYear();\n const month = currentDate.getMonth();\n const firstDay = new Date(year, month, 1);\n const lastDay = new Date(year, month + 1, 0);\n const startOffset = firstDay.getDay();\n const daysInMonth = lastDay.getDate();\n const today = new Date();\n\n // Build 6x7 grid\n const cells: (number | null)[] = [];\n for (let i = 0; i < startOffset; i++) cells.push(null);\n for (let d = 1; d <= daysInMonth; d++) cells.push(d);\n while (cells.length < 42) cells.push(null);\n\n const getOccurrencesForDay = (day: number): CalendarOccurrence[] => {\n return occurrences.filter((occ) => {\n const occDate = new Date(occ.occurrenceAt);\n return (\n occDate.getFullYear() === year && occDate.getMonth() === month && occDate.getDate() === day\n );\n });\n };\n\n const isToday = (day: number): boolean => {\n return today.getFullYear() === year && today.getMonth() === month && today.getDate() === day;\n };\n\n return (\n <div className=\"flex-1 overflow-auto\">\n {/* Day headers */}\n <div className=\"grid grid-cols-7 border-b border-border-default\">\n {DAYS_OF_WEEK.map((day) => (\n <div key={day} className=\"p-2 text-xs font-medium text-text-tertiary text-center\">\n {day}\n </div>\n ))}\n </div>\n\n {/* Calendar grid */}\n <div className=\"grid grid-cols-7 auto-rows-[minmax(100px,1fr)]\">\n {cells.map((day, i) => {\n const dayOccurrences = day ? getOccurrencesForDay(day) : [];\n const maxVisible = 3;\n const overflow = dayOccurrences.length - maxVisible;\n\n return (\n <div\n key={i}\n className={`border-b border-r border-border-default p-1 ${\n day === null ? 'bg-bg-sunken' : 'bg-bg-surface'\n } ${isToday(day!) ? 'bg-action-primary-bg/5' : ''}`}\n >\n {day !== null && (\n <>\n <span\n className={`inline-flex items-center justify-center size-6 text-xs rounded-full ${\n isToday(day)\n ? 'bg-action-primary-bg text-action-primary-text font-bold'\n : 'text-text-secondary'\n }`}\n >\n {day}\n </span>\n <div className=\"mt-1 space-y-0.5\">\n {dayOccurrences.slice(0, maxVisible).map((occ, j) => (\n <VibeTaskBlock\n key={`${occ.task.id}-${j}`}\n task={occ.task}\n compact\n onTriggerNow={onTriggerNow}\n onViewLogs={onViewLogs}\n onViewDetail={onViewDetail}\n />\n ))}\n {overflow > 0 && (\n <span className=\"text-xs text-text-tertiary pl-1\">\n +{overflow} {tr('vibecontrols.calendar.month.more', 'more')}\n </span>\n )}\n </div>\n </>\n )}\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n"],"mappings":";;;;AAYA,IAAM,IAAe;CAAC;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAM;AAEtE,SAAgB,EAAiB,EAC/B,gBACA,gBACA,iBACA,eACA,mBACwB;CACxB,IAAM,IAAK,GAAO,EACZ,IAAO,EAAY,aAAa,EAChC,IAAQ,EAAY,UAAU,EAC9B,IAAW,IAAI,KAAK,GAAM,GAAO,EAAE,EACnC,IAAU,IAAI,KAAK,GAAM,IAAQ,GAAG,EAAE,EACtC,IAAc,EAAS,QAAQ,EAC/B,IAAc,EAAQ,SAAS,EAC/B,oBAAQ,IAAI,MAAM,EAGlB,IAA2B,EAAE;AACnC,MAAK,IAAI,IAAI,GAAG,IAAI,GAAa,IAAK,GAAM,KAAK,KAAK;AACtD,MAAK,IAAI,IAAI,GAAG,KAAK,GAAa,IAAK,GAAM,KAAK,EAAE;AACpD,QAAO,EAAM,SAAS,IAAI,GAAM,KAAK,KAAK;CAE1C,IAAM,KAAwB,MACrB,EAAY,QAAQ,MAAQ;EACjC,IAAM,IAAU,IAAI,KAAK,EAAI,aAAa;AAC1C,SACE,EAAQ,aAAa,KAAK,KAAQ,EAAQ,UAAU,KAAK,KAAS,EAAQ,SAAS,KAAK;GAE1F,EAGE,KAAW,MACR,EAAM,aAAa,KAAK,KAAQ,EAAM,UAAU,KAAK,KAAS,EAAM,SAAS,KAAK;AAG3F,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CAEE,kBAAC,OAAD;GAAK,WAAU;aACZ,EAAa,KAAK,MACjB,kBAAC,OAAD;IAAe,WAAU;cACtB;IACG,EAFI,EAEJ,CACN;GACE,CAAA,EAGN,kBAAC,OAAD;GAAK,WAAU;aACZ,EAAM,KAAK,GAAK,MAAM;IACrB,IAAM,IAAiB,IAAM,EAAqB,EAAI,GAAG,EAAE,EAErD,IAAW,EAAe,SAAS;AAEzC,WACE,kBAAC,OAAD;KAEE,WAAW,+CACT,MAAQ,OAAO,iBAAiB,gBACjC,GAAG,EAAQ,EAAK,GAAG,2BAA2B;eAE9C,MAAQ,QACP,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,QAAD;MACE,WAAW,uEACT,EAAQ,EAAI,GACR,4DACA;gBAGL;MACI,CAAA,EACP,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACG,EAAe,MAAM,GAAG,EAAW,CAAC,KAAK,GAAK,MAC7C,kBAAC,GAAD;OAEE,MAAM,EAAI;OACV,SAAA;OACc;OACF;OACE;OACd,EANK,GAAG,EAAI,KAAK,GAAG,GAAG,IAMvB,CACF,EACD,IAAW,KACV,kBAAC,QAAD;OAAM,WAAU;iBAAhB;QAAkD;QAC9C;QAAS;QAAE,EAAG,oCAAoC,OAAO;QACtD;SAEL;QACL,EAAA,CAAA;KAED,EAnCC,EAmCD;KAER;GACE,CAAA,CACF"}
1
+ {"version":3,"file":"VibeCalMonthView.js","names":[],"sources":["../../../src/components/vibecalendar/VibeCalMonthView.tsx"],"sourcesContent":["import { VibeTaskBlock } from './VibeTaskBlock';\nimport type { CalendarOccurrence, VibeCalendarTask } from './types';\nimport { useTr } from '../../shared/hooks/useTr';\n\ninterface VibeCalMonthViewProps {\n currentDate: Date;\n occurrences: CalendarOccurrence[];\n onTriggerNow?: (taskId: string) => void;\n onViewLogs: (task: VibeCalendarTask) => void;\n onViewDetail: (taskId: string) => void;\n}\n\nconst DAYS_OF_WEEK = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\n\nexport function VibeCalMonthView({\n currentDate,\n occurrences,\n onTriggerNow,\n onViewLogs,\n onViewDetail,\n}: VibeCalMonthViewProps) {\n const tr = useTr();\n const year = currentDate.getFullYear();\n const month = currentDate.getMonth();\n const firstDay = new Date(year, month, 1);\n const lastDay = new Date(year, month + 1, 0);\n const startOffset = firstDay.getDay();\n const daysInMonth = lastDay.getDate();\n const today = new Date();\n\n // Build 6x7 grid\n const cells: (number | null)[] = [];\n for (let i = 0; i < startOffset; i++) cells.push(null);\n for (let d = 1; d <= daysInMonth; d++) cells.push(d);\n while (cells.length < 42) cells.push(null);\n\n const getOccurrencesForDay = (day: number): CalendarOccurrence[] => {\n return occurrences.filter((occ) => {\n const occDate = new Date(occ.occurrenceAt);\n return (\n occDate.getFullYear() === year && occDate.getMonth() === month && occDate.getDate() === day\n );\n });\n };\n\n const isToday = (day: number): boolean => {\n return today.getFullYear() === year && today.getMonth() === month && today.getDate() === day;\n };\n\n return (\n <div className=\"flex-1 overflow-auto\">\n {/* Day headers */}\n <div className=\"grid grid-cols-7 border-b border-border-default\">\n {DAYS_OF_WEEK.map((day) => (\n <div key={day} className=\"p-2 text-xs font-medium text-text-tertiary text-center\">\n {day}\n </div>\n ))}\n </div>\n\n {/* Calendar grid */}\n <div className=\"grid grid-cols-7 auto-rows-[minmax(100px,1fr)]\">\n {cells.map((day, i) => {\n const dayOccurrences = day ? getOccurrencesForDay(day) : [];\n const maxVisible = 3;\n const overflow = dayOccurrences.length - maxVisible;\n\n return (\n <div\n key={i}\n className={`border-b border-r border-border-default p-1 ${\n day === null ? 'bg-bg-sunken' : 'bg-bg-surface'\n } ${isToday(day!) ? 'bg-[var(--color-accent-soft)]' : ''}`}\n >\n {day !== null && (\n <>\n <span\n className={`inline-flex items-center justify-center size-6 text-xs rounded-full ${\n isToday(day)\n ? 'bg-action-primary-bg text-action-primary-text font-bold'\n : 'text-text-secondary'\n }`}\n >\n {day}\n </span>\n <div className=\"mt-1 space-y-0.5\">\n {dayOccurrences.slice(0, maxVisible).map((occ, j) => (\n <VibeTaskBlock\n key={`${occ.task.id}-${j}`}\n task={occ.task}\n compact\n onTriggerNow={onTriggerNow}\n onViewLogs={onViewLogs}\n onViewDetail={onViewDetail}\n />\n ))}\n {overflow > 0 && (\n <span className=\"text-xs text-text-tertiary pl-1\">\n +{overflow} {tr('vibecontrols.calendar.month.more', 'more')}\n </span>\n )}\n </div>\n </>\n )}\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n"],"mappings":";;;;AAYA,IAAM,IAAe;CAAC;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAM;AAEtE,SAAgB,EAAiB,EAC/B,gBACA,gBACA,iBACA,eACA,mBACwB;CACxB,IAAM,IAAK,GAAO,EACZ,IAAO,EAAY,aAAa,EAChC,IAAQ,EAAY,UAAU,EAC9B,IAAW,IAAI,KAAK,GAAM,GAAO,EAAE,EACnC,IAAU,IAAI,KAAK,GAAM,IAAQ,GAAG,EAAE,EACtC,IAAc,EAAS,QAAQ,EAC/B,IAAc,EAAQ,SAAS,EAC/B,oBAAQ,IAAI,MAAM,EAGlB,IAA2B,EAAE;AACnC,MAAK,IAAI,IAAI,GAAG,IAAI,GAAa,IAAK,GAAM,KAAK,KAAK;AACtD,MAAK,IAAI,IAAI,GAAG,KAAK,GAAa,IAAK,GAAM,KAAK,EAAE;AACpD,QAAO,EAAM,SAAS,IAAI,GAAM,KAAK,KAAK;CAE1C,IAAM,KAAwB,MACrB,EAAY,QAAQ,MAAQ;EACjC,IAAM,IAAU,IAAI,KAAK,EAAI,aAAa;AAC1C,SACE,EAAQ,aAAa,KAAK,KAAQ,EAAQ,UAAU,KAAK,KAAS,EAAQ,SAAS,KAAK;GAE1F,EAGE,KAAW,MACR,EAAM,aAAa,KAAK,KAAQ,EAAM,UAAU,KAAK,KAAS,EAAM,SAAS,KAAK;AAG3F,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CAEE,kBAAC,OAAD;GAAK,WAAU;aACZ,EAAa,KAAK,MACjB,kBAAC,OAAD;IAAe,WAAU;cACtB;IACG,EAFI,EAEJ,CACN;GACE,CAAA,EAGN,kBAAC,OAAD;GAAK,WAAU;aACZ,EAAM,KAAK,GAAK,MAAM;IACrB,IAAM,IAAiB,IAAM,EAAqB,EAAI,GAAG,EAAE,EAErD,IAAW,EAAe,SAAS;AAEzC,WACE,kBAAC,OAAD;KAEE,WAAW,+CACT,MAAQ,OAAO,iBAAiB,gBACjC,GAAG,EAAQ,EAAK,GAAG,kCAAkC;eAErD,MAAQ,QACP,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,QAAD;MACE,WAAW,uEACT,EAAQ,EAAI,GACR,4DACA;gBAGL;MACI,CAAA,EACP,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACG,EAAe,MAAM,GAAG,EAAW,CAAC,KAAK,GAAK,MAC7C,kBAAC,GAAD;OAEE,MAAM,EAAI;OACV,SAAA;OACc;OACF;OACE;OACd,EANK,GAAG,EAAI,KAAK,GAAG,GAAG,IAMvB,CACF,EACD,IAAW,KACV,kBAAC,QAAD;OAAM,WAAU;iBAAhB;QAAkD;QAC9C;QAAS;QAAE,EAAG,oCAAoC,OAAO;QACtD;SAEL;QACL,EAAA,CAAA;KAED,EAnCC,EAmCD;KAER;GACE,CAAA,CACF"}
@@ -33,7 +33,7 @@ function u({ currentDate: u, occurrences: d, onTriggerNow: f, onViewLogs: p, onV
33
33
  children: [/* @__PURE__ */ o("div", {
34
34
  className: "flex border-b border-border-default flex-shrink-0",
35
35
  children: [/* @__PURE__ */ a("div", { className: "w-16 flex-shrink-0" }), g.map((e, t) => /* @__PURE__ */ o("div", {
36
- className: `flex-1 text-center py-2 border-l border-border-default ${_(e) ? "bg-action-primary-bg/5" : ""}`,
36
+ className: `flex-1 text-center py-2 border-l border-border-default ${_(e) ? "bg-[var(--color-accent-soft)]" : ""}`,
37
37
  children: [/* @__PURE__ */ a("div", {
38
38
  className: "text-xs text-text-tertiary",
39
39
  children: c[t]
@@ -58,7 +58,7 @@ function u({ currentDate: u, occurrences: d, onTriggerNow: f, onViewLogs: p, onV
58
58
  }), g.map((n, s) => {
59
59
  let c = v(n, e);
60
60
  return /* @__PURE__ */ a("div", {
61
- className: `flex-1 border-l border-t border-border-default p-0.5 ${_(n) && e === y ? "bg-action-primary-bg/5" : ""}`,
61
+ className: `flex-1 border-l border-t border-border-default p-0.5 ${_(n) && e === y ? "bg-[var(--color-accent-soft)]" : ""}`,
62
62
  children: c.map((e, n) => {
63
63
  let s = e.task;
64
64
  return /* @__PURE__ */ a("div", {
@@ -80,13 +80,13 @@ function u({ currentDate: u, occurrences: d, onTriggerNow: f, onViewLogs: p, onV
80
80
  children: [f && /* @__PURE__ */ a("button", {
81
81
  type: "button",
82
82
  onClick: () => f(s.id),
83
- className: "p-0.5 rounded hover:bg-bg-secondary",
83
+ className: "p-0.5 rounded hover:bg-bg-surface",
84
84
  title: "Trigger Now",
85
85
  children: /* @__PURE__ */ a(i, { size: 10 })
86
86
  }), /* @__PURE__ */ a("button", {
87
87
  type: "button",
88
88
  onClick: () => p(s),
89
- className: "p-0.5 rounded hover:bg-bg-secondary",
89
+ className: "p-0.5 rounded hover:bg-bg-surface",
90
90
  title: "View Logs",
91
91
  children: /* @__PURE__ */ a(r, { size: 10 })
92
92
  })]
@@ -1 +1 @@
1
- {"version":3,"file":"VibeCalWeekView.js","names":[],"sources":["../../../src/components/vibecalendar/VibeCalWeekView.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport { Play, Eye } from 'lucide-react';\nimport { STATUS_COLORS } from './types';\nimport type { CalendarOccurrence, VibeCalendarTask } from './types';\nimport { useTr } from '../../shared/hooks/useTr';\n\ninterface VibeCalWeekViewProps {\n currentDate: Date;\n occurrences: CalendarOccurrence[];\n onTriggerNow?: (taskId: string) => void;\n onViewLogs: (task: VibeCalendarTask) => void;\n onViewDetail: (taskId: string) => void;\n}\n\nconst HOURS = Array.from({ length: 24 }, (_, i) => i);\nconst DAYS_SHORT = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\n\nfunction formatHour(hour: number): string {\n if (hour === 0) return '12 AM';\n if (hour < 12) return `${hour} AM`;\n if (hour === 12) return '12 PM';\n return `${hour - 12} PM`;\n}\n\nexport function VibeCalWeekView({\n currentDate,\n occurrences,\n onTriggerNow,\n onViewLogs,\n onViewDetail,\n}: VibeCalWeekViewProps) {\n const tr = useTr();\n const today = new Date();\n\n // Calculate the week's dates (Sun-Sat)\n const weekDates = useMemo(() => {\n const start = new Date(currentDate);\n start.setDate(start.getDate() - start.getDay());\n return Array.from({ length: 7 }, (_, i) => {\n const d = new Date(start);\n d.setDate(d.getDate() + i);\n return d;\n });\n }, [currentDate]);\n\n const isToday = (date: Date): boolean =>\n date.getFullYear() === today.getFullYear() &&\n date.getMonth() === today.getMonth() &&\n date.getDate() === today.getDate();\n\n const getOccurrencesForSlot = (date: Date, hour: number): CalendarOccurrence[] =>\n occurrences.filter((occ) => {\n const d = new Date(occ.occurrenceAt);\n return (\n d.getFullYear() === date.getFullYear() &&\n d.getMonth() === date.getMonth() &&\n d.getDate() === date.getDate() &&\n d.getHours() === hour\n );\n });\n\n const nowHour = today.getHours();\n\n return (\n <div className=\"flex-1 flex flex-col overflow-hidden\">\n {/* Day column headers */}\n <div className=\"flex border-b border-border-default flex-shrink-0\">\n {/* Time gutter */}\n <div className=\"w-16 flex-shrink-0\" />\n {weekDates.map((date, i) => (\n <div\n key={i}\n className={`flex-1 text-center py-2 border-l border-border-default ${\n isToday(date) ? 'bg-action-primary-bg/5' : ''\n }`}\n >\n <div className=\"text-xs text-text-tertiary\">{DAYS_SHORT[i]}</div>\n <div\n className={`text-sm font-medium mt-0.5 ${\n isToday(date)\n ? 'inline-flex items-center justify-center size-7 rounded-full bg-action-primary-bg text-action-primary-text'\n : 'text-text-primary'\n }`}\n >\n {date.getDate()}\n </div>\n </div>\n ))}\n </div>\n\n {/* Time grid - scrollable */}\n <div className=\"flex-1 overflow-auto\">\n <div className=\"relative\">\n {HOURS.map((hour) => (\n <div key={hour} className=\"flex\" style={{ minHeight: '48px' }}>\n {/* Time label */}\n <div className=\"w-16 flex-shrink-0 text-right pr-2 pt-0.5\">\n <span className=\"text-xs text-text-tertiary\">{formatHour(hour)}</span>\n </div>\n\n {/* Day columns */}\n {weekDates.map((date, dayIdx) => {\n const slotOccurrences = getOccurrencesForSlot(date, hour);\n const isCurrent = isToday(date) && hour === nowHour;\n\n return (\n <div\n key={dayIdx}\n className={`flex-1 border-l border-t border-border-default p-0.5 ${\n isCurrent ? 'bg-action-primary-bg/5' : ''\n }`}\n >\n {slotOccurrences.map((occ, j) => {\n const task = occ.task;\n const statusColor =\n STATUS_COLORS[occ.execution?.status || task.status] ||\n STATUS_COLORS.PENDING;\n\n return (\n <div\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n (() => onViewDetail(task.id))();\n }\n }}\n key={`${task.id}-${j}`}\n onClick={() => onViewDetail(task.id)}\n className={`mb-0.5 px-1.5 py-1 rounded text-xs border cursor-pointer ${statusColor} hover:opacity-80 transition-opacity`}\n >\n <div className=\"flex items-center justify-between gap-1\">\n <span className=\"truncate font-medium\">{task.title}</span>\n <div\n className=\"flex items-center gap-0.5 flex-shrink-0\"\n onClick={(e) => e.stopPropagation()}\n >\n {onTriggerNow && (\n <button\n type=\"button\"\n onClick={() => onTriggerNow(task.id)}\n className=\"p-0.5 rounded hover:bg-bg-secondary\"\n title=\"Trigger Now\"\n >\n <Play size={10} />\n </button>\n )}\n <button\n type=\"button\"\n onClick={() => onViewLogs(task)}\n className=\"p-0.5 rounded hover:bg-bg-secondary\"\n title=\"View Logs\"\n >\n <Eye size={10} />\n </button>\n </div>\n </div>\n </div>\n );\n })}\n </div>\n );\n })}\n </div>\n ))}\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"VibeCalWeekView.js","names":[],"sources":["../../../src/components/vibecalendar/VibeCalWeekView.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport { Play, Eye } from 'lucide-react';\nimport { STATUS_COLORS } from './types';\nimport type { CalendarOccurrence, VibeCalendarTask } from './types';\nimport { useTr } from '../../shared/hooks/useTr';\n\ninterface VibeCalWeekViewProps {\n currentDate: Date;\n occurrences: CalendarOccurrence[];\n onTriggerNow?: (taskId: string) => void;\n onViewLogs: (task: VibeCalendarTask) => void;\n onViewDetail: (taskId: string) => void;\n}\n\nconst HOURS = Array.from({ length: 24 }, (_, i) => i);\nconst DAYS_SHORT = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\n\nfunction formatHour(hour: number): string {\n if (hour === 0) return '12 AM';\n if (hour < 12) return `${hour} AM`;\n if (hour === 12) return '12 PM';\n return `${hour - 12} PM`;\n}\n\nexport function VibeCalWeekView({\n currentDate,\n occurrences,\n onTriggerNow,\n onViewLogs,\n onViewDetail,\n}: VibeCalWeekViewProps) {\n const tr = useTr();\n const today = new Date();\n\n // Calculate the week's dates (Sun-Sat)\n const weekDates = useMemo(() => {\n const start = new Date(currentDate);\n start.setDate(start.getDate() - start.getDay());\n return Array.from({ length: 7 }, (_, i) => {\n const d = new Date(start);\n d.setDate(d.getDate() + i);\n return d;\n });\n }, [currentDate]);\n\n const isToday = (date: Date): boolean =>\n date.getFullYear() === today.getFullYear() &&\n date.getMonth() === today.getMonth() &&\n date.getDate() === today.getDate();\n\n const getOccurrencesForSlot = (date: Date, hour: number): CalendarOccurrence[] =>\n occurrences.filter((occ) => {\n const d = new Date(occ.occurrenceAt);\n return (\n d.getFullYear() === date.getFullYear() &&\n d.getMonth() === date.getMonth() &&\n d.getDate() === date.getDate() &&\n d.getHours() === hour\n );\n });\n\n const nowHour = today.getHours();\n\n return (\n <div className=\"flex-1 flex flex-col overflow-hidden\">\n {/* Day column headers */}\n <div className=\"flex border-b border-border-default flex-shrink-0\">\n {/* Time gutter */}\n <div className=\"w-16 flex-shrink-0\" />\n {weekDates.map((date, i) => (\n <div\n key={i}\n className={`flex-1 text-center py-2 border-l border-border-default ${\n isToday(date) ? 'bg-[var(--color-accent-soft)]' : ''\n }`}\n >\n <div className=\"text-xs text-text-tertiary\">{DAYS_SHORT[i]}</div>\n <div\n className={`text-sm font-medium mt-0.5 ${\n isToday(date)\n ? 'inline-flex items-center justify-center size-7 rounded-full bg-action-primary-bg text-action-primary-text'\n : 'text-text-primary'\n }`}\n >\n {date.getDate()}\n </div>\n </div>\n ))}\n </div>\n\n {/* Time grid - scrollable */}\n <div className=\"flex-1 overflow-auto\">\n <div className=\"relative\">\n {HOURS.map((hour) => (\n <div key={hour} className=\"flex\" style={{ minHeight: '48px' }}>\n {/* Time label */}\n <div className=\"w-16 flex-shrink-0 text-right pr-2 pt-0.5\">\n <span className=\"text-xs text-text-tertiary\">{formatHour(hour)}</span>\n </div>\n\n {/* Day columns */}\n {weekDates.map((date, dayIdx) => {\n const slotOccurrences = getOccurrencesForSlot(date, hour);\n const isCurrent = isToday(date) && hour === nowHour;\n\n return (\n <div\n key={dayIdx}\n className={`flex-1 border-l border-t border-border-default p-0.5 ${\n isCurrent ? 'bg-[var(--color-accent-soft)]' : ''\n }`}\n >\n {slotOccurrences.map((occ, j) => {\n const task = occ.task;\n const statusColor =\n STATUS_COLORS[occ.execution?.status || task.status] ||\n STATUS_COLORS.PENDING;\n\n return (\n <div\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n (() => onViewDetail(task.id))();\n }\n }}\n key={`${task.id}-${j}`}\n onClick={() => onViewDetail(task.id)}\n className={`mb-0.5 px-1.5 py-1 rounded text-xs border cursor-pointer ${statusColor} hover:opacity-80 transition-opacity`}\n >\n <div className=\"flex items-center justify-between gap-1\">\n <span className=\"truncate font-medium\">{task.title}</span>\n <div\n className=\"flex items-center gap-0.5 flex-shrink-0\"\n onClick={(e) => e.stopPropagation()}\n >\n {onTriggerNow && (\n <button\n type=\"button\"\n onClick={() => onTriggerNow(task.id)}\n className=\"p-0.5 rounded hover:bg-bg-surface\"\n title=\"Trigger Now\"\n >\n <Play size={10} />\n </button>\n )}\n <button\n type=\"button\"\n onClick={() => onViewLogs(task)}\n className=\"p-0.5 rounded hover:bg-bg-surface\"\n title=\"View Logs\"\n >\n <Eye size={10} />\n </button>\n </div>\n </div>\n </div>\n );\n })}\n </div>\n );\n })}\n </div>\n ))}\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -55,7 +55,7 @@ function d({ currentDate: t, viewMode: i, onDateChange: a, onViewModeChange: o,
55
55
  /* @__PURE__ */ c("button", {
56
56
  type: "button",
57
57
  onClick: () => p("today"),
58
- className: "px-3 py-1.5 text-sm font-medium bg-bg-surface border border-border-default rounded-md hover:bg-bg-secondary transition-colors",
58
+ className: "px-3 py-1.5 text-sm font-medium bg-bg-surface border border-border-default rounded-md hover:bg-bg-surface transition-colors",
59
59
  children: f("vibecontrols.calendar.header.today", "Today")
60
60
  }),
61
61
  /* @__PURE__ */ l("div", {
@@ -63,12 +63,12 @@ function d({ currentDate: t, viewMode: i, onDateChange: a, onViewModeChange: o,
63
63
  children: [/* @__PURE__ */ c("button", {
64
64
  type: "button",
65
65
  onClick: () => p("prev"),
66
- className: "p-1.5 rounded-md hover:bg-bg-secondary transition-colors",
66
+ className: "p-1.5 rounded-md hover:bg-bg-surface transition-colors",
67
67
  children: /* @__PURE__ */ c(n, { size: 18 })
68
68
  }), /* @__PURE__ */ c("button", {
69
69
  type: "button",
70
70
  onClick: () => p("next"),
71
- className: "p-1.5 rounded-md hover:bg-bg-secondary transition-colors",
71
+ className: "p-1.5 rounded-md hover:bg-bg-surface transition-colors",
72
72
  children: /* @__PURE__ */ c(r, { size: 18 })
73
73
  })]
74
74
  }),
@@ -116,7 +116,7 @@ function d({ currentDate: t, viewMode: i, onDateChange: a, onViewModeChange: o,
116
116
  children: u.map(({ mode: e, label: t, icon: n }) => /* @__PURE__ */ l("button", {
117
117
  type: "button",
118
118
  onClick: () => o(e),
119
- className: `flex items-center justify-center gap-1.5 rounded-md px-2.5 py-1.5 text-xs transition-colors sm:px-3 sm:text-sm ${i === e ? "bg-action-primary-bg text-action-primary-text" : "text-text-secondary hover:text-text-primary hover:bg-bg-secondary"}`,
119
+ className: `flex items-center justify-center gap-1.5 rounded-md px-2.5 py-1.5 text-xs transition-colors sm:px-3 sm:text-sm ${i === e ? "bg-action-primary-bg text-action-primary-text" : "text-text-secondary hover:text-text-primary hover:bg-bg-surface"}`,
120
120
  children: [/* @__PURE__ */ c(n, { size: 14 }), t]
121
121
  }, e))
122
122
  }), d && /* @__PURE__ */ l("button", {
@@ -1 +1 @@
1
- {"version":3,"file":"VibeCalendarHeader.js","names":[],"sources":["../../../src/components/vibecalendar/VibeCalendarHeader.tsx"],"sourcesContent":["import { ChevronLeft, ChevronRight, Plus, Calendar, List, LayoutGrid, Clock } from 'lucide-react';\nimport type { CalendarViewMode } from './types';\nimport { useTr } from '../../shared/hooks/useTr';\n\ninterface VibeCalendarHeaderProps {\n currentDate: Date;\n viewMode: CalendarViewMode;\n onDateChange: (date: Date) => void;\n onViewModeChange: (mode: CalendarViewMode) => void;\n onCreateTask?: () => void;\n}\n\nconst VIEW_OPTIONS: { mode: CalendarViewMode; label: string; icon: typeof Calendar }[] = [\n { mode: 'month', label: 'Month', icon: LayoutGrid },\n { mode: 'week', label: 'Week', icon: Calendar },\n { mode: 'day', label: 'Day', icon: Clock },\n { mode: 'agenda', label: 'Agenda', icon: List },\n];\n\nexport function VibeCalendarHeader({\n currentDate,\n viewMode,\n onDateChange,\n onViewModeChange,\n onCreateTask,\n}: VibeCalendarHeaderProps) {\n const tr = useTr();\n const navigateDate = (direction: 'prev' | 'next' | 'today') => {\n if (direction === 'today') {\n onDateChange(new Date());\n return;\n }\n\n const newDate = new Date(currentDate);\n const delta = direction === 'prev' ? -1 : 1;\n\n switch (viewMode) {\n case 'month':\n newDate.setMonth(newDate.getMonth() + delta);\n break;\n case 'week':\n newDate.setDate(newDate.getDate() + delta * 7);\n break;\n case 'day':\n newDate.setDate(newDate.getDate() + delta);\n break;\n case 'agenda':\n newDate.setMonth(newDate.getMonth() + delta);\n break;\n }\n\n onDateChange(newDate);\n };\n\n const formatDateLabel = (): string => {\n const options: Intl.DateTimeFormatOptions = { year: 'numeric' };\n\n switch (viewMode) {\n case 'month':\n return currentDate.toLocaleDateString('en-US', { month: 'long', year: 'numeric' });\n case 'week': {\n const weekStart = new Date(currentDate);\n weekStart.setDate(weekStart.getDate() - weekStart.getDay());\n const weekEnd = new Date(weekStart);\n weekEnd.setDate(weekEnd.getDate() + 6);\n return `${weekStart.toLocaleDateString('en-US', { month: 'short', day: 'numeric' })} - ${weekEnd.toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' })}`;\n }\n case 'day':\n return currentDate.toLocaleDateString('en-US', {\n weekday: 'long',\n month: 'long',\n day: 'numeric',\n year: 'numeric',\n });\n case 'agenda':\n return currentDate.toLocaleDateString('en-US', { month: 'long', year: 'numeric' });\n default:\n return currentDate.toLocaleDateString('en-US', options);\n }\n };\n\n return (\n <div className=\"flex flex-col gap-3 border-b border-border-default pb-4 lg:flex-row lg:items-center lg:justify-between\">\n {/* Left: Navigation */}\n <div className=\"flex flex-wrap items-center gap-2\">\n <button\n type=\"button\"\n onClick={() => navigateDate('today')}\n className=\"px-3 py-1.5 text-sm font-medium bg-bg-surface border border-border-default rounded-md hover:bg-bg-secondary transition-colors\"\n >\n {tr('vibecontrols.calendar.header.today', 'Today')}\n </button>\n <div className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n onClick={() => navigateDate('prev')}\n className=\"p-1.5 rounded-md hover:bg-bg-secondary transition-colors\"\n >\n <ChevronLeft size={18} />\n </button>\n <button\n type=\"button\"\n onClick={() => navigateDate('next')}\n className=\"p-1.5 rounded-md hover:bg-bg-secondary transition-colors\"\n >\n <ChevronRight size={18} />\n </button>\n </div>\n <h2 className=\"min-w-0 text-base font-semibold text-text-primary sm:ml-2 sm:text-lg\">\n {formatDateLabel()}\n </h2>\n </div>\n\n {/* Right: View Mode + Create */}\n <div className=\"flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between lg:justify-end\">\n {/* View Mode Switcher */}\n <div className=\"grid grid-cols-2 gap-1 rounded-lg border border-border-default bg-bg-surface p-1 sm:flex sm:items-center sm:gap-0.5 sm:p-0.5\">\n {VIEW_OPTIONS.map(({ mode, label, icon: Icon }) => (\n <button\n type=\"button\"\n key={mode}\n onClick={() => onViewModeChange(mode)}\n className={`flex items-center justify-center gap-1.5 rounded-md px-2.5 py-1.5 text-xs transition-colors sm:px-3 sm:text-sm ${\n viewMode === mode\n ? 'bg-action-primary-bg text-action-primary-text'\n : 'text-text-secondary hover:text-text-primary hover:bg-bg-secondary'\n }`}\n >\n <Icon size={14} />\n {label}\n </button>\n ))}\n </div>\n\n {/* Create Task Button */}\n {onCreateTask && (\n <button\n type=\"button\"\n onClick={onCreateTask}\n className=\"flex w-full items-center justify-center gap-2 rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text transition-opacity hover:opacity-90 sm:w-auto\"\n >\n <Plus size={16} />\n {tr('vibecontrols.calendar.header.scheduleTask', 'Schedule Task')}\n </button>\n )}\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"VibeCalendarHeader.js","names":[],"sources":["../../../src/components/vibecalendar/VibeCalendarHeader.tsx"],"sourcesContent":["import { ChevronLeft, ChevronRight, Plus, Calendar, List, LayoutGrid, Clock } from 'lucide-react';\nimport type { CalendarViewMode } from './types';\nimport { useTr } from '../../shared/hooks/useTr';\n\ninterface VibeCalendarHeaderProps {\n currentDate: Date;\n viewMode: CalendarViewMode;\n onDateChange: (date: Date) => void;\n onViewModeChange: (mode: CalendarViewMode) => void;\n onCreateTask?: () => void;\n}\n\nconst VIEW_OPTIONS: { mode: CalendarViewMode; label: string; icon: typeof Calendar }[] = [\n { mode: 'month', label: 'Month', icon: LayoutGrid },\n { mode: 'week', label: 'Week', icon: Calendar },\n { mode: 'day', label: 'Day', icon: Clock },\n { mode: 'agenda', label: 'Agenda', icon: List },\n];\n\nexport function VibeCalendarHeader({\n currentDate,\n viewMode,\n onDateChange,\n onViewModeChange,\n onCreateTask,\n}: VibeCalendarHeaderProps) {\n const tr = useTr();\n const navigateDate = (direction: 'prev' | 'next' | 'today') => {\n if (direction === 'today') {\n onDateChange(new Date());\n return;\n }\n\n const newDate = new Date(currentDate);\n const delta = direction === 'prev' ? -1 : 1;\n\n switch (viewMode) {\n case 'month':\n newDate.setMonth(newDate.getMonth() + delta);\n break;\n case 'week':\n newDate.setDate(newDate.getDate() + delta * 7);\n break;\n case 'day':\n newDate.setDate(newDate.getDate() + delta);\n break;\n case 'agenda':\n newDate.setMonth(newDate.getMonth() + delta);\n break;\n }\n\n onDateChange(newDate);\n };\n\n const formatDateLabel = (): string => {\n const options: Intl.DateTimeFormatOptions = { year: 'numeric' };\n\n switch (viewMode) {\n case 'month':\n return currentDate.toLocaleDateString('en-US', { month: 'long', year: 'numeric' });\n case 'week': {\n const weekStart = new Date(currentDate);\n weekStart.setDate(weekStart.getDate() - weekStart.getDay());\n const weekEnd = new Date(weekStart);\n weekEnd.setDate(weekEnd.getDate() + 6);\n return `${weekStart.toLocaleDateString('en-US', { month: 'short', day: 'numeric' })} - ${weekEnd.toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' })}`;\n }\n case 'day':\n return currentDate.toLocaleDateString('en-US', {\n weekday: 'long',\n month: 'long',\n day: 'numeric',\n year: 'numeric',\n });\n case 'agenda':\n return currentDate.toLocaleDateString('en-US', { month: 'long', year: 'numeric' });\n default:\n return currentDate.toLocaleDateString('en-US', options);\n }\n };\n\n return (\n <div className=\"flex flex-col gap-3 border-b border-border-default pb-4 lg:flex-row lg:items-center lg:justify-between\">\n {/* Left: Navigation */}\n <div className=\"flex flex-wrap items-center gap-2\">\n <button\n type=\"button\"\n onClick={() => navigateDate('today')}\n className=\"px-3 py-1.5 text-sm font-medium bg-bg-surface border border-border-default rounded-md hover:bg-bg-surface transition-colors\"\n >\n {tr('vibecontrols.calendar.header.today', 'Today')}\n </button>\n <div className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n onClick={() => navigateDate('prev')}\n className=\"p-1.5 rounded-md hover:bg-bg-surface transition-colors\"\n >\n <ChevronLeft size={18} />\n </button>\n <button\n type=\"button\"\n onClick={() => navigateDate('next')}\n className=\"p-1.5 rounded-md hover:bg-bg-surface transition-colors\"\n >\n <ChevronRight size={18} />\n </button>\n </div>\n <h2 className=\"min-w-0 text-base font-semibold text-text-primary sm:ml-2 sm:text-lg\">\n {formatDateLabel()}\n </h2>\n </div>\n\n {/* Right: View Mode + Create */}\n <div className=\"flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between lg:justify-end\">\n {/* View Mode Switcher */}\n <div className=\"grid grid-cols-2 gap-1 rounded-lg border border-border-default bg-bg-surface p-1 sm:flex sm:items-center sm:gap-0.5 sm:p-0.5\">\n {VIEW_OPTIONS.map(({ mode, label, icon: Icon }) => (\n <button\n type=\"button\"\n key={mode}\n onClick={() => onViewModeChange(mode)}\n className={`flex items-center justify-center gap-1.5 rounded-md px-2.5 py-1.5 text-xs transition-colors sm:px-3 sm:text-sm ${\n viewMode === mode\n ? 'bg-action-primary-bg text-action-primary-text'\n : 'text-text-secondary hover:text-text-primary hover:bg-bg-surface'\n }`}\n >\n <Icon size={14} />\n {label}\n </button>\n ))}\n </div>\n\n {/* Create Task Button */}\n {onCreateTask && (\n <button\n type=\"button\"\n onClick={onCreateTask}\n className=\"flex w-full items-center justify-center gap-2 rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text transition-opacity hover:opacity-90 sm:w-auto\"\n >\n <Plus size={16} />\n {tr('vibecontrols.calendar.header.scheduleTask', 'Schedule Task')}\n </button>\n )}\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -47,13 +47,13 @@ function o({ task: o, compact: s = !1, onTriggerNow: c, onViewLogs: l, onViewDet
47
47
  children: [c && /* @__PURE__ */ i("button", {
48
48
  type: "button",
49
49
  onClick: () => c(o.id),
50
- className: "p-1 rounded hover:bg-bg-secondary transition-colors",
50
+ className: "p-1 rounded hover:bg-bg-surface transition-colors",
51
51
  title: "Trigger Now",
52
52
  children: /* @__PURE__ */ i(r, { size: 14 })
53
53
  }), /* @__PURE__ */ i("button", {
54
54
  type: "button",
55
55
  onClick: () => l(o),
56
- className: "p-1 rounded hover:bg-bg-secondary transition-colors",
56
+ className: "p-1 rounded hover:bg-bg-surface transition-colors",
57
57
  title: "View Logs",
58
58
  children: /* @__PURE__ */ i(n, { size: 14 })
59
59
  })]
@@ -1 +1 @@
1
- {"version":3,"file":"VibeTaskBlock.js","names":[],"sources":["../../../src/components/vibecalendar/VibeTaskBlock.tsx"],"sourcesContent":["import { Play, Eye } from 'lucide-react';\nimport { STATUS_COLORS } from './types';\nimport type { VibeCalendarTask } from './types';\nimport { useTr } from '../../shared/hooks/useTr';\n\ninterface VibeTaskBlockProps {\n task: VibeCalendarTask;\n compact?: boolean;\n onTriggerNow?: (taskId: string) => void;\n onViewLogs: (task: VibeCalendarTask) => void;\n onViewDetail: (taskId: string) => void;\n}\n\nexport function VibeTaskBlock({\n task,\n compact = false,\n onTriggerNow,\n onViewLogs,\n onViewDetail,\n}: VibeTaskBlockProps) {\n const tr = useTr();\n const statusColor = STATUS_COLORS[task.status] || STATUS_COLORS.PENDING;\n const commandPreview = task.taskConfig.command\n ? task.taskConfig.command.length > 40\n ? task.taskConfig.command.slice(0, 40) + '...'\n : task.taskConfig.command\n : task.taskConfig.script\n ? 'Script'\n : 'File Operation';\n\n if (compact) {\n return (\n <button\n type=\"button\"\n onClick={() => onViewDetail(task.id)}\n className={`w-full text-left px-2 py-1 rounded text-xs truncate border ${statusColor} hover:opacity-80 transition-opacity`}\n title={task.title}\n >\n {task.title}\n </button>\n );\n }\n\n return (\n <div\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n (() => onViewDetail(task.id))();\n }\n }}\n className={`relative p-3 rounded-lg border ${statusColor} hover:opacity-90 transition-opacity cursor-pointer`}\n onClick={() => onViewDetail(task.id)}\n >\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex-1 min-w-0\">\n <h4 className=\"font-medium text-sm text-text-primary truncate\">{task.title}</h4>\n <p className=\"text-xs text-text-secondary mt-0.5 font-mono truncate\">{commandPreview}</p>\n <div className=\"flex items-center gap-2 mt-1.5\">\n {task.nextExecutionAt && (\n <span className=\"text-xs text-text-tertiary\">\n Next: {new Date(task.nextExecutionAt).toLocaleString()}\n </span>\n )}\n </div>\n </div>\n\n {/* Quick Actions */}\n <div className=\"flex items-center gap-1\" onClick={(e) => e.stopPropagation()}>\n {onTriggerNow && (\n <button\n type=\"button\"\n onClick={() => onTriggerNow(task.id)}\n className=\"p-1 rounded hover:bg-bg-secondary transition-colors\"\n title=\"Trigger Now\"\n >\n <Play size={14} />\n </button>\n )}\n <button\n type=\"button\"\n onClick={() => onViewLogs(task)}\n className=\"p-1 rounded hover:bg-bg-secondary transition-colors\"\n title=\"View Logs\"\n >\n <Eye size={14} />\n </button>\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;AAaA,SAAgB,EAAc,EAC5B,SACA,aAAU,IACV,iBACA,eACA,mBACqB;AACV,IAAO;CAClB,IAAM,IAAc,EAAc,EAAK,WAAW,EAAc,SAC1D,IAAiB,EAAK,WAAW,UACnC,EAAK,WAAW,QAAQ,SAAS,KAC/B,EAAK,WAAW,QAAQ,MAAM,GAAG,GAAG,GAAG,QACvC,EAAK,WAAW,UAClB,EAAK,WAAW,SACd,WACA;AAeN,QAbI,IAEA,kBAAC,UAAD;EACE,MAAK;EACL,eAAe,EAAa,EAAK,GAAG;EACpC,WAAW,8DAA8D,EAAY;EACrF,OAAO,EAAK;YAEX,EAAK;EACC,CAAA,GAKX,kBAAC,OAAD;EACE,MAAK;EACL,UAAU;EACV,YAAY,MAAM;AAChB,IAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,SACjC,EAAE,gBAAgB,EACX,EAAa,EAAK,GAAG;;EAGhC,WAAW,kCAAkC,EAAY;EACzD,eAAe,EAAa,EAAK,GAAG;YAEpC,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,MAAD;MAAI,WAAU;gBAAkD,EAAK;MAAW,CAAA;KAChF,kBAAC,KAAD;MAAG,WAAU;gBAAyD;MAAmB,CAAA;KACzF,kBAAC,OAAD;MAAK,WAAU;gBACZ,EAAK,mBACJ,kBAAC,QAAD;OAAM,WAAU;iBAAhB,CAA6C,UACpC,IAAI,KAAK,EAAK,gBAAgB,CAAC,gBAAgB,CACjD;;MAEL,CAAA;KACF;OAGN,kBAAC,OAAD;IAAK,WAAU;IAA0B,UAAU,MAAM,EAAE,iBAAiB;cAA5E,CACG,KACC,kBAAC,UAAD;KACE,MAAK;KACL,eAAe,EAAa,EAAK,GAAG;KACpC,WAAU;KACV,OAAM;eAEN,kBAAC,GAAD,EAAM,MAAM,IAAM,CAAA;KACX,CAAA,EAEX,kBAAC,UAAD;KACE,MAAK;KACL,eAAe,EAAW,EAAK;KAC/B,WAAU;KACV,OAAM;eAEN,kBAAC,GAAD,EAAK,MAAM,IAAM,CAAA;KACV,CAAA,CACL;MACF;;EACF,CAAA"}
1
+ {"version":3,"file":"VibeTaskBlock.js","names":[],"sources":["../../../src/components/vibecalendar/VibeTaskBlock.tsx"],"sourcesContent":["import { Play, Eye } from 'lucide-react';\nimport { STATUS_COLORS } from './types';\nimport type { VibeCalendarTask } from './types';\nimport { useTr } from '../../shared/hooks/useTr';\n\ninterface VibeTaskBlockProps {\n task: VibeCalendarTask;\n compact?: boolean;\n onTriggerNow?: (taskId: string) => void;\n onViewLogs: (task: VibeCalendarTask) => void;\n onViewDetail: (taskId: string) => void;\n}\n\nexport function VibeTaskBlock({\n task,\n compact = false,\n onTriggerNow,\n onViewLogs,\n onViewDetail,\n}: VibeTaskBlockProps) {\n const tr = useTr();\n const statusColor = STATUS_COLORS[task.status] || STATUS_COLORS.PENDING;\n const commandPreview = task.taskConfig.command\n ? task.taskConfig.command.length > 40\n ? task.taskConfig.command.slice(0, 40) + '...'\n : task.taskConfig.command\n : task.taskConfig.script\n ? 'Script'\n : 'File Operation';\n\n if (compact) {\n return (\n <button\n type=\"button\"\n onClick={() => onViewDetail(task.id)}\n className={`w-full text-left px-2 py-1 rounded text-xs truncate border ${statusColor} hover:opacity-80 transition-opacity`}\n title={task.title}\n >\n {task.title}\n </button>\n );\n }\n\n return (\n <div\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n (() => onViewDetail(task.id))();\n }\n }}\n className={`relative p-3 rounded-lg border ${statusColor} hover:opacity-90 transition-opacity cursor-pointer`}\n onClick={() => onViewDetail(task.id)}\n >\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex-1 min-w-0\">\n <h4 className=\"font-medium text-sm text-text-primary truncate\">{task.title}</h4>\n <p className=\"text-xs text-text-secondary mt-0.5 font-mono truncate\">{commandPreview}</p>\n <div className=\"flex items-center gap-2 mt-1.5\">\n {task.nextExecutionAt && (\n <span className=\"text-xs text-text-tertiary\">\n Next: {new Date(task.nextExecutionAt).toLocaleString()}\n </span>\n )}\n </div>\n </div>\n\n {/* Quick Actions */}\n <div className=\"flex items-center gap-1\" onClick={(e) => e.stopPropagation()}>\n {onTriggerNow && (\n <button\n type=\"button\"\n onClick={() => onTriggerNow(task.id)}\n className=\"p-1 rounded hover:bg-bg-surface transition-colors\"\n title=\"Trigger Now\"\n >\n <Play size={14} />\n </button>\n )}\n <button\n type=\"button\"\n onClick={() => onViewLogs(task)}\n className=\"p-1 rounded hover:bg-bg-surface transition-colors\"\n title=\"View Logs\"\n >\n <Eye size={14} />\n </button>\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;AAaA,SAAgB,EAAc,EAC5B,SACA,aAAU,IACV,iBACA,eACA,mBACqB;AACV,IAAO;CAClB,IAAM,IAAc,EAAc,EAAK,WAAW,EAAc,SAC1D,IAAiB,EAAK,WAAW,UACnC,EAAK,WAAW,QAAQ,SAAS,KAC/B,EAAK,WAAW,QAAQ,MAAM,GAAG,GAAG,GAAG,QACvC,EAAK,WAAW,UAClB,EAAK,WAAW,SACd,WACA;AAeN,QAbI,IAEA,kBAAC,UAAD;EACE,MAAK;EACL,eAAe,EAAa,EAAK,GAAG;EACpC,WAAW,8DAA8D,EAAY;EACrF,OAAO,EAAK;YAEX,EAAK;EACC,CAAA,GAKX,kBAAC,OAAD;EACE,MAAK;EACL,UAAU;EACV,YAAY,MAAM;AAChB,IAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,SACjC,EAAE,gBAAgB,EACX,EAAa,EAAK,GAAG;;EAGhC,WAAW,kCAAkC,EAAY;EACzD,eAAe,EAAa,EAAK,GAAG;YAEpC,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,MAAD;MAAI,WAAU;gBAAkD,EAAK;MAAW,CAAA;KAChF,kBAAC,KAAD;MAAG,WAAU;gBAAyD;MAAmB,CAAA;KACzF,kBAAC,OAAD;MAAK,WAAU;gBACZ,EAAK,mBACJ,kBAAC,QAAD;OAAM,WAAU;iBAAhB,CAA6C,UACpC,IAAI,KAAK,EAAK,gBAAgB,CAAC,gBAAgB,CACjD;;MAEL,CAAA;KACF;OAGN,kBAAC,OAAD;IAAK,WAAU;IAA0B,UAAU,MAAM,EAAE,iBAAiB;cAA5E,CACG,KACC,kBAAC,UAAD;KACE,MAAK;KACL,eAAe,EAAa,EAAK,GAAG;KACpC,WAAU;KACV,OAAM;eAEN,kBAAC,GAAD,EAAM,MAAM,IAAM,CAAA;KACX,CAAA,EAEX,kBAAC,UAAD;KACE,MAAK;KACL,eAAe,EAAW,EAAK;KAC/B,WAAU;KACV,OAAM;eAEN,kBAAC,GAAD,EAAK,MAAM,IAAM,CAAA;KACV,CAAA,CACL;MACF;;EACF,CAAA"}
@@ -1,15 +1,15 @@
1
1
  //#region src/components/vibecalendar/types.ts
2
2
  var e = {
3
- PENDING: "bg-status-info-bg/10 text-status-info-text border-status-info-border/30",
4
- RUNNING: "bg-status-warning-bg/10 text-status-warning-text border-status-warning-border/30",
5
- COMPLETED: "bg-status-success-bg/10 text-status-success-text border-status-success-border/30",
6
- FAILED: "bg-status-error-bg/10 text-status-error-text border-status-error-border/30",
3
+ PENDING: "bg-status-info-bg-subtle text-status-info-text border-status-info-border/30",
4
+ RUNNING: "bg-status-warning-bg-subtle text-status-warning-text border-status-warning-border/30",
5
+ COMPLETED: "bg-status-success-bg-subtle text-status-success-text border-status-success-border/30",
6
+ FAILED: "bg-status-error-bg-subtle text-status-error-text border-status-error-border/30",
7
7
  PAUSED: "bg-bg-muted/10 text-text-tertiary border-border-subtle/30",
8
8
  CANCELLED: "bg-bg-muted/10 text-text-tertiary border-border-subtle/30",
9
9
  DRAFT: "bg-bg-muted/10 text-text-tertiary border-border-subtle/30",
10
- TIMEOUT: "bg-status-warning-bg/10 text-status-warning-text border-status-warning-border/30",
10
+ TIMEOUT: "bg-status-warning-bg-subtle text-status-warning-text border-status-warning-border/30",
11
11
  MANUAL: "bg-accent-purple-subtle text-accent-purple border-accent-purple/30",
12
- SCHEDULE: "bg-status-info-bg/10 text-status-info-text border-status-info-border/30",
12
+ SCHEDULE: "bg-status-info-bg-subtle text-status-info-text border-status-info-border/30",
13
13
  ARCHIVED: "bg-bg-muted/10 text-text-tertiary border-border-subtle/30",
14
14
  DISABLED: "bg-bg-muted/10 text-text-tertiary border-border-subtle/30"
15
15
  };
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","names":[],"sources":["../../../src/components/vibecalendar/types.ts"],"sourcesContent":["export type CalendarViewMode = 'month' | 'week' | 'day' | 'agenda';\n\n// Where a calendar tile's data originally came from. Set by\n// client-side mappers ONLY — never present on the GraphQL response.\n// Page handlers branch on this to pick the matching subgraph for\n// mutations and the matching detail route. Omitted = default\n// `vibeCalendarTask` (rows from wspace-calendar-svc).\nexport type VibeCalendarTaskSource = 'scheduledJob' | 'vibeCalendarTask';\n\nexport interface VibeCalendarTask {\n id: string;\n /**\n * Set by client-side mappers (e.g. `jobToVibeCalendarTask`). Reading\n * code branches on this to pick the correct mutation/route. Omitted\n * for real VibeCalendarTask rows fetched from wspace-calendar-svc —\n * treat `undefined` as `'vibeCalendarTask'`.\n */\n source?: VibeCalendarTaskSource;\n title: string;\n description: string | null;\n calendarId: string;\n calendarEventId: string;\n agentId: string;\n taskConfig: {\n taskType: string;\n command?: string | null;\n script?: string | null;\n interpreter?: string | null;\n cwd?: string | null;\n env?: Record<string, string> | null;\n timeout?: number | null;\n webhookUrl?: string | null;\n webhookMethod?: string | null;\n webhookHeaders?: Record<string, string> | null;\n webhookAuthType?: string | null;\n webhookPayload?: Record<string, unknown> | null;\n };\n cronExpression: string | null;\n rrule: string | null;\n scheduledAt: string | null;\n timezone: string;\n nextExecutionAt: string | null;\n lastExecutedAt: string | null;\n status: string;\n totalExecutions: number;\n consecutiveFailures: number;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface VibeCalendarExecution {\n id: string;\n taskId: string;\n status: string;\n output: string | null;\n exitCode: number | null;\n webhookStatusCode: number | null;\n startedAt: string | null;\n completedAt: string | null;\n error: string | null;\n}\n\nexport interface CalendarOccurrence {\n task: VibeCalendarTask;\n occurrenceAt: string;\n isPast: boolean;\n execution: VibeCalendarExecution | null;\n}\n\nexport const STATUS_COLORS: Record<string, string> = {\n PENDING: 'bg-status-info-bg/10 text-status-info-text border-status-info-border/30',\n RUNNING: 'bg-status-warning-bg/10 text-status-warning-text border-status-warning-border/30',\n COMPLETED: 'bg-status-success-bg/10 text-status-success-text border-status-success-border/30',\n FAILED: 'bg-status-error-bg/10 text-status-error-text border-status-error-border/30',\n PAUSED: 'bg-bg-muted/10 text-text-tertiary border-border-subtle/30',\n CANCELLED: 'bg-bg-muted/10 text-text-tertiary border-border-subtle/30',\n DRAFT: 'bg-bg-muted/10 text-text-tertiary border-border-subtle/30',\n TIMEOUT: 'bg-status-warning-bg/10 text-status-warning-text border-status-warning-border/30',\n MANUAL: 'bg-accent-purple-subtle text-accent-purple border-accent-purple/30',\n SCHEDULE: 'bg-status-info-bg/10 text-status-info-text border-status-info-border/30',\n // Scheduler-svc JobStatus exclusives — without these the badge\n // silently falls back to PENDING styling on archived/disabled jobs.\n ARCHIVED: 'bg-bg-muted/10 text-text-tertiary border-border-subtle/30',\n DISABLED: 'bg-bg-muted/10 text-text-tertiary border-border-subtle/30',\n};\n"],"mappings":";AAqEA,IAAa,IAAwC;CACnD,SAAS;CACT,SAAS;CACT,WAAW;CACX,QAAQ;CACR,QAAQ;CACR,WAAW;CACX,OAAO;CACP,SAAS;CACT,QAAQ;CACR,UAAU;CAGV,UAAU;CACV,UAAU;CACX"}
1
+ {"version":3,"file":"types.js","names":[],"sources":["../../../src/components/vibecalendar/types.ts"],"sourcesContent":["export type CalendarViewMode = 'month' | 'week' | 'day' | 'agenda';\n\n// Where a calendar tile's data originally came from. Set by\n// client-side mappers ONLY — never present on the GraphQL response.\n// Page handlers branch on this to pick the matching subgraph for\n// mutations and the matching detail route. Omitted = default\n// `vibeCalendarTask` (rows from wspace-calendar-svc).\nexport type VibeCalendarTaskSource = 'scheduledJob' | 'vibeCalendarTask';\n\nexport interface VibeCalendarTask {\n id: string;\n /**\n * Set by client-side mappers (e.g. `jobToVibeCalendarTask`). Reading\n * code branches on this to pick the correct mutation/route. Omitted\n * for real VibeCalendarTask rows fetched from wspace-calendar-svc —\n * treat `undefined` as `'vibeCalendarTask'`.\n */\n source?: VibeCalendarTaskSource;\n title: string;\n description: string | null;\n calendarId: string;\n calendarEventId: string;\n agentId: string;\n taskConfig: {\n taskType: string;\n command?: string | null;\n script?: string | null;\n interpreter?: string | null;\n cwd?: string | null;\n env?: Record<string, string> | null;\n timeout?: number | null;\n webhookUrl?: string | null;\n webhookMethod?: string | null;\n webhookHeaders?: Record<string, string> | null;\n webhookAuthType?: string | null;\n webhookPayload?: Record<string, unknown> | null;\n };\n cronExpression: string | null;\n rrule: string | null;\n scheduledAt: string | null;\n timezone: string;\n nextExecutionAt: string | null;\n lastExecutedAt: string | null;\n status: string;\n totalExecutions: number;\n consecutiveFailures: number;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface VibeCalendarExecution {\n id: string;\n taskId: string;\n status: string;\n output: string | null;\n exitCode: number | null;\n webhookStatusCode: number | null;\n startedAt: string | null;\n completedAt: string | null;\n error: string | null;\n}\n\nexport interface CalendarOccurrence {\n task: VibeCalendarTask;\n occurrenceAt: string;\n isPast: boolean;\n execution: VibeCalendarExecution | null;\n}\n\nexport const STATUS_COLORS: Record<string, string> = {\n PENDING: 'bg-status-info-bg-subtle text-status-info-text border-status-info-border/30',\n RUNNING: 'bg-status-warning-bg-subtle text-status-warning-text border-status-warning-border/30',\n COMPLETED: 'bg-status-success-bg-subtle text-status-success-text border-status-success-border/30',\n FAILED: 'bg-status-error-bg-subtle text-status-error-text border-status-error-border/30',\n PAUSED: 'bg-bg-muted/10 text-text-tertiary border-border-subtle/30',\n CANCELLED: 'bg-bg-muted/10 text-text-tertiary border-border-subtle/30',\n DRAFT: 'bg-bg-muted/10 text-text-tertiary border-border-subtle/30',\n TIMEOUT: 'bg-status-warning-bg-subtle text-status-warning-text border-status-warning-border/30',\n MANUAL: 'bg-accent-purple-subtle text-accent-purple border-accent-purple/30',\n SCHEDULE: 'bg-status-info-bg-subtle text-status-info-text border-status-info-border/30',\n // Scheduler-svc JobStatus exclusives — without these the badge\n // silently falls back to PENDING styling on archived/disabled jobs.\n ARCHIVED: 'bg-bg-muted/10 text-text-tertiary border-border-subtle/30',\n DISABLED: 'bg-bg-muted/10 text-text-tertiary border-border-subtle/30',\n};\n"],"mappings":";AAqEA,IAAa,IAAwC;CACnD,SAAS;CACT,SAAS;CACT,WAAW;CACX,QAAQ;CACR,QAAQ;CACR,WAAW;CACX,OAAO;CACP,SAAS;CACT,QAAQ;CACR,UAAU;CAGV,UAAU;CACV,UAAU;CACX"}
@@ -158,7 +158,7 @@ var _ = ({ initialData: _, agents: v, onSubmit: y, onCancel: b, isLoading: x, ti
158
158
  A,
159
159
  z,
160
160
  y
161
- ]), Z = "w-full px-3 py-2 rounded-lg border border-border-default bg-bg-secondary text-text-primary focus:outline-none focus:ring-2 focus:ring-action-primary-bg", Q = "block text-sm font-medium text-text-secondary mb-1";
161
+ ]), Z = "w-full px-3 py-2 rounded-lg border border-border-default bg-bg-surface text-text-primary focus:outline-none focus:ring-2 focus:ring-action-primary-bg", Q = "block text-sm font-medium text-text-secondary mb-1";
162
162
  return /* @__PURE__ */ f("div", {
163
163
  className: "fixed inset-0 z-50 flex items-center justify-center bg-bg-overlay backdrop-blur-sm",
164
164
  children: /* @__PURE__ */ p("div", {
@@ -171,7 +171,7 @@ var _ = ({ initialData: _, agents: v, onSubmit: y, onCancel: b, isLoading: x, ti
171
171
  }), /* @__PURE__ */ f("button", {
172
172
  type: "button",
173
173
  onClick: b,
174
- className: "p-1 rounded hover:bg-bg-tertiary text-text-tertiary",
174
+ className: "p-1 rounded hover:bg-bg-sunken text-text-tertiary",
175
175
  children: /* @__PURE__ */ f(d, { size: 18 })
176
176
  })]
177
177
  }), /* @__PURE__ */ p("form", {
@@ -199,7 +199,7 @@ var _ = ({ initialData: _, agents: v, onSubmit: y, onCancel: b, isLoading: x, ti
199
199
  children: [D("vibecontrols.vibedeck.buttonForm.action", "Action"), " *"]
200
200
  }),
201
201
  V ? /* @__PURE__ */ p("div", {
202
- className: "flex items-center gap-2 px-3 py-2.5 rounded-lg border border-action-primary-bg/40 bg-bg-secondary",
202
+ className: "flex items-center gap-2 px-3 py-2.5 rounded-lg border border-[var(--color-accent-soft)] bg-bg-surface",
203
203
  children: [/* @__PURE__ */ p("div", {
204
204
  className: "flex-1 min-w-0",
205
205
  children: [/* @__PURE__ */ f("div", {
@@ -208,7 +208,7 @@ var _ = ({ initialData: _, agents: v, onSubmit: y, onCancel: b, isLoading: x, ti
208
208
  }), /* @__PURE__ */ p("div", {
209
209
  className: "text-xs text-text-tertiary flex items-center gap-1",
210
210
  children: [/* @__PURE__ */ f("span", {
211
- className: "inline-flex items-center px-1.5 py-0.5 rounded text-[10px] font-semibold bg-action-primary-bg/10 text-action-primary-bg",
211
+ className: "inline-flex items-center px-1.5 py-0.5 rounded text-[10px] font-semibold bg-[var(--color-accent-soft)] text-action-primary-bg",
212
212
  children: V.actionType
213
213
  }), V.command && /* @__PURE__ */ f("span", {
214
214
  className: "font-mono truncate",
@@ -218,7 +218,7 @@ var _ = ({ initialData: _, agents: v, onSubmit: y, onCancel: b, isLoading: x, ti
218
218
  }), /* @__PURE__ */ f("button", {
219
219
  type: "button",
220
220
  onClick: K,
221
- className: "p-1.5 rounded hover:bg-bg-tertiary text-text-tertiary hover:text-status-error-text",
221
+ className: "p-1.5 rounded hover:bg-bg-sunken text-text-tertiary hover:text-status-error-text",
222
222
  title: "Change action",
223
223
  children: /* @__PURE__ */ f(u, { size: 14 })
224
224
  })]
@@ -240,7 +240,7 @@ var _ = ({ initialData: _, agents: v, onSubmit: y, onCancel: b, isLoading: x, ti
240
240
  },
241
241
  onFocus: () => F(!0),
242
242
  onBlur: () => setTimeout(() => F(!1), 200),
243
- className: "w-full px-3 py-2 rounded-lg border border-border-default bg-bg-secondary text-text-primary text-sm focus:outline-none focus:ring-2 focus:ring-action-primary-bg",
243
+ className: "w-full px-3 py-2 rounded-lg border border-border-default bg-bg-surface text-text-primary text-sm focus:outline-none focus:ring-2 focus:ring-action-primary-bg",
244
244
  placeholder: D("vibecontrols.vibedeck.buttonForm.searchActions", "Search existing actions...")
245
245
  }), P && /* @__PURE__ */ f("div", {
246
246
  className: "absolute z-50 mt-1 w-full max-h-48 overflow-y-auto rounded-lg border border-border-default shadow-xl bg-bg-elevated",
@@ -251,7 +251,7 @@ var _ = ({ initialData: _, agents: v, onSubmit: y, onCancel: b, isLoading: x, ti
251
251
  type: "button",
252
252
  onMouseDown: (e) => e.preventDefault(),
253
253
  onClick: () => G(e),
254
- className: "w-full text-left px-3 py-2 hover:bg-bg-tertiary",
254
+ className: "w-full text-left px-3 py-2 hover:bg-bg-sunken",
255
255
  children: [/* @__PURE__ */ f("div", {
256
256
  className: "text-sm font-medium",
257
257
  children: e.displayName || e.name
@@ -274,7 +274,7 @@ var _ = ({ initialData: _, agents: v, onSubmit: y, onCancel: b, isLoading: x, ti
274
274
  })
275
275
  ] }),
276
276
  I && /* @__PURE__ */ p("div", {
277
- className: "p-4 rounded-lg bg-bg-secondary/50 border border-dashed border-border-default space-y-4",
277
+ className: "p-4 rounded-lg bg-bg-sunken border border-dashed border-border-default space-y-4",
278
278
  children: [
279
279
  /* @__PURE__ */ p("div", { children: [/* @__PURE__ */ f("label", {
280
280
  htmlFor: "vibedeckbuttonform-23",
@@ -412,7 +412,7 @@ var _ = ({ initialData: _, agents: v, onSubmit: y, onCancel: b, isLoading: x, ti
412
412
  children: [/* @__PURE__ */ f("button", {
413
413
  type: "button",
414
414
  onClick: b,
415
- className: "px-4 py-2 rounded-lg text-sm text-text-secondary hover:bg-bg-tertiary",
415
+ className: "px-4 py-2 rounded-lg text-sm text-text-secondary hover:bg-bg-sunken",
416
416
  children: D("vibecontrols.vibedeck.buttonForm.cancel", "Cancel")
417
417
  }), /* @__PURE__ */ f("button", {
418
418
  type: "submit",