@zendir/ui 0.2.21 → 0.3.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 (322) hide show
  1. package/CHANGELOG.md +183 -1
  2. package/README.md +70 -28
  3. package/dist/index.d.ts +1 -1
  4. package/dist/index.js +73 -64
  5. package/dist/index.js.map +1 -1
  6. package/dist/react/3d/CesiumCaptureSource.d.ts +1 -1
  7. package/dist/react/3d/CesiumCaptureSource.js +1 -1
  8. package/dist/react/3d/CesiumCaptureSource.js.map +1 -1
  9. package/dist/react/3d/ZenSpace3D.js +1254 -0
  10. package/dist/react/3d/ZenSpace3D.js.map +1 -0
  11. package/dist/react/3d/ZenSpace3DCesium.js +579 -0
  12. package/dist/react/3d/ZenSpace3DCesium.js.map +1 -0
  13. package/dist/react/3d/ZenSpace3DShaders.js +478 -0
  14. package/dist/react/3d/ZenSpace3DShaders.js.map +1 -0
  15. package/dist/react/3d/ZenSpace3DTypes.d.ts +28 -1
  16. package/dist/react/3d/ZenSpace3DUtils.d.ts +17 -173
  17. package/dist/react/3d/ZenSpace3DUtils.js +20 -1
  18. package/dist/react/3d/ZenSpace3DUtils.js.map +1 -1
  19. package/dist/react/3d/capturePngAnalysis.js +42 -0
  20. package/dist/react/3d/capturePngAnalysis.js.map +1 -0
  21. package/dist/react/3d/index.d.ts +6 -12
  22. package/dist/react/3d/index.js +57 -0
  23. package/dist/react/3d/index.js.map +1 -0
  24. package/dist/react/3d/threeLoader.js +22 -0
  25. package/dist/react/3d/threeLoader.js.map +1 -0
  26. package/dist/react/astro/ClassificationBanner.js +1 -1
  27. package/dist/react/astro/GlobalStatusBar.js +1 -1
  28. package/dist/react/astro/MissionClock.js +8 -5
  29. package/dist/react/astro/MissionClock.js.map +1 -1
  30. package/dist/react/astro/MonitoringIcon.js +2 -2
  31. package/dist/react/astro/MonitoringIcon.js.map +1 -1
  32. package/dist/react/astro/Notification.js +1 -1
  33. package/dist/react/astro/Progress.js +1 -1
  34. package/dist/react/astro/SimulationControls.js +3 -3
  35. package/dist/react/astro/SimulationControls.js.map +1 -1
  36. package/dist/react/astro/StatusIndicator.js +1 -1
  37. package/dist/react/astro/UnifiedTimeline.js +5 -5
  38. package/dist/react/astro/UnifiedTimeline.js.map +1 -1
  39. package/dist/react/astro/index.js +34 -0
  40. package/dist/react/astro/index.js.map +1 -0
  41. package/dist/react/cards/AccessCard.js +410 -0
  42. package/dist/react/cards/AccessCard.js.map +1 -0
  43. package/dist/react/cards/OrbitCard.js +372 -0
  44. package/dist/react/cards/OrbitCard.js.map +1 -0
  45. package/dist/react/cards/SpacecraftCard.js +941 -0
  46. package/dist/react/cards/SpacecraftCard.js.map +1 -0
  47. package/dist/react/cards/TelemetryCard.js +742 -0
  48. package/dist/react/cards/TelemetryCard.js.map +1 -0
  49. package/dist/react/cards/TelemetryStreamCard.js +309 -0
  50. package/dist/react/cards/TelemetryStreamCard.js.map +1 -0
  51. package/dist/react/cards/index.js +13 -0
  52. package/dist/react/cards/index.js.map +1 -0
  53. package/dist/react/charts/GroundTrackMap.d.ts +2 -15
  54. package/dist/react/charts/GroundTrackMap.js +1 -1
  55. package/dist/react/charts/GroundTrackMap.js.map +1 -1
  56. package/dist/react/charts/GroundTrackMapLeaflet.js +1 -1
  57. package/dist/react/charts/index.js +104 -0
  58. package/dist/react/charts/index.js.map +1 -0
  59. package/dist/react/charts/unified/AstroChart.js +35 -14
  60. package/dist/react/charts/unified/AstroChart.js.map +1 -1
  61. package/dist/react/charts/unified/PowerOverviewChart.js +488 -0
  62. package/dist/react/charts/unified/PowerOverviewChart.js.map +1 -0
  63. package/dist/react/charts/unified/domain.js +3168 -0
  64. package/dist/react/charts/unified/domain.js.map +1 -0
  65. package/dist/react/charts/unified/generators.js +518 -0
  66. package/dist/react/charts/unified/generators.js.map +1 -0
  67. package/dist/react/charts/unified/presets.js +1000 -0
  68. package/dist/react/charts/unified/presets.js.map +1 -0
  69. package/dist/react/charts/unified/sync.js +219 -0
  70. package/dist/react/charts/unified/sync.js.map +1 -0
  71. package/dist/react/charts/unified/theme.js +331 -4
  72. package/dist/react/charts/unified/theme.js.map +1 -1
  73. package/dist/react/charts/unified/useChartStream.js +226 -0
  74. package/dist/react/charts/unified/useChartStream.js.map +1 -0
  75. package/dist/react/chatgpt/AppCard.d.ts +0 -4
  76. package/dist/react/chatgpt/index.d.ts +0 -19
  77. package/dist/react/chatgpt/index.js +163 -0
  78. package/dist/react/chatgpt/index.js.map +1 -0
  79. package/dist/react/context/SpatialSelectionContext.d.ts +40 -0
  80. package/dist/react/context/SpatialSelectionContext.js +10 -0
  81. package/dist/react/context/SpatialSelectionContext.js.map +1 -0
  82. package/dist/react/context/index.d.ts +2 -0
  83. package/dist/react/core/{DataTable.d.ts → data/DataTable.d.ts} +1 -1
  84. package/dist/react/core/{DataTable.js → data/DataTable.js} +4 -4
  85. package/dist/react/core/data/DataTable.js.map +1 -0
  86. package/dist/react/core/{DataValue.d.ts → data/DataValue.d.ts} +2 -2
  87. package/dist/react/core/{DataValue.js → data/DataValue.js} +2 -2
  88. package/dist/react/core/data/DataValue.js.map +1 -0
  89. package/dist/react/core/{propertyConfig.d.ts → data/propertyConfig.d.ts} +2 -2
  90. package/dist/react/core/data/propertyConfig.js.map +1 -0
  91. package/dist/react/core/{AstroIcon.js → display/AstroIcon.js} +1 -1
  92. package/dist/react/core/display/AstroIcon.js.map +1 -0
  93. package/dist/react/core/{Badge.d.ts → display/Badge.d.ts} +1 -1
  94. package/dist/react/core/{Badge.js → display/Badge.js} +2 -2
  95. package/dist/react/core/display/Badge.js.map +1 -0
  96. package/dist/react/core/{CardHeader.d.ts → display/CardHeader.d.ts} +1 -1
  97. package/dist/react/core/{CardHeader.js → display/CardHeader.js} +2 -2
  98. package/dist/react/core/display/CardHeader.js.map +1 -0
  99. package/dist/react/core/{Container.d.ts → display/Container.d.ts} +1 -1
  100. package/dist/react/core/{Container.js → display/Container.js} +3 -3
  101. package/dist/react/core/display/Container.js.map +1 -0
  102. package/dist/react/core/{CopyButton.js → display/CopyButton.js} +1 -1
  103. package/dist/react/core/display/CopyButton.js.map +1 -0
  104. package/dist/react/core/{GlassCard.d.ts → display/GlassCard.d.ts} +1 -1
  105. package/dist/react/core/{GlassCard.js → display/GlassCard.js} +2 -2
  106. package/dist/react/core/display/GlassCard.js.map +1 -0
  107. package/dist/react/core/{HeaderIconWithStatus.d.ts → display/HeaderIconWithStatus.d.ts} +1 -1
  108. package/dist/react/core/{HeaderIconWithStatus.js → display/HeaderIconWithStatus.js} +1 -1
  109. package/dist/react/core/display/HeaderIconWithStatus.js.map +1 -0
  110. package/dist/react/core/{Icon.d.ts → display/Icon.d.ts} +1 -1
  111. package/dist/react/core/{Icon.js → display/Icon.js} +1 -1
  112. package/dist/react/core/display/Icon.js.map +1 -0
  113. package/dist/react/core/{Typography.d.ts → display/Typography.d.ts} +13 -4
  114. package/dist/react/core/{Typography.js → display/Typography.js} +1 -1
  115. package/dist/react/core/display/Typography.js.map +1 -0
  116. package/dist/react/core/{ConfirmDialog.js → feedback/ConfirmDialog.js} +1 -1
  117. package/dist/react/core/feedback/ConfirmDialog.js.map +1 -0
  118. package/dist/react/core/{Dialog.js → feedback/Dialog.js} +2 -2
  119. package/dist/react/core/feedback/Dialog.js.map +1 -0
  120. package/dist/react/core/{Toast.js → feedback/Toast.js} +3 -3
  121. package/dist/react/core/feedback/Toast.js.map +1 -0
  122. package/dist/react/core/index.d.ts +85 -85
  123. package/dist/react/core/index.js +161 -0
  124. package/dist/react/core/index.js.map +1 -0
  125. package/dist/react/core/{Button.js → inputs/Button.js} +2 -2
  126. package/dist/react/core/inputs/Button.js.map +1 -0
  127. package/dist/react/core/{Checkbox.js → inputs/Checkbox.js} +2 -2
  128. package/dist/react/core/inputs/Checkbox.js.map +1 -0
  129. package/dist/react/core/{Input.d.ts → inputs/Input.d.ts} +1 -1
  130. package/dist/react/core/{Input.js → inputs/Input.js} +3 -3
  131. package/dist/react/core/inputs/Input.js.map +1 -0
  132. package/dist/react/core/{LimitsBar.js → inputs/LimitsBar.js} +1 -1
  133. package/dist/react/core/inputs/LimitsBar.js.map +1 -0
  134. package/dist/react/core/{NumberInput.d.ts → inputs/NumberInput.d.ts} +2 -2
  135. package/dist/react/core/{NumberInput.js → inputs/NumberInput.js} +3 -3
  136. package/dist/react/core/inputs/NumberInput.js.map +1 -0
  137. package/dist/react/core/{PinInput.js → inputs/PinInput.js} +2 -2
  138. package/dist/react/core/inputs/PinInput.js.map +1 -0
  139. package/dist/react/core/{Select.js → inputs/Select.js} +3 -3
  140. package/dist/react/core/inputs/Select.js.map +1 -0
  141. package/dist/react/core/{Toggle.js → inputs/Toggle.js} +2 -2
  142. package/dist/react/core/inputs/Toggle.js.map +1 -0
  143. package/dist/react/core/layout/Box.js +1 -1
  144. package/dist/react/core/layout/Flex.js +1 -1
  145. package/dist/react/core/layout/Grid.js +1 -1
  146. package/dist/react/core/layout/Stack.js +1 -1
  147. package/dist/react/core/{AppBar.d.ts → navigation/AppBar.d.ts} +1 -1
  148. package/dist/react/core/{AppBar.js → navigation/AppBar.js} +7 -7
  149. package/dist/react/core/navigation/AppBar.js.map +1 -0
  150. package/dist/react/core/{Pagination.js → navigation/Pagination.js} +2 -2
  151. package/dist/react/core/navigation/Pagination.js.map +1 -0
  152. package/dist/react/core/{SideNav.d.ts → navigation/SideNav.d.ts} +1 -1
  153. package/dist/react/core/{SideNav.js → navigation/SideNav.js} +3 -3
  154. package/dist/react/core/navigation/SideNav.js.map +1 -0
  155. package/dist/react/core/{Tabs.js → navigation/Tabs.js} +2 -2
  156. package/dist/react/core/navigation/Tabs.js.map +1 -0
  157. package/dist/react/core/{Popover.js → overlays/Popover.js} +1 -1
  158. package/dist/react/core/overlays/Popover.js.map +1 -0
  159. package/dist/react/core/{SidePanel.js → overlays/SidePanel.js} +3 -3
  160. package/dist/react/core/overlays/SidePanel.js.map +1 -0
  161. package/dist/react/core/{Tooltip.js → overlays/Tooltip.js} +2 -2
  162. package/dist/react/core/overlays/Tooltip.js.map +1 -0
  163. package/dist/react/core/{ActivityPlanner.js → widgets/ActivityPlanner.js} +1 -1
  164. package/dist/react/core/widgets/ActivityPlanner.js.map +1 -0
  165. package/dist/react/core/{Capture.js → widgets/Capture.js} +3 -3
  166. package/dist/react/core/widgets/Capture.js.map +1 -0
  167. package/dist/react/core/{ChatPanel.d.ts → widgets/ChatPanel.d.ts} +1 -1
  168. package/dist/react/core/{ChatPanel.js → widgets/ChatPanel.js} +2 -2
  169. package/dist/react/core/widgets/ChatPanel.js.map +1 -0
  170. package/dist/react/core/{ColorPickerPanel.d.ts → widgets/ColorPickerPanel.d.ts} +1 -1
  171. package/dist/react/core/{ColorPickerPanel.js → widgets/ColorPickerPanel.js} +3 -3
  172. package/dist/react/core/widgets/ColorPickerPanel.js.map +1 -0
  173. package/dist/react/core/{CommandBuilder.js → widgets/CommandBuilder.js} +1 -1
  174. package/dist/react/core/widgets/CommandBuilder.js.map +1 -0
  175. package/dist/react/core/{ConnectionForm.d.ts → widgets/ConnectionForm.d.ts} +1 -1
  176. package/dist/react/core/{ConnectionForm.js → widgets/ConnectionForm.js} +2 -2
  177. package/dist/react/core/widgets/ConnectionForm.js.map +1 -0
  178. package/dist/react/core/{FileExplorer.js → widgets/FileExplorer.js} +2 -2
  179. package/dist/react/core/widgets/FileExplorer.js.map +1 -0
  180. package/dist/react/core/{HexViewer.js → widgets/HexViewer.js} +1 -1
  181. package/dist/react/core/widgets/HexViewer.js.map +1 -0
  182. package/dist/react/core/{ImageGallery.d.ts → widgets/ImageGallery.d.ts} +1 -1
  183. package/dist/react/core/{ImageGallery.js → widgets/ImageGallery.js} +3 -3
  184. package/dist/react/core/widgets/ImageGallery.js.map +1 -0
  185. package/dist/react/core/{LogViewer.d.ts → widgets/LogViewer.d.ts} +13 -3
  186. package/dist/react/core/{LogViewer.js → widgets/LogViewer.js} +28 -8
  187. package/dist/react/core/widgets/LogViewer.js.map +1 -0
  188. package/dist/react/core/{MessageStream.d.ts → widgets/MessageStream.d.ts} +2 -2
  189. package/dist/react/core/{MessageStream.js → widgets/MessageStream.js} +4 -4
  190. package/dist/react/core/widgets/MessageStream.js.map +1 -0
  191. package/dist/react/core/{MissionCalendar.js → widgets/MissionCalendar.js} +2 -2
  192. package/dist/react/core/widgets/MissionCalendar.js.map +1 -0
  193. package/dist/react/core/{PacketViewer.js → widgets/PacketViewer.js} +1 -1
  194. package/dist/react/core/widgets/PacketViewer.js.map +1 -0
  195. package/dist/react/core/widgets/capture-placeholder.png.js.map +1 -0
  196. package/dist/react/hooks/index.d.ts +9 -11
  197. package/dist/react/hooks/useAccessWindows.d.ts +15 -19
  198. package/dist/react/hooks/useCompactMode.js +1 -1
  199. package/dist/react/hooks/useGroundTrackHistory.d.ts +34 -0
  200. package/dist/react/hooks/useSimulationScene.d.ts +141 -0
  201. package/dist/react/hooks/useSimulationScene.js +401 -0
  202. package/dist/react/hooks/useSimulationScene.js.map +1 -0
  203. package/dist/react/hooks/useZendirSession.d.ts +44 -69
  204. package/dist/react/index.d.ts +7 -3
  205. package/dist/react/panels/LayerControlPanel.d.ts +54 -0
  206. package/dist/react/panels/LayerControlPanel.js +184 -0
  207. package/dist/react/panels/LayerControlPanel.js.map +1 -0
  208. package/dist/react/panels/ObjectInventoryPanel.d.ts +57 -0
  209. package/dist/react/panels/ObjectInventoryPanel.js +261 -0
  210. package/dist/react/panels/ObjectInventoryPanel.js.map +1 -0
  211. package/dist/react/panels/index.d.ts +15 -0
  212. package/dist/react/panels/index.js +8 -0
  213. package/dist/react/panels/index.js.map +1 -0
  214. package/dist/react/theme/ThemeProvider.d.ts +2 -0
  215. package/dist/react/theme/ThemeProvider.js +50 -72
  216. package/dist/react/theme/ThemeProvider.js.map +1 -1
  217. package/dist/react/theme/config.js +30 -0
  218. package/dist/react/theme/config.js.map +1 -0
  219. package/dist/react/theme/index.js +19 -0
  220. package/dist/react/theme/index.js.map +1 -0
  221. package/dist/react/types.d.ts +32 -3
  222. package/dist/react/types.js.map +1 -1
  223. package/dist/react/utils/index.js +8 -0
  224. package/dist/react/utils/index.js.map +1 -1
  225. package/dist/react.js +73 -64
  226. package/dist/react.js.map +1 -1
  227. package/dist/shaders/atmosphere.frag.js +5 -0
  228. package/dist/shaders/atmosphere.frag.js.map +1 -0
  229. package/dist/shaders/atmosphere.vert.js +5 -0
  230. package/dist/shaders/atmosphere.vert.js.map +1 -0
  231. package/dist/shaders/stars.frag.js +5 -0
  232. package/dist/shaders/stars.frag.js.map +1 -0
  233. package/dist/shaders/stars.vert.js +5 -0
  234. package/dist/shaders/stars.vert.js.map +1 -0
  235. package/dist/style.css +6 -4
  236. package/dist/tokens/css-vars.d.ts +91 -0
  237. package/dist/tokens/css-vars.js +228 -0
  238. package/dist/tokens/css-vars.js.map +1 -0
  239. package/dist/tokens/index.d.ts +71 -18
  240. package/dist/tokens/index.js +206 -97
  241. package/dist/tokens/index.js.map +1 -1
  242. package/dist/tokens/tokens.css +50 -50
  243. package/package.json +70 -58
  244. package/sdk-stub.js +10 -5
  245. package/dist/react/3d/EarthViewer.d.ts +0 -46
  246. package/dist/react/3d/SolarSystemViewer.d.ts +0 -43
  247. package/dist/react/chatgpt/ChatGPTCard.d.ts +0 -6
  248. package/dist/react/core/ActivityPlanner.js.map +0 -1
  249. package/dist/react/core/AppBar.js.map +0 -1
  250. package/dist/react/core/AstroIcon.js.map +0 -1
  251. package/dist/react/core/Badge.js.map +0 -1
  252. package/dist/react/core/Button.js.map +0 -1
  253. package/dist/react/core/Capture.js.map +0 -1
  254. package/dist/react/core/CardHeader.js.map +0 -1
  255. package/dist/react/core/ChatPanel.js.map +0 -1
  256. package/dist/react/core/Checkbox.js.map +0 -1
  257. package/dist/react/core/ColorPickerPanel.js.map +0 -1
  258. package/dist/react/core/CommandBuilder.js.map +0 -1
  259. package/dist/react/core/ConfirmDialog.js.map +0 -1
  260. package/dist/react/core/ConnectionForm.js.map +0 -1
  261. package/dist/react/core/Container.js.map +0 -1
  262. package/dist/react/core/CopyButton.js.map +0 -1
  263. package/dist/react/core/DataTable.js.map +0 -1
  264. package/dist/react/core/DataValue.js.map +0 -1
  265. package/dist/react/core/Dialog.js.map +0 -1
  266. package/dist/react/core/FileExplorer.js.map +0 -1
  267. package/dist/react/core/GlassCard.js.map +0 -1
  268. package/dist/react/core/HeaderIconWithStatus.js.map +0 -1
  269. package/dist/react/core/HexViewer.js.map +0 -1
  270. package/dist/react/core/Icon.js.map +0 -1
  271. package/dist/react/core/ImageGallery.js.map +0 -1
  272. package/dist/react/core/Input.js.map +0 -1
  273. package/dist/react/core/LimitsBar.js.map +0 -1
  274. package/dist/react/core/LogViewer.js.map +0 -1
  275. package/dist/react/core/MessageStream.js.map +0 -1
  276. package/dist/react/core/MissionCalendar.js.map +0 -1
  277. package/dist/react/core/NumberInput.js.map +0 -1
  278. package/dist/react/core/PacketViewer.js.map +0 -1
  279. package/dist/react/core/Pagination.js.map +0 -1
  280. package/dist/react/core/PinInput.js.map +0 -1
  281. package/dist/react/core/Popover.js.map +0 -1
  282. package/dist/react/core/Select.js.map +0 -1
  283. package/dist/react/core/SideNav.js.map +0 -1
  284. package/dist/react/core/SidePanel.js.map +0 -1
  285. package/dist/react/core/Tabs.js.map +0 -1
  286. package/dist/react/core/Toast.js.map +0 -1
  287. package/dist/react/core/Toggle.js.map +0 -1
  288. package/dist/react/core/Tooltip.js.map +0 -1
  289. package/dist/react/core/Typography.js.map +0 -1
  290. package/dist/react/core/capture-placeholder.png.js.map +0 -1
  291. package/dist/react/core/propertyConfig.js.map +0 -1
  292. package/dist/react/hooks/useSimulationTime.d.ts +0 -61
  293. package/dist/react/hooks/useSpacecraftPosition.d.ts +0 -50
  294. package/dist/react/hooks/useTelemetry.d.ts +0 -55
  295. package/dist/types.d.ts +0 -1
  296. package/dist/types.js +0 -2
  297. package/dist/types.js.map +0 -1
  298. /package/dist/react/core/{propertyConfig.js → data/propertyConfig.js} +0 -0
  299. /package/dist/react/core/{AstroIcon.d.ts → display/AstroIcon.d.ts} +0 -0
  300. /package/dist/react/core/{CopyButton.d.ts → display/CopyButton.d.ts} +0 -0
  301. /package/dist/react/core/{ConfirmDialog.d.ts → feedback/ConfirmDialog.d.ts} +0 -0
  302. /package/dist/react/core/{Dialog.d.ts → feedback/Dialog.d.ts} +0 -0
  303. /package/dist/react/core/{Toast.d.ts → feedback/Toast.d.ts} +0 -0
  304. /package/dist/react/core/{Button.d.ts → inputs/Button.d.ts} +0 -0
  305. /package/dist/react/core/{Checkbox.d.ts → inputs/Checkbox.d.ts} +0 -0
  306. /package/dist/react/core/{LimitsBar.d.ts → inputs/LimitsBar.d.ts} +0 -0
  307. /package/dist/react/core/{PinInput.d.ts → inputs/PinInput.d.ts} +0 -0
  308. /package/dist/react/core/{Select.d.ts → inputs/Select.d.ts} +0 -0
  309. /package/dist/react/core/{Toggle.d.ts → inputs/Toggle.d.ts} +0 -0
  310. /package/dist/react/core/{Pagination.d.ts → navigation/Pagination.d.ts} +0 -0
  311. /package/dist/react/core/{Tabs.d.ts → navigation/Tabs.d.ts} +0 -0
  312. /package/dist/react/core/{Popover.d.ts → overlays/Popover.d.ts} +0 -0
  313. /package/dist/react/core/{SidePanel.d.ts → overlays/SidePanel.d.ts} +0 -0
  314. /package/dist/react/core/{Tooltip.d.ts → overlays/Tooltip.d.ts} +0 -0
  315. /package/dist/react/core/{ActivityPlanner.d.ts → widgets/ActivityPlanner.d.ts} +0 -0
  316. /package/dist/react/core/{Capture.d.ts → widgets/Capture.d.ts} +0 -0
  317. /package/dist/react/core/{CommandBuilder.d.ts → widgets/CommandBuilder.d.ts} +0 -0
  318. /package/dist/react/core/{FileExplorer.d.ts → widgets/FileExplorer.d.ts} +0 -0
  319. /package/dist/react/core/{HexViewer.d.ts → widgets/HexViewer.d.ts} +0 -0
  320. /package/dist/react/core/{MissionCalendar.d.ts → widgets/MissionCalendar.d.ts} +0 -0
  321. /package/dist/react/core/{PacketViewer.d.ts → widgets/PacketViewer.d.ts} +0 -0
  322. /package/dist/react/core/{capture-placeholder.png.js → widgets/capture-placeholder.png.js} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"SimulationControls.js","sources":["../../../src/react/astro/SimulationControls.tsx"],"sourcesContent":["/**\r\n * @zendir/ui - SimulationControls Component\r\n * \r\n * Space operations simulation playback controls following Astro UX patterns.\r\n * Provides play/pause/stop/step controls for simulation time management.\r\n * \r\n * Features:\r\n * - Play/Pause toggle with visual state feedback\r\n * - Stop (reset) functionality\r\n * - Step forward/backward controls\r\n * - Time scale (playback rate) adjustment\r\n * - Simulation time display integration\r\n * - AOS/LOS timer integration\r\n * - Keyboard accessibility\r\n * - AstroUXDS compliant styling\r\n * \r\n * Space Operations Terminology:\r\n * - SIM: Simulation mode indicator\r\n * - MET: Mission Elapsed Time\r\n * - Epoch: Simulation start time (t=0)\r\n * - Time Scale: Playback speed multiplier\r\n * \r\n * @example\r\n * ```tsx\r\n * import { SimulationControls } from '@zendir/ui/react';\r\n * \r\n * <SimulationControls\r\n * isPlaying={isPlaying}\r\n * onPlay={handlePlay}\r\n * onPause={handlePause}\r\n * onStop={handleStop}\r\n * timeScale={1}\r\n * onTimeScaleChange={setTimeScale}\r\n * currentTime={simulationTime}\r\n * epoch={epoch}\r\n * />\r\n * ```\r\n */\r\n\r\nimport React, { memo, useState, useCallback, useMemo } from 'react';\r\nimport { useTheme } from '../theme';\r\nimport { classNames, tabularNumsStyle, safeAccentText } from '../utils';\r\nimport { AstroIcon } from '../core/AstroIcon';\r\nimport { Tooltip } from '../core/Tooltip';\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\nexport type SimulationState = 'stopped' | 'playing' | 'paused';\r\n\r\nexport interface SimulationControlsProps {\r\n /** Current simulation state */\r\n state?: SimulationState;\r\n /** Whether simulation is playing (alternative to state) */\r\n isPlaying?: boolean;\r\n /** Whether simulation is paused (used with isPlaying for 3-state) */\r\n isPaused?: boolean;\r\n \r\n // === Playback Callbacks ===\r\n /** Called when play is triggered */\r\n onPlay?: () => void;\r\n /** Called when pause is triggered */\r\n onPause?: () => void;\r\n /** Called when stop (reset) is triggered */\r\n onStop?: () => void;\r\n /** Called when step forward is triggered */\r\n onStepForward?: () => void;\r\n /** Called when step backward is triggered */\r\n onStepBackward?: () => void;\r\n \r\n // === Time Display ===\r\n /** Current simulation time */\r\n currentTime?: Date | string;\r\n /** Simulation epoch (t=0) */\r\n epoch?: Date | string;\r\n /** Current elapsed seconds from epoch */\r\n elapsedSeconds?: number;\r\n /** Show elapsed time display */\r\n showElapsedTime?: boolean;\r\n /** Show current time display */\r\n showCurrentTime?: boolean;\r\n /** Show date in time display */\r\n showDate?: boolean;\r\n \r\n // === Time Scale ===\r\n /** Current time scale factor (1 = realtime) */\r\n timeScale?: number;\r\n /** Callback when time scale changes */\r\n onTimeScaleChange?: (scale: number) => void;\r\n /** Available time scale presets */\r\n timeScalePresets?: number[];\r\n /** Show time scale controls */\r\n showTimeScale?: boolean;\r\n \r\n // === Step Size ===\r\n /** Step size in seconds */\r\n stepSize?: number;\r\n /** Callback when step size changes */\r\n onStepSizeChange?: (size: number) => void;\r\n /** Available step size presets in seconds */\r\n stepSizePresets?: number[];\r\n /** Show step controls */\r\n showStepControls?: boolean;\r\n \r\n // === Appearance ===\r\n /** Compact display mode */\r\n compact?: boolean;\r\n /** Small size variant */\r\n small?: boolean;\r\n /** Custom className */\r\n className?: string;\r\n /** Disabled state */\r\n disabled?: boolean;\r\n /** Show simulation status indicator */\r\n showStatus?: boolean;\r\n /** Custom label for simulation mode */\r\n label?: string;\r\n}\r\n\r\n// ============================================================================\r\n// Constants\r\n// ============================================================================\r\n\r\nconst DEFAULT_TIME_SCALE_PRESETS = [0.1, 0.25, 0.5, 1, 2, 5, 10, 60, 3600];\r\nconst DEFAULT_STEP_SIZE_PRESETS = [1, 5, 10, 30, 60, 300, 600, 3600];\r\n\r\n// ============================================================================\r\n// Utility Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Format elapsed time as DD:HH:MM:SS\r\n */\r\nfunction formatElapsedTime(seconds: number): string {\r\n const absSeconds = Math.abs(seconds);\r\n const days = Math.floor(absSeconds / 86400);\r\n const hours = Math.floor((absSeconds % 86400) / 3600);\r\n const mins = Math.floor((absSeconds % 3600) / 60);\r\n const secs = Math.floor(absSeconds % 60);\r\n \r\n const sign = seconds < 0 ? '-' : '';\r\n \r\n if (days > 0) {\r\n return `${sign}${days}:${hours.toString().padStart(2, '0')}:${mins.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`;\r\n }\r\n return `${sign}${hours.toString().padStart(2, '0')}:${mins.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`;\r\n}\r\n\r\n/**\r\n * Format time scale for display\r\n */\r\nfunction formatTimeScale(scale: number): string {\r\n if (scale >= 3600) return `${scale / 3600}h/s`;\r\n if (scale >= 60) return `${scale / 60}m/s`;\r\n if (scale === 1) return '1×';\r\n if (scale < 1) return `${scale}×`;\r\n return `${scale}×`;\r\n}\r\n\r\n/**\r\n * Format step size for display\r\n */\r\nfunction formatStepSize(seconds: number): string {\r\n if (seconds >= 3600) return `${seconds / 3600}h`;\r\n if (seconds >= 60) return `${seconds / 60}m`;\r\n return `${seconds}s`;\r\n}\r\n\r\n/**\r\n * Format time for display\r\n */\r\nfunction formatTimeDisplay(date: Date): string {\r\n const hours = date.getUTCHours().toString().padStart(2, '0');\r\n const mins = date.getUTCMinutes().toString().padStart(2, '0');\r\n const secs = date.getUTCSeconds().toString().padStart(2, '0');\r\n return `${hours}:${mins}:${secs}`;\r\n}\r\n\r\n/**\r\n * Format date for display\r\n */\r\nfunction formatDateDisplay(date: Date): string {\r\n const year = date.getUTCFullYear();\r\n const month = (date.getUTCMonth() + 1).toString().padStart(2, '0');\r\n const day = date.getUTCDate().toString().padStart(2, '0');\r\n return `${year}-${month}-${day}`;\r\n}\r\n\r\n// ============================================================================\r\n// Sub-components\r\n// ============================================================================\r\n\r\ninterface ControlButtonProps {\r\n icon: string;\r\n label: string;\r\n onClick?: () => void;\r\n active?: boolean;\r\n disabled?: boolean;\r\n danger?: boolean;\r\n tokens: ReturnType<typeof useTheme>['tokens'];\r\n small?: boolean;\r\n}\r\n\r\nconst ControlButton = memo(function ControlButton({\r\n icon,\r\n label,\r\n onClick,\r\n active = false,\r\n disabled = false,\r\n danger = false,\r\n tokens,\r\n small = false,\r\n}: ControlButtonProps) {\r\n const size = small ? 28 : 32;\r\n const iconSize = small ? 14 : 16;\r\n \r\n const baseColor = danger \r\n ? tokens.colors.status.critical \r\n : active \r\n ? tokens.colors.status.normal \r\n : tokens.colors.text.primary;\r\n \r\n const bgColor = active \r\n ? `${tokens.colors.status.normal}25`\r\n : 'rgba(255,255,255,0.14)';\r\n \r\n return (\r\n <Tooltip content={label} placement=\"bottom\">\r\n <button\r\n onClick={onClick}\r\n disabled={disabled}\r\n aria-label={label}\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n width: size,\r\n height: size,\r\n padding: 0,\r\n border: 'none',\r\n borderRadius: tokens.borderRadius.md,\r\n backgroundColor: disabled ? 'rgba(255,255,255,0.06)' : bgColor,\r\n color: disabled ? tokens.colors.text.tertiary : baseColor,\r\n cursor: disabled ? 'not-allowed' : 'pointer',\r\n transition: 'all 0.15s ease',\r\n opacity: disabled ? 0.5 : 1,\r\n }}\r\n onMouseEnter={(e) => {\r\n if (!disabled) {\r\n e.currentTarget.style.backgroundColor = active \r\n ? `${tokens.colors.status.normal}35`\r\n : 'rgba(255,255,255,0.22)';\r\n }\r\n }}\r\n onMouseLeave={(e) => {\r\n if (!disabled) {\r\n e.currentTarget.style.backgroundColor = bgColor;\r\n }\r\n }}\r\n >\r\n <AstroIcon \r\n name={icon as any} \r\n size={iconSize} \r\n color={disabled ? tokens.colors.text.tertiary : baseColor}\r\n />\r\n </button>\r\n </Tooltip>\r\n );\r\n});\r\n\r\ninterface TimeScaleSelectorProps {\r\n value: number;\r\n presets: number[];\r\n onChange?: (scale: number) => void;\r\n disabled?: boolean;\r\n tokens: ReturnType<typeof useTheme>['tokens'];\r\n small?: boolean;\r\n}\r\n\r\nconst TimeScaleSelector = memo(function TimeScaleSelector({\r\n value,\r\n presets,\r\n onChange,\r\n disabled = false,\r\n tokens,\r\n small = false,\r\n}: TimeScaleSelectorProps) {\r\n const [isOpen, setIsOpen] = useState(false);\r\n \r\n return (\r\n <div style={{ position: 'relative' }}>\r\n <Tooltip content=\"Time Scale / Playback Speed\" placement=\"bottom\">\r\n <button\r\n onClick={() => !disabled && setIsOpen(!isOpen)}\r\n disabled={disabled}\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: 4,\r\n padding: small ? '4px 8px' : '6px 10px',\r\n border: 'none',\r\n borderRadius: tokens.borderRadius.sm,\r\n backgroundColor: 'rgba(255,255,255,0.08)',\r\n color: value !== 1 ? tokens.colors.status.caution : tokens.colors.text.secondary,\r\n fontSize: small ? tokens.typography.fontSize.xxs : '0.6875rem', // 10px/11px in rem\r\n fontWeight: 700, // AstroUXDS bold for time display (critical info)\r\n fontFamily: tokens.typography.fontFamily.mono,\r\n cursor: disabled ? 'not-allowed' : 'pointer',\r\n transition: 'all 0.15s ease',\r\n opacity: disabled ? 0.5 : 1,\r\n ...tabularNumsStyle,\r\n }}\r\n >\r\n <AstroIcon name=\"fast-forward\" size={small ? 10 : 12} color=\"inherit\" />\r\n {formatTimeScale(value)}\r\n </button>\r\n </Tooltip>\r\n \r\n {isOpen && !disabled && (\r\n <>\r\n <div \r\n style={{ \r\n position: 'fixed', \r\n inset: 0, \r\n zIndex: 99 \r\n }} \r\n onClick={() => setIsOpen(false)} \r\n />\r\n <div\r\n style={{\r\n position: 'absolute',\r\n top: '100%',\r\n left: '50%',\r\n transform: 'translateX(-50%)',\r\n marginTop: 4,\r\n padding: 4,\r\n backgroundColor: tokens.colors.background.elevated,\r\n border: `1px solid ${tokens.colors.border.default}`,\r\n borderRadius: tokens.borderRadius.md,\r\n boxShadow: tokens.shadows.lg,\r\n zIndex: 100,\r\n minWidth: 80,\r\n }}\r\n >\r\n {presets.map((scale) => (\r\n <button\r\n key={scale}\r\n onClick={() => {\r\n onChange?.(scale);\r\n setIsOpen(false);\r\n }}\r\n style={{\r\n display: 'block',\r\n width: '100%',\r\n padding: '6px 12px',\r\n border: 'none',\r\n borderRadius: tokens.borderRadius.sm,\r\n backgroundColor: value === scale ? tokens.colors.accent.primary : 'transparent',\r\n color: value === scale ? '#ffffff' : tokens.colors.text.secondary,\r\n fontSize: '0.6875rem', // 11px in rem\r\n fontWeight: value === scale ? 500 : 400, // AstroUXDS: 500 (medium) not 600\r\n fontFamily: tokens.typography.fontFamily.mono,\r\n textAlign: 'center',\r\n cursor: 'pointer',\r\n transition: 'all 0.1s ease',\r\n ...tabularNumsStyle,\r\n }}\r\n onMouseEnter={(e) => {\r\n if (value !== scale) {\r\n e.currentTarget.style.backgroundColor = 'rgba(255,255,255,0.1)';\r\n }\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = value === scale \r\n ? tokens.colors.accent.primary \r\n : 'transparent';\r\n }}\r\n >\r\n {formatTimeScale(scale)}\r\n </button>\r\n ))}\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n );\r\n});\r\n\r\ninterface SimulationTimeDisplayProps {\r\n currentTime?: Date;\r\n elapsedSeconds?: number;\r\n showElapsed?: boolean;\r\n showCurrent?: boolean;\r\n showDate?: boolean;\r\n isPlaying?: boolean;\r\n tokens: ReturnType<typeof useTheme>['tokens'];\r\n small?: boolean;\r\n}\r\n\r\nconst SimulationTimeDisplay = memo(function SimulationTimeDisplay({\r\n currentTime,\r\n elapsedSeconds,\r\n showElapsed = true,\r\n showCurrent = true,\r\n showDate = false,\r\n isPlaying = false,\r\n tokens,\r\n small = false,\r\n}: SimulationTimeDisplayProps) {\r\n return (\r\n <div\r\n style={{\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'center',\r\n gap: 2,\r\n padding: `${tokens.spacing.xs} ${tokens.spacing.sm}`,\r\n }}\r\n >\r\n {showDate && currentTime && (\r\n <span\r\n style={{\r\n fontSize: tokens.typography.fontSize.xs,\r\n fontFamily: tokens.typography.fontFamily.mono,\r\n color: tokens.colors.text.tertiary,\r\n ...tabularNumsStyle,\r\n }}\r\n >\r\n {formatDateDisplay(currentTime)}\r\n </span>\r\n )}\r\n \r\n {showCurrent && currentTime && (\r\n <span\r\n style={{\r\n fontSize: small ? tokens.typography.fontSize.lg : tokens.typography.fontSize.xl,\r\n fontWeight: tokens.typography.fontWeight.bold, // Bold (700) to match MissionClock\r\n fontFamily: tokens.typography.fontFamily.mono,\r\n color: tokens.colors.text.primary,\r\n ...tabularNumsStyle,\r\n }}\r\n >\r\n {formatTimeDisplay(currentTime)}\r\n </span>\r\n )}\r\n \r\n {showElapsed && elapsedSeconds !== undefined && (\r\n <span\r\n style={{\r\n fontSize: tokens.typography.fontSize.sm,\r\n fontFamily: tokens.typography.fontFamily.mono,\r\n color: tokens.colors.status.caution,\r\n ...tabularNumsStyle,\r\n }}\r\n >\r\n T{elapsedSeconds >= 0 ? '+' : ''}{formatElapsedTime(elapsedSeconds)}\r\n </span>\r\n )}\r\n \r\n <span\r\n style={{\r\n fontSize: tokens.typography.fontSize.xs,\r\n fontWeight: tokens.typography.fontWeight.medium,\r\n color: isPlaying ? safeAccentText(tokens.colors.accent.primary) : tokens.colors.status.standby,\r\n textTransform: 'uppercase',\r\n letterSpacing: tokens.typography.letterSpacing.wide,\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: 4,\r\n }}\r\n >\r\n {isPlaying && (\r\n <span\r\n style={{\r\n width: 6,\r\n height: 6,\r\n borderRadius: '50%',\r\n backgroundColor: tokens.colors.accent.primary,\r\n animation: 'pulse 1.5s ease-in-out infinite',\r\n }}\r\n />\r\n )}\r\n SIM\r\n </span>\r\n </div>\r\n );\r\n});\r\n\r\n// ============================================================================\r\n// Main Component\r\n// ============================================================================\r\n\r\n/**\r\n * SimulationControls - Playback controls for space simulation\r\n * \r\n * Provides comprehensive simulation time control following Astro UX patterns.\r\n * Designed for mission control and space operations applications.\r\n * \r\n * @example\r\n * ```tsx\r\n * // Basic usage\r\n * <SimulationControls\r\n * isPlaying={isPlaying}\r\n * onPlay={() => setIsPlaying(true)}\r\n * onPause={() => setIsPlaying(false)}\r\n * onStop={handleReset}\r\n * />\r\n * \r\n * // Full featured\r\n * <SimulationControls\r\n * isPlaying={isPlaying}\r\n * onPlay={handlePlay}\r\n * onPause={handlePause}\r\n * onStop={handleStop}\r\n * onStepForward={handleStepForward}\r\n * onStepBackward={handleStepBackward}\r\n * currentTime={simulationTime}\r\n * epoch={epoch}\r\n * elapsedSeconds={elapsed}\r\n * timeScale={timeScale}\r\n * onTimeScaleChange={setTimeScale}\r\n * showTimeScale\r\n * showStepControls\r\n * showElapsedTime\r\n * />\r\n * \r\n * // In AppBar center slot\r\n * <AppBar\r\n * appName=\"Mission Control\"\r\n * centerSlot={\r\n * <SimulationControls\r\n * compact\r\n * isPlaying={isPlaying}\r\n * onPlay={handlePlay}\r\n * onPause={handlePause}\r\n * currentTime={simTime}\r\n * />\r\n * }\r\n * />\r\n * ```\r\n */\r\nexport const SimulationControls = memo(function SimulationControls({\r\n state,\r\n isPlaying: isPlayingProp,\r\n isPaused,\r\n onPlay,\r\n onPause,\r\n onStop,\r\n onStepForward,\r\n onStepBackward,\r\n currentTime: currentTimeProp,\r\n epoch,\r\n elapsedSeconds: elapsedSecondsProp,\r\n showElapsedTime = true,\r\n showCurrentTime = true,\r\n showDate = true,\r\n timeScale = 1,\r\n onTimeScaleChange,\r\n timeScalePresets = DEFAULT_TIME_SCALE_PRESETS,\r\n showTimeScale = true,\r\n stepSize = 60,\r\n onStepSizeChange: _onStepSizeChange,\r\n stepSizePresets: _stepSizePresets = DEFAULT_STEP_SIZE_PRESETS,\r\n showStepControls = true,\r\n compact = false,\r\n small = false,\r\n className = '',\r\n disabled = false,\r\n showStatus = true,\r\n label,\r\n}: SimulationControlsProps): React.ReactElement {\r\n const { tokens, theme } = useTheme();\r\n const isTransparentTheme = theme === 'transparent' || theme === 'transparent-bold' || theme === 'transparent-minimal';\r\n \r\n // Derive playing state from props\r\n const isPlaying = useMemo(() => {\r\n if (state) return state === 'playing';\r\n return isPlayingProp ?? false;\r\n }, [state, isPlayingProp]);\r\n \r\n const isStopped = useMemo(() => {\r\n if (state) return state === 'stopped';\r\n return !isPlayingProp && !isPaused;\r\n }, [state, isPlayingProp, isPaused]);\r\n \r\n // Parse current time\r\n const currentTime = useMemo(() => {\r\n if (!currentTimeProp) return undefined;\r\n return typeof currentTimeProp === 'string' ? new Date(currentTimeProp) : currentTimeProp;\r\n }, [currentTimeProp]);\r\n \r\n // Calculate elapsed seconds\r\n const elapsedSeconds = useMemo(() => {\r\n if (elapsedSecondsProp !== undefined) return elapsedSecondsProp;\r\n if (currentTime && epoch) {\r\n const epochDate = typeof epoch === 'string' ? new Date(epoch) : epoch;\r\n return (currentTime.getTime() - epochDate.getTime()) / 1000;\r\n }\r\n return undefined;\r\n }, [elapsedSecondsProp, currentTime, epoch]);\r\n \r\n // Handle play/pause toggle\r\n const handlePlayPause = useCallback(() => {\r\n if (isPlaying) {\r\n onPause?.();\r\n } else {\r\n onPlay?.();\r\n }\r\n }, [isPlaying, onPlay, onPause]);\r\n \r\n // Handle keyboard shortcuts\r\n const handleKeyDown = useCallback((e: React.KeyboardEvent) => {\r\n if (disabled) return;\r\n \r\n switch (e.key) {\r\n case ' ':\r\n e.preventDefault();\r\n handlePlayPause();\r\n break;\r\n case 'Escape':\r\n e.preventDefault();\r\n onStop?.();\r\n break;\r\n case 'ArrowRight':\r\n e.preventDefault();\r\n onStepForward?.();\r\n break;\r\n case 'ArrowLeft':\r\n e.preventDefault();\r\n onStepBackward?.();\r\n break;\r\n }\r\n }, [disabled, handlePlayPause, onStop, onStepForward, onStepBackward]);\r\n \r\n return (\r\n <div\r\n className={classNames('zendir-simulation-controls', className)}\r\n role=\"group\"\r\n aria-label={label || 'Simulation Controls'}\r\n onKeyDown={handleKeyDown}\r\n tabIndex={0}\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: compact ? tokens.spacing.sm : tokens.spacing.md,\r\n padding: compact \r\n ? `${tokens.spacing.xs} ${tokens.spacing.sm}`\r\n : `${tokens.spacing.sm} ${tokens.spacing.md}`,\r\n backgroundColor: isTransparentTheme \r\n ? 'rgba(0,0,0,0.3)' \r\n : tokens.colors.background.surface,\r\n ...(isTransparentTheme && { \r\n backdropFilter: 'blur(12px)', \r\n WebkitBackdropFilter: 'blur(12px)' as const \r\n }),\r\n ...(tokens.colors.border.cardStyle ?? { border: `1px solid ${tokens.colors.border.muted}` }),\r\n borderRadius: tokens.borderRadius.lg,\r\n outline: 'none',\r\n transition: tokens.animation.fast,\r\n }}\r\n >\r\n {/* Time Display (if showing time) */}\r\n {(showCurrentTime || showElapsedTime) && !compact && (\r\n <SimulationTimeDisplay\r\n currentTime={currentTime}\r\n elapsedSeconds={elapsedSeconds}\r\n showElapsed={showElapsedTime}\r\n showCurrent={showCurrentTime}\r\n showDate={showDate}\r\n isPlaying={isPlaying}\r\n tokens={tokens}\r\n small={small}\r\n />\r\n )}\r\n \r\n {/* Compact time display */}\r\n {compact && currentTime && (\r\n <div\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: 8,\r\n }}\r\n >\r\n {showDate && (\r\n <span\r\n style={{\r\n fontSize: tokens.typography.fontSize.xs,\r\n fontFamily: tokens.typography.fontFamily.mono,\r\n color: tokens.colors.text.tertiary,\r\n ...tabularNumsStyle,\r\n }}\r\n >\r\n {formatDateDisplay(currentTime)}\r\n </span>\r\n )}\r\n <span\r\n style={{\r\n fontSize: tokens.typography.fontSize.lg,\r\n fontWeight: tokens.typography.fontWeight.bold, // Bold (700) to match MissionClock\r\n fontFamily: tokens.typography.fontFamily.mono,\r\n color: tokens.colors.text.primary,\r\n ...tabularNumsStyle,\r\n }}\r\n >\r\n {formatTimeDisplay(currentTime)}\r\n </span>\r\n {showStatus && (\r\n <span\r\n style={{\r\n fontSize: tokens.typography.fontSize.xs,\r\n fontWeight: tokens.typography.fontWeight.medium,\r\n color: isPlaying ? safeAccentText(tokens.colors.accent.primary) : tokens.colors.status.standby,\r\n textTransform: 'uppercase',\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: 4,\r\n }}\r\n >\r\n {isPlaying && (\r\n <span\r\n style={{\r\n width: 6,\r\n height: 6,\r\n borderRadius: '50%',\r\n backgroundColor: tokens.colors.accent.primary,\r\n }}\r\n />\r\n )}\r\n SIM\r\n </span>\r\n )}\r\n </div>\r\n )}\r\n \r\n {/* Separator */}\r\n {((showCurrentTime || showElapsedTime) || (compact && currentTime)) && (\r\n <div\r\n style={{\r\n width: 1,\r\n height: 24,\r\n backgroundColor: tokens.colors.border.muted,\r\n }}\r\n />\r\n )}\r\n \r\n {/* Transport Controls */}\r\n <div\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: 4,\r\n }}\r\n >\r\n {/* Step Backward */}\r\n {showStepControls && (\r\n <ControlButton\r\n icon=\"skip-previous\"\r\n label={`Step backward ${formatStepSize(stepSize)}`}\r\n onClick={onStepBackward}\r\n disabled={disabled || !onStepBackward}\r\n tokens={tokens}\r\n small={small}\r\n />\r\n )}\r\n \r\n {/* Stop */}\r\n <ControlButton\r\n icon=\"stop\"\r\n label=\"Stop / Reset\"\r\n onClick={onStop}\r\n disabled={disabled || !onStop}\r\n danger={!isStopped}\r\n tokens={tokens}\r\n small={small}\r\n />\r\n \r\n {/* Play/Pause */}\r\n <Tooltip content={isPlaying ? 'Pause (Space)' : 'Play (Space)'} placement=\"bottom\">\r\n <button\r\n onClick={handlePlayPause}\r\n disabled={disabled}\r\n aria-label={isPlaying ? 'Pause simulation' : 'Play simulation'}\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n width: small ? 36 : 44,\r\n height: small ? 36 : 44,\r\n padding: 0,\r\n border: isPlaying ? `2px solid ${tokens.colors.accent.primary}` : 'none',\r\n borderRadius: '50%',\r\n // Use accent primary for both states - playing has outline style\r\n backgroundColor: isPlaying \r\n ? 'rgba(138, 43, 226, 0.15)' // Subtle purple fill when playing\r\n : tokens.colors.accent.primary,\r\n color: isPlaying ? safeAccentText(tokens.colors.accent.primary) : '#ffffff',\r\n cursor: disabled ? 'not-allowed' : 'pointer',\r\n transition: 'all 0.15s ease',\r\n opacity: disabled ? 0.5 : 1,\r\n boxShadow: isPlaying \r\n ? `0 0 16px ${tokens.colors.accent.primary}50`\r\n : `0 0 8px ${tokens.colors.accent.primary}40`,\r\n }}\r\n onMouseEnter={(e) => {\r\n if (!disabled) {\r\n e.currentTarget.style.transform = 'scale(1.05)';\r\n }\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.transform = 'scale(1)';\r\n }}\r\n >\r\n <AstroIcon \r\n name={isPlaying ? 'pause' : 'play-arrow'} \r\n size={small ? 18 : 22} \r\n color={isPlaying ? tokens.colors.accent.primary : '#ffffff'}\r\n />\r\n </button>\r\n </Tooltip>\r\n \r\n {/* Step Forward */}\r\n {showStepControls && (\r\n <ControlButton\r\n icon=\"skip-next\"\r\n label={`Step forward ${formatStepSize(stepSize)}`}\r\n onClick={onStepForward}\r\n disabled={disabled || !onStepForward}\r\n tokens={tokens}\r\n small={small}\r\n />\r\n )}\r\n </div>\r\n \r\n {/* Time Scale */}\r\n {showTimeScale && (\r\n <>\r\n <div\r\n style={{\r\n width: 1,\r\n height: 24,\r\n backgroundColor: tokens.colors.border.muted,\r\n }}\r\n />\r\n <TimeScaleSelector\r\n value={timeScale}\r\n presets={timeScalePresets}\r\n onChange={onTimeScaleChange}\r\n disabled={disabled || !onTimeScaleChange}\r\n tokens={tokens}\r\n small={small}\r\n />\r\n </>\r\n )}\r\n </div>\r\n );\r\n});\r\n\r\n// ============================================================================\r\n// Convenience Components\r\n// ============================================================================\r\n\r\n/**\r\n * MiniSimulationControls - Ultra-compact controls for AppBar\r\n */\r\nexport interface MiniSimulationControlsProps {\r\n isPlaying?: boolean;\r\n onPlay?: () => void;\r\n onPause?: () => void;\r\n onStop?: () => void;\r\n timeScale?: number;\r\n onTimeScaleChange?: (scale: number) => void;\r\n disabled?: boolean;\r\n className?: string;\r\n}\r\n\r\nexport const MiniSimulationControls = memo(function MiniSimulationControls({\r\n isPlaying = false,\r\n onPlay,\r\n onPause,\r\n onStop,\r\n timeScale = 1,\r\n onTimeScaleChange,\r\n disabled = false,\r\n className = '',\r\n}: MiniSimulationControlsProps): React.ReactElement {\r\n return (\r\n <SimulationControls\r\n isPlaying={isPlaying}\r\n onPlay={onPlay}\r\n onPause={onPause}\r\n onStop={onStop}\r\n timeScale={timeScale}\r\n onTimeScaleChange={onTimeScaleChange}\r\n disabled={disabled}\r\n compact\r\n small\r\n showCurrentTime={false}\r\n showElapsedTime={false}\r\n showDate={false}\r\n showStepControls={false}\r\n showTimeScale={Boolean(onTimeScaleChange)}\r\n className={className}\r\n />\r\n );\r\n});\r\n\r\n/**\r\n * SimulationControlsWithClock - Controls combined with MissionClock\r\n */\r\nexport interface SimulationControlsWithClockProps extends Omit<SimulationControlsProps, 'showCurrentTime' | 'showElapsedTime'> {\r\n /** Clock format */\r\n clockFormat?: '12h' | '24h';\r\n /** Timezone label */\r\n timezone?: string;\r\n}\r\n\r\nexport const SimulationControlsWithClock = memo(function SimulationControlsWithClock({\r\n clockFormat: _clockFormat = '24h',\r\n timezone = 'SIM',\r\n ...props\r\n}: SimulationControlsWithClockProps): React.ReactElement {\r\n return (\r\n <SimulationControls\r\n {...props}\r\n showCurrentTime\r\n showElapsedTime\r\n showDate\r\n label={`Simulation Controls - ${timezone}`}\r\n />\r\n );\r\n});\r\n\r\nexport default SimulationControls;\r\n"],"names":["ControlButton","TimeScaleSelector","SimulationTimeDisplay","SimulationControls","MiniSimulationControls","SimulationControlsWithClock"],"mappings":"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"}
1
+ {"version":3,"file":"SimulationControls.js","sources":["../../../src/react/astro/SimulationControls.tsx"],"sourcesContent":["/**\r\n * @zendir/ui - SimulationControls Component\r\n * \r\n * Space operations simulation playback controls following Astro UX patterns.\r\n * Provides play/pause/stop/step controls for simulation time management.\r\n * \r\n * Features:\r\n * - Play/Pause toggle with visual state feedback\r\n * - Stop (reset) functionality\r\n * - Step forward/backward controls\r\n * - Time scale (playback rate) adjustment\r\n * - Simulation time display integration\r\n * - AOS/LOS timer integration\r\n * - Keyboard accessibility\r\n * - AstroUXDS compliant styling\r\n * \r\n * Space Operations Terminology:\r\n * - SIM: Simulation mode indicator\r\n * - MET: Mission Elapsed Time\r\n * - Epoch: Simulation start time (t=0)\r\n * - Time Scale: Playback speed multiplier\r\n * \r\n * @example\r\n * ```tsx\r\n * import { SimulationControls } from '@zendir/ui/react';\r\n * \r\n * <SimulationControls\r\n * isPlaying={isPlaying}\r\n * onPlay={handlePlay}\r\n * onPause={handlePause}\r\n * onStop={handleStop}\r\n * timeScale={1}\r\n * onTimeScaleChange={setTimeScale}\r\n * currentTime={simulationTime}\r\n * epoch={epoch}\r\n * />\r\n * ```\r\n */\r\n\r\nimport React, { memo, useState, useCallback, useMemo } from 'react';\r\nimport { useTheme } from '../theme';\r\nimport { classNames, tabularNumsStyle, safeAccentText } from '../utils';\r\nimport { AstroIcon } from '../core/display/AstroIcon';\r\nimport { Tooltip } from '../core/overlays/Tooltip';\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\nexport type SimulationState = 'stopped' | 'playing' | 'paused';\r\n\r\nexport interface SimulationControlsProps {\r\n /** Current simulation state */\r\n state?: SimulationState;\r\n /** Whether simulation is playing (alternative to state) */\r\n isPlaying?: boolean;\r\n /** Whether simulation is paused (used with isPlaying for 3-state) */\r\n isPaused?: boolean;\r\n \r\n // === Playback Callbacks ===\r\n /** Called when play is triggered */\r\n onPlay?: () => void;\r\n /** Called when pause is triggered */\r\n onPause?: () => void;\r\n /** Called when stop (reset) is triggered */\r\n onStop?: () => void;\r\n /** Called when step forward is triggered */\r\n onStepForward?: () => void;\r\n /** Called when step backward is triggered */\r\n onStepBackward?: () => void;\r\n \r\n // === Time Display ===\r\n /** Current simulation time */\r\n currentTime?: Date | string;\r\n /** Simulation epoch (t=0) */\r\n epoch?: Date | string;\r\n /** Current elapsed seconds from epoch */\r\n elapsedSeconds?: number;\r\n /** Show elapsed time display */\r\n showElapsedTime?: boolean;\r\n /** Show current time display */\r\n showCurrentTime?: boolean;\r\n /** Show date in time display */\r\n showDate?: boolean;\r\n \r\n // === Time Scale ===\r\n /** Current time scale factor (1 = realtime) */\r\n timeScale?: number;\r\n /** Callback when time scale changes */\r\n onTimeScaleChange?: (scale: number) => void;\r\n /** Available time scale presets */\r\n timeScalePresets?: number[];\r\n /** Show time scale controls */\r\n showTimeScale?: boolean;\r\n \r\n // === Step Size ===\r\n /** Step size in seconds */\r\n stepSize?: number;\r\n /** Callback when step size changes */\r\n onStepSizeChange?: (size: number) => void;\r\n /** Available step size presets in seconds */\r\n stepSizePresets?: number[];\r\n /** Show step controls */\r\n showStepControls?: boolean;\r\n \r\n // === Appearance ===\r\n /** Compact display mode */\r\n compact?: boolean;\r\n /** Small size variant */\r\n small?: boolean;\r\n /** Custom className */\r\n className?: string;\r\n /** Disabled state */\r\n disabled?: boolean;\r\n /** Show simulation status indicator */\r\n showStatus?: boolean;\r\n /** Custom label for simulation mode */\r\n label?: string;\r\n}\r\n\r\n// ============================================================================\r\n// Constants\r\n// ============================================================================\r\n\r\nconst DEFAULT_TIME_SCALE_PRESETS = [0.1, 0.25, 0.5, 1, 2, 5, 10, 60, 3600];\r\nconst DEFAULT_STEP_SIZE_PRESETS = [1, 5, 10, 30, 60, 300, 600, 3600];\r\n\r\n// ============================================================================\r\n// Utility Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Format elapsed time as DD:HH:MM:SS\r\n */\r\nfunction formatElapsedTime(seconds: number): string {\r\n const absSeconds = Math.abs(seconds);\r\n const days = Math.floor(absSeconds / 86400);\r\n const hours = Math.floor((absSeconds % 86400) / 3600);\r\n const mins = Math.floor((absSeconds % 3600) / 60);\r\n const secs = Math.floor(absSeconds % 60);\r\n \r\n const sign = seconds < 0 ? '-' : '';\r\n \r\n if (days > 0) {\r\n return `${sign}${days}:${hours.toString().padStart(2, '0')}:${mins.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`;\r\n }\r\n return `${sign}${hours.toString().padStart(2, '0')}:${mins.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`;\r\n}\r\n\r\n/**\r\n * Format time scale for display\r\n */\r\nfunction formatTimeScale(scale: number): string {\r\n if (scale >= 3600) return `${scale / 3600}h/s`;\r\n if (scale >= 60) return `${scale / 60}m/s`;\r\n if (scale === 1) return '1×';\r\n if (scale < 1) return `${scale}×`;\r\n return `${scale}×`;\r\n}\r\n\r\n/**\r\n * Format step size for display\r\n */\r\nfunction formatStepSize(seconds: number): string {\r\n if (seconds >= 3600) return `${seconds / 3600}h`;\r\n if (seconds >= 60) return `${seconds / 60}m`;\r\n return `${seconds}s`;\r\n}\r\n\r\n/**\r\n * Format time for display\r\n */\r\nfunction formatTimeDisplay(date: Date): string {\r\n const hours = date.getUTCHours().toString().padStart(2, '0');\r\n const mins = date.getUTCMinutes().toString().padStart(2, '0');\r\n const secs = date.getUTCSeconds().toString().padStart(2, '0');\r\n return `${hours}:${mins}:${secs}`;\r\n}\r\n\r\n/**\r\n * Format date for display\r\n */\r\nfunction formatDateDisplay(date: Date): string {\r\n const year = date.getUTCFullYear();\r\n const month = (date.getUTCMonth() + 1).toString().padStart(2, '0');\r\n const day = date.getUTCDate().toString().padStart(2, '0');\r\n return `${year}-${month}-${day}`;\r\n}\r\n\r\n// ============================================================================\r\n// Sub-components\r\n// ============================================================================\r\n\r\ninterface ControlButtonProps {\r\n icon: string;\r\n label: string;\r\n onClick?: () => void;\r\n active?: boolean;\r\n disabled?: boolean;\r\n danger?: boolean;\r\n tokens: ReturnType<typeof useTheme>['tokens'];\r\n small?: boolean;\r\n}\r\n\r\nconst ControlButton = memo(function ControlButton({\r\n icon,\r\n label,\r\n onClick,\r\n active = false,\r\n disabled = false,\r\n danger = false,\r\n tokens,\r\n small = false,\r\n}: ControlButtonProps) {\r\n const size = small ? 28 : 32;\r\n const iconSize = small ? 14 : 16;\r\n \r\n const baseColor = danger \r\n ? tokens.colors.status.critical \r\n : active \r\n ? tokens.colors.status.normal \r\n : tokens.colors.text.primary;\r\n \r\n const bgColor = active \r\n ? `${tokens.colors.status.normal}25`\r\n : 'rgba(255,255,255,0.14)';\r\n \r\n return (\r\n <Tooltip content={label} placement=\"bottom\">\r\n <button\r\n onClick={onClick}\r\n disabled={disabled}\r\n aria-label={label}\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n width: size,\r\n height: size,\r\n padding: 0,\r\n border: 'none',\r\n borderRadius: tokens.borderRadius.md,\r\n backgroundColor: disabled ? 'rgba(255,255,255,0.06)' : bgColor,\r\n color: disabled ? tokens.colors.text.tertiary : baseColor,\r\n cursor: disabled ? 'not-allowed' : 'pointer',\r\n transition: 'all 0.15s ease',\r\n opacity: disabled ? 0.5 : 1,\r\n }}\r\n onMouseEnter={(e) => {\r\n if (!disabled) {\r\n e.currentTarget.style.backgroundColor = active \r\n ? `${tokens.colors.status.normal}35`\r\n : 'rgba(255,255,255,0.22)';\r\n }\r\n }}\r\n onMouseLeave={(e) => {\r\n if (!disabled) {\r\n e.currentTarget.style.backgroundColor = bgColor;\r\n }\r\n }}\r\n >\r\n <AstroIcon \r\n name={icon as any} \r\n size={iconSize} \r\n color={disabled ? tokens.colors.text.tertiary : baseColor}\r\n />\r\n </button>\r\n </Tooltip>\r\n );\r\n});\r\n\r\ninterface TimeScaleSelectorProps {\r\n value: number;\r\n presets: number[];\r\n onChange?: (scale: number) => void;\r\n disabled?: boolean;\r\n tokens: ReturnType<typeof useTheme>['tokens'];\r\n small?: boolean;\r\n}\r\n\r\nconst TimeScaleSelector = memo(function TimeScaleSelector({\r\n value,\r\n presets,\r\n onChange,\r\n disabled = false,\r\n tokens,\r\n small = false,\r\n}: TimeScaleSelectorProps) {\r\n const [isOpen, setIsOpen] = useState(false);\r\n \r\n return (\r\n <div style={{ position: 'relative' }}>\r\n <Tooltip content=\"Time Scale / Playback Speed\" placement=\"bottom\">\r\n <button\r\n onClick={() => !disabled && setIsOpen(!isOpen)}\r\n disabled={disabled}\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: 4,\r\n padding: small ? '4px 8px' : '6px 10px',\r\n border: 'none',\r\n borderRadius: tokens.borderRadius.sm,\r\n backgroundColor: 'rgba(255,255,255,0.08)',\r\n color: value !== 1 ? tokens.colors.status.caution : tokens.colors.text.secondary,\r\n fontSize: small ? tokens.typography.fontSize.xxs : '0.6875rem', // 10px/11px in rem\r\n fontWeight: 700, // AstroUXDS bold for time display (critical info)\r\n fontFamily: tokens.typography.fontFamily.mono,\r\n cursor: disabled ? 'not-allowed' : 'pointer',\r\n transition: 'all 0.15s ease',\r\n opacity: disabled ? 0.5 : 1,\r\n ...tabularNumsStyle,\r\n }}\r\n >\r\n <AstroIcon name=\"fast-forward\" size={small ? 10 : 12} color=\"inherit\" />\r\n {formatTimeScale(value)}\r\n </button>\r\n </Tooltip>\r\n \r\n {isOpen && !disabled && (\r\n <>\r\n <div \r\n style={{ \r\n position: 'fixed', \r\n inset: 0, \r\n zIndex: 99 \r\n }} \r\n onClick={() => setIsOpen(false)} \r\n />\r\n <div\r\n style={{\r\n position: 'absolute',\r\n top: '100%',\r\n left: '50%',\r\n transform: 'translateX(-50%)',\r\n marginTop: 4,\r\n padding: 4,\r\n backgroundColor: tokens.colors.background.elevated,\r\n border: `1px solid ${tokens.colors.border.default}`,\r\n borderRadius: tokens.borderRadius.md,\r\n boxShadow: tokens.shadows.lg,\r\n zIndex: 100,\r\n minWidth: 80,\r\n }}\r\n >\r\n {presets.map((scale) => (\r\n <button\r\n key={scale}\r\n onClick={() => {\r\n onChange?.(scale);\r\n setIsOpen(false);\r\n }}\r\n style={{\r\n display: 'block',\r\n width: '100%',\r\n padding: '6px 12px',\r\n border: 'none',\r\n borderRadius: tokens.borderRadius.sm,\r\n backgroundColor: value === scale ? tokens.colors.accent.primary : 'transparent',\r\n color: value === scale ? '#ffffff' : tokens.colors.text.secondary,\r\n fontSize: '0.6875rem', // 11px in rem\r\n fontWeight: value === scale ? 500 : 400, // AstroUXDS: 500 (medium) not 600\r\n fontFamily: tokens.typography.fontFamily.mono,\r\n textAlign: 'center',\r\n cursor: 'pointer',\r\n transition: 'all 0.1s ease',\r\n ...tabularNumsStyle,\r\n }}\r\n onMouseEnter={(e) => {\r\n if (value !== scale) {\r\n e.currentTarget.style.backgroundColor = 'rgba(255,255,255,0.1)';\r\n }\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.backgroundColor = value === scale \r\n ? tokens.colors.accent.primary \r\n : 'transparent';\r\n }}\r\n >\r\n {formatTimeScale(scale)}\r\n </button>\r\n ))}\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n );\r\n});\r\n\r\ninterface SimulationTimeDisplayProps {\r\n currentTime?: Date;\r\n elapsedSeconds?: number;\r\n showElapsed?: boolean;\r\n showCurrent?: boolean;\r\n showDate?: boolean;\r\n isPlaying?: boolean;\r\n tokens: ReturnType<typeof useTheme>['tokens'];\r\n small?: boolean;\r\n}\r\n\r\nconst SimulationTimeDisplay = memo(function SimulationTimeDisplay({\r\n currentTime,\r\n elapsedSeconds,\r\n showElapsed = true,\r\n showCurrent = true,\r\n showDate = false,\r\n isPlaying = false,\r\n tokens,\r\n small = false,\r\n}: SimulationTimeDisplayProps) {\r\n return (\r\n <div\r\n style={{\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'center',\r\n gap: 2,\r\n padding: `${tokens.spacing.xs} ${tokens.spacing.sm}`,\r\n }}\r\n >\r\n {showDate && currentTime && (\r\n <span\r\n style={{\r\n fontSize: tokens.typography.fontSize.xs,\r\n fontFamily: tokens.typography.fontFamily.mono,\r\n color: tokens.colors.text.tertiary,\r\n ...tabularNumsStyle,\r\n }}\r\n >\r\n {formatDateDisplay(currentTime)}\r\n </span>\r\n )}\r\n \r\n {showCurrent && currentTime && (\r\n <span\r\n style={{\r\n fontSize: small ? tokens.typography.fontSize.lg : tokens.typography.fontSize.xl,\r\n fontWeight: tokens.typography.fontWeight.bold, // Bold (700) to match MissionClock\r\n fontFamily: tokens.typography.fontFamily.mono,\r\n color: tokens.colors.text.primary,\r\n ...tabularNumsStyle,\r\n }}\r\n >\r\n {formatTimeDisplay(currentTime)}\r\n </span>\r\n )}\r\n \r\n {showElapsed && elapsedSeconds !== undefined && (\r\n <span\r\n style={{\r\n fontSize: tokens.typography.fontSize.sm,\r\n fontFamily: tokens.typography.fontFamily.mono,\r\n color: tokens.colors.status.caution,\r\n ...tabularNumsStyle,\r\n }}\r\n >\r\n T{elapsedSeconds >= 0 ? '+' : ''}{formatElapsedTime(elapsedSeconds)}\r\n </span>\r\n )}\r\n \r\n <span\r\n style={{\r\n fontSize: tokens.typography.fontSize.xs,\r\n fontWeight: tokens.typography.fontWeight.medium,\r\n color: isPlaying ? safeAccentText(tokens.colors.accent.primary) : tokens.colors.status.standby,\r\n textTransform: 'uppercase',\r\n letterSpacing: tokens.typography.letterSpacing.wide,\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: 4,\r\n }}\r\n >\r\n {isPlaying && (\r\n <span\r\n style={{\r\n width: 6,\r\n height: 6,\r\n borderRadius: '50%',\r\n backgroundColor: tokens.colors.accent.primary,\r\n animation: 'pulse 1.5s ease-in-out infinite',\r\n }}\r\n />\r\n )}\r\n SIM\r\n </span>\r\n </div>\r\n );\r\n});\r\n\r\n// ============================================================================\r\n// Main Component\r\n// ============================================================================\r\n\r\n/**\r\n * SimulationControls - Playback controls for space simulation\r\n * \r\n * Provides comprehensive simulation time control following Astro UX patterns.\r\n * Designed for mission control and space operations applications.\r\n * \r\n * @example\r\n * ```tsx\r\n * // Basic usage\r\n * <SimulationControls\r\n * isPlaying={isPlaying}\r\n * onPlay={() => setIsPlaying(true)}\r\n * onPause={() => setIsPlaying(false)}\r\n * onStop={handleReset}\r\n * />\r\n * \r\n * // Full featured\r\n * <SimulationControls\r\n * isPlaying={isPlaying}\r\n * onPlay={handlePlay}\r\n * onPause={handlePause}\r\n * onStop={handleStop}\r\n * onStepForward={handleStepForward}\r\n * onStepBackward={handleStepBackward}\r\n * currentTime={simulationTime}\r\n * epoch={epoch}\r\n * elapsedSeconds={elapsed}\r\n * timeScale={timeScale}\r\n * onTimeScaleChange={setTimeScale}\r\n * showTimeScale\r\n * showStepControls\r\n * showElapsedTime\r\n * />\r\n * \r\n * // In AppBar center slot\r\n * <AppBar\r\n * appName=\"Mission Control\"\r\n * centerSlot={\r\n * <SimulationControls\r\n * compact\r\n * isPlaying={isPlaying}\r\n * onPlay={handlePlay}\r\n * onPause={handlePause}\r\n * currentTime={simTime}\r\n * />\r\n * }\r\n * />\r\n * ```\r\n */\r\nexport const SimulationControls = memo(function SimulationControls({\r\n state,\r\n isPlaying: isPlayingProp,\r\n isPaused,\r\n onPlay,\r\n onPause,\r\n onStop,\r\n onStepForward,\r\n onStepBackward,\r\n currentTime: currentTimeProp,\r\n epoch,\r\n elapsedSeconds: elapsedSecondsProp,\r\n showElapsedTime = true,\r\n showCurrentTime = true,\r\n showDate = true,\r\n timeScale = 1,\r\n onTimeScaleChange,\r\n timeScalePresets = DEFAULT_TIME_SCALE_PRESETS,\r\n showTimeScale = true,\r\n stepSize = 60,\r\n onStepSizeChange: _onStepSizeChange,\r\n stepSizePresets: _stepSizePresets = DEFAULT_STEP_SIZE_PRESETS,\r\n showStepControls = true,\r\n compact = false,\r\n small = false,\r\n className = '',\r\n disabled = false,\r\n showStatus = true,\r\n label,\r\n}: SimulationControlsProps): React.ReactElement {\r\n const { tokens, theme } = useTheme();\r\n const isTransparentTheme = theme === 'transparent' || theme === 'transparent-bold' || theme === 'transparent-minimal';\r\n \r\n // Derive playing state from props\r\n const isPlaying = useMemo(() => {\r\n if (state) return state === 'playing';\r\n return isPlayingProp ?? false;\r\n }, [state, isPlayingProp]);\r\n \r\n const isStopped = useMemo(() => {\r\n if (state) return state === 'stopped';\r\n return !isPlayingProp && !isPaused;\r\n }, [state, isPlayingProp, isPaused]);\r\n \r\n // Parse current time\r\n const currentTime = useMemo(() => {\r\n if (!currentTimeProp) return undefined;\r\n return typeof currentTimeProp === 'string' ? new Date(currentTimeProp) : currentTimeProp;\r\n }, [currentTimeProp]);\r\n \r\n // Calculate elapsed seconds\r\n const elapsedSeconds = useMemo(() => {\r\n if (elapsedSecondsProp !== undefined) return elapsedSecondsProp;\r\n if (currentTime && epoch) {\r\n const epochDate = typeof epoch === 'string' ? new Date(epoch) : epoch;\r\n return (currentTime.getTime() - epochDate.getTime()) / 1000;\r\n }\r\n return undefined;\r\n }, [elapsedSecondsProp, currentTime, epoch]);\r\n \r\n // Handle play/pause toggle\r\n const handlePlayPause = useCallback(() => {\r\n if (isPlaying) {\r\n onPause?.();\r\n } else {\r\n onPlay?.();\r\n }\r\n }, [isPlaying, onPlay, onPause]);\r\n \r\n // Handle keyboard shortcuts\r\n const handleKeyDown = useCallback((e: React.KeyboardEvent) => {\r\n if (disabled) return;\r\n \r\n switch (e.key) {\r\n case ' ':\r\n e.preventDefault();\r\n handlePlayPause();\r\n break;\r\n case 'Escape':\r\n e.preventDefault();\r\n onStop?.();\r\n break;\r\n case 'ArrowRight':\r\n e.preventDefault();\r\n onStepForward?.();\r\n break;\r\n case 'ArrowLeft':\r\n e.preventDefault();\r\n onStepBackward?.();\r\n break;\r\n }\r\n }, [disabled, handlePlayPause, onStop, onStepForward, onStepBackward]);\r\n \r\n return (\r\n <div\r\n className={classNames('zendir-simulation-controls', className)}\r\n role=\"group\"\r\n aria-label={label || 'Simulation Controls'}\r\n onKeyDown={handleKeyDown}\r\n tabIndex={0}\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: compact ? tokens.spacing.sm : tokens.spacing.md,\r\n padding: compact \r\n ? `${tokens.spacing.xs} ${tokens.spacing.sm}`\r\n : `${tokens.spacing.sm} ${tokens.spacing.md}`,\r\n backgroundColor: isTransparentTheme \r\n ? 'rgba(0,0,0,0.3)' \r\n : tokens.colors.background.surface,\r\n ...(isTransparentTheme && { \r\n backdropFilter: 'blur(12px)', \r\n WebkitBackdropFilter: 'blur(12px)' as const \r\n }),\r\n ...(tokens.colors.border.cardStyle ?? { border: `1px solid ${tokens.colors.border.muted}` }),\r\n borderRadius: tokens.borderRadius.lg,\r\n outline: 'none',\r\n transition: tokens.animation.fast,\r\n }}\r\n >\r\n {/* Time Display (if showing time) */}\r\n {(showCurrentTime || showElapsedTime) && !compact && (\r\n <SimulationTimeDisplay\r\n currentTime={currentTime}\r\n elapsedSeconds={elapsedSeconds}\r\n showElapsed={showElapsedTime}\r\n showCurrent={showCurrentTime}\r\n showDate={showDate}\r\n isPlaying={isPlaying}\r\n tokens={tokens}\r\n small={small}\r\n />\r\n )}\r\n \r\n {/* Compact time display */}\r\n {compact && currentTime && (\r\n <div\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: 8,\r\n }}\r\n >\r\n {showDate && (\r\n <span\r\n style={{\r\n fontSize: tokens.typography.fontSize.xs,\r\n fontFamily: tokens.typography.fontFamily.mono,\r\n color: tokens.colors.text.tertiary,\r\n ...tabularNumsStyle,\r\n }}\r\n >\r\n {formatDateDisplay(currentTime)}\r\n </span>\r\n )}\r\n <span\r\n style={{\r\n fontSize: tokens.typography.fontSize.lg,\r\n fontWeight: tokens.typography.fontWeight.bold, // Bold (700) to match MissionClock\r\n fontFamily: tokens.typography.fontFamily.mono,\r\n color: tokens.colors.text.primary,\r\n ...tabularNumsStyle,\r\n }}\r\n >\r\n {formatTimeDisplay(currentTime)}\r\n </span>\r\n {showStatus && (\r\n <span\r\n style={{\r\n fontSize: tokens.typography.fontSize.xs,\r\n fontWeight: tokens.typography.fontWeight.medium,\r\n color: isPlaying ? safeAccentText(tokens.colors.accent.primary) : tokens.colors.status.standby,\r\n textTransform: 'uppercase',\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: 4,\r\n }}\r\n >\r\n {isPlaying && (\r\n <span\r\n style={{\r\n width: 6,\r\n height: 6,\r\n borderRadius: '50%',\r\n backgroundColor: tokens.colors.accent.primary,\r\n }}\r\n />\r\n )}\r\n SIM\r\n </span>\r\n )}\r\n </div>\r\n )}\r\n \r\n {/* Separator */}\r\n {((showCurrentTime || showElapsedTime) || (compact && currentTime)) && (\r\n <div\r\n style={{\r\n width: 1,\r\n height: 24,\r\n backgroundColor: tokens.colors.border.muted,\r\n }}\r\n />\r\n )}\r\n \r\n {/* Transport Controls */}\r\n <div\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: 4,\r\n }}\r\n >\r\n {/* Step Backward */}\r\n {showStepControls && (\r\n <ControlButton\r\n icon=\"skip-previous\"\r\n label={`Step backward ${formatStepSize(stepSize)}`}\r\n onClick={onStepBackward}\r\n disabled={disabled || !onStepBackward}\r\n tokens={tokens}\r\n small={small}\r\n />\r\n )}\r\n \r\n {/* Stop */}\r\n <ControlButton\r\n icon=\"stop\"\r\n label=\"Stop / Reset\"\r\n onClick={onStop}\r\n disabled={disabled || !onStop}\r\n danger={!isStopped}\r\n tokens={tokens}\r\n small={small}\r\n />\r\n \r\n {/* Play/Pause */}\r\n <Tooltip content={isPlaying ? 'Pause (Space)' : 'Play (Space)'} placement=\"bottom\">\r\n <button\r\n onClick={handlePlayPause}\r\n disabled={disabled}\r\n aria-label={isPlaying ? 'Pause simulation' : 'Play simulation'}\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n width: small ? 36 : 44,\r\n height: small ? 36 : 44,\r\n padding: 0,\r\n border: isPlaying ? `2px solid ${tokens.colors.accent.primary}` : 'none',\r\n borderRadius: '50%',\r\n // Use accent primary for both states - playing has outline style\r\n backgroundColor: isPlaying \r\n ? 'rgba(138, 43, 226, 0.15)' // Subtle purple fill when playing\r\n : tokens.colors.accent.primary,\r\n color: isPlaying ? safeAccentText(tokens.colors.accent.primary) : '#ffffff',\r\n cursor: disabled ? 'not-allowed' : 'pointer',\r\n transition: 'all 0.15s ease',\r\n opacity: disabled ? 0.5 : 1,\r\n boxShadow: isPlaying \r\n ? `0 0 16px ${tokens.colors.accent.primary}50`\r\n : `0 0 8px ${tokens.colors.accent.primary}40`,\r\n }}\r\n onMouseEnter={(e) => {\r\n if (!disabled) {\r\n e.currentTarget.style.transform = 'scale(1.05)';\r\n }\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.transform = 'scale(1)';\r\n }}\r\n >\r\n <AstroIcon \r\n name={isPlaying ? 'pause' : 'play-arrow'} \r\n size={small ? 18 : 22} \r\n color={isPlaying ? tokens.colors.accent.primary : '#ffffff'}\r\n />\r\n </button>\r\n </Tooltip>\r\n \r\n {/* Step Forward */}\r\n {showStepControls && (\r\n <ControlButton\r\n icon=\"skip-next\"\r\n label={`Step forward ${formatStepSize(stepSize)}`}\r\n onClick={onStepForward}\r\n disabled={disabled || !onStepForward}\r\n tokens={tokens}\r\n small={small}\r\n />\r\n )}\r\n </div>\r\n \r\n {/* Time Scale */}\r\n {showTimeScale && (\r\n <>\r\n <div\r\n style={{\r\n width: 1,\r\n height: 24,\r\n backgroundColor: tokens.colors.border.muted,\r\n }}\r\n />\r\n <TimeScaleSelector\r\n value={timeScale}\r\n presets={timeScalePresets}\r\n onChange={onTimeScaleChange}\r\n disabled={disabled || !onTimeScaleChange}\r\n tokens={tokens}\r\n small={small}\r\n />\r\n </>\r\n )}\r\n </div>\r\n );\r\n});\r\n\r\n// ============================================================================\r\n// Convenience Components\r\n// ============================================================================\r\n\r\n/**\r\n * MiniSimulationControls - Ultra-compact controls for AppBar\r\n */\r\nexport interface MiniSimulationControlsProps {\r\n isPlaying?: boolean;\r\n onPlay?: () => void;\r\n onPause?: () => void;\r\n onStop?: () => void;\r\n timeScale?: number;\r\n onTimeScaleChange?: (scale: number) => void;\r\n disabled?: boolean;\r\n className?: string;\r\n}\r\n\r\nexport const MiniSimulationControls = memo(function MiniSimulationControls({\r\n isPlaying = false,\r\n onPlay,\r\n onPause,\r\n onStop,\r\n timeScale = 1,\r\n onTimeScaleChange,\r\n disabled = false,\r\n className = '',\r\n}: MiniSimulationControlsProps): React.ReactElement {\r\n return (\r\n <SimulationControls\r\n isPlaying={isPlaying}\r\n onPlay={onPlay}\r\n onPause={onPause}\r\n onStop={onStop}\r\n timeScale={timeScale}\r\n onTimeScaleChange={onTimeScaleChange}\r\n disabled={disabled}\r\n compact\r\n small\r\n showCurrentTime={false}\r\n showElapsedTime={false}\r\n showDate={false}\r\n showStepControls={false}\r\n showTimeScale={Boolean(onTimeScaleChange)}\r\n className={className}\r\n />\r\n );\r\n});\r\n\r\n/**\r\n * SimulationControlsWithClock - Controls combined with MissionClock\r\n */\r\nexport interface SimulationControlsWithClockProps extends Omit<SimulationControlsProps, 'showCurrentTime' | 'showElapsedTime'> {\r\n /** Clock format */\r\n clockFormat?: '12h' | '24h';\r\n /** Timezone label */\r\n timezone?: string;\r\n}\r\n\r\nexport const SimulationControlsWithClock = memo(function SimulationControlsWithClock({\r\n clockFormat: _clockFormat = '24h',\r\n timezone = 'SIM',\r\n ...props\r\n}: SimulationControlsWithClockProps): React.ReactElement {\r\n return (\r\n <SimulationControls\r\n {...props}\r\n showCurrentTime\r\n showElapsedTime\r\n showDate\r\n label={`Simulation Controls - ${timezone}`}\r\n />\r\n );\r\n});\r\n\r\nexport default SimulationControls;\r\n"],"names":["ControlButton","TimeScaleSelector","SimulationTimeDisplay","SimulationControls","MiniSimulationControls","SimulationControlsWithClock"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { jsxs, jsx } from "react/jsx-runtime";
2
2
  import { memo } from "react";
3
- import { classNames } from "../utils/index.js";
4
3
  import { useTheme } from "../theme/ThemeProvider.js";
4
+ import { classNames } from "../utils/index.js";
5
5
  const STATUS_COLORS_DARK = {
6
6
  off: "#a4abb6",
7
7
  standby: "#2dccff",
@@ -1,13 +1,13 @@
1
1
  import { jsxs, jsx, Fragment } from "react/jsx-runtime";
2
2
  import { memo, useState, useCallback, useMemo, useRef, useEffect } from "react";
3
+ import { useTheme } from "../theme/ThemeProvider.js";
3
4
  import { classNames, safeAccentText } from "../utils/index.js";
4
5
  import { useCategoryPalette } from "../context/CategoryContext.js";
5
- import { Icon } from "../core/Icon.js";
6
- import { Badge } from "../core/Badge.js";
7
- import { Tooltip } from "../core/Tooltip.js";
8
- import { Button } from "../core/Button.js";
6
+ import { Icon } from "../core/display/Icon.js";
7
+ import { Badge } from "../core/display/Badge.js";
8
+ import { Tooltip } from "../core/overlays/Tooltip.js";
9
+ import { Button } from "../core/inputs/Button.js";
9
10
  import { useBreakpoint } from "../core/layout/useBreakpoint.js";
10
- import { useTheme } from "../theme/ThemeProvider.js";
11
11
  const Z = {
12
12
  /** Base layer for track events / scatter dots */
13
13
  trackEvent: 1,