@zendir/ui 0.5.0 → 0.6.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 (391) hide show
  1. package/CHANGELOG.md +419 -386
  2. package/README.md +640 -631
  3. package/dist/_virtual/_rolldown/runtime.js +13 -0
  4. package/dist/index.js +17 -221
  5. package/dist/react/3d/CesiumCaptureSource.d.ts +0 -1
  6. package/dist/react/3d/CesiumCaptureSource.js +364 -283
  7. package/dist/react/3d/CesiumCaptureSource.js.map +1 -1
  8. package/dist/react/3d/ZenSpace3D.d.ts +2 -3
  9. package/dist/react/3d/ZenSpace3D.js +1681 -1237
  10. package/dist/react/3d/ZenSpace3D.js.map +1 -1
  11. package/dist/react/3d/ZenSpace3DCesium.d.ts +0 -1
  12. package/dist/react/3d/ZenSpace3DCesium.js +513 -560
  13. package/dist/react/3d/ZenSpace3DCesium.js.map +1 -1
  14. package/dist/react/3d/ZenSpace3DShaders.js +61 -66
  15. package/dist/react/3d/ZenSpace3DShaders.js.map +1 -1
  16. package/dist/react/3d/ZenSpace3DTypes.d.ts +19 -20
  17. package/dist/react/3d/ZenSpace3DUtils.d.ts +0 -1
  18. package/dist/react/3d/ZenSpace3DUtils.js +37 -24
  19. package/dist/react/3d/ZenSpace3DUtils.js.map +1 -1
  20. package/dist/react/3d/capturePngAnalysis.js +42 -36
  21. package/dist/react/3d/capturePngAnalysis.js.map +1 -1
  22. package/dist/react/3d/index.d.ts +3 -3
  23. package/dist/react/3d/index.js +5 -53
  24. package/dist/react/3d/threeLoader.d.ts +1 -1
  25. package/dist/react/3d/threeLoader.js +23 -18
  26. package/dist/react/3d/threeLoader.js.map +1 -1
  27. package/dist/react/astro/ClassificationBanner.d.ts +2 -3
  28. package/dist/react/astro/ClassificationBanner.js +95 -79
  29. package/dist/react/astro/ClassificationBanner.js.map +1 -1
  30. package/dist/react/astro/GlobalStatusBar.d.ts +0 -1
  31. package/dist/react/astro/GlobalStatusBar.js +157 -163
  32. package/dist/react/astro/GlobalStatusBar.js.map +1 -1
  33. package/dist/react/astro/MissionClock.d.ts +7 -8
  34. package/dist/react/astro/MissionClock.js +377 -400
  35. package/dist/react/astro/MissionClock.js.map +1 -1
  36. package/dist/react/astro/MonitoringIcon.d.ts +1 -2
  37. package/dist/react/astro/MonitoringIcon.js +422 -358
  38. package/dist/react/astro/MonitoringIcon.js.map +1 -1
  39. package/dist/react/astro/Notification.d.ts +1 -2
  40. package/dist/react/astro/Notification.js +229 -126
  41. package/dist/react/astro/Notification.js.map +1 -1
  42. package/dist/react/astro/Progress.d.ts +0 -1
  43. package/dist/react/astro/Progress.js +199 -141
  44. package/dist/react/astro/Progress.js.map +1 -1
  45. package/dist/react/astro/SimulationControls.d.ts +3 -4
  46. package/dist/react/astro/SimulationControls.js +596 -650
  47. package/dist/react/astro/SimulationControls.js.map +1 -1
  48. package/dist/react/astro/StatusIndicator.d.ts +0 -1
  49. package/dist/react/astro/StatusIndicator.js +236 -170
  50. package/dist/react/astro/StatusIndicator.js.map +1 -1
  51. package/dist/react/astro/UnifiedTimeline.d.ts +9 -10
  52. package/dist/react/astro/UnifiedTimeline.js +2345 -2392
  53. package/dist/react/astro/UnifiedTimeline.js.map +1 -1
  54. package/dist/react/astro/index.d.ts +5 -5
  55. package/dist/react/astro/index.js +1 -25
  56. package/dist/react/cards/AccessCard.d.ts +0 -1
  57. package/dist/react/cards/AccessCard.js +471 -405
  58. package/dist/react/cards/AccessCard.js.map +1 -1
  59. package/dist/react/cards/OrbitCard.d.ts +0 -1
  60. package/dist/react/cards/OrbitCard.js +487 -364
  61. package/dist/react/cards/OrbitCard.js.map +1 -1
  62. package/dist/react/cards/SpacecraftCard.d.ts +0 -1
  63. package/dist/react/cards/SpacecraftCard.js +813 -925
  64. package/dist/react/cards/SpacecraftCard.js.map +1 -1
  65. package/dist/react/cards/TelemetryCard.d.ts +0 -1
  66. package/dist/react/cards/TelemetryCard.js +1055 -732
  67. package/dist/react/cards/TelemetryCard.js.map +1 -1
  68. package/dist/react/cards/TelemetryStreamCard.d.ts +0 -1
  69. package/dist/react/cards/TelemetryStreamCard.js +323 -297
  70. package/dist/react/cards/TelemetryStreamCard.js.map +1 -1
  71. package/dist/react/cards/index.d.ts +1 -1
  72. package/dist/react/cards/index.js +1 -8
  73. package/dist/react/charts/GroundTrackMap.d.ts +6 -7
  74. package/dist/react/charts/GroundTrackMap.js +1377 -1256
  75. package/dist/react/charts/GroundTrackMap.js.map +1 -1
  76. package/dist/react/charts/GroundTrackMapLeaflet.d.ts +1 -2
  77. package/dist/react/charts/GroundTrackMapLeaflet.js +1065 -987
  78. package/dist/react/charts/GroundTrackMapLeaflet.js.map +1 -1
  79. package/dist/react/charts/groundTrackMapLeafletTiles.js +34 -25
  80. package/dist/react/charts/groundTrackMapLeafletTiles.js.map +1 -1
  81. package/dist/react/charts/groundTrackMapLeafletUtils.js +70 -61
  82. package/dist/react/charts/groundTrackMapLeafletUtils.js.map +1 -1
  83. package/dist/react/charts/index.d.ts +1 -1
  84. package/dist/react/charts/index.js +7 -100
  85. package/dist/react/charts/unified/AstroChart.d.ts +1 -2
  86. package/dist/react/charts/unified/AstroChart.js +1331 -1411
  87. package/dist/react/charts/unified/AstroChart.js.map +1 -1
  88. package/dist/react/charts/unified/PowerOverviewChart.d.ts +3 -3
  89. package/dist/react/charts/unified/PowerOverviewChart.js +495 -478
  90. package/dist/react/charts/unified/PowerOverviewChart.js.map +1 -1
  91. package/dist/react/charts/unified/domain.d.ts +12 -13
  92. package/dist/react/charts/unified/domain.js +3999 -3145
  93. package/dist/react/charts/unified/domain.js.map +1 -1
  94. package/dist/react/charts/unified/generators.d.ts +3 -4
  95. package/dist/react/charts/unified/generators.js +561 -498
  96. package/dist/react/charts/unified/generators.js.map +1 -1
  97. package/dist/react/charts/unified/index.d.ts +1 -1
  98. package/dist/react/charts/unified/presets.d.ts +14 -15
  99. package/dist/react/charts/unified/presets.js +857 -994
  100. package/dist/react/charts/unified/presets.js.map +1 -1
  101. package/dist/react/charts/unified/sync.d.ts +2 -3
  102. package/dist/react/charts/unified/sync.js +229 -195
  103. package/dist/react/charts/unified/sync.js.map +1 -1
  104. package/dist/react/charts/unified/theme.d.ts +11 -12
  105. package/dist/react/charts/unified/theme.js +606 -642
  106. package/dist/react/charts/unified/theme.js.map +1 -1
  107. package/dist/react/charts/unified/types.d.ts +32 -33
  108. package/dist/react/charts/unified/useChartStream.d.ts +1 -2
  109. package/dist/react/charts/unified/useChartStream.js +203 -216
  110. package/dist/react/charts/unified/useChartStream.js.map +1 -1
  111. package/dist/react/chatgpt/AppCard.d.ts +1 -2
  112. package/dist/react/chatgpt/index.d.ts +7 -7
  113. package/dist/react/chatgpt/index.js +160 -139
  114. package/dist/react/chatgpt/index.js.map +1 -1
  115. package/dist/react/context/CategoryContext.d.ts +0 -1
  116. package/dist/react/context/CategoryContext.js +78 -29
  117. package/dist/react/context/CategoryContext.js.map +1 -1
  118. package/dist/react/context/DisplaySettingsContext.d.ts +1 -2
  119. package/dist/react/context/DisplaySettingsContext.js +205 -156
  120. package/dist/react/context/DisplaySettingsContext.js.map +1 -1
  121. package/dist/react/context/SpatialSelectionContext.d.ts +0 -1
  122. package/dist/react/context/SpatialSelectionContext.js +36 -7
  123. package/dist/react/context/SpatialSelectionContext.js.map +1 -1
  124. package/dist/react/core/data/DataTable.d.ts +3 -4
  125. package/dist/react/core/data/DataTable.js +473 -440
  126. package/dist/react/core/data/DataTable.js.map +1 -1
  127. package/dist/react/core/data/DataValue.d.ts +4 -5
  128. package/dist/react/core/data/DataValue.js +605 -571
  129. package/dist/react/core/data/DataValue.js.map +1 -1
  130. package/dist/react/core/data/propertyConfig.d.ts +1 -2
  131. package/dist/react/core/data/propertyConfig.js +446 -382
  132. package/dist/react/core/data/propertyConfig.js.map +1 -1
  133. package/dist/react/core/display/AstroIcon.d.ts +4 -5
  134. package/dist/react/core/display/AstroIcon.js +339 -429
  135. package/dist/react/core/display/AstroIcon.js.map +1 -1
  136. package/dist/react/core/display/Badge.d.ts +2 -3
  137. package/dist/react/core/display/Badge.js +131 -131
  138. package/dist/react/core/display/Badge.js.map +1 -1
  139. package/dist/react/core/display/CardHeader.d.ts +0 -1
  140. package/dist/react/core/display/CardHeader.js +398 -311
  141. package/dist/react/core/display/CardHeader.js.map +1 -1
  142. package/dist/react/core/display/Container.d.ts +2 -3
  143. package/dist/react/core/display/Container.js +640 -668
  144. package/dist/react/core/display/Container.js.map +1 -1
  145. package/dist/react/core/display/CopyButton.d.ts +1 -2
  146. package/dist/react/core/display/CopyButton.js +158 -101
  147. package/dist/react/core/display/CopyButton.js.map +1 -1
  148. package/dist/react/core/display/GlassCard.d.ts +3 -4
  149. package/dist/react/core/display/GlassCard.js +416 -369
  150. package/dist/react/core/display/GlassCard.js.map +1 -1
  151. package/dist/react/core/display/HeaderIconWithStatus.d.ts +0 -1
  152. package/dist/react/core/display/HeaderIconWithStatus.js +152 -152
  153. package/dist/react/core/display/HeaderIconWithStatus.js.map +1 -1
  154. package/dist/react/core/display/Icon.d.ts +2 -3
  155. package/dist/react/core/display/Icon.js +172 -143
  156. package/dist/react/core/display/Icon.js.map +1 -1
  157. package/dist/react/core/display/Typography.d.ts +24 -25
  158. package/dist/react/core/display/Typography.js +360 -178
  159. package/dist/react/core/display/Typography.js.map +1 -1
  160. package/dist/react/core/feedback/ConfirmDialog.d.ts +1 -2
  161. package/dist/react/core/feedback/ConfirmDialog.js +343 -304
  162. package/dist/react/core/feedback/ConfirmDialog.js.map +1 -1
  163. package/dist/react/core/feedback/Dialog.d.ts +2 -3
  164. package/dist/react/core/feedback/Dialog.js +189 -197
  165. package/dist/react/core/feedback/Dialog.js.map +1 -1
  166. package/dist/react/core/feedback/Toast.d.ts +2 -3
  167. package/dist/react/core/feedback/Toast.js +346 -207
  168. package/dist/react/core/feedback/Toast.js.map +1 -1
  169. package/dist/react/core/index.d.ts +26 -26
  170. package/dist/react/core/index.js +7 -119
  171. package/dist/react/core/inputs/Button.d.ts +2 -3
  172. package/dist/react/core/inputs/Button.js +281 -304
  173. package/dist/react/core/inputs/Button.js.map +1 -1
  174. package/dist/react/core/inputs/Checkbox.d.ts +2 -3
  175. package/dist/react/core/inputs/Checkbox.js +139 -127
  176. package/dist/react/core/inputs/Checkbox.js.map +1 -1
  177. package/dist/react/core/inputs/Input.d.ts +3 -4
  178. package/dist/react/core/inputs/Input.js +277 -285
  179. package/dist/react/core/inputs/Input.js.map +1 -1
  180. package/dist/react/core/inputs/LimitsBar.d.ts +1 -2
  181. package/dist/react/core/inputs/LimitsBar.js +271 -196
  182. package/dist/react/core/inputs/LimitsBar.js.map +1 -1
  183. package/dist/react/core/inputs/NumberInput.d.ts +2 -3
  184. package/dist/react/core/inputs/NumberInput.js +531 -503
  185. package/dist/react/core/inputs/NumberInput.js.map +1 -1
  186. package/dist/react/core/inputs/PinInput.d.ts +2 -3
  187. package/dist/react/core/inputs/PinInput.js +224 -207
  188. package/dist/react/core/inputs/PinInput.js.map +1 -1
  189. package/dist/react/core/inputs/Select.d.ts +1 -2
  190. package/dist/react/core/inputs/Select.js +298 -299
  191. package/dist/react/core/inputs/Select.js.map +1 -1
  192. package/dist/react/core/inputs/Toggle.d.ts +2 -3
  193. package/dist/react/core/inputs/Toggle.js +142 -148
  194. package/dist/react/core/inputs/Toggle.js.map +1 -1
  195. package/dist/react/core/layout/Box.d.ts +3 -4
  196. package/dist/react/core/layout/Box.js +118 -122
  197. package/dist/react/core/layout/Box.js.map +1 -1
  198. package/dist/react/core/layout/Center.d.ts +0 -1
  199. package/dist/react/core/layout/Center.js +45 -32
  200. package/dist/react/core/layout/Center.js.map +1 -1
  201. package/dist/react/core/layout/Divider.d.ts +1 -2
  202. package/dist/react/core/layout/Divider.js +112 -106
  203. package/dist/react/core/layout/Divider.js.map +1 -1
  204. package/dist/react/core/layout/Flex.d.ts +4 -5
  205. package/dist/react/core/layout/Flex.js +120 -124
  206. package/dist/react/core/layout/Flex.js.map +1 -1
  207. package/dist/react/core/layout/Grid.d.ts +5 -6
  208. package/dist/react/core/layout/Grid.js +131 -138
  209. package/dist/react/core/layout/Grid.js.map +1 -1
  210. package/dist/react/core/layout/Spacer.d.ts +0 -1
  211. package/dist/react/core/layout/Spacer.js +36 -29
  212. package/dist/react/core/layout/Spacer.js.map +1 -1
  213. package/dist/react/core/layout/Stack.d.ts +4 -5
  214. package/dist/react/core/layout/Stack.js +127 -70
  215. package/dist/react/core/layout/Stack.js.map +1 -1
  216. package/dist/react/core/layout/responsive.d.ts +1 -2
  217. package/dist/react/core/layout/responsive.js +25 -19
  218. package/dist/react/core/layout/responsive.js.map +1 -1
  219. package/dist/react/core/layout/useBreakpoint.d.ts +1 -1
  220. package/dist/react/core/layout/useBreakpoint.js +119 -66
  221. package/dist/react/core/layout/useBreakpoint.js.map +1 -1
  222. package/dist/react/core/navigation/AppBar.d.ts +1 -2
  223. package/dist/react/core/navigation/AppBar.js +827 -805
  224. package/dist/react/core/navigation/AppBar.js.map +1 -1
  225. package/dist/react/core/navigation/Pagination.d.ts +2 -3
  226. package/dist/react/core/navigation/Pagination.js +207 -187
  227. package/dist/react/core/navigation/Pagination.js.map +1 -1
  228. package/dist/react/core/navigation/SideNav.d.ts +5 -6
  229. package/dist/react/core/navigation/SideNav.js +855 -629
  230. package/dist/react/core/navigation/SideNav.js.map +1 -1
  231. package/dist/react/core/navigation/Tabs.d.ts +0 -1
  232. package/dist/react/core/navigation/Tabs.js +113 -119
  233. package/dist/react/core/navigation/Tabs.js.map +1 -1
  234. package/dist/react/core/overlays/Popover.d.ts +2 -3
  235. package/dist/react/core/overlays/Popover.js +303 -282
  236. package/dist/react/core/overlays/Popover.js.map +1 -1
  237. package/dist/react/core/overlays/SidePanel.d.ts +1 -2
  238. package/dist/react/core/overlays/SidePanel.js +217 -212
  239. package/dist/react/core/overlays/SidePanel.js.map +1 -1
  240. package/dist/react/core/overlays/Tooltip.d.ts +1 -2
  241. package/dist/react/core/overlays/Tooltip.js +170 -176
  242. package/dist/react/core/overlays/Tooltip.js.map +1 -1
  243. package/dist/react/core/widgets/ActivityPlanner.d.ts +0 -1
  244. package/dist/react/core/widgets/ActivityPlanner.js +855 -517
  245. package/dist/react/core/widgets/ActivityPlanner.js.map +1 -1
  246. package/dist/react/core/widgets/Capture.d.ts +2 -3
  247. package/dist/react/core/widgets/Capture.js +965 -779
  248. package/dist/react/core/widgets/Capture.js.map +1 -1
  249. package/dist/react/core/widgets/ChatPanel.d.ts +16 -17
  250. package/dist/react/core/widgets/ChatPanel.js +1734 -1034
  251. package/dist/react/core/widgets/ChatPanel.js.map +1 -1
  252. package/dist/react/core/widgets/ColorPickerPanel.d.ts +0 -1
  253. package/dist/react/core/widgets/ColorPickerPanel.js +298 -287
  254. package/dist/react/core/widgets/ColorPickerPanel.js.map +1 -1
  255. package/dist/react/core/widgets/CommandBuilder.d.ts +2 -3
  256. package/dist/react/core/widgets/CommandBuilder.js +624 -516
  257. package/dist/react/core/widgets/CommandBuilder.js.map +1 -1
  258. package/dist/react/core/widgets/ConnectionForm.d.ts +2 -3
  259. package/dist/react/core/widgets/ConnectionForm.js +528 -492
  260. package/dist/react/core/widgets/ConnectionForm.js.map +1 -1
  261. package/dist/react/core/widgets/FileExplorer.d.ts +3 -4
  262. package/dist/react/core/widgets/FileExplorer.js +617 -505
  263. package/dist/react/core/widgets/FileExplorer.js.map +1 -1
  264. package/dist/react/core/widgets/HexViewer.d.ts +2 -3
  265. package/dist/react/core/widgets/HexViewer.js +1353 -1091
  266. package/dist/react/core/widgets/HexViewer.js.map +1 -1
  267. package/dist/react/core/widgets/ImageFrame.d.ts +1 -2
  268. package/dist/react/core/widgets/ImageFrame.js +230 -193
  269. package/dist/react/core/widgets/ImageFrame.js.map +1 -1
  270. package/dist/react/core/widgets/ImageGallery.d.ts +2 -1
  271. package/dist/react/core/widgets/ImageGallery.js +380 -314
  272. package/dist/react/core/widgets/ImageGallery.js.map +1 -1
  273. package/dist/react/core/widgets/ImagePanel.d.ts +0 -1
  274. package/dist/react/core/widgets/ImagePanel.js +110 -101
  275. package/dist/react/core/widgets/ImagePanel.js.map +1 -1
  276. package/dist/react/core/widgets/LogViewer.d.ts +2 -3
  277. package/dist/react/core/widgets/LogViewer.js +711 -607
  278. package/dist/react/core/widgets/LogViewer.js.map +1 -1
  279. package/dist/react/core/widgets/MessageStream.d.ts +3 -4
  280. package/dist/react/core/widgets/MessageStream.js +514 -444
  281. package/dist/react/core/widgets/MessageStream.js.map +1 -1
  282. package/dist/react/core/widgets/MissionCalendar.d.ts +3 -4
  283. package/dist/react/core/widgets/MissionCalendar.js +1488 -1020
  284. package/dist/react/core/widgets/MissionCalendar.js.map +1 -1
  285. package/dist/react/core/widgets/PacketViewer.d.ts +2 -3
  286. package/dist/react/core/widgets/PacketViewer.js +550 -421
  287. package/dist/react/core/widgets/PacketViewer.js.map +1 -1
  288. package/dist/react/core/widgets/capture-placeholder.png.js +6 -5
  289. package/dist/react/core/widgets/capture-placeholder.png.js.map +1 -1
  290. package/dist/react/hooks/index.d.ts +5 -5
  291. package/dist/react/hooks/useAccessWindows.d.ts +0 -1
  292. package/dist/react/hooks/useCompactMode.d.ts +1 -1
  293. package/dist/react/hooks/useCompactMode.js +104 -58
  294. package/dist/react/hooks/useCompactMode.js.map +1 -1
  295. package/dist/react/hooks/useGroundTrackHistory.d.ts +0 -1
  296. package/dist/react/hooks/useSimulationScene.d.ts +1 -2
  297. package/dist/react/hooks/useSimulationScene.js +481 -374
  298. package/dist/react/hooks/useSimulationScene.js.map +1 -1
  299. package/dist/react/index.d.ts +3 -3
  300. package/dist/react/panels/LayerControlPanel.d.ts +1 -2
  301. package/dist/react/panels/LayerControlPanel.js +223 -180
  302. package/dist/react/panels/LayerControlPanel.js.map +1 -1
  303. package/dist/react/panels/ObjectInventoryPanel.d.ts +2 -3
  304. package/dist/react/panels/ObjectInventoryPanel.js +315 -250
  305. package/dist/react/panels/ObjectInventoryPanel.js.map +1 -1
  306. package/dist/react/panels/index.d.ts +1 -1
  307. package/dist/react/panels/index.js +1 -6
  308. package/dist/react/shared/ErrorBoundary.d.ts +1 -2
  309. package/dist/react/shared/ErrorBoundary.js +170 -139
  310. package/dist/react/shared/ErrorBoundary.js.map +1 -1
  311. package/dist/react/shared/Skeleton.d.ts +1 -2
  312. package/dist/react/shared/Skeleton.js +300 -301
  313. package/dist/react/shared/Skeleton.js.map +1 -1
  314. package/dist/react/theme/ThemeProvider.d.ts +2 -321
  315. package/dist/react/theme/ThemeProvider.js +313 -939
  316. package/dist/react/theme/ThemeProvider.js.map +1 -1
  317. package/dist/react/theme/cardAccent.d.ts +1 -2
  318. package/dist/react/theme/cardAccent.js +196 -126
  319. package/dist/react/theme/cardAccent.js.map +1 -1
  320. package/dist/react/theme/config.d.ts +0 -1
  321. package/dist/react/theme/config.js +47 -25
  322. package/dist/react/theme/config.js.map +1 -1
  323. package/dist/react/theme/index.d.ts +2 -2
  324. package/dist/react/theme/index.js +1 -16
  325. package/dist/react/theme/types.d.ts +332 -0
  326. package/dist/react/theme/types.js +39 -0
  327. package/dist/react/theme/types.js.map +1 -0
  328. package/dist/react/types.d.ts +8 -8
  329. package/dist/react/types.js +147 -47
  330. package/dist/react/types.js.map +1 -1
  331. package/dist/react/utils/categoryPalette.d.ts +0 -1
  332. package/dist/react/utils/categoryPalette.js +91 -102
  333. package/dist/react/utils/categoryPalette.js.map +1 -1
  334. package/dist/react/utils/index.d.ts +5 -5
  335. package/dist/react/utils/index.js +457 -371
  336. package/dist/react/utils/index.js.map +1 -1
  337. package/dist/react/visualizations/EclipseTimerCard.d.ts +0 -1
  338. package/dist/react/visualizations/LinkBudgetCard.d.ts +0 -1
  339. package/dist/react/visualizations/NavBallCard.d.ts +0 -1
  340. package/dist/react/visualizations/PropulsionCard.d.ts +1 -2
  341. package/dist/react/visualizations/SensorFootprintCard.d.ts +1 -2
  342. package/dist/react/visualizations/ThermalHeatmapCard.d.ts +0 -1
  343. package/dist/react/visualizations/index.d.ts +3 -3
  344. package/dist/react.d.ts +2 -1
  345. package/dist/react.js +17 -221
  346. package/dist/shaders/atmosphere.frag.js +6 -5
  347. package/dist/shaders/atmosphere.frag.js.map +1 -1
  348. package/dist/shaders/atmosphere.vert.js +6 -5
  349. package/dist/shaders/atmosphere.vert.js.map +1 -1
  350. package/dist/shaders/stars.frag.js +6 -5
  351. package/dist/shaders/stars.frag.js.map +1 -1
  352. package/dist/shaders/stars.vert.js +6 -5
  353. package/dist/shaders/stars.vert.js.map +1 -1
  354. package/dist/style.css +26 -3
  355. package/dist/tokens/core.d.ts +159 -0
  356. package/dist/tokens/core.js +144 -0
  357. package/dist/tokens/core.js.map +1 -0
  358. package/dist/tokens/css-vars.d.ts +213 -2
  359. package/dist/tokens/css-vars.js +590 -227
  360. package/dist/tokens/css-vars.js.map +1 -1
  361. package/dist/tokens/index.d.ts +31 -228
  362. package/dist/tokens/index.js +281 -366
  363. package/dist/tokens/index.js.map +1 -1
  364. package/dist/tokens/palettes/astro.d.ts +129 -0
  365. package/dist/tokens/palettes/astro.js +112 -0
  366. package/dist/tokens/palettes/astro.js.map +1 -0
  367. package/dist/tokens/palettes/index.d.ts +288 -0
  368. package/dist/tokens/palettes/index.js +35 -0
  369. package/dist/tokens/palettes/index.js.map +1 -0
  370. package/dist/tokens/palettes/tailwind.d.ts +324 -0
  371. package/dist/tokens/palettes/tailwind.js +201 -0
  372. package/dist/tokens/palettes/tailwind.js.map +1 -0
  373. package/dist/tokens/palettes/zendir.d.ts +126 -0
  374. package/dist/tokens/palettes/zendir.js +92 -0
  375. package/dist/tokens/palettes/zendir.js.map +1 -0
  376. package/dist/tokens/themes.d.ts +30 -0
  377. package/dist/tokens/themes.js +704 -0
  378. package/dist/tokens/themes.js.map +1 -0
  379. package/dist/tokens/tokens.css +533 -155
  380. package/dist/types/index.d.ts +2 -2
  381. package/package.json +310 -313
  382. package/dist/index.js.map +0 -1
  383. package/dist/react/3d/index.js.map +0 -1
  384. package/dist/react/astro/index.js.map +0 -1
  385. package/dist/react/cards/index.js.map +0 -1
  386. package/dist/react/charts/index.js.map +0 -1
  387. package/dist/react/core/index.js.map +0 -1
  388. package/dist/react/panels/index.js.map +0 -1
  389. package/dist/react/theme/astro-tokens.d.ts +0 -153
  390. package/dist/react/theme/index.js.map +0 -1
  391. package/dist/react.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ActivityPlanner.js","sources":["../../../../src/react/core/widgets/ActivityPlanner.tsx"],"sourcesContent":["/**\r\n * @zendir/ui - ActivityPlanner Component\r\n * \r\n * Activity scheduling and management panel. Creates, edits, and monitors\r\n * scheduled activities across timelines. Integrates with MissionCalendar\r\n * and Timeline components.\r\n * \r\n * Space Mission Features:\r\n * - Create/edit activities with command or script execution\r\n * - Drag-and-drop reorder within timeline\r\n * - Hazardous activity warnings (Astro UX)\r\n * - Activity lifecycle tracking (created → scheduled → started → completed)\r\n * - Overlap detection within a timeline\r\n * - Metadata recording (operator, environment, notes)\r\n * - Contact window awareness\r\n * - Batch scheduling\r\n * \r\n * @example\r\n * ```tsx\r\n * <ActivityPlanner\r\n * activities={activities}\r\n * timelines={timelines}\r\n * onActivityCreate={(a) => console.log('Create:', a)}\r\n * onActivityUpdate={(a) => console.log('Update:', a)}\r\n * />\r\n * ```\r\n */\r\n\r\nimport React, { useState, useMemo, useCallback, memo, useRef } from 'react';\r\nimport { useTheme } from '../../theme';\r\nimport type { CalendarEvent, CalendarTimeline, ActivityStatus, ActivityType } from './MissionCalendar';\r\n\r\n// =============================================================================\r\n// Types\r\n// =============================================================================\r\n\r\nexport interface ActivityFormData {\r\n title: string;\r\n type: ActivityType;\r\n start: string; // ISO string\r\n end: string; // ISO string\r\n timeline: string;\r\n description: string;\r\n command: string;\r\n script: string;\r\n hazardous: boolean;\r\n metadata: Record<string, string>;\r\n}\r\n\r\nexport interface ActivityPlannerProps {\r\n /** Activities to display */\r\n activities: CalendarEvent[];\r\n /** Available timelines */\r\n timelines: CalendarTimeline[];\r\n /** Currently selected date for scheduling */\r\n selectedDate?: Date;\r\n /** Height (default: 500) */\r\n height?: number | string;\r\n /** Title */\r\n title?: string;\r\n /** Read-only mode */\r\n readOnly?: boolean;\r\n /** Show overlap warnings */\r\n showOverlapWarning?: boolean;\r\n /** Called on create */\r\n onActivityCreate?: (activity: Partial<CalendarEvent>) => void;\r\n /** Called on update */\r\n onActivityUpdate?: (id: string, updates: Partial<CalendarEvent>) => void;\r\n /** Called on delete */\r\n onActivityDelete?: (id: string) => void;\r\n /** Called when requesting to view activity in calendar */\r\n onViewInCalendar?: (activity: CalendarEvent) => void;\r\n /** Called when requesting to view in timeline */\r\n onViewInTimeline?: (activity: CalendarEvent) => void;\r\n /** CSS class */\r\n className?: string;\r\n}\r\n\r\n// =============================================================================\r\n// Helpers\r\n// =============================================================================\r\n\r\n/**\r\n * Map activity status → Astro UX status color using tokens.\r\n * created/scheduled → standby (cyan)\r\n * started/completed → normal (green)\r\n * paused/stopped/disabled → caution (yellow)\r\n * error/failed/crashed → critical (red)\r\n */\r\nfunction getStatusColor(status?: ActivityStatus, tokens?: ReturnType<typeof useTheme>['tokens']): string {\r\n if (!status || !tokens) return tokens?.colors.text.muted ?? 'currentColor';\r\n switch (status) {\r\n case 'created': case 'scheduled': return tokens.colors.status.standby;\r\n case 'started': case 'completed': return tokens.colors.status.normal;\r\n case 'paused': case 'stopped': case 'disabled': return tokens.colors.status.caution;\r\n case 'error': case 'failed': case 'crashed': return tokens.colors.status.critical;\r\n }\r\n}\r\n\r\n/**\r\n * Return Astro UX status shape + contextual icon.\r\n * The leading character is the Astro status shape for the mapped level:\r\n * standby → ◯ (ring), normal → ● (filled circle),\r\n * caution → ■ (square), critical → ▼ (triangle down)\r\n * Followed by a contextual glyph for the specific activity state.\r\n */\r\nfunction getStatusIcon(status?: ActivityStatus): string {\r\n if (!status) return '◯';\r\n switch (status) {\r\n case 'created': return '◯'; // standby ring\r\n case 'scheduled': return '◯ ◉'; // standby ring + scheduled\r\n case 'started': return '● ▶'; // normal circle + play\r\n case 'completed': return '● ✓'; // normal circle + check\r\n case 'paused': return '■ ⏸'; // caution square + pause\r\n case 'stopped': return '■ ⏹'; // caution square + stop\r\n case 'disabled': return '■ ⊘'; // caution square + disabled\r\n case 'error': case 'failed': case 'crashed': return '▼'; // critical triangle down\r\n }\r\n}\r\n\r\nfunction formatDate(d: Date): string {\r\n return d.toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' });\r\n}\r\n\r\nfunction formatTime(d: Date): string {\r\n return d.toLocaleTimeString('en-US', { hour12: false, hour: '2-digit', minute: '2-digit', second: '2-digit' });\r\n}\r\n\r\nfunction checkOverlap(a: CalendarEvent, b: CalendarEvent): boolean {\r\n if (!a.end || !b.end) return false;\r\n if (a.timeline !== b.timeline) return false;\r\n return a.start < b.end && b.start < a.end;\r\n}\r\n\r\n// =============================================================================\r\n// Form Component\r\n// =============================================================================\r\n\r\nconst ActivityForm = memo(function ActivityForm({\r\n timelines, selectedDate, tokens, onSubmit, onCancel,\r\n}: {\r\n timelines: CalendarTimeline[];\r\n selectedDate?: Date;\r\n tokens: ReturnType<typeof useTheme>['tokens'];\r\n onSubmit: (data: ActivityFormData) => void;\r\n onCancel: () => void;\r\n}) {\r\n const now = selectedDate || new Date();\r\n const endDefault = new Date(now.getTime() + 3600000);\r\n\r\n const [form, setForm] = useState<ActivityFormData>({\r\n title: '', type: 'command',\r\n start: now.toISOString().slice(0, 16),\r\n end: endDefault.toISOString().slice(0, 16),\r\n timeline: timelines[0]?.id || '',\r\n description: '', command: '', script: '',\r\n hazardous: false, metadata: {},\r\n });\r\n const [metaKey, setMetaKey] = useState('');\r\n const [metaValue, setMetaValue] = useState('');\r\n\r\n const addMetadata = useCallback(() => {\r\n if (metaKey.trim()) {\r\n setForm(prev => ({ ...prev, metadata: { ...prev.metadata, [metaKey.trim()]: metaValue } }));\r\n setMetaKey('');\r\n setMetaValue('');\r\n }\r\n }, [metaKey, metaValue]);\r\n\r\n const inputStyle: React.CSSProperties = {\r\n background: tokens.colors.background.base,\r\n color: tokens.colors.text.primary,\r\n border: `1px solid ${tokens.colors.border.muted}`,\r\n borderRadius: tokens.borderRadius.md,\r\n padding: `${tokens.spacing.xs}px ${tokens.spacing.sm}px`,\r\n fontSize: tokens.typography.fontSize.xs,\r\n width: '100%',\r\n minHeight: 40,\r\n fontFamily: tokens.typography.fontFamily.primary,\r\n transition: 'all 150ms ease',\r\n };\r\n\r\n const labelStyle: React.CSSProperties = {\r\n fontSize: tokens.typography.fontSize.xxs, fontWeight: 500, color: tokens.colors.text.muted,\r\n textTransform: 'uppercase', marginBottom: 3, display: 'block',\r\n };\r\n\r\n return (\r\n <div style={{ padding: 12, display: 'flex', flexDirection: 'column', gap: 8 }}>\r\n <div style={{ display: 'grid', gridTemplateColumns: '1fr 120px', gap: 8 }}>\r\n <div>\r\n <label htmlFor=\"activity-title\" style={labelStyle}>Title</label>\r\n <input id=\"activity-title\" aria-label=\"Activity title\" style={inputStyle} value={form.title} onChange={e => setForm(p => ({ ...p, title: e.target.value }))} placeholder=\"Activity name\" />\r\n </div>\r\n <div>\r\n <label htmlFor=\"activity-type\" style={labelStyle}>Type</label>\r\n <select id=\"activity-type\" aria-label=\"Activity type\" style={inputStyle} value={form.type} onChange={e => setForm(p => ({ ...p, type: e.target.value as ActivityType }))}>\r\n <option value=\"command\">Command</option>\r\n <option value=\"script\">Script</option>\r\n <option value=\"reserve\">Reserve</option>\r\n <option value=\"contact\">Contact</option>\r\n <option value=\"note\">Note</option>\r\n <option value=\"metadata\">Metadata</option>\r\n </select>\r\n </div>\r\n </div>\r\n <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 8 }}>\r\n <div>\r\n <label htmlFor=\"activity-start-time\" style={labelStyle}>Start Time</label>\r\n <input id=\"activity-start-time\" aria-label=\"Start time\" type=\"datetime-local\" style={{ ...inputStyle, fontFamily: tokens.typography.fontFamily.mono }} value={form.start} onChange={e => setForm(p => ({ ...p, start: e.target.value }))} />\r\n </div>\r\n <div>\r\n <label htmlFor=\"activity-end-time\" style={labelStyle}>End Time</label>\r\n <input id=\"activity-end-time\" aria-label=\"End time\" type=\"datetime-local\" style={{ ...inputStyle, fontFamily: tokens.typography.fontFamily.mono }} value={form.end} onChange={e => setForm(p => ({ ...p, end: e.target.value }))} />\r\n </div>\r\n </div>\r\n {timelines.length > 0 && (\r\n <div>\r\n <label htmlFor=\"activity-timeline\" style={labelStyle}>Timeline</label>\r\n <select id=\"activity-timeline\" aria-label=\"Timeline\" style={inputStyle} value={form.timeline} onChange={e => setForm(p => ({ ...p, timeline: e.target.value }))}>\r\n {timelines.map(t => <option key={t.id} value={t.id}>{t.name}</option>)}\r\n </select>\r\n </div>\r\n )}\r\n {form.type === 'command' && (\r\n <div>\r\n <label htmlFor=\"activity-command\" style={labelStyle}>Command</label>\r\n <input id=\"activity-command\" aria-label=\"Command\" style={{ ...inputStyle, fontFamily: tokens.typography.fontFamily.mono }} value={form.command} onChange={e => setForm(p => ({ ...p, command: e.target.value }))} placeholder='cmd(\"TARGET COMMAND\")' />\r\n </div>\r\n )}\r\n {form.type === 'script' && (\r\n <div>\r\n <label htmlFor=\"activity-script\" style={labelStyle}>Script Path</label>\r\n <input id=\"activity-script\" aria-label=\"Script path\" style={{ ...inputStyle, fontFamily: tokens.typography.fontFamily.mono }} value={form.script} onChange={e => setForm(p => ({ ...p, script: e.target.value }))} placeholder=\"/scripts/ops/collect.rb\" />\r\n </div>\r\n )}\r\n <div>\r\n <label htmlFor=\"activity-description\" style={labelStyle}>Description</label>\r\n <textarea id=\"activity-description\" aria-label=\"Description\" style={{ ...inputStyle, minHeight: 48, resize: 'vertical' }} value={form.description} onChange={e => setForm(p => ({ ...p, description: e.target.value }))} placeholder=\"Notes...\" />\r\n </div>\r\n\r\n {/* Metadata KV */}\r\n <div>\r\n <div style={labelStyle}>Metadata</div>\r\n <div style={{ display: 'flex', gap: 4, marginBottom: 4 }}>\r\n <input aria-label=\"Metadata key\" style={{ ...inputStyle, flex: 1 }} value={metaKey} onChange={e => setMetaKey(e.target.value)} placeholder=\"Key\" />\r\n <input aria-label=\"Metadata value\" style={{ ...inputStyle, flex: 1 }} value={metaValue} onChange={e => setMetaValue(e.target.value)} placeholder=\"Value\" />\r\n <button onClick={addMetadata} style={{\r\n background: tokens.colors.interactive.default, color: tokens.colors.text.inverse, border: 'none',\r\n borderRadius: tokens.borderRadius.md, padding: `0 ${tokens.spacing.sm}px`, fontSize: tokens.typography.fontSize.xs, cursor: 'pointer',\r\n transition: 'all 150ms ease',\r\n }}>+</button>\r\n </div>\r\n {Object.keys(form.metadata).length > 0 && (\r\n <div style={{ display: 'flex', gap: 4, flexWrap: 'wrap' }}>\r\n {Object.entries(form.metadata).map(([k, v]) => (\r\n <span key={k} style={{\r\n fontSize: tokens.typography.fontSize.micro, background: tokens.colors.background.surface, padding: `2px 6px`,\r\n borderRadius: tokens.borderRadius.sm, display: 'flex', alignItems: 'center', gap: tokens.spacing.xs,\r\n }}>\r\n {k}: {v}\r\n <button\r\n type=\"button\"\r\n aria-label={`Remove metadata ${k}`}\r\n onClick={() => setForm(p => {\r\n const m = { ...p.metadata };\r\n delete m[k];\r\n return { ...p, metadata: m };\r\n })}\r\n style={{\r\n cursor: 'pointer',\r\n color: tokens.colors.status.critical,\r\n fontWeight: 500,\r\n border: 'none',\r\n background: 'transparent',\r\n padding: 0,\r\n lineHeight: 1,\r\n }}\r\n >\r\n ×\r\n </button>\r\n </span>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Hazardous toggle */}\r\n <label style={{ display: 'flex', alignItems: 'center', gap: 6, fontSize: tokens.typography.fontSize.xs, cursor: 'pointer' }}>\r\n <input aria-label=\"Hazardous activity\" type=\"checkbox\" checked={form.hazardous} onChange={e => setForm(p => ({ ...p, hazardous: e.target.checked }))} />\r\n <span style={{ color: form.hazardous ? tokens.colors.status.critical : tokens.colors.text.secondary }}>\r\n ⚠ Hazardous Activity\r\n </span>\r\n </label>\r\n\r\n {/* Buttons */}\r\n <div style={{ display: 'flex', gap: 6, justifyContent: 'flex-end', marginTop: 4 }}>\r\n <button onClick={onCancel} style={{\r\n background: 'transparent', color: tokens.colors.text.muted,\r\n border: `1px solid ${tokens.colors.border.muted}`,\r\n borderRadius: tokens.borderRadius.md, padding: `${tokens.spacing.xs}px 14px`, fontSize: tokens.typography.fontSize.xs, cursor: 'pointer',\r\n transition: 'all 150ms ease',\r\n }}>Cancel</button>\r\n <button onClick={() => onSubmit(form)} disabled={!form.title.trim()} style={{\r\n background: tokens.colors.interactive.default, color: tokens.colors.text.inverse,\r\n border: 'none', borderRadius: tokens.borderRadius.md, padding: `${tokens.spacing.xs}px 14px`, fontSize: tokens.typography.fontSize.xs,\r\n cursor: form.title.trim() ? 'pointer' : 'not-allowed', fontWeight: 500, opacity: form.title.trim() ? 1 : 0.5,\r\n transition: 'all 150ms ease',\r\n }}>Create Activity</button>\r\n </div>\r\n </div>\r\n );\r\n});\r\n\r\n// =============================================================================\r\n// Main Component\r\n// =============================================================================\r\n\r\nexport const ActivityPlanner = memo(function ActivityPlanner({\r\n activities,\r\n timelines,\r\n selectedDate,\r\n height = 500,\r\n title = 'Activity Planner',\r\n readOnly = false,\r\n showOverlapWarning = true,\r\n onActivityCreate,\r\n onActivityUpdate: _onActivityUpdate,\r\n onActivityDelete,\r\n onViewInCalendar,\r\n onViewInTimeline,\r\n className = '',\r\n}: ActivityPlannerProps): React.ReactElement {\r\n const { tokens, theme } = useTheme();\r\n const isTransparentTheme =\r\n theme === 'transparent' || theme === 'transparent-bold' || theme === 'transparent-minimal';\r\n const [showForm, setShowForm] = useState(false);\r\n const [filter, setFilter] = useState('');\r\n const [sortBy, setSortBy] = useState<'time' | 'status' | 'timeline'>('time');\r\n const listRef = useRef<HTMLDivElement>(null);\r\n\r\n // Overlap detection\r\n const overlaps = useMemo(() => {\r\n const pairs: [string, string][] = [];\r\n for (let i = 0; i < activities.length; i++) {\r\n for (let j = i + 1; j < activities.length; j++) {\r\n if (checkOverlap(activities[i], activities[j])) {\r\n pairs.push([activities[i].id, activities[j].id]);\r\n }\r\n }\r\n }\r\n return new Set(pairs.flat());\r\n }, [activities]);\r\n\r\n // Sort and filter\r\n const displayActivities = useMemo(() => {\r\n let list = [...activities];\r\n if (filter) {\r\n const lf = filter.toLowerCase();\r\n list = list.filter(a =>\r\n a.title.toLowerCase().includes(lf) ||\r\n a.description?.toLowerCase().includes(lf) ||\r\n a.timeline?.toLowerCase().includes(lf) ||\r\n a.command?.toLowerCase().includes(lf)\r\n );\r\n }\r\n switch (sortBy) {\r\n case 'time': list.sort((a, b) => a.start.getTime() - b.start.getTime()); break;\r\n case 'status': list.sort((a, b) => (a.status || '').localeCompare(b.status || '')); break;\r\n case 'timeline': list.sort((a, b) => (a.timeline || '').localeCompare(b.timeline || '')); break;\r\n }\r\n return list;\r\n }, [activities, filter, sortBy]);\r\n\r\n // Stats\r\n const stats = useMemo(() => ({\r\n total: activities.length,\r\n scheduled: activities.filter(a => a.status === 'scheduled' || a.status === 'created').length,\r\n running: activities.filter(a => a.status === 'started').length,\r\n completed: activities.filter(a => a.status === 'completed').length,\r\n errors: activities.filter(a => a.status === 'error' || a.status === 'failed' || a.status === 'crashed').length,\r\n }), [activities]);\r\n\r\n const handleCreate = useCallback((data: ActivityFormData) => {\r\n onActivityCreate?.({\r\n title: data.title,\r\n type: data.type,\r\n start: new Date(data.start),\r\n end: new Date(data.end),\r\n timeline: data.timeline,\r\n description: data.description,\r\n command: data.command || undefined,\r\n script: data.script || undefined,\r\n metadata: Object.keys(data.metadata).length > 0 ? data.metadata : undefined,\r\n status: 'created',\r\n });\r\n setShowForm(false);\r\n }, [onActivityCreate]);\r\n\r\n const panelPadX = tokens.spacing.md;\r\n const panelPadY = tokens.spacing.sm;\r\n\r\n return (\r\n <div\r\n className={`activity-planner ${className}`}\r\n style={{\r\n height: typeof height === 'number' ? height : undefined,\r\n background: tokens.colors.background.base,\r\n ...(tokens.colors.border.cardStyle ?? { border: `1px solid ${tokens.colors.border.muted}` }),\r\n borderRadius: tokens.borderRadius.lg, overflow: 'hidden',\r\n display: 'flex', flexDirection: 'column',\r\n fontFamily: tokens.typography.fontFamily.primary, color: tokens.colors.text.primary,\r\n backdropFilter: isTransparentTheme ? 'blur(10px)' : undefined,\r\n WebkitBackdropFilter: isTransparentTheme ? 'blur(10px)' : undefined,\r\n }}\r\n >\r\n {/* Header */}\r\n <div style={{\r\n padding: `${panelPadY}px ${panelPadX}px`,\r\n borderBottom: `1px solid ${tokens.colors.border.muted}`,\r\n background: tokens.colors.background.surface,\r\n backdropFilter: 'blur(8px)',\r\n display: 'flex', alignItems: 'center', justifyContent: 'space-between',\r\n }}>\r\n <div style={{ display: 'flex', alignItems: 'center', gap: tokens.spacing.sm }}>\r\n <span style={{ fontWeight: 500, fontSize: tokens.typography.fontSize.sm }}>{title}</span>\r\n <div style={{ display: 'flex', gap: 10, fontSize: tokens.typography.fontSize.xxs, color: tokens.colors.text.muted }}>\r\n <span>Scheduled {stats.scheduled}</span>\r\n <span style={{ color: tokens.colors.text.secondary }}>Running {stats.running}</span>\r\n <span style={{ color: tokens.colors.text.secondary }}>Completed {stats.completed}</span>\r\n {stats.errors > 0 && <span style={{ color: tokens.colors.status.critical }}>Errors {stats.errors}</span>}\r\n </div>\r\n </div>\r\n {!readOnly && (\r\n <button\r\n onClick={() => setShowForm(!showForm)}\r\n style={{\r\n background: showForm ? tokens.colors.status.critical + '22' : tokens.colors.interactive.default,\r\n color: showForm ? tokens.colors.status.critical : tokens.colors.text.inverse,\r\n border: 'none', borderRadius: tokens.borderRadius.md, padding: '3px 10px',\r\n fontSize: tokens.typography.fontSize.xs, fontWeight: 500, cursor: 'pointer',\r\n transition: 'all 150ms ease',\r\n }}\r\n >\r\n {showForm ? '✕ Cancel' : '+ New Activity'}\r\n </button>\r\n )}\r\n </div>\r\n\r\n {/* Create form */}\r\n {showForm && !readOnly && (\r\n <div style={{ borderBottom: `1px solid ${tokens.colors.border.muted}`, background: tokens.colors.background.surface + '88' }}>\r\n <ActivityForm\r\n timelines={timelines}\r\n selectedDate={selectedDate}\r\n tokens={tokens}\r\n onSubmit={handleCreate}\r\n onCancel={() => setShowForm(false)}\r\n />\r\n </div>\r\n )}\r\n\r\n {/* Search / Sort */}\r\n <div style={{\r\n padding: `${tokens.spacing.xs}px ${panelPadX}px`, display: 'flex', gap: 6, alignItems: 'center',\r\n borderBottom: `1px solid ${tokens.colors.border.muted}`,\r\n }}>\r\n <input\r\n value={filter}\r\n onChange={e => setFilter(e.target.value)}\r\n aria-label=\"Search activities\"\r\n placeholder=\"Search activities...\"\r\n style={{\r\n flex: 1, background: tokens.colors.background.surface,\r\n color: tokens.colors.text.primary,\r\n border: `1px solid ${tokens.colors.border.muted}`,\r\n borderRadius: tokens.borderRadius.md, padding: '3px 8px', fontSize: tokens.typography.fontSize.xxs,\r\n fontFamily: tokens.typography.fontFamily.primary,\r\n transition: 'all 150ms ease',\r\n }}\r\n />\r\n <select\r\n value={sortBy}\r\n onChange={e => setSortBy(e.target.value as 'time' | 'status' | 'timeline')}\r\n aria-label=\"Sort activities\"\r\n style={{\r\n background: tokens.colors.background.surface,\r\n color: tokens.colors.text.secondary,\r\n border: `1px solid ${tokens.colors.border.muted}`,\r\n borderRadius: tokens.borderRadius.md, padding: '3px 6px', fontSize: tokens.typography.fontSize.xxs,\r\n transition: 'all 150ms ease',\r\n }}\r\n >\r\n <option value=\"time\">Sort: Time</option>\r\n <option value=\"status\">Sort: Status</option>\r\n <option value=\"timeline\">Sort: Timeline</option>\r\n </select>\r\n </div>\r\n\r\n {/* Activity list */}\r\n <div ref={listRef} style={{ flex: 1, overflow: 'auto', padding: 8 }}>\r\n {displayActivities.length === 0 ? (\r\n <div style={{ textAlign: 'center', color: tokens.colors.text.muted, padding: 40, fontSize: tokens.typography.fontSize.xs }}>\r\n {filter ? 'No matching activities' : 'No activities scheduled'}\r\n </div>\r\n ) : (\r\n <div style={{ display: 'flex', flexDirection: 'column', gap: 4 }}>\r\n {displayActivities.map(a => {\r\n const color = a.color || getStatusColor(a.status, tokens);\r\n const hasOverlap = overlaps.has(a.id);\r\n return (\r\n <div\r\n key={a.id}\r\n style={{\r\n display: 'grid', gridTemplateColumns: '24px 1fr auto',\r\n alignItems: 'center', gap: tokens.spacing.sm,\r\n padding: '6px 10px',\r\n background: hasOverlap ? `${tokens.colors.status.caution}10` : `${color}08`,\r\n borderLeft: `3px solid ${color}`,\r\n borderRadius: tokens.borderRadius.md, fontSize: tokens.typography.fontSize.xs, cursor: 'pointer',\r\n border: hasOverlap && showOverlapWarning ? `1px solid ${tokens.colors.status.caution}44` : undefined,\r\n transition: 'all 150ms ease',\r\n }}\r\n >\r\n {/* Status icon */}\r\n <div style={{ textAlign: 'center' }}>\r\n <span style={{ color, fontSize: tokens.typography.fontSize.sm, fontWeight: 500 }}>{getStatusIcon(a.status)}</span>\r\n </div>\r\n {/* Info */}\r\n <div style={{ overflow: 'hidden' }}>\r\n <div style={{ display: 'flex', alignItems: 'center', gap: 6, marginBottom: 2 }}>\r\n <span style={{ fontWeight: 500, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>\r\n {a.title}\r\n </span>\r\n {a.timeline && (\r\n <span style={{\r\n fontSize: tokens.typography.fontSize.micro, background: tokens.colors.background.surface,\r\n padding: `0 ${tokens.spacing.xs}px`, borderRadius: tokens.borderRadius.sm, color: tokens.colors.text.muted,\r\n }}>{a.timeline}</span>\r\n )}\r\n {hasOverlap && showOverlapWarning && (\r\n <span style={{ fontSize: tokens.typography.fontSize.micro, color: tokens.colors.status.caution, fontWeight: 500 }}>⚠ OVERLAP</span>\r\n )}\r\n </div>\r\n <div style={{ fontSize: tokens.typography.fontSize.micro, fontFamily: tokens.typography.fontFamily.mono, color: tokens.colors.text.muted }}>\r\n {formatDate(a.start)} {formatTime(a.start)}\r\n {a.end ? ` → ${formatTime(a.end)}` : ''}\r\n </div>\r\n </div>\r\n {/* Actions */}\r\n <div style={{ display: 'flex', gap: 4 }}>\r\n {onViewInCalendar && (\r\n <button aria-label={`View ${a.title} in calendar`} onClick={() => onViewInCalendar(a)} style={actionBtnStyle(tokens)} title=\"View in Calendar\">Calendar</button>\r\n )}\r\n {onViewInTimeline && (\r\n <button aria-label={`View ${a.title} in timeline`} onClick={() => onViewInTimeline(a)} style={actionBtnStyle(tokens)} title=\"View in Timeline\">Timeline</button>\r\n )}\r\n {!readOnly && onActivityDelete && (\r\n <button aria-label={`Delete ${a.title}`} onClick={() => onActivityDelete(a.id)} style={{ ...actionBtnStyle(tokens), color: tokens.colors.status.critical }} title=\"Delete\">Delete</button>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Footer */}\r\n <div style={{\r\n padding: `${tokens.spacing.xs}px ${panelPadX}px`,\r\n borderTop: `1px solid ${tokens.colors.border.muted}`,\r\n background: tokens.colors.background.surface,\r\n fontSize: tokens.typography.fontSize.micro, color: tokens.colors.text.muted,\r\n display: 'flex', justifyContent: 'space-between',\r\n }}>\r\n <span>{displayActivities.length} / {activities.length} activities</span>\r\n {overlaps.size > 0 && showOverlapWarning && (\r\n <span style={{ color: tokens.colors.status.caution }}>⚠ {overlaps.size} overlapping activities</span>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n});\r\n\r\nfunction actionBtnStyle(tokens: ReturnType<typeof useTheme>['tokens']): React.CSSProperties {\r\n return {\r\n background: 'transparent', border: `1px solid ${tokens.colors.border.muted}`,\r\n borderRadius: tokens.borderRadius.sm, padding: `2px ${tokens.spacing.xs}px`, fontSize: tokens.typography.fontSize.xxs, cursor: 'pointer',\r\n lineHeight: 1,\r\n transition: 'all 150ms ease',\r\n };\r\n}\r\n\r\nexport default ActivityPlanner;\r\n"],"names":["ActivityForm","ActivityPlanner"],"mappings":"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"}
1
+ {"version":3,"file":"ActivityPlanner.js","names":[],"sources":["../../../../src/react/core/widgets/ActivityPlanner.tsx"],"sourcesContent":["/**\r\n * @zendir/ui - ActivityPlanner Component\r\n *\r\n * Activity scheduling and management panel. Creates, edits, and monitors\r\n * scheduled activities across timelines. Integrates with MissionCalendar\r\n * and Timeline components.\r\n *\r\n * Space Mission Features:\r\n * - Create/edit activities with command or script execution\r\n * - Drag-and-drop reorder within timeline\r\n * - Hazardous activity warnings (Astro UX)\r\n * - Activity lifecycle tracking (created → scheduled → started → completed)\r\n * - Overlap detection within a timeline\r\n * - Metadata recording (operator, environment, notes)\r\n * - Contact window awareness\r\n * - Batch scheduling\r\n *\r\n * @example\r\n * ```tsx\r\n * <ActivityPlanner\r\n * activities={activities}\r\n * timelines={timelines}\r\n * onActivityCreate={(a) => console.log('Create:', a)}\r\n * onActivityUpdate={(a) => console.log('Update:', a)}\r\n * />\r\n * ```\r\n */\r\n\r\nimport React, { useState, useMemo, useCallback, memo, useRef } from \"react\";\r\nimport { useTheme } from \"../../theme\";\r\nimport type {\r\n CalendarEvent,\r\n CalendarTimeline,\r\n ActivityStatus,\r\n ActivityType,\r\n} from \"./MissionCalendar\";\r\n\r\n// =============================================================================\r\n// Types\r\n// =============================================================================\r\n\r\nexport interface ActivityFormData {\r\n title: string;\r\n type: ActivityType;\r\n start: string; // ISO string\r\n end: string; // ISO string\r\n timeline: string;\r\n description: string;\r\n command: string;\r\n script: string;\r\n hazardous: boolean;\r\n metadata: Record<string, string>;\r\n}\r\n\r\nexport interface ActivityPlannerProps {\r\n /** Activities to display */\r\n activities: CalendarEvent[];\r\n /** Available timelines */\r\n timelines: CalendarTimeline[];\r\n /** Currently selected date for scheduling */\r\n selectedDate?: Date;\r\n /** Height (default: 500) */\r\n height?: number | string;\r\n /** Title */\r\n title?: string;\r\n /** Read-only mode */\r\n readOnly?: boolean;\r\n /** Show overlap warnings */\r\n showOverlapWarning?: boolean;\r\n /** Called on create */\r\n onActivityCreate?: (activity: Partial<CalendarEvent>) => void;\r\n /** Called on update */\r\n onActivityUpdate?: (id: string, updates: Partial<CalendarEvent>) => void;\r\n /** Called on delete */\r\n onActivityDelete?: (id: string) => void;\r\n /** Called when requesting to view activity in calendar */\r\n onViewInCalendar?: (activity: CalendarEvent) => void;\r\n /** Called when requesting to view in timeline */\r\n onViewInTimeline?: (activity: CalendarEvent) => void;\r\n /** CSS class */\r\n className?: string;\r\n}\r\n\r\n// =============================================================================\r\n// Helpers\r\n// =============================================================================\r\n\r\n/**\r\n * Map activity status → Astro UX status color using tokens.\r\n * created/scheduled → standby (cyan)\r\n * started/completed → normal (green)\r\n * paused/stopped/disabled → caution (yellow)\r\n * error/failed/crashed → critical (red)\r\n */\r\nfunction getStatusColor(\r\n status?: ActivityStatus,\r\n tokens?: ReturnType<typeof useTheme>[\"tokens\"],\r\n): string {\r\n if (!status || !tokens) return tokens?.colors.text.muted ?? \"currentColor\";\r\n switch (status) {\r\n case \"created\":\r\n case \"scheduled\":\r\n return tokens.colors.status.standby;\r\n case \"started\":\r\n case \"completed\":\r\n return tokens.colors.status.normal;\r\n case \"paused\":\r\n case \"stopped\":\r\n case \"disabled\":\r\n return tokens.colors.status.caution;\r\n case \"error\":\r\n case \"failed\":\r\n case \"crashed\":\r\n return tokens.colors.status.critical;\r\n }\r\n}\r\n\r\n/**\r\n * Return Astro UX status shape + contextual icon.\r\n * The leading character is the Astro status shape for the mapped level:\r\n * standby → ◯ (ring), normal → ● (filled circle),\r\n * caution → ■ (square), critical → ▼ (triangle down)\r\n * Followed by a contextual glyph for the specific activity state.\r\n */\r\nfunction getStatusIcon(status?: ActivityStatus): string {\r\n if (!status) return \"◯\";\r\n switch (status) {\r\n case \"created\":\r\n return \"◯\"; // standby ring\r\n case \"scheduled\":\r\n return \"◯ ◉\"; // standby ring + scheduled\r\n case \"started\":\r\n return \"● ▶\"; // normal circle + play\r\n case \"completed\":\r\n return \"● ✓\"; // normal circle + check\r\n case \"paused\":\r\n return \"■ ⏸\"; // caution square + pause\r\n case \"stopped\":\r\n return \"■ ⏹\"; // caution square + stop\r\n case \"disabled\":\r\n return \"■ ⊘\"; // caution square + disabled\r\n case \"error\":\r\n case \"failed\":\r\n case \"crashed\":\r\n return \"▼\"; // critical triangle down\r\n }\r\n}\r\n\r\nfunction formatDate(d: Date): string {\r\n return d.toLocaleDateString(\"en-US\", {\r\n month: \"short\",\r\n day: \"numeric\",\r\n year: \"numeric\",\r\n });\r\n}\r\n\r\nfunction formatTime(d: Date): string {\r\n return d.toLocaleTimeString(\"en-US\", {\r\n hour12: false,\r\n hour: \"2-digit\",\r\n minute: \"2-digit\",\r\n second: \"2-digit\",\r\n });\r\n}\r\n\r\nfunction checkOverlap(a: CalendarEvent, b: CalendarEvent): boolean {\r\n if (!a.end || !b.end) return false;\r\n if (a.timeline !== b.timeline) return false;\r\n return a.start < b.end && b.start < a.end;\r\n}\r\n\r\n// =============================================================================\r\n// Form Component\r\n// =============================================================================\r\n\r\nconst ActivityForm = memo(function ActivityForm({\r\n timelines,\r\n selectedDate,\r\n tokens,\r\n onSubmit,\r\n onCancel,\r\n}: {\r\n timelines: CalendarTimeline[];\r\n selectedDate?: Date;\r\n tokens: ReturnType<typeof useTheme>[\"tokens\"];\r\n onSubmit: (data: ActivityFormData) => void;\r\n onCancel: () => void;\r\n}) {\r\n const now = selectedDate || new Date();\r\n const endDefault = new Date(now.getTime() + 3600000);\r\n\r\n const [form, setForm] = useState<ActivityFormData>({\r\n title: \"\",\r\n type: \"command\",\r\n start: now.toISOString().slice(0, 16),\r\n end: endDefault.toISOString().slice(0, 16),\r\n timeline: timelines[0]?.id || \"\",\r\n description: \"\",\r\n command: \"\",\r\n script: \"\",\r\n hazardous: false,\r\n metadata: {},\r\n });\r\n const [metaKey, setMetaKey] = useState(\"\");\r\n const [metaValue, setMetaValue] = useState(\"\");\r\n\r\n const addMetadata = useCallback(() => {\r\n if (metaKey.trim()) {\r\n setForm((prev) => ({\r\n ...prev,\r\n metadata: { ...prev.metadata, [metaKey.trim()]: metaValue },\r\n }));\r\n setMetaKey(\"\");\r\n setMetaValue(\"\");\r\n }\r\n }, [metaKey, metaValue]);\r\n\r\n const inputStyle: React.CSSProperties = {\r\n background: tokens.colors.background.base,\r\n color: tokens.colors.text.primary,\r\n border: `1px solid ${tokens.colors.border.muted}`,\r\n borderRadius: tokens.borderRadius.md,\r\n padding: `${tokens.spacing.xs}px ${tokens.spacing.sm}px`,\r\n fontSize: tokens.typography.fontSize.xs,\r\n width: \"100%\",\r\n minHeight: 40,\r\n fontFamily: tokens.typography.fontFamily.primary,\r\n transition: \"all 150ms ease\",\r\n };\r\n\r\n const labelStyle: React.CSSProperties = {\r\n fontSize: tokens.typography.fontSize.xxs,\r\n fontWeight: 500,\r\n color: tokens.colors.text.muted,\r\n textTransform: \"uppercase\",\r\n marginBottom: 3,\r\n display: \"block\",\r\n };\r\n\r\n return (\r\n <div\r\n style={{ padding: 12, display: \"flex\", flexDirection: \"column\", gap: 8 }}\r\n >\r\n <div\r\n style={{ display: \"grid\", gridTemplateColumns: \"1fr 120px\", gap: 8 }}\r\n >\r\n <div>\r\n <label htmlFor=\"activity-title\" style={labelStyle}>\r\n Title\r\n </label>\r\n <input\r\n id=\"activity-title\"\r\n aria-label=\"Activity title\"\r\n style={inputStyle}\r\n value={form.title}\r\n onChange={(e) => setForm((p) => ({ ...p, title: e.target.value }))}\r\n placeholder=\"Activity name\"\r\n />\r\n </div>\r\n <div>\r\n <label htmlFor=\"activity-type\" style={labelStyle}>\r\n Type\r\n </label>\r\n <select\r\n id=\"activity-type\"\r\n aria-label=\"Activity type\"\r\n style={inputStyle}\r\n value={form.type}\r\n onChange={(e) =>\r\n setForm((p) => ({ ...p, type: e.target.value as ActivityType }))\r\n }\r\n >\r\n <option value=\"command\">Command</option>\r\n <option value=\"script\">Script</option>\r\n <option value=\"reserve\">Reserve</option>\r\n <option value=\"contact\">Contact</option>\r\n <option value=\"note\">Note</option>\r\n <option value=\"metadata\">Metadata</option>\r\n </select>\r\n </div>\r\n </div>\r\n <div style={{ display: \"grid\", gridTemplateColumns: \"1fr 1fr\", gap: 8 }}>\r\n <div>\r\n <label htmlFor=\"activity-start-time\" style={labelStyle}>\r\n Start Time\r\n </label>\r\n <input\r\n id=\"activity-start-time\"\r\n aria-label=\"Start time\"\r\n type=\"datetime-local\"\r\n style={{\r\n ...inputStyle,\r\n fontFamily: tokens.typography.fontFamily.mono,\r\n }}\r\n value={form.start}\r\n onChange={(e) => setForm((p) => ({ ...p, start: e.target.value }))}\r\n />\r\n </div>\r\n <div>\r\n <label htmlFor=\"activity-end-time\" style={labelStyle}>\r\n End Time\r\n </label>\r\n <input\r\n id=\"activity-end-time\"\r\n aria-label=\"End time\"\r\n type=\"datetime-local\"\r\n style={{\r\n ...inputStyle,\r\n fontFamily: tokens.typography.fontFamily.mono,\r\n }}\r\n value={form.end}\r\n onChange={(e) => setForm((p) => ({ ...p, end: e.target.value }))}\r\n />\r\n </div>\r\n </div>\r\n {timelines.length > 0 && (\r\n <div>\r\n <label htmlFor=\"activity-timeline\" style={labelStyle}>\r\n Timeline\r\n </label>\r\n <select\r\n id=\"activity-timeline\"\r\n aria-label=\"Timeline\"\r\n style={inputStyle}\r\n value={form.timeline}\r\n onChange={(e) =>\r\n setForm((p) => ({ ...p, timeline: e.target.value }))\r\n }\r\n >\r\n {timelines.map((t) => (\r\n <option key={t.id} value={t.id}>\r\n {t.name}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n )}\r\n {form.type === \"command\" && (\r\n <div>\r\n <label htmlFor=\"activity-command\" style={labelStyle}>\r\n Command\r\n </label>\r\n <input\r\n id=\"activity-command\"\r\n aria-label=\"Command\"\r\n style={{\r\n ...inputStyle,\r\n fontFamily: tokens.typography.fontFamily.mono,\r\n }}\r\n value={form.command}\r\n onChange={(e) =>\r\n setForm((p) => ({ ...p, command: e.target.value }))\r\n }\r\n placeholder='cmd(\"TARGET COMMAND\")'\r\n />\r\n </div>\r\n )}\r\n {form.type === \"script\" && (\r\n <div>\r\n <label htmlFor=\"activity-script\" style={labelStyle}>\r\n Script Path\r\n </label>\r\n <input\r\n id=\"activity-script\"\r\n aria-label=\"Script path\"\r\n style={{\r\n ...inputStyle,\r\n fontFamily: tokens.typography.fontFamily.mono,\r\n }}\r\n value={form.script}\r\n onChange={(e) => setForm((p) => ({ ...p, script: e.target.value }))}\r\n placeholder=\"/scripts/ops/collect.rb\"\r\n />\r\n </div>\r\n )}\r\n <div>\r\n <label htmlFor=\"activity-description\" style={labelStyle}>\r\n Description\r\n </label>\r\n <textarea\r\n id=\"activity-description\"\r\n aria-label=\"Description\"\r\n style={{ ...inputStyle, minHeight: 48, resize: \"vertical\" }}\r\n value={form.description}\r\n onChange={(e) =>\r\n setForm((p) => ({ ...p, description: e.target.value }))\r\n }\r\n placeholder=\"Notes...\"\r\n />\r\n </div>\r\n\r\n {/* Metadata KV */}\r\n <div>\r\n <div style={labelStyle}>Metadata</div>\r\n <div style={{ display: \"flex\", gap: 4, marginBottom: 4 }}>\r\n <input\r\n aria-label=\"Metadata key\"\r\n style={{ ...inputStyle, flex: 1 }}\r\n value={metaKey}\r\n onChange={(e) => setMetaKey(e.target.value)}\r\n placeholder=\"Key\"\r\n />\r\n <input\r\n aria-label=\"Metadata value\"\r\n style={{ ...inputStyle, flex: 1 }}\r\n value={metaValue}\r\n onChange={(e) => setMetaValue(e.target.value)}\r\n placeholder=\"Value\"\r\n />\r\n <button\r\n onClick={addMetadata}\r\n style={{\r\n background: tokens.colors.interactive.default,\r\n color: tokens.colors.text.inverse,\r\n border: \"none\",\r\n borderRadius: tokens.borderRadius.md,\r\n padding: `0 ${tokens.spacing.sm}px`,\r\n fontSize: tokens.typography.fontSize.xs,\r\n cursor: \"pointer\",\r\n transition: \"all 150ms ease\",\r\n }}\r\n >\r\n +\r\n </button>\r\n </div>\r\n {Object.keys(form.metadata).length > 0 && (\r\n <div style={{ display: \"flex\", gap: 4, flexWrap: \"wrap\" }}>\r\n {Object.entries(form.metadata).map(([k, v]) => (\r\n <span\r\n key={k}\r\n style={{\r\n fontSize: tokens.typography.fontSize.micro,\r\n background: tokens.colors.background.surface,\r\n padding: `2px 6px`,\r\n borderRadius: tokens.borderRadius.sm,\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: tokens.spacing.xs,\r\n }}\r\n >\r\n {k}: {v}\r\n <button\r\n type=\"button\"\r\n aria-label={`Remove metadata ${k}`}\r\n onClick={() =>\r\n setForm((p) => {\r\n const m = { ...p.metadata };\r\n delete m[k];\r\n return { ...p, metadata: m };\r\n })\r\n }\r\n style={{\r\n cursor: \"pointer\",\r\n color: tokens.colors.status.critical,\r\n fontWeight: 500,\r\n border: \"none\",\r\n background: \"transparent\",\r\n padding: 0,\r\n lineHeight: 1,\r\n }}\r\n >\r\n ×\r\n </button>\r\n </span>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Hazardous toggle */}\r\n <label\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: 6,\r\n fontSize: tokens.typography.fontSize.xs,\r\n cursor: \"pointer\",\r\n }}\r\n >\r\n <input\r\n aria-label=\"Hazardous activity\"\r\n type=\"checkbox\"\r\n checked={form.hazardous}\r\n onChange={(e) =>\r\n setForm((p) => ({ ...p, hazardous: e.target.checked }))\r\n }\r\n />\r\n <span\r\n style={{\r\n color: form.hazardous\r\n ? tokens.colors.status.critical\r\n : tokens.colors.text.secondary,\r\n }}\r\n >\r\n ⚠ Hazardous Activity\r\n </span>\r\n </label>\r\n\r\n {/* Buttons */}\r\n <div\r\n style={{\r\n display: \"flex\",\r\n gap: 6,\r\n justifyContent: \"flex-end\",\r\n marginTop: 4,\r\n }}\r\n >\r\n <button\r\n onClick={onCancel}\r\n style={{\r\n background: \"transparent\",\r\n color: tokens.colors.text.muted,\r\n border: `1px solid ${tokens.colors.border.muted}`,\r\n borderRadius: tokens.borderRadius.md,\r\n padding: `${tokens.spacing.xs}px 14px`,\r\n fontSize: tokens.typography.fontSize.xs,\r\n cursor: \"pointer\",\r\n transition: \"all 150ms ease\",\r\n }}\r\n >\r\n Cancel\r\n </button>\r\n <button\r\n onClick={() => onSubmit(form)}\r\n disabled={!form.title.trim()}\r\n style={{\r\n background: tokens.colors.interactive.default,\r\n color: tokens.colors.text.inverse,\r\n border: \"none\",\r\n borderRadius: tokens.borderRadius.md,\r\n padding: `${tokens.spacing.xs}px 14px`,\r\n fontSize: tokens.typography.fontSize.xs,\r\n cursor: form.title.trim() ? \"pointer\" : \"not-allowed\",\r\n fontWeight: 500,\r\n opacity: form.title.trim() ? 1 : 0.5,\r\n transition: \"all 150ms ease\",\r\n }}\r\n >\r\n Create Activity\r\n </button>\r\n </div>\r\n </div>\r\n );\r\n});\r\n\r\n// =============================================================================\r\n// Main Component\r\n// =============================================================================\r\n\r\nexport const ActivityPlanner = memo(function ActivityPlanner({\r\n activities,\r\n timelines,\r\n selectedDate,\r\n height = 500,\r\n title = \"Activity Planner\",\r\n readOnly = false,\r\n showOverlapWarning = true,\r\n onActivityCreate,\r\n onActivityUpdate: _onActivityUpdate,\r\n onActivityDelete,\r\n onViewInCalendar,\r\n onViewInTimeline,\r\n className = \"\",\r\n}: ActivityPlannerProps): React.ReactElement {\r\n const { tokens, theme } = useTheme();\r\n const isTransparentTheme =\r\n theme === \"transparent\" ||\r\n theme === \"transparent-bold\" ||\r\n theme === \"transparent-minimal\";\r\n const [showForm, setShowForm] = useState(false);\r\n const [filter, setFilter] = useState(\"\");\r\n const [sortBy, setSortBy] = useState<\"time\" | \"status\" | \"timeline\">(\"time\");\r\n const listRef = useRef<HTMLDivElement>(null);\r\n\r\n // Overlap detection\r\n const overlaps = useMemo(() => {\r\n const pairs: [string, string][] = [];\r\n for (let i = 0; i < activities.length; i++) {\r\n for (let j = i + 1; j < activities.length; j++) {\r\n if (checkOverlap(activities[i], activities[j])) {\r\n pairs.push([activities[i].id, activities[j].id]);\r\n }\r\n }\r\n }\r\n return new Set(pairs.flat());\r\n }, [activities]);\r\n\r\n // Sort and filter\r\n const displayActivities = useMemo(() => {\r\n let list = [...activities];\r\n if (filter) {\r\n const lf = filter.toLowerCase();\r\n list = list.filter(\r\n (a) =>\r\n a.title.toLowerCase().includes(lf) ||\r\n a.description?.toLowerCase().includes(lf) ||\r\n a.timeline?.toLowerCase().includes(lf) ||\r\n a.command?.toLowerCase().includes(lf),\r\n );\r\n }\r\n switch (sortBy) {\r\n case \"time\":\r\n list.sort((a, b) => a.start.getTime() - b.start.getTime());\r\n break;\r\n case \"status\":\r\n list.sort((a, b) => (a.status || \"\").localeCompare(b.status || \"\"));\r\n break;\r\n case \"timeline\":\r\n list.sort((a, b) => (a.timeline || \"\").localeCompare(b.timeline || \"\"));\r\n break;\r\n }\r\n return list;\r\n }, [activities, filter, sortBy]);\r\n\r\n // Stats\r\n const stats = useMemo(\r\n () => ({\r\n total: activities.length,\r\n scheduled: activities.filter(\r\n (a) => a.status === \"scheduled\" || a.status === \"created\",\r\n ).length,\r\n running: activities.filter((a) => a.status === \"started\").length,\r\n completed: activities.filter((a) => a.status === \"completed\").length,\r\n errors: activities.filter(\r\n (a) =>\r\n a.status === \"error\" ||\r\n a.status === \"failed\" ||\r\n a.status === \"crashed\",\r\n ).length,\r\n }),\r\n [activities],\r\n );\r\n\r\n const handleCreate = useCallback(\r\n (data: ActivityFormData) => {\r\n onActivityCreate?.({\r\n title: data.title,\r\n type: data.type,\r\n start: new Date(data.start),\r\n end: new Date(data.end),\r\n timeline: data.timeline,\r\n description: data.description,\r\n command: data.command || undefined,\r\n script: data.script || undefined,\r\n metadata:\r\n Object.keys(data.metadata).length > 0 ? data.metadata : undefined,\r\n status: \"created\",\r\n });\r\n setShowForm(false);\r\n },\r\n [onActivityCreate],\r\n );\r\n\r\n const panelPadX = tokens.spacing.md;\r\n const panelPadY = tokens.spacing.sm;\r\n\r\n return (\r\n <div\r\n className={`activity-planner ${className}`}\r\n style={{\r\n height: typeof height === \"number\" ? height : undefined,\r\n background: tokens.colors.background.base,\r\n ...(tokens.colors.border.cardStyle ?? {\r\n border: `1px solid ${tokens.colors.border.muted}`,\r\n }),\r\n borderRadius: tokens.borderRadius.lg,\r\n overflow: \"hidden\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n fontFamily: tokens.typography.fontFamily.primary,\r\n color: tokens.colors.text.primary,\r\n backdropFilter: isTransparentTheme ? \"blur(10px)\" : undefined,\r\n WebkitBackdropFilter: isTransparentTheme ? \"blur(10px)\" : undefined,\r\n }}\r\n >\r\n {/* Header */}\r\n <div\r\n style={{\r\n padding: `${panelPadY}px ${panelPadX}px`,\r\n borderBottom: `1px solid ${tokens.colors.border.muted}`,\r\n background: tokens.colors.background.surface,\r\n backdropFilter: \"blur(8px)\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"space-between\",\r\n }}\r\n >\r\n <div\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: tokens.spacing.sm,\r\n }}\r\n >\r\n <span\r\n style={{ fontWeight: 500, fontSize: tokens.typography.fontSize.sm }}\r\n >\r\n {title}\r\n </span>\r\n <div\r\n style={{\r\n display: \"flex\",\r\n gap: 10,\r\n fontSize: tokens.typography.fontSize.xxs,\r\n color: tokens.colors.text.muted,\r\n }}\r\n >\r\n <span>Scheduled {stats.scheduled}</span>\r\n <span style={{ color: tokens.colors.text.secondary }}>\r\n Running {stats.running}\r\n </span>\r\n <span style={{ color: tokens.colors.text.secondary }}>\r\n Completed {stats.completed}\r\n </span>\r\n {stats.errors > 0 && (\r\n <span style={{ color: tokens.colors.status.critical }}>\r\n Errors {stats.errors}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n {!readOnly && (\r\n <button\r\n onClick={() => setShowForm(!showForm)}\r\n style={{\r\n background: showForm\r\n ? tokens.colors.status.critical + \"22\"\r\n : tokens.colors.interactive.default,\r\n color: showForm\r\n ? tokens.colors.status.critical\r\n : tokens.colors.text.inverse,\r\n border: \"none\",\r\n borderRadius: tokens.borderRadius.md,\r\n padding: \"3px 10px\",\r\n fontSize: tokens.typography.fontSize.xs,\r\n fontWeight: 500,\r\n cursor: \"pointer\",\r\n transition: \"all 150ms ease\",\r\n }}\r\n >\r\n {showForm ? \"✕ Cancel\" : \"+ New Activity\"}\r\n </button>\r\n )}\r\n </div>\r\n\r\n {/* Create form */}\r\n {showForm && !readOnly && (\r\n <div\r\n style={{\r\n borderBottom: `1px solid ${tokens.colors.border.muted}`,\r\n background: tokens.colors.background.surface + \"88\",\r\n }}\r\n >\r\n <ActivityForm\r\n timelines={timelines}\r\n selectedDate={selectedDate}\r\n tokens={tokens}\r\n onSubmit={handleCreate}\r\n onCancel={() => setShowForm(false)}\r\n />\r\n </div>\r\n )}\r\n\r\n {/* Search / Sort */}\r\n <div\r\n style={{\r\n padding: `${tokens.spacing.xs}px ${panelPadX}px`,\r\n display: \"flex\",\r\n gap: 6,\r\n alignItems: \"center\",\r\n borderBottom: `1px solid ${tokens.colors.border.muted}`,\r\n }}\r\n >\r\n <input\r\n value={filter}\r\n onChange={(e) => setFilter(e.target.value)}\r\n aria-label=\"Search activities\"\r\n placeholder=\"Search activities...\"\r\n style={{\r\n flex: 1,\r\n background: tokens.colors.background.surface,\r\n color: tokens.colors.text.primary,\r\n border: `1px solid ${tokens.colors.border.muted}`,\r\n borderRadius: tokens.borderRadius.md,\r\n padding: \"3px 8px\",\r\n fontSize: tokens.typography.fontSize.xxs,\r\n fontFamily: tokens.typography.fontFamily.primary,\r\n transition: \"all 150ms ease\",\r\n }}\r\n />\r\n <select\r\n value={sortBy}\r\n onChange={(e) =>\r\n setSortBy(e.target.value as \"time\" | \"status\" | \"timeline\")\r\n }\r\n aria-label=\"Sort activities\"\r\n style={{\r\n background: tokens.colors.background.surface,\r\n color: tokens.colors.text.secondary,\r\n border: `1px solid ${tokens.colors.border.muted}`,\r\n borderRadius: tokens.borderRadius.md,\r\n padding: \"3px 6px\",\r\n fontSize: tokens.typography.fontSize.xxs,\r\n transition: \"all 150ms ease\",\r\n }}\r\n >\r\n <option value=\"time\">Sort: Time</option>\r\n <option value=\"status\">Sort: Status</option>\r\n <option value=\"timeline\">Sort: Timeline</option>\r\n </select>\r\n </div>\r\n\r\n {/* Activity list */}\r\n <div ref={listRef} style={{ flex: 1, overflow: \"auto\", padding: 8 }}>\r\n {displayActivities.length === 0 ? (\r\n <div\r\n style={{\r\n textAlign: \"center\",\r\n color: tokens.colors.text.muted,\r\n padding: 40,\r\n fontSize: tokens.typography.fontSize.xs,\r\n }}\r\n >\r\n {filter ? \"No matching activities\" : \"No activities scheduled\"}\r\n </div>\r\n ) : (\r\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 4 }}>\r\n {displayActivities.map((a) => {\r\n const color = a.color || getStatusColor(a.status, tokens);\r\n const hasOverlap = overlaps.has(a.id);\r\n return (\r\n <div\r\n key={a.id}\r\n style={{\r\n display: \"grid\",\r\n gridTemplateColumns: \"24px 1fr auto\",\r\n alignItems: \"center\",\r\n gap: tokens.spacing.sm,\r\n padding: \"6px 10px\",\r\n background: hasOverlap\r\n ? `${tokens.colors.status.caution}10`\r\n : `${color}08`,\r\n borderLeft: `3px solid ${color}`,\r\n borderRadius: tokens.borderRadius.md,\r\n fontSize: tokens.typography.fontSize.xs,\r\n cursor: \"pointer\",\r\n border:\r\n hasOverlap && showOverlapWarning\r\n ? `1px solid ${tokens.colors.status.caution}44`\r\n : undefined,\r\n transition: \"all 150ms ease\",\r\n }}\r\n >\r\n {/* Status icon */}\r\n <div style={{ textAlign: \"center\" }}>\r\n <span\r\n style={{\r\n color,\r\n fontSize: tokens.typography.fontSize.sm,\r\n fontWeight: 500,\r\n }}\r\n >\r\n {getStatusIcon(a.status)}\r\n </span>\r\n </div>\r\n {/* Info */}\r\n <div style={{ overflow: \"hidden\" }}>\r\n <div\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: 6,\r\n marginBottom: 2,\r\n }}\r\n >\r\n <span\r\n style={{\r\n fontWeight: 500,\r\n overflow: \"hidden\",\r\n textOverflow: \"ellipsis\",\r\n whiteSpace: \"nowrap\",\r\n }}\r\n >\r\n {a.title}\r\n </span>\r\n {a.timeline && (\r\n <span\r\n style={{\r\n fontSize: tokens.typography.fontSize.micro,\r\n background: tokens.colors.background.surface,\r\n padding: `0 ${tokens.spacing.xs}px`,\r\n borderRadius: tokens.borderRadius.sm,\r\n color: tokens.colors.text.muted,\r\n }}\r\n >\r\n {a.timeline}\r\n </span>\r\n )}\r\n {hasOverlap && showOverlapWarning && (\r\n <span\r\n style={{\r\n fontSize: tokens.typography.fontSize.micro,\r\n color: tokens.colors.status.caution,\r\n fontWeight: 500,\r\n }}\r\n >\r\n ⚠ OVERLAP\r\n </span>\r\n )}\r\n </div>\r\n <div\r\n style={{\r\n fontSize: tokens.typography.fontSize.micro,\r\n fontFamily: tokens.typography.fontFamily.mono,\r\n color: tokens.colors.text.muted,\r\n }}\r\n >\r\n {formatDate(a.start)} {formatTime(a.start)}\r\n {a.end ? ` → ${formatTime(a.end)}` : \"\"}\r\n </div>\r\n </div>\r\n {/* Actions */}\r\n <div style={{ display: \"flex\", gap: 4 }}>\r\n {onViewInCalendar && (\r\n <button\r\n aria-label={`View ${a.title} in calendar`}\r\n onClick={() => onViewInCalendar(a)}\r\n style={actionBtnStyle(tokens)}\r\n title=\"View in Calendar\"\r\n >\r\n Calendar\r\n </button>\r\n )}\r\n {onViewInTimeline && (\r\n <button\r\n aria-label={`View ${a.title} in timeline`}\r\n onClick={() => onViewInTimeline(a)}\r\n style={actionBtnStyle(tokens)}\r\n title=\"View in Timeline\"\r\n >\r\n Timeline\r\n </button>\r\n )}\r\n {!readOnly && onActivityDelete && (\r\n <button\r\n aria-label={`Delete ${a.title}`}\r\n onClick={() => onActivityDelete(a.id)}\r\n style={{\r\n ...actionBtnStyle(tokens),\r\n color: tokens.colors.status.critical,\r\n }}\r\n title=\"Delete\"\r\n >\r\n Delete\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Footer */}\r\n <div\r\n style={{\r\n padding: `${tokens.spacing.xs}px ${panelPadX}px`,\r\n borderTop: `1px solid ${tokens.colors.border.muted}`,\r\n background: tokens.colors.background.surface,\r\n fontSize: tokens.typography.fontSize.micro,\r\n color: tokens.colors.text.muted,\r\n display: \"flex\",\r\n justifyContent: \"space-between\",\r\n }}\r\n >\r\n <span>\r\n {displayActivities.length} / {activities.length} activities\r\n </span>\r\n {overlaps.size > 0 && showOverlapWarning && (\r\n <span style={{ color: tokens.colors.status.caution }}>\r\n ⚠ {overlaps.size} overlapping activities\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n});\r\n\r\nfunction actionBtnStyle(\r\n tokens: ReturnType<typeof useTheme>[\"tokens\"],\r\n): React.CSSProperties {\r\n return {\r\n background: \"transparent\",\r\n border: `1px solid ${tokens.colors.border.muted}`,\r\n borderRadius: tokens.borderRadius.sm,\r\n padding: `2px ${tokens.spacing.xs}px`,\r\n fontSize: tokens.typography.fontSize.xxs,\r\n cursor: \"pointer\",\r\n lineHeight: 1,\r\n transition: \"all 150ms ease\",\r\n };\r\n}\r\n\r\nexport default ActivityPlanner;\r\n"],"mappings":"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"}
@@ -1,5 +1,4 @@
1
1
  import { default as React } from 'react';
2
-
3
2
  /** Camera capture arguments */
4
3
  export interface CaptureArgs {
5
4
  monochromatic: boolean;
@@ -18,7 +17,7 @@ export interface CaptureArgs {
18
17
  * - 'png' → lossless, larger file (good for scientific/archival use)
19
18
  * - 'jpeg' → lossy, smaller file (~3-5× smaller than PNG at q=0.92)
20
19
  */
21
- format?: 'png' | 'jpeg';
20
+ format?: "png" | "jpeg";
22
21
  /**
23
22
  * JPEG quality factor (0–1). Only used when format='jpeg'. Default: 0.92.
24
23
  * Ignored for PNG (which is always lossless).
@@ -27,7 +26,7 @@ export interface CaptureArgs {
27
26
  }
28
27
  /** Incoming capture request */
29
28
  export interface CaptureRequest {
30
- type: 'capture';
29
+ type: "capture";
31
30
  req_id: number;
32
31
  args: CaptureArgs;
33
32
  }