@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":"generators.js","sources":["../../../../src/react/charts/unified/generators.ts"],"sourcesContent":["/**\r\n * @zendir/ui - Realistic Space Data Generators\r\n * \r\n * Generate realistic demo data for space-specific charts.\r\n * All generators produce physically accurate data following orbital mechanics\r\n * and RF/signal propagation principles.\r\n */\r\n\r\nimport type {\r\n PowerChartData,\r\n AttitudeChartData,\r\n WaterfallDataPoint,\r\n DopplerTrackPoint,\r\n SatellitePassInfo,\r\n SpectrumDataPoint,\r\n ContactWindowData,\r\n EclipseTimelineData,\r\n HeliocentricOrbitData,\r\n} from './types';\r\nimport type { ConjunctionEvent as _ConjunctionEvent } from './domain';\r\n\r\n// =============================================================================\r\n// Constants\r\n// =============================================================================\r\n\r\nconst SPEED_OF_LIGHT = 299792458; // m/s\r\nconst EARTH_RADIUS = 6371; // km\r\nconst MU_EARTH = 398600.4418; // km³/s² (Earth gravitational parameter)\r\n\r\n// =============================================================================\r\n// Power System Generator\r\n// =============================================================================\r\n\r\nexport interface PowerGeneratorConfig {\r\n /** Orbit period in seconds (default: 5400 = 90 min LEO) */\r\n orbitPeriod?: number;\r\n /** Eclipse duration in seconds (default: 2100 = 35 min) */\r\n eclipseDuration?: number;\r\n /** Solar array power output at optimal pointing (W) */\r\n solarArrayPower?: number;\r\n /** Average load power (W) */\r\n loadPower?: number;\r\n /** Battery capacity (Wh) */\r\n batteryCapacity?: number;\r\n /** Initial state of charge (%) */\r\n initialSoC?: number;\r\n /** Load reduction factor during eclipse (0-1) */\r\n eclipseLoadReduction?: number;\r\n /** Simulation duration in orbits */\r\n orbits?: number;\r\n /** Time resolution in seconds */\r\n resolution?: number;\r\n}\r\n\r\n/**\r\n * Generate realistic LEO satellite power system telemetry\r\n * \r\n * Models:\r\n * - Solar array power variation with orbit phase (cosine pointing loss)\r\n * - Eclipse periods with zero solar input\r\n * - Battery charge/discharge with 90% round-trip efficiency\r\n * - Load shedding during eclipse\r\n */\r\nexport function generatePowerData(config: PowerGeneratorConfig = {}): PowerChartData[] {\r\n const {\r\n orbitPeriod = 5400,\r\n eclipseDuration = 2100,\r\n solarArrayPower = 85,\r\n loadPower = 45,\r\n batteryCapacity = 300,\r\n initialSoC = 80,\r\n eclipseLoadReduction = 0.7,\r\n orbits = 2,\r\n resolution = 60,\r\n } = config;\r\n\r\n const data: PowerChartData[] = [];\r\n const totalDuration = orbitPeriod * orbits;\r\n let batterySoC = initialSoC;\r\n const batteryEfficiency = 0.9;\r\n \r\n // Eclipse starts at 40% of orbit, ends at 78% (typical LEO)\r\n const eclipseStart = 0.4;\r\n const eclipseEnd = eclipseStart + eclipseDuration / orbitPeriod;\r\n\r\n for (let t = 0; t < totalDuration; t += resolution) {\r\n const orbitPhase = (t % orbitPeriod) / orbitPeriod;\r\n const inEclipse = orbitPhase >= eclipseStart && orbitPhase < eclipseEnd;\r\n \r\n // Solar power with pointing variation (±10% sinusoidal)\r\n const pointingFactor = 0.9 + 0.1 * Math.sin(orbitPhase * Math.PI * 2);\r\n const solarPower = inEclipse ? 0 : solarArrayPower * pointingFactor;\r\n \r\n // Load power (reduced during eclipse for power conservation)\r\n const consumption = inEclipse ? loadPower * eclipseLoadReduction : loadPower;\r\n \r\n // Net power (positive = charging, negative = discharging)\r\n const netPower = solarPower - consumption;\r\n \r\n // Battery state of charge update\r\n const energyDelta = (netPower * resolution) / 3600; // Wh\r\n const efficiencyFactor = netPower > 0 ? batteryEfficiency : 1 / batteryEfficiency;\r\n batterySoC += (energyDelta * efficiencyFactor / batteryCapacity) * 100;\r\n batterySoC = Math.max(0, Math.min(100, batterySoC));\r\n \r\n data.push({\r\n time: Date.now() + t * 1000,\r\n solarPower: Math.round(solarPower * 10) / 10,\r\n consumption: Math.round(consumption * 10) / 10,\r\n netPower: Math.round(netPower * 10) / 10,\r\n batteryPercent: Math.round(batterySoC * 10) / 10,\r\n eclipse: inEclipse,\r\n });\r\n }\r\n\r\n return data;\r\n}\r\n\r\n// =============================================================================\r\n// Attitude Generator\r\n// =============================================================================\r\n\r\nexport interface AttitudeGeneratorConfig {\r\n /** Initial attitude [roll, pitch, yaw] in degrees */\r\n initialAttitude?: [number, number, number];\r\n /** Target attitude [roll, pitch, yaw] in degrees */\r\n targetAttitude?: [number, number, number];\r\n /** Slew rate in deg/s */\r\n slewRate?: number;\r\n /** Settling time in seconds */\r\n settleTime?: number;\r\n /** Pointing jitter RMS in degrees */\r\n jitter?: number;\r\n /** Sampling rate in Hz */\r\n samplingRate?: number;\r\n /** Duration in seconds */\r\n duration?: number;\r\n}\r\n\r\n/**\r\n * Generate realistic spacecraft attitude telemetry\r\n * \r\n * Models:\r\n * - Slew maneuver with trapezoidal velocity profile\r\n * - Fine pointing settling with exponential decay\r\n * - Random jitter (Gaussian distribution)\r\n * - Angular velocity from finite differences\r\n */\r\nexport function generateAttitudeData(config: AttitudeGeneratorConfig = {}): AttitudeChartData[] {\r\n const {\r\n initialAttitude = [0, -45, 90],\r\n targetAttitude = [0, 30, 180],\r\n slewRate = 0.5,\r\n settleTime = 30,\r\n jitter = 0.02,\r\n samplingRate = 1,\r\n duration = 300,\r\n } = config;\r\n\r\n const data: AttitudeChartData[] = [];\r\n const dt = 1 / samplingRate;\r\n \r\n // Calculate slew geometry\r\n const deltaAttitude = targetAttitude.map((t, i) => t - initialAttitude[i]);\r\n const totalAngle = Math.sqrt(deltaAttitude.reduce((sum, d) => sum + d * d, 0));\r\n const slewDuration = totalAngle / slewRate;\r\n const _unitVector = deltaAttitude.map(d => d / totalAngle);\r\n\r\n // Gaussian random for jitter\r\n const gaussRandom = () => {\r\n const u1 = Math.random();\r\n const u2 = Math.random();\r\n return Math.sqrt(-2 * Math.log(u1)) * Math.cos(2 * Math.PI * u2);\r\n };\r\n\r\n let prevRoll = initialAttitude[0];\r\n let prevPitch = initialAttitude[1];\r\n let prevYaw = initialAttitude[2];\r\n\r\n for (let t = 0; t < duration; t += dt) {\r\n let roll: number, pitch: number, yaw: number;\r\n let pointingError: number;\r\n\r\n if (t < slewDuration) {\r\n // During slew\r\n const progress = t / slewDuration;\r\n const smoothProgress = 0.5 - 0.5 * Math.cos(progress * Math.PI); // Smooth ease\r\n roll = initialAttitude[0] + deltaAttitude[0] * smoothProgress;\r\n pitch = initialAttitude[1] + deltaAttitude[1] * smoothProgress;\r\n yaw = initialAttitude[2] + deltaAttitude[2] * smoothProgress;\r\n pointingError = totalAngle * (1 - progress);\r\n } else if (t < slewDuration + settleTime) {\r\n // Settling phase\r\n const settleProgress = (t - slewDuration) / settleTime;\r\n const decayFactor = Math.exp(-3 * settleProgress);\r\n const overshoot = 0.05 * Math.sin(settleProgress * Math.PI * 4) * decayFactor;\r\n \r\n roll = targetAttitude[0] + overshoot + jitter * gaussRandom();\r\n pitch = targetAttitude[1] + overshoot + jitter * gaussRandom();\r\n yaw = targetAttitude[2] + overshoot + jitter * gaussRandom();\r\n pointingError = Math.abs(overshoot) + jitter * Math.abs(gaussRandom());\r\n } else {\r\n // Fine pointing\r\n roll = targetAttitude[0] + jitter * gaussRandom();\r\n pitch = targetAttitude[1] + jitter * gaussRandom();\r\n yaw = targetAttitude[2] + jitter * gaussRandom();\r\n pointingError = jitter * Math.sqrt(\r\n Math.pow(gaussRandom(), 2) + Math.pow(gaussRandom(), 2) + Math.pow(gaussRandom(), 2)\r\n );\r\n }\r\n\r\n // Angular velocity from finite differences\r\n const angularVelocity = Math.sqrt(\r\n Math.pow((roll - prevRoll) / dt, 2) +\r\n Math.pow((pitch - prevPitch) / dt, 2) +\r\n Math.pow((yaw - prevYaw) / dt, 2)\r\n );\r\n\r\n data.push({\r\n time: Date.now() + t * 1000,\r\n roll: Math.round(roll * 100) / 100,\r\n pitch: Math.round(pitch * 100) / 100,\r\n yaw: Math.round(yaw * 100) / 100,\r\n pointingError: Math.round(pointingError * 1000) / 1000,\r\n angularVelocity: Math.round(angularVelocity * 1000) / 1000,\r\n });\r\n\r\n prevRoll = roll;\r\n prevPitch = pitch;\r\n prevYaw = yaw;\r\n }\r\n\r\n return data;\r\n}\r\n\r\n// =============================================================================\r\n// Doppler Track Generator\r\n// =============================================================================\r\n\r\nexport interface DopplerGeneratorConfig {\r\n /** Carrier frequency in Hz */\r\n carrierFrequency?: number;\r\n /** Satellite altitude in km */\r\n altitude?: number;\r\n /** Maximum elevation angle in degrees */\r\n maxElevation?: number;\r\n /** Pass duration in seconds */\r\n passDuration?: number;\r\n /** Time resolution in seconds */\r\n resolution?: number;\r\n /** Add measurement noise (Hz RMS) */\r\n measurementNoise?: number;\r\n /** Satellite name */\r\n satelliteName?: string;\r\n /** Ground station name */\r\n groundStation?: string;\r\n}\r\n\r\n/**\r\n * Generate realistic Doppler tracking data for a satellite pass\r\n * \r\n * Uses simplified orbital mechanics:\r\n * - Circular orbit at specified altitude\r\n * - Pass geometry from maximum elevation\r\n * - Doppler shift from velocity projection\r\n */\r\nexport function generateDopplerData(config: DopplerGeneratorConfig = {}): {\r\n predicted: DopplerTrackPoint[];\r\n measured: DopplerTrackPoint[];\r\n passInfo: SatellitePassInfo;\r\n} {\r\n const {\r\n carrierFrequency = 437e6, // 437 MHz (UHF amateur)\r\n altitude = 400, // km (ISS altitude)\r\n maxElevation = 75,\r\n passDuration = 600, // 10 minutes\r\n resolution = 1,\r\n measurementNoise = 50, // Hz\r\n satelliteName = 'ISS',\r\n groundStation: _groundStation = 'Home Station',\r\n } = config;\r\n\r\n const predicted: DopplerTrackPoint[] = [];\r\n const measured: DopplerTrackPoint[] = [];\r\n\r\n // Orbital velocity\r\n const orbitRadius = EARTH_RADIUS + altitude;\r\n const orbitalVelocity = Math.sqrt(MU_EARTH / orbitRadius); // km/s\r\n\r\n // Maximum Doppler shift\r\n const maxDoppler = carrierFrequency * (orbitalVelocity * 1000 / SPEED_OF_LIGHT);\r\n\r\n // Calculate pass geometry\r\n const elevationRad = (maxElevation * Math.PI) / 180;\r\n const passHalfAngle = Math.PI / 2 - elevationRad;\r\n\r\n const now = Date.now();\r\n const aos = now;\r\n const los = now + passDuration * 1000;\r\n const tca = now + (passDuration / 2) * 1000;\r\n\r\n // Gaussian random for noise\r\n const gaussRandom = () => {\r\n const u1 = Math.random();\r\n const u2 = Math.random();\r\n return Math.sqrt(-2 * Math.log(u1)) * Math.cos(2 * Math.PI * u2);\r\n };\r\n\r\n for (let t = 0; t <= passDuration; t += resolution) {\r\n const time = now + t * 1000;\r\n const passPhase = t / passDuration; // 0 to 1\r\n const angle = (passPhase - 0.5) * 2 * passHalfAngle; // -halfAngle to +halfAngle\r\n\r\n // Doppler shift (maximum at edges, zero at TCA)\r\n const dopplerShift = maxDoppler * Math.sin(angle);\r\n\r\n // Elevation angle (maximum at TCA)\r\n const elevation = maxElevation * Math.cos(angle);\r\n\r\n predicted.push({\r\n time,\r\n dopplerShift: Math.round(dopplerShift),\r\n elevation: Math.round(elevation * 10) / 10,\r\n });\r\n\r\n // Simulated measured data with noise and bias\r\n const measuredShift = dopplerShift + measurementNoise * gaussRandom();\r\n measured.push({\r\n time,\r\n dopplerShift: Math.round(measuredShift),\r\n elevation: Math.round(elevation * 10) / 10,\r\n });\r\n }\r\n\r\n const passInfo: SatellitePassInfo = {\r\n name: satelliteName,\r\n aos: new Date(aos),\r\n los: new Date(los),\r\n tca: new Date(tca),\r\n maxElevation,\r\n };\r\n\r\n return { predicted, measured, passInfo };\r\n}\r\n\r\n// =============================================================================\r\n// Waterfall/Spectrum Generator\r\n// =============================================================================\r\n\r\nexport interface WaterfallGeneratorConfig {\r\n /** Center frequency in Hz */\r\n centerFrequency?: number;\r\n /** Bandwidth in Hz */\r\n bandwidth?: number;\r\n /** Number of FFT bins */\r\n fftBins?: number;\r\n /** Noise floor in dBm */\r\n noiseFloor?: number;\r\n /** Number of time samples */\r\n timeSamples?: number;\r\n /** Signals to include */\r\n signals?: Array<{\r\n /** Offset from center frequency (Hz) */\r\n offset: number;\r\n /** Signal power (dBm) */\r\n power: number;\r\n /** Signal bandwidth (Hz) */\r\n bandwidth: number;\r\n /** Signal type */\r\n type: 'cw' | 'ssb' | 'digital' | 'beacon';\r\n /** Doppler drift (Hz/s) - for moving signals */\r\n dopplerDrift?: number;\r\n }>;\r\n}\r\n\r\n/**\r\n * Generate realistic RF waterfall data\r\n * \r\n * Models:\r\n * - Gaussian noise floor\r\n * - CW signals (narrow spikes)\r\n * - SSB signals (offset sideband with modulation)\r\n * - Digital signals (wider, flatter spectrum)\r\n * - Time-varying Doppler drift\r\n */\r\nexport function generateWaterfallData(config: WaterfallGeneratorConfig = {}): WaterfallDataPoint[] {\r\n const {\r\n centerFrequency = 437e6,\r\n bandwidth = 100e3,\r\n fftBins = 512,\r\n noiseFloor = -120,\r\n timeSamples = 100,\r\n signals = [\r\n { offset: -30e3, power: -80, bandwidth: 500, type: 'cw' as const },\r\n { offset: 0, power: -75, bandwidth: 20e3, type: 'digital' as const },\r\n { offset: 25e3, power: -90, bandwidth: 3e3, type: 'ssb' as const },\r\n ],\r\n } = config;\r\n\r\n const data: WaterfallDataPoint[] = [];\r\n const freqStep = bandwidth / fftBins;\r\n const noiseStdDev = 3; // dB variation\r\n\r\n // Gaussian random\r\n const gaussRandom = () => {\r\n const u1 = Math.random();\r\n const u2 = Math.random();\r\n return Math.sqrt(-2 * Math.log(u1)) * Math.cos(2 * Math.PI * u2);\r\n };\r\n\r\n // Pre-compute frequency bins (constant for all time slices)\r\n const frequencies: number[] = [];\r\n for (let f = 0; f < fftBins; f++) {\r\n frequencies.push(centerFrequency + (f - fftBins / 2) * freqStep);\r\n }\r\n\r\n for (let t = 0; t < timeSamples; t++) {\r\n const powers: number[] = [];\r\n const time = Date.now() - (timeSamples - t) * 100; // 100ms between samples\r\n\r\n for (let f = 0; f < fftBins; f++) {\r\n const freqOffset = (f - fftBins / 2) * freqStep;\r\n let power = noiseFloor + noiseStdDev * gaussRandom();\r\n\r\n // Add signals\r\n for (const signal of signals) {\r\n const signalOffset = signal.offset + (signal.dopplerDrift || 0) * (t / 10);\r\n const distance = Math.abs(freqOffset - signalOffset);\r\n \r\n if (signal.type === 'cw') {\r\n // Narrow CW signal (sinc-like)\r\n if (distance < signal.bandwidth * 2) {\r\n const shape = Math.pow(Math.sin(Math.PI * distance / signal.bandwidth) / \r\n (Math.PI * distance / signal.bandwidth + 0.001), 2);\r\n power = Math.max(power, signal.power + 10 * Math.log10(shape + 0.001) + gaussRandom());\r\n }\r\n } else if (signal.type === 'ssb') {\r\n // SSB with voice-like modulation\r\n if (freqOffset >= signalOffset && freqOffset <= signalOffset + signal.bandwidth) {\r\n const modulation = 0.5 + 0.5 * Math.sin(t * 0.3 + f * 0.1);\r\n power = Math.max(power, signal.power - 3 + 6 * modulation + 2 * gaussRandom());\r\n }\r\n } else if (signal.type === 'digital') {\r\n // Digital signal (flat-topped with rolloff)\r\n if (distance < signal.bandwidth / 2) {\r\n power = Math.max(power, signal.power + gaussRandom());\r\n } else if (distance < signal.bandwidth) {\r\n const rolloff = 1 - (distance - signal.bandwidth / 2) / (signal.bandwidth / 2);\r\n power = Math.max(power, signal.power - 20 * (1 - rolloff) + gaussRandom());\r\n }\r\n } else if (signal.type === 'beacon') {\r\n // Beacon (stable CW)\r\n if (distance < signal.bandwidth) {\r\n power = Math.max(power, signal.power);\r\n }\r\n }\r\n }\r\n\r\n powers.push(Math.round(power * 10) / 10);\r\n }\r\n\r\n data.push({ time, frequencies: [...frequencies], powers });\r\n }\r\n\r\n return data;\r\n}\r\n\r\n// =============================================================================\r\n// Contact Window Generator\r\n// =============================================================================\r\n\r\nexport interface ContactGeneratorConfig {\r\n /** Ground stations */\r\n groundStations?: Array<{\r\n name: string;\r\n latitude: number;\r\n longitude: number;\r\n }>;\r\n /** Satellite altitude (km) */\r\n altitude?: number;\r\n /** Orbit inclination (degrees) */\r\n inclination?: number;\r\n /** Simulation duration (hours) */\r\n duration?: number;\r\n /** Minimum elevation (degrees) */\r\n minElevation?: number;\r\n}\r\n\r\n/**\r\n * Generate realistic ground station contact windows\r\n * \r\n * Uses simplified visibility calculation based on:\r\n * - Orbital period from altitude\r\n * - Swath width from elevation angle\r\n * - Ground track precession\r\n */\r\nexport function generateContactWindows(config: ContactGeneratorConfig = {}): ContactWindowData[] {\r\n const {\r\n groundStations = [\r\n { name: 'Svalbard (SG)', latitude: 78.2, longitude: 15.4 },\r\n { name: 'McMurdo (MCM)', latitude: -77.8, longitude: 166.7 },\r\n { name: 'Hawaii (HBK)', latitude: 21.5, longitude: -158.0 },\r\n { name: 'Kiruna (KIR)', latitude: 67.9, longitude: 20.9 },\r\n ],\r\n altitude = 400,\r\n inclination = 51.6,\r\n duration = 24,\r\n minElevation = 5,\r\n } = config;\r\n\r\n const result: ContactWindowData[] = [];\r\n const now = Date.now();\r\n const orbitPeriod = 2 * Math.PI * Math.sqrt(Math.pow(EARTH_RADIUS + altitude, 3) / MU_EARTH);\r\n const passesPerDay = Math.floor((duration * 3600) / orbitPeriod);\r\n\r\n for (const gs of groundStations) {\r\n const windows: ContactWindowData['windows'] = [];\r\n \r\n // Determine visibility based on latitude and inclination\r\n const isVisible = Math.abs(gs.latitude) <= inclination + 15;\r\n if (!isVisible) continue;\r\n\r\n // Generate passes based on ground station latitude\r\n const passesForStation = Math.floor(passesPerDay * (0.3 + 0.7 * Math.cos((gs.latitude * Math.PI) / 180)));\r\n \r\n for (let i = 0; i < passesForStation; i++) {\r\n const passStart = now + (i * duration * 3600 * 1000) / passesForStation;\r\n const passStart2 = passStart + (Math.random() - 0.5) * orbitPeriod * 500; // Jitter\r\n \r\n // Pass duration depends on elevation (higher el = shorter duration but better signal)\r\n const maxEl = minElevation + Math.random() * (85 - minElevation);\r\n const passDuration = 10 * 60 * 1000 * (1 - maxEl / 180); // 5-10 minutes\r\n \r\n const signalQuality = maxEl > 45 ? 'good' : maxEl > 20 ? 'marginal' : 'poor';\r\n \r\n windows.push({\r\n start: passStart2,\r\n end: passStart2 + passDuration,\r\n label: `Pass ${i + 1}`,\r\n signalQuality: signalQuality as 'good' | 'marginal' | 'poor',\r\n elevation: Math.round(maxEl),\r\n });\r\n }\r\n\r\n result.push({ id: gs.name, name: gs.name, windows });\r\n }\r\n\r\n return result;\r\n}\r\n\r\n// =============================================================================\r\n// Heliocentric Orbit Generator\r\n// =============================================================================\r\n\r\nexport interface HeliocentricGeneratorConfig {\r\n /** Bodies to include */\r\n bodies?: Array<{\r\n name: string;\r\n type: 'planet' | 'spacecraft' | 'asteroid' | 'comet';\r\n semiMajorAxis: number; // AU\r\n eccentricity: number;\r\n inclination: number; // degrees\r\n argumentOfPerihelion: number; // degrees\r\n trueAnomaly: number; // degrees (current position)\r\n color?: string;\r\n }>;\r\n /** Number of points per orbit */\r\n orbitPoints?: number;\r\n}\r\n\r\n/**\r\n * Generate heliocentric orbit visualization data\r\n */\r\nexport function generateHeliocentricOrbits(config: HeliocentricGeneratorConfig = {}): HeliocentricOrbitData[] {\r\n const {\r\n bodies = [\r\n { name: 'Earth', type: 'planet' as const, semiMajorAxis: 1.0, eccentricity: 0.017, inclination: 0, argumentOfPerihelion: 102, trueAnomaly: 0, color: '#3498db' },\r\n { name: 'Mars', type: 'planet' as const, semiMajorAxis: 1.52, eccentricity: 0.093, inclination: 1.85, argumentOfPerihelion: 286, trueAnomaly: 45, color: '#e74c3c' },\r\n { name: 'Voyager 1', type: 'spacecraft' as const, semiMajorAxis: 40, eccentricity: 0.99, inclination: 35, argumentOfPerihelion: 0, trueAnomaly: 170, color: '#3E3CFF' },\r\n ],\r\n orbitPoints = 72,\r\n } = config;\r\n\r\n return bodies.map(body => {\r\n const { semiMajorAxis: a, eccentricity: e, inclination: i, argumentOfPerihelion: omega, trueAnomaly: nu } = body;\r\n \r\n // Generate orbit path\r\n const orbitPath: { x: number; y: number; z: number }[] = [];\r\n for (let j = 0; j <= orbitPoints; j++) {\r\n const angle = (j / orbitPoints) * 2 * Math.PI;\r\n const r = (a * (1 - e * e)) / (1 + e * Math.cos(angle));\r\n \r\n // Rotate by argument of perihelion and inclination\r\n const xOrbit = r * Math.cos(angle);\r\n const yOrbit = r * Math.sin(angle);\r\n \r\n const omegaRad = (omega * Math.PI) / 180;\r\n const iRad = (i * Math.PI) / 180;\r\n \r\n const x = xOrbit * Math.cos(omegaRad) - yOrbit * Math.cos(iRad) * Math.sin(omegaRad);\r\n const y = xOrbit * Math.sin(omegaRad) + yOrbit * Math.cos(iRad) * Math.cos(omegaRad);\r\n const z = yOrbit * Math.sin(iRad);\r\n \r\n orbitPath.push({ x, y, z });\r\n }\r\n\r\n // Current position\r\n const nuRad = (nu * Math.PI) / 180;\r\n const r = (a * (1 - e * e)) / (1 + e * Math.cos(nuRad));\r\n const xOrbit = r * Math.cos(nuRad);\r\n const yOrbit = r * Math.sin(nuRad);\r\n \r\n const omegaRad = (omega * Math.PI) / 180;\r\n const iRad = (i * Math.PI) / 180;\r\n \r\n const x = xOrbit * Math.cos(omegaRad) - yOrbit * Math.cos(iRad) * Math.sin(omegaRad);\r\n const y = xOrbit * Math.sin(omegaRad) + yOrbit * Math.cos(iRad) * Math.cos(omegaRad);\r\n const z = yOrbit * Math.sin(iRad);\r\n\r\n // Orbital period in days\r\n const period = 365.25 * Math.pow(a, 1.5);\r\n\r\n return {\r\n name: body.name,\r\n type: body.type,\r\n x,\r\n y,\r\n z,\r\n orbitPath,\r\n color: body.color,\r\n semiMajorAxis: a,\r\n period,\r\n inclination: i,\r\n size: body.type === 'planet' ? 20 : 12,\r\n };\r\n });\r\n}\r\n\r\n// =============================================================================\r\n// Spectrum Generator (single FFT snapshot)\r\n// =============================================================================\r\n\r\nexport interface SpectrumGeneratorConfig {\r\n /** Center frequency (Hz) */\r\n centerFrequency?: number;\r\n /** Bandwidth (Hz) */\r\n bandwidth?: number;\r\n /** Number of points */\r\n points?: number;\r\n /** Noise floor (dBm) */\r\n noiseFloor?: number;\r\n /** Signals */\r\n signals?: Array<{\r\n frequency: number;\r\n power: number;\r\n bandwidth: number;\r\n }>;\r\n}\r\n\r\n/**\r\n * Generate a single RF spectrum snapshot\r\n */\r\nexport function generateSpectrum(config: SpectrumGeneratorConfig = {}): SpectrumDataPoint[] {\r\n const {\r\n centerFrequency = 2200e6,\r\n bandwidth = 10e6,\r\n points = 256,\r\n noiseFloor = -120,\r\n signals = [\r\n { frequency: 2200e6, power: -75, bandwidth: 100e3 },\r\n { frequency: 2197.5e6, power: -80, bandwidth: 10e3 },\r\n { frequency: 2202.5e6, power: -95, bandwidth: 50e3 },\r\n ],\r\n } = config;\r\n\r\n const data: SpectrumDataPoint[] = [];\r\n const freqMin = centerFrequency - bandwidth / 2;\r\n const freqStep = bandwidth / points;\r\n\r\n for (let i = 0; i < points; i++) {\r\n const freq = freqMin + i * freqStep;\r\n let power = noiseFloor + 3 * (Math.random() - 0.5);\r\n\r\n for (const signal of signals) {\r\n const distance = Math.abs(freq - signal.frequency);\r\n if (distance < signal.bandwidth * 2) {\r\n const attenuation = 20 * Math.log10(1 + distance / (signal.bandwidth / 2));\r\n power = Math.max(power, signal.power - attenuation);\r\n }\r\n }\r\n\r\n data.push({ frequency: freq, power: Math.round(power * 10) / 10 });\r\n }\r\n\r\n return data;\r\n}\r\n\r\n// =============================================================================\r\n// Eclipse Timeline Generator\r\n// =============================================================================\r\n\r\nexport interface EclipseGeneratorConfig {\r\n /** Orbit period (seconds) */\r\n orbitPeriod?: number;\r\n /** Eclipse fraction (0-1) */\r\n eclipseFraction?: number;\r\n /** Number of orbits */\r\n orbits?: number;\r\n /** Include penumbra */\r\n includePenumbra?: boolean;\r\n}\r\n\r\n/**\r\n * Generate eclipse timeline data\r\n */\r\nexport function generateEclipseTimeline(config: EclipseGeneratorConfig = {}): EclipseTimelineData[] {\r\n const {\r\n orbitPeriod = 5400,\r\n eclipseFraction = 0.38,\r\n orbits = 5,\r\n includePenumbra = true,\r\n } = config;\r\n\r\n const data: EclipseTimelineData[] = [];\r\n const now = Date.now();\r\n const penumbraDuration = includePenumbra ? 60 : 0; // 1 minute penumbra\r\n\r\n for (let orbit = 0; orbit < orbits; orbit++) {\r\n const orbitStart = now + orbit * orbitPeriod * 1000;\r\n const eclipseStart = orbitStart + orbitPeriod * 0.4 * 1000;\r\n const eclipseEnd = eclipseStart + orbitPeriod * eclipseFraction * 1000;\r\n\r\n // Sunlight before eclipse\r\n data.push({\r\n start: orbitStart,\r\n end: eclipseStart - penumbraDuration * 1000,\r\n type: 'sunlight',\r\n orbitNumber: orbit + 1,\r\n });\r\n\r\n // Penumbra entry\r\n if (includePenumbra) {\r\n data.push({\r\n start: eclipseStart - penumbraDuration * 1000,\r\n end: eclipseStart,\r\n type: 'penumbra',\r\n orbitNumber: orbit + 1,\r\n });\r\n }\r\n\r\n // Umbra\r\n data.push({\r\n start: eclipseStart,\r\n end: eclipseEnd,\r\n type: 'umbra',\r\n orbitNumber: orbit + 1,\r\n });\r\n\r\n // Penumbra exit\r\n if (includePenumbra) {\r\n data.push({\r\n start: eclipseEnd,\r\n end: eclipseEnd + penumbraDuration * 1000,\r\n type: 'penumbra',\r\n orbitNumber: orbit + 1,\r\n });\r\n }\r\n\r\n // Sunlight after eclipse\r\n data.push({\r\n start: eclipseEnd + penumbraDuration * 1000,\r\n end: orbitStart + orbitPeriod * 1000,\r\n type: 'sunlight',\r\n orbitNumber: orbit + 1,\r\n });\r\n }\r\n\r\n return data;\r\n}\r\n\r\n// =============================================================================\r\n// Constellation Coverage Generator\r\n// =============================================================================\r\n\r\nexport interface CoverageGeneratorConfig {\r\n /** Latitude resolution (degrees) */\r\n latResolution?: number;\r\n /** Longitude resolution (degrees) */\r\n lonResolution?: number;\r\n /** Number of orbital planes */\r\n planes?: number;\r\n /** Satellites per plane */\r\n satsPerPlane?: number;\r\n /** Orbit altitude (km) */\r\n altitude?: number;\r\n /** Orbit inclination (degrees) */\r\n inclination?: number;\r\n /** Metric to compute: 'visibility' | 'revisitTime' | 'latency' */\r\n metric?: 'visibility' | 'revisitTime' | 'latency';\r\n}\r\n\r\n/**\r\n * Generate constellation coverage grid data\r\n * \r\n * Models simplified visibility based on satellite altitude\r\n * and ground footprint overlap from Walker constellation geometry.\r\n */\r\nexport function generateConstellationCoverage(config: CoverageGeneratorConfig = {}): {\r\n latitudes: number[];\r\n longitudes: number[];\r\n coverage: number[][];\r\n unit: string;\r\n} {\r\n const {\r\n latResolution = 5,\r\n lonResolution = 5,\r\n planes = 6,\r\n satsPerPlane = 22,\r\n altitude = 550,\r\n inclination = 53,\r\n metric = 'visibility',\r\n } = config;\r\n\r\n const latitudes: number[] = [];\r\n const longitudes: number[] = [];\r\n const coverage: number[][] = [];\r\n\r\n for (let lat = -90; lat <= 90; lat += latResolution) latitudes.push(lat);\r\n for (let lon = -180; lon < 180; lon += lonResolution) longitudes.push(lon);\r\n\r\n // Footprint half-angle from altitude\r\n const earthRadius = 6371;\r\n const footprintAngle = Math.acos(earthRadius / (earthRadius + altitude)) * (180 / Math.PI);\r\n const totalSats = planes * satsPerPlane;\r\n\r\n for (let li = 0; li < latitudes.length; li++) {\r\n const row: number[] = [];\r\n const lat = latitudes[li];\r\n const _latRad = (lat * Math.PI) / 180;\r\n\r\n for (let lj = 0; lj < longitudes.length; lj++) {\r\n let value: number;\r\n\r\n // Coverage depends on latitude vs inclination\r\n const latFactor = Math.abs(lat) <= inclination\r\n ? 1.0\r\n : Math.max(0, 1.0 - (Math.abs(lat) - inclination) / 20);\r\n\r\n // Base coverage from constellation density\r\n const densityFactor = totalSats / 100;\r\n const footprintOverlap = Math.min(1, densityFactor * (footprintAngle / 30));\r\n\r\n if (metric === 'visibility') {\r\n // Percentage of time with at least 1 satellite visible\r\n value = Math.min(100, footprintOverlap * latFactor * 100);\r\n // Add polar convergence bonus\r\n if (Math.abs(lat) > 60) value = Math.min(100, value * 1.2);\r\n // Add noise\r\n value += (Math.random() - 0.5) * 5;\r\n value = Math.max(0, Math.min(100, value));\r\n } else if (metric === 'revisitTime') {\r\n // Minutes between passes (lower is better)\r\n const baseRevisit = 90 / (footprintOverlap * latFactor + 0.01);\r\n value = Math.max(1, Math.min(120, baseRevisit + (Math.random() - 0.5) * 10));\r\n } else {\r\n // Latency in ms (one-way)\r\n const slantRange = altitude / Math.sin(Math.max(0.1, latFactor * Math.PI / 4));\r\n value = (slantRange / 300) + 2 + Math.random() * 2; // ms\r\n }\r\n\r\n row.push(Math.round(value * 10) / 10);\r\n }\r\n coverage.push(row);\r\n }\r\n\r\n const units: Record<string, string> = { visibility: '%', revisitTime: 'min', latency: 'ms' };\r\n return { latitudes, longitudes, coverage, unit: units[metric] || '%' };\r\n}\r\n\r\n// =============================================================================\r\n// Conjunction Event Generator\r\n// =============================================================================\r\n\r\nexport interface ConjunctionGeneratorConfig {\r\n /** Primary object name */\r\n primaryName?: string;\r\n /** Number of events to generate */\r\n eventCount?: number;\r\n /** Time range in hours */\r\n timeRangeHours?: number;\r\n /** Include high-risk events */\r\n includeHighRisk?: boolean;\r\n}\r\n\r\n/**\r\n * Generate realistic conjunction/close approach events\r\n */\r\nexport function generateConjunctionEvents(config: ConjunctionGeneratorConfig = {}): Array<{\r\n id: string;\r\n primary: string;\r\n secondary: string;\r\n tca: number;\r\n missDistance: number;\r\n probability: number;\r\n relativeVelocity: number;\r\n position: { x: number; y: number; z: number };\r\n uncertainty?: { rx: number; ry: number; rz: number };\r\n}> {\r\n const {\r\n primaryName = 'SAT-ALPHA',\r\n eventCount = 12,\r\n timeRangeHours = 72,\r\n includeHighRisk = true,\r\n } = config;\r\n\r\n const secondaries = [\r\n 'COSMOS-2251 DEB', 'FENGYUN-1C DEB', 'SL-16 R/B', 'IRIDIUM 33 DEB',\r\n 'NOAA 17 DEB', 'ATLAS 5 CENTAUR R/B', 'BREEZE-M DEB', 'CZ-3B R/B',\r\n 'UNKNOWN DEB', 'MICROSAT-R DEB', 'DELTA 2 R/B', 'H-2A R/B',\r\n ];\r\n\r\n const now = Date.now();\r\n const events = [];\r\n\r\n for (let i = 0; i < eventCount; i++) {\r\n const tca = now + Math.random() * timeRangeHours * 3600000;\r\n let missDistance: number;\r\n\r\n if (includeHighRisk && i < 2) {\r\n missDistance = 0.1 + Math.random() * 0.9; // Critical: < 1 km\r\n } else if (i < 5) {\r\n missDistance = 1 + Math.random() * 4; // Warning: 1-5 km\r\n } else {\r\n missDistance = 5 + Math.random() * 15; // Safe: > 5 km\r\n }\r\n\r\n const probability = Math.pow(10, -3 - missDistance * 1.5 + Math.random());\r\n const relativeVelocity = 5 + Math.random() * 12;\r\n\r\n const angle = Math.random() * 2 * Math.PI;\r\n const incAngle = (Math.random() - 0.5) * Math.PI;\r\n const radius = 6800 + Math.random() * 600;\r\n\r\n events.push({\r\n id: `CDM-${String(i + 1).padStart(3, '0')}`,\r\n primary: primaryName,\r\n secondary: secondaries[i % secondaries.length],\r\n tca,\r\n missDistance: Math.round(missDistance * 1000) / 1000,\r\n probability: Math.max(1e-10, probability),\r\n relativeVelocity: Math.round(relativeVelocity * 100) / 100,\r\n position: {\r\n x: Math.round(radius * Math.cos(angle) * Math.cos(incAngle)),\r\n y: Math.round(radius * Math.sin(angle) * Math.cos(incAngle)),\r\n z: Math.round(radius * Math.sin(incAngle)),\r\n },\r\n uncertainty: {\r\n rx: 20 + Math.random() * 100,\r\n ry: 50 + Math.random() * 300,\r\n rz: 10 + Math.random() * 60,\r\n },\r\n });\r\n }\r\n\r\n return events.sort((a, b) => a.tca - b.tca);\r\n}\r\n\r\nexport default {\r\n generatePowerData,\r\n generateAttitudeData,\r\n generateDopplerData,\r\n generateWaterfallData,\r\n generateContactWindows,\r\n generateHeliocentricOrbits,\r\n generateSpectrum,\r\n generateEclipseTimeline,\r\n generateConstellationCoverage,\r\n generateConjunctionEvents,\r\n};\r\n"],"names":["r","xOrbit","yOrbit","omegaRad","iRad","x","y","z"],"mappings":"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"}
1
+ {"version":3,"file":"generators.js","names":[],"sources":["../../../../src/react/charts/unified/generators.ts"],"sourcesContent":["/**\r\n * @zendir/ui - Realistic Space Data Generators\r\n *\r\n * Generate realistic demo data for space-specific charts.\r\n * All generators produce physically accurate data following orbital mechanics\r\n * and RF/signal propagation principles.\r\n */\r\n\r\nimport type {\r\n PowerChartData,\r\n AttitudeChartData,\r\n WaterfallDataPoint,\r\n DopplerTrackPoint,\r\n SatellitePassInfo,\r\n SpectrumDataPoint,\r\n ContactWindowData,\r\n EclipseTimelineData,\r\n HeliocentricOrbitData,\r\n} from \"./types\";\r\nimport type { ConjunctionEvent as _ConjunctionEvent } from \"./domain\";\r\n\r\n// =============================================================================\r\n// Constants\r\n// =============================================================================\r\n\r\nconst SPEED_OF_LIGHT = 299792458; // m/s\r\nconst EARTH_RADIUS = 6371; // km\r\nconst MU_EARTH = 398600.4418; // km³/s² (Earth gravitational parameter)\r\n\r\n// =============================================================================\r\n// Power System Generator\r\n// =============================================================================\r\n\r\nexport interface PowerGeneratorConfig {\r\n /** Orbit period in seconds (default: 5400 = 90 min LEO) */\r\n orbitPeriod?: number;\r\n /** Eclipse duration in seconds (default: 2100 = 35 min) */\r\n eclipseDuration?: number;\r\n /** Solar array power output at optimal pointing (W) */\r\n solarArrayPower?: number;\r\n /** Average load power (W) */\r\n loadPower?: number;\r\n /** Battery capacity (Wh) */\r\n batteryCapacity?: number;\r\n /** Initial state of charge (%) */\r\n initialSoC?: number;\r\n /** Load reduction factor during eclipse (0-1) */\r\n eclipseLoadReduction?: number;\r\n /** Simulation duration in orbits */\r\n orbits?: number;\r\n /** Time resolution in seconds */\r\n resolution?: number;\r\n}\r\n\r\n/**\r\n * Generate realistic LEO satellite power system telemetry\r\n *\r\n * Models:\r\n * - Solar array power variation with orbit phase (cosine pointing loss)\r\n * - Eclipse periods with zero solar input\r\n * - Battery charge/discharge with 90% round-trip efficiency\r\n * - Load shedding during eclipse\r\n */\r\nexport function generatePowerData(\r\n config: PowerGeneratorConfig = {},\r\n): PowerChartData[] {\r\n const {\r\n orbitPeriod = 5400,\r\n eclipseDuration = 2100,\r\n solarArrayPower = 85,\r\n loadPower = 45,\r\n batteryCapacity = 300,\r\n initialSoC = 80,\r\n eclipseLoadReduction = 0.7,\r\n orbits = 2,\r\n resolution = 60,\r\n } = config;\r\n\r\n const data: PowerChartData[] = [];\r\n const totalDuration = orbitPeriod * orbits;\r\n let batterySoC = initialSoC;\r\n const batteryEfficiency = 0.9;\r\n\r\n // Eclipse starts at 40% of orbit, ends at 78% (typical LEO)\r\n const eclipseStart = 0.4;\r\n const eclipseEnd = eclipseStart + eclipseDuration / orbitPeriod;\r\n\r\n for (let t = 0; t < totalDuration; t += resolution) {\r\n const orbitPhase = (t % orbitPeriod) / orbitPeriod;\r\n const inEclipse = orbitPhase >= eclipseStart && orbitPhase < eclipseEnd;\r\n\r\n // Solar power with pointing variation (±10% sinusoidal)\r\n const pointingFactor = 0.9 + 0.1 * Math.sin(orbitPhase * Math.PI * 2);\r\n const solarPower = inEclipse ? 0 : solarArrayPower * pointingFactor;\r\n\r\n // Load power (reduced during eclipse for power conservation)\r\n const consumption = inEclipse\r\n ? loadPower * eclipseLoadReduction\r\n : loadPower;\r\n\r\n // Net power (positive = charging, negative = discharging)\r\n const netPower = solarPower - consumption;\r\n\r\n // Battery state of charge update\r\n const energyDelta = (netPower * resolution) / 3600; // Wh\r\n const efficiencyFactor =\r\n netPower > 0 ? batteryEfficiency : 1 / batteryEfficiency;\r\n batterySoC += ((energyDelta * efficiencyFactor) / batteryCapacity) * 100;\r\n batterySoC = Math.max(0, Math.min(100, batterySoC));\r\n\r\n data.push({\r\n time: Date.now() + t * 1000,\r\n solarPower: Math.round(solarPower * 10) / 10,\r\n consumption: Math.round(consumption * 10) / 10,\r\n netPower: Math.round(netPower * 10) / 10,\r\n batteryPercent: Math.round(batterySoC * 10) / 10,\r\n eclipse: inEclipse,\r\n });\r\n }\r\n\r\n return data;\r\n}\r\n\r\n// =============================================================================\r\n// Attitude Generator\r\n// =============================================================================\r\n\r\nexport interface AttitudeGeneratorConfig {\r\n /** Initial attitude [roll, pitch, yaw] in degrees */\r\n initialAttitude?: [number, number, number];\r\n /** Target attitude [roll, pitch, yaw] in degrees */\r\n targetAttitude?: [number, number, number];\r\n /** Slew rate in deg/s */\r\n slewRate?: number;\r\n /** Settling time in seconds */\r\n settleTime?: number;\r\n /** Pointing jitter RMS in degrees */\r\n jitter?: number;\r\n /** Sampling rate in Hz */\r\n samplingRate?: number;\r\n /** Duration in seconds */\r\n duration?: number;\r\n}\r\n\r\n/**\r\n * Generate realistic spacecraft attitude telemetry\r\n *\r\n * Models:\r\n * - Slew maneuver with trapezoidal velocity profile\r\n * - Fine pointing settling with exponential decay\r\n * - Random jitter (Gaussian distribution)\r\n * - Angular velocity from finite differences\r\n */\r\nexport function generateAttitudeData(\r\n config: AttitudeGeneratorConfig = {},\r\n): AttitudeChartData[] {\r\n const {\r\n initialAttitude = [0, -45, 90],\r\n targetAttitude = [0, 30, 180],\r\n slewRate = 0.5,\r\n settleTime = 30,\r\n jitter = 0.02,\r\n samplingRate = 1,\r\n duration = 300,\r\n } = config;\r\n\r\n const data: AttitudeChartData[] = [];\r\n const dt = 1 / samplingRate;\r\n\r\n // Calculate slew geometry\r\n const deltaAttitude = targetAttitude.map((t, i) => t - initialAttitude[i]);\r\n const totalAngle = Math.sqrt(\r\n deltaAttitude.reduce((sum, d) => sum + d * d, 0),\r\n );\r\n const slewDuration = totalAngle / slewRate;\r\n const _unitVector = deltaAttitude.map((d) => d / totalAngle);\r\n\r\n // Gaussian random for jitter\r\n const gaussRandom = () => {\r\n const u1 = Math.random();\r\n const u2 = Math.random();\r\n return Math.sqrt(-2 * Math.log(u1)) * Math.cos(2 * Math.PI * u2);\r\n };\r\n\r\n let prevRoll = initialAttitude[0];\r\n let prevPitch = initialAttitude[1];\r\n let prevYaw = initialAttitude[2];\r\n\r\n for (let t = 0; t < duration; t += dt) {\r\n let roll: number, pitch: number, yaw: number;\r\n let pointingError: number;\r\n\r\n if (t < slewDuration) {\r\n // During slew\r\n const progress = t / slewDuration;\r\n const smoothProgress = 0.5 - 0.5 * Math.cos(progress * Math.PI); // Smooth ease\r\n roll = initialAttitude[0] + deltaAttitude[0] * smoothProgress;\r\n pitch = initialAttitude[1] + deltaAttitude[1] * smoothProgress;\r\n yaw = initialAttitude[2] + deltaAttitude[2] * smoothProgress;\r\n pointingError = totalAngle * (1 - progress);\r\n } else if (t < slewDuration + settleTime) {\r\n // Settling phase\r\n const settleProgress = (t - slewDuration) / settleTime;\r\n const decayFactor = Math.exp(-3 * settleProgress);\r\n const overshoot =\r\n 0.05 * Math.sin(settleProgress * Math.PI * 4) * decayFactor;\r\n\r\n roll = targetAttitude[0] + overshoot + jitter * gaussRandom();\r\n pitch = targetAttitude[1] + overshoot + jitter * gaussRandom();\r\n yaw = targetAttitude[2] + overshoot + jitter * gaussRandom();\r\n pointingError = Math.abs(overshoot) + jitter * Math.abs(gaussRandom());\r\n } else {\r\n // Fine pointing\r\n roll = targetAttitude[0] + jitter * gaussRandom();\r\n pitch = targetAttitude[1] + jitter * gaussRandom();\r\n yaw = targetAttitude[2] + jitter * gaussRandom();\r\n pointingError =\r\n jitter *\r\n Math.sqrt(\r\n Math.pow(gaussRandom(), 2) +\r\n Math.pow(gaussRandom(), 2) +\r\n Math.pow(gaussRandom(), 2),\r\n );\r\n }\r\n\r\n // Angular velocity from finite differences\r\n const angularVelocity = Math.sqrt(\r\n Math.pow((roll - prevRoll) / dt, 2) +\r\n Math.pow((pitch - prevPitch) / dt, 2) +\r\n Math.pow((yaw - prevYaw) / dt, 2),\r\n );\r\n\r\n data.push({\r\n time: Date.now() + t * 1000,\r\n roll: Math.round(roll * 100) / 100,\r\n pitch: Math.round(pitch * 100) / 100,\r\n yaw: Math.round(yaw * 100) / 100,\r\n pointingError: Math.round(pointingError * 1000) / 1000,\r\n angularVelocity: Math.round(angularVelocity * 1000) / 1000,\r\n });\r\n\r\n prevRoll = roll;\r\n prevPitch = pitch;\r\n prevYaw = yaw;\r\n }\r\n\r\n return data;\r\n}\r\n\r\n// =============================================================================\r\n// Doppler Track Generator\r\n// =============================================================================\r\n\r\nexport interface DopplerGeneratorConfig {\r\n /** Carrier frequency in Hz */\r\n carrierFrequency?: number;\r\n /** Satellite altitude in km */\r\n altitude?: number;\r\n /** Maximum elevation angle in degrees */\r\n maxElevation?: number;\r\n /** Pass duration in seconds */\r\n passDuration?: number;\r\n /** Time resolution in seconds */\r\n resolution?: number;\r\n /** Add measurement noise (Hz RMS) */\r\n measurementNoise?: number;\r\n /** Satellite name */\r\n satelliteName?: string;\r\n /** Ground station name */\r\n groundStation?: string;\r\n}\r\n\r\n/**\r\n * Generate realistic Doppler tracking data for a satellite pass\r\n *\r\n * Uses simplified orbital mechanics:\r\n * - Circular orbit at specified altitude\r\n * - Pass geometry from maximum elevation\r\n * - Doppler shift from velocity projection\r\n */\r\nexport function generateDopplerData(config: DopplerGeneratorConfig = {}): {\r\n predicted: DopplerTrackPoint[];\r\n measured: DopplerTrackPoint[];\r\n passInfo: SatellitePassInfo;\r\n} {\r\n const {\r\n carrierFrequency = 437e6, // 437 MHz (UHF amateur)\r\n altitude = 400, // km (ISS altitude)\r\n maxElevation = 75,\r\n passDuration = 600, // 10 minutes\r\n resolution = 1,\r\n measurementNoise = 50, // Hz\r\n satelliteName = \"ISS\",\r\n groundStation: _groundStation = \"Home Station\",\r\n } = config;\r\n\r\n const predicted: DopplerTrackPoint[] = [];\r\n const measured: DopplerTrackPoint[] = [];\r\n\r\n // Orbital velocity\r\n const orbitRadius = EARTH_RADIUS + altitude;\r\n const orbitalVelocity = Math.sqrt(MU_EARTH / orbitRadius); // km/s\r\n\r\n // Maximum Doppler shift\r\n const maxDoppler =\r\n carrierFrequency * ((orbitalVelocity * 1000) / SPEED_OF_LIGHT);\r\n\r\n // Calculate pass geometry\r\n const elevationRad = (maxElevation * Math.PI) / 180;\r\n const passHalfAngle = Math.PI / 2 - elevationRad;\r\n\r\n const now = Date.now();\r\n const aos = now;\r\n const los = now + passDuration * 1000;\r\n const tca = now + (passDuration / 2) * 1000;\r\n\r\n // Gaussian random for noise\r\n const gaussRandom = () => {\r\n const u1 = Math.random();\r\n const u2 = Math.random();\r\n return Math.sqrt(-2 * Math.log(u1)) * Math.cos(2 * Math.PI * u2);\r\n };\r\n\r\n for (let t = 0; t <= passDuration; t += resolution) {\r\n const time = now + t * 1000;\r\n const passPhase = t / passDuration; // 0 to 1\r\n const angle = (passPhase - 0.5) * 2 * passHalfAngle; // -halfAngle to +halfAngle\r\n\r\n // Doppler shift (maximum at edges, zero at TCA)\r\n const dopplerShift = maxDoppler * Math.sin(angle);\r\n\r\n // Elevation angle (maximum at TCA)\r\n const elevation = maxElevation * Math.cos(angle);\r\n\r\n predicted.push({\r\n time,\r\n dopplerShift: Math.round(dopplerShift),\r\n elevation: Math.round(elevation * 10) / 10,\r\n });\r\n\r\n // Simulated measured data with noise and bias\r\n const measuredShift = dopplerShift + measurementNoise * gaussRandom();\r\n measured.push({\r\n time,\r\n dopplerShift: Math.round(measuredShift),\r\n elevation: Math.round(elevation * 10) / 10,\r\n });\r\n }\r\n\r\n const passInfo: SatellitePassInfo = {\r\n name: satelliteName,\r\n aos: new Date(aos),\r\n los: new Date(los),\r\n tca: new Date(tca),\r\n maxElevation,\r\n };\r\n\r\n return { predicted, measured, passInfo };\r\n}\r\n\r\n// =============================================================================\r\n// Waterfall/Spectrum Generator\r\n// =============================================================================\r\n\r\nexport interface WaterfallGeneratorConfig {\r\n /** Center frequency in Hz */\r\n centerFrequency?: number;\r\n /** Bandwidth in Hz */\r\n bandwidth?: number;\r\n /** Number of FFT bins */\r\n fftBins?: number;\r\n /** Noise floor in dBm */\r\n noiseFloor?: number;\r\n /** Number of time samples */\r\n timeSamples?: number;\r\n /** Signals to include */\r\n signals?: Array<{\r\n /** Offset from center frequency (Hz) */\r\n offset: number;\r\n /** Signal power (dBm) */\r\n power: number;\r\n /** Signal bandwidth (Hz) */\r\n bandwidth: number;\r\n /** Signal type */\r\n type: \"cw\" | \"ssb\" | \"digital\" | \"beacon\";\r\n /** Doppler drift (Hz/s) - for moving signals */\r\n dopplerDrift?: number;\r\n }>;\r\n}\r\n\r\n/**\r\n * Generate realistic RF waterfall data\r\n *\r\n * Models:\r\n * - Gaussian noise floor\r\n * - CW signals (narrow spikes)\r\n * - SSB signals (offset sideband with modulation)\r\n * - Digital signals (wider, flatter spectrum)\r\n * - Time-varying Doppler drift\r\n */\r\nexport function generateWaterfallData(\r\n config: WaterfallGeneratorConfig = {},\r\n): WaterfallDataPoint[] {\r\n const {\r\n centerFrequency = 437e6,\r\n bandwidth = 100e3,\r\n fftBins = 512,\r\n noiseFloor = -120,\r\n timeSamples = 100,\r\n signals = [\r\n { offset: -30e3, power: -80, bandwidth: 500, type: \"cw\" as const },\r\n { offset: 0, power: -75, bandwidth: 20e3, type: \"digital\" as const },\r\n { offset: 25e3, power: -90, bandwidth: 3e3, type: \"ssb\" as const },\r\n ],\r\n } = config;\r\n\r\n const data: WaterfallDataPoint[] = [];\r\n const freqStep = bandwidth / fftBins;\r\n const noiseStdDev = 3; // dB variation\r\n\r\n // Gaussian random\r\n const gaussRandom = () => {\r\n const u1 = Math.random();\r\n const u2 = Math.random();\r\n return Math.sqrt(-2 * Math.log(u1)) * Math.cos(2 * Math.PI * u2);\r\n };\r\n\r\n // Pre-compute frequency bins (constant for all time slices)\r\n const frequencies: number[] = [];\r\n for (let f = 0; f < fftBins; f++) {\r\n frequencies.push(centerFrequency + (f - fftBins / 2) * freqStep);\r\n }\r\n\r\n for (let t = 0; t < timeSamples; t++) {\r\n const powers: number[] = [];\r\n const time = Date.now() - (timeSamples - t) * 100; // 100ms between samples\r\n\r\n for (let f = 0; f < fftBins; f++) {\r\n const freqOffset = (f - fftBins / 2) * freqStep;\r\n let power = noiseFloor + noiseStdDev * gaussRandom();\r\n\r\n // Add signals\r\n for (const signal of signals) {\r\n const signalOffset =\r\n signal.offset + (signal.dopplerDrift || 0) * (t / 10);\r\n const distance = Math.abs(freqOffset - signalOffset);\r\n\r\n if (signal.type === \"cw\") {\r\n // Narrow CW signal (sinc-like)\r\n if (distance < signal.bandwidth * 2) {\r\n const shape = Math.pow(\r\n Math.sin((Math.PI * distance) / signal.bandwidth) /\r\n ((Math.PI * distance) / signal.bandwidth + 0.001),\r\n 2,\r\n );\r\n power = Math.max(\r\n power,\r\n signal.power + 10 * Math.log10(shape + 0.001) + gaussRandom(),\r\n );\r\n }\r\n } else if (signal.type === \"ssb\") {\r\n // SSB with voice-like modulation\r\n if (\r\n freqOffset >= signalOffset &&\r\n freqOffset <= signalOffset + signal.bandwidth\r\n ) {\r\n const modulation = 0.5 + 0.5 * Math.sin(t * 0.3 + f * 0.1);\r\n power = Math.max(\r\n power,\r\n signal.power - 3 + 6 * modulation + 2 * gaussRandom(),\r\n );\r\n }\r\n } else if (signal.type === \"digital\") {\r\n // Digital signal (flat-topped with rolloff)\r\n if (distance < signal.bandwidth / 2) {\r\n power = Math.max(power, signal.power + gaussRandom());\r\n } else if (distance < signal.bandwidth) {\r\n const rolloff =\r\n 1 - (distance - signal.bandwidth / 2) / (signal.bandwidth / 2);\r\n power = Math.max(\r\n power,\r\n signal.power - 20 * (1 - rolloff) + gaussRandom(),\r\n );\r\n }\r\n } else if (signal.type === \"beacon\") {\r\n // Beacon (stable CW)\r\n if (distance < signal.bandwidth) {\r\n power = Math.max(power, signal.power);\r\n }\r\n }\r\n }\r\n\r\n powers.push(Math.round(power * 10) / 10);\r\n }\r\n\r\n data.push({ time, frequencies: [...frequencies], powers });\r\n }\r\n\r\n return data;\r\n}\r\n\r\n// =============================================================================\r\n// Contact Window Generator\r\n// =============================================================================\r\n\r\nexport interface ContactGeneratorConfig {\r\n /** Ground stations */\r\n groundStations?: Array<{\r\n name: string;\r\n latitude: number;\r\n longitude: number;\r\n }>;\r\n /** Satellite altitude (km) */\r\n altitude?: number;\r\n /** Orbit inclination (degrees) */\r\n inclination?: number;\r\n /** Simulation duration (hours) */\r\n duration?: number;\r\n /** Minimum elevation (degrees) */\r\n minElevation?: number;\r\n}\r\n\r\n/**\r\n * Generate realistic ground station contact windows\r\n *\r\n * Uses simplified visibility calculation based on:\r\n * - Orbital period from altitude\r\n * - Swath width from elevation angle\r\n * - Ground track precession\r\n */\r\nexport function generateContactWindows(\r\n config: ContactGeneratorConfig = {},\r\n): ContactWindowData[] {\r\n const {\r\n groundStations = [\r\n { name: \"Svalbard (SG)\", latitude: 78.2, longitude: 15.4 },\r\n { name: \"McMurdo (MCM)\", latitude: -77.8, longitude: 166.7 },\r\n { name: \"Hawaii (HBK)\", latitude: 21.5, longitude: -158.0 },\r\n { name: \"Kiruna (KIR)\", latitude: 67.9, longitude: 20.9 },\r\n ],\r\n altitude = 400,\r\n inclination = 51.6,\r\n duration = 24,\r\n minElevation = 5,\r\n } = config;\r\n\r\n const result: ContactWindowData[] = [];\r\n const now = Date.now();\r\n const orbitPeriod =\r\n 2 * Math.PI * Math.sqrt(Math.pow(EARTH_RADIUS + altitude, 3) / MU_EARTH);\r\n const passesPerDay = Math.floor((duration * 3600) / orbitPeriod);\r\n\r\n for (const gs of groundStations) {\r\n const windows: ContactWindowData[\"windows\"] = [];\r\n\r\n // Determine visibility based on latitude and inclination\r\n const isVisible = Math.abs(gs.latitude) <= inclination + 15;\r\n if (!isVisible) continue;\r\n\r\n // Generate passes based on ground station latitude\r\n const passesForStation = Math.floor(\r\n passesPerDay * (0.3 + 0.7 * Math.cos((gs.latitude * Math.PI) / 180)),\r\n );\r\n\r\n for (let i = 0; i < passesForStation; i++) {\r\n const passStart = now + (i * duration * 3600 * 1000) / passesForStation;\r\n const passStart2 = passStart + (Math.random() - 0.5) * orbitPeriod * 500; // Jitter\r\n\r\n // Pass duration depends on elevation (higher el = shorter duration but better signal)\r\n const maxEl = minElevation + Math.random() * (85 - minElevation);\r\n const passDuration = 10 * 60 * 1000 * (1 - maxEl / 180); // 5-10 minutes\r\n\r\n const signalQuality =\r\n maxEl > 45 ? \"good\" : maxEl > 20 ? \"marginal\" : \"poor\";\r\n\r\n windows.push({\r\n start: passStart2,\r\n end: passStart2 + passDuration,\r\n label: `Pass ${i + 1}`,\r\n signalQuality: signalQuality as \"good\" | \"marginal\" | \"poor\",\r\n elevation: Math.round(maxEl),\r\n });\r\n }\r\n\r\n result.push({ id: gs.name, name: gs.name, windows });\r\n }\r\n\r\n return result;\r\n}\r\n\r\n// =============================================================================\r\n// Heliocentric Orbit Generator\r\n// =============================================================================\r\n\r\nexport interface HeliocentricGeneratorConfig {\r\n /** Bodies to include */\r\n bodies?: Array<{\r\n name: string;\r\n type: \"planet\" | \"spacecraft\" | \"asteroid\" | \"comet\";\r\n semiMajorAxis: number; // AU\r\n eccentricity: number;\r\n inclination: number; // degrees\r\n argumentOfPerihelion: number; // degrees\r\n trueAnomaly: number; // degrees (current position)\r\n color?: string;\r\n }>;\r\n /** Number of points per orbit */\r\n orbitPoints?: number;\r\n}\r\n\r\n/**\r\n * Generate heliocentric orbit visualization data\r\n */\r\nexport function generateHeliocentricOrbits(\r\n config: HeliocentricGeneratorConfig = {},\r\n): HeliocentricOrbitData[] {\r\n const {\r\n bodies = [\r\n {\r\n name: \"Earth\",\r\n type: \"planet\" as const,\r\n semiMajorAxis: 1.0,\r\n eccentricity: 0.017,\r\n inclination: 0,\r\n argumentOfPerihelion: 102,\r\n trueAnomaly: 0,\r\n color: \"#3498db\",\r\n },\r\n {\r\n name: \"Mars\",\r\n type: \"planet\" as const,\r\n semiMajorAxis: 1.52,\r\n eccentricity: 0.093,\r\n inclination: 1.85,\r\n argumentOfPerihelion: 286,\r\n trueAnomaly: 45,\r\n color: \"#e74c3c\",\r\n },\r\n {\r\n name: \"Voyager 1\",\r\n type: \"spacecraft\" as const,\r\n semiMajorAxis: 40,\r\n eccentricity: 0.99,\r\n inclination: 35,\r\n argumentOfPerihelion: 0,\r\n trueAnomaly: 170,\r\n color: \"#3E3CFF\",\r\n },\r\n ],\r\n orbitPoints = 72,\r\n } = config;\r\n\r\n return bodies.map((body) => {\r\n const {\r\n semiMajorAxis: a,\r\n eccentricity: e,\r\n inclination: i,\r\n argumentOfPerihelion: omega,\r\n trueAnomaly: nu,\r\n } = body;\r\n\r\n // Generate orbit path\r\n const orbitPath: { x: number; y: number; z: number }[] = [];\r\n for (let j = 0; j <= orbitPoints; j++) {\r\n const angle = (j / orbitPoints) * 2 * Math.PI;\r\n const r = (a * (1 - e * e)) / (1 + e * Math.cos(angle));\r\n\r\n // Rotate by argument of perihelion and inclination\r\n const xOrbit = r * Math.cos(angle);\r\n const yOrbit = r * Math.sin(angle);\r\n\r\n const omegaRad = (omega * Math.PI) / 180;\r\n const iRad = (i * Math.PI) / 180;\r\n\r\n const x =\r\n xOrbit * Math.cos(omegaRad) -\r\n yOrbit * Math.cos(iRad) * Math.sin(omegaRad);\r\n const y =\r\n xOrbit * Math.sin(omegaRad) +\r\n yOrbit * Math.cos(iRad) * Math.cos(omegaRad);\r\n const z = yOrbit * Math.sin(iRad);\r\n\r\n orbitPath.push({ x, y, z });\r\n }\r\n\r\n // Current position\r\n const nuRad = (nu * Math.PI) / 180;\r\n const r = (a * (1 - e * e)) / (1 + e * Math.cos(nuRad));\r\n const xOrbit = r * Math.cos(nuRad);\r\n const yOrbit = r * Math.sin(nuRad);\r\n\r\n const omegaRad = (omega * Math.PI) / 180;\r\n const iRad = (i * Math.PI) / 180;\r\n\r\n const x =\r\n xOrbit * Math.cos(omegaRad) -\r\n yOrbit * Math.cos(iRad) * Math.sin(omegaRad);\r\n const y =\r\n xOrbit * Math.sin(omegaRad) +\r\n yOrbit * Math.cos(iRad) * Math.cos(omegaRad);\r\n const z = yOrbit * Math.sin(iRad);\r\n\r\n // Orbital period in days\r\n const period = 365.25 * Math.pow(a, 1.5);\r\n\r\n return {\r\n name: body.name,\r\n type: body.type,\r\n x,\r\n y,\r\n z,\r\n orbitPath,\r\n color: body.color,\r\n semiMajorAxis: a,\r\n period,\r\n inclination: i,\r\n size: body.type === \"planet\" ? 20 : 12,\r\n };\r\n });\r\n}\r\n\r\n// =============================================================================\r\n// Spectrum Generator (single FFT snapshot)\r\n// =============================================================================\r\n\r\nexport interface SpectrumGeneratorConfig {\r\n /** Center frequency (Hz) */\r\n centerFrequency?: number;\r\n /** Bandwidth (Hz) */\r\n bandwidth?: number;\r\n /** Number of points */\r\n points?: number;\r\n /** Noise floor (dBm) */\r\n noiseFloor?: number;\r\n /** Signals */\r\n signals?: Array<{\r\n frequency: number;\r\n power: number;\r\n bandwidth: number;\r\n }>;\r\n}\r\n\r\n/**\r\n * Generate a single RF spectrum snapshot\r\n */\r\nexport function generateSpectrum(\r\n config: SpectrumGeneratorConfig = {},\r\n): SpectrumDataPoint[] {\r\n const {\r\n centerFrequency = 2200e6,\r\n bandwidth = 10e6,\r\n points = 256,\r\n noiseFloor = -120,\r\n signals = [\r\n { frequency: 2200e6, power: -75, bandwidth: 100e3 },\r\n { frequency: 2197.5e6, power: -80, bandwidth: 10e3 },\r\n { frequency: 2202.5e6, power: -95, bandwidth: 50e3 },\r\n ],\r\n } = config;\r\n\r\n const data: SpectrumDataPoint[] = [];\r\n const freqMin = centerFrequency - bandwidth / 2;\r\n const freqStep = bandwidth / points;\r\n\r\n for (let i = 0; i < points; i++) {\r\n const freq = freqMin + i * freqStep;\r\n let power = noiseFloor + 3 * (Math.random() - 0.5);\r\n\r\n for (const signal of signals) {\r\n const distance = Math.abs(freq - signal.frequency);\r\n if (distance < signal.bandwidth * 2) {\r\n const attenuation =\r\n 20 * Math.log10(1 + distance / (signal.bandwidth / 2));\r\n power = Math.max(power, signal.power - attenuation);\r\n }\r\n }\r\n\r\n data.push({ frequency: freq, power: Math.round(power * 10) / 10 });\r\n }\r\n\r\n return data;\r\n}\r\n\r\n// =============================================================================\r\n// Eclipse Timeline Generator\r\n// =============================================================================\r\n\r\nexport interface EclipseGeneratorConfig {\r\n /** Orbit period (seconds) */\r\n orbitPeriod?: number;\r\n /** Eclipse fraction (0-1) */\r\n eclipseFraction?: number;\r\n /** Number of orbits */\r\n orbits?: number;\r\n /** Include penumbra */\r\n includePenumbra?: boolean;\r\n}\r\n\r\n/**\r\n * Generate eclipse timeline data\r\n */\r\nexport function generateEclipseTimeline(\r\n config: EclipseGeneratorConfig = {},\r\n): EclipseTimelineData[] {\r\n const {\r\n orbitPeriod = 5400,\r\n eclipseFraction = 0.38,\r\n orbits = 5,\r\n includePenumbra = true,\r\n } = config;\r\n\r\n const data: EclipseTimelineData[] = [];\r\n const now = Date.now();\r\n const penumbraDuration = includePenumbra ? 60 : 0; // 1 minute penumbra\r\n\r\n for (let orbit = 0; orbit < orbits; orbit++) {\r\n const orbitStart = now + orbit * orbitPeriod * 1000;\r\n const eclipseStart = orbitStart + orbitPeriod * 0.4 * 1000;\r\n const eclipseEnd = eclipseStart + orbitPeriod * eclipseFraction * 1000;\r\n\r\n // Sunlight before eclipse\r\n data.push({\r\n start: orbitStart,\r\n end: eclipseStart - penumbraDuration * 1000,\r\n type: \"sunlight\",\r\n orbitNumber: orbit + 1,\r\n });\r\n\r\n // Penumbra entry\r\n if (includePenumbra) {\r\n data.push({\r\n start: eclipseStart - penumbraDuration * 1000,\r\n end: eclipseStart,\r\n type: \"penumbra\",\r\n orbitNumber: orbit + 1,\r\n });\r\n }\r\n\r\n // Umbra\r\n data.push({\r\n start: eclipseStart,\r\n end: eclipseEnd,\r\n type: \"umbra\",\r\n orbitNumber: orbit + 1,\r\n });\r\n\r\n // Penumbra exit\r\n if (includePenumbra) {\r\n data.push({\r\n start: eclipseEnd,\r\n end: eclipseEnd + penumbraDuration * 1000,\r\n type: \"penumbra\",\r\n orbitNumber: orbit + 1,\r\n });\r\n }\r\n\r\n // Sunlight after eclipse\r\n data.push({\r\n start: eclipseEnd + penumbraDuration * 1000,\r\n end: orbitStart + orbitPeriod * 1000,\r\n type: \"sunlight\",\r\n orbitNumber: orbit + 1,\r\n });\r\n }\r\n\r\n return data;\r\n}\r\n\r\n// =============================================================================\r\n// Constellation Coverage Generator\r\n// =============================================================================\r\n\r\nexport interface CoverageGeneratorConfig {\r\n /** Latitude resolution (degrees) */\r\n latResolution?: number;\r\n /** Longitude resolution (degrees) */\r\n lonResolution?: number;\r\n /** Number of orbital planes */\r\n planes?: number;\r\n /** Satellites per plane */\r\n satsPerPlane?: number;\r\n /** Orbit altitude (km) */\r\n altitude?: number;\r\n /** Orbit inclination (degrees) */\r\n inclination?: number;\r\n /** Metric to compute: 'visibility' | 'revisitTime' | 'latency' */\r\n metric?: \"visibility\" | \"revisitTime\" | \"latency\";\r\n}\r\n\r\n/**\r\n * Generate constellation coverage grid data\r\n *\r\n * Models simplified visibility based on satellite altitude\r\n * and ground footprint overlap from Walker constellation geometry.\r\n */\r\nexport function generateConstellationCoverage(\r\n config: CoverageGeneratorConfig = {},\r\n): {\r\n latitudes: number[];\r\n longitudes: number[];\r\n coverage: number[][];\r\n unit: string;\r\n} {\r\n const {\r\n latResolution = 5,\r\n lonResolution = 5,\r\n planes = 6,\r\n satsPerPlane = 22,\r\n altitude = 550,\r\n inclination = 53,\r\n metric = \"visibility\",\r\n } = config;\r\n\r\n const latitudes: number[] = [];\r\n const longitudes: number[] = [];\r\n const coverage: number[][] = [];\r\n\r\n for (let lat = -90; lat <= 90; lat += latResolution) latitudes.push(lat);\r\n for (let lon = -180; lon < 180; lon += lonResolution) longitudes.push(lon);\r\n\r\n // Footprint half-angle from altitude\r\n const earthRadius = 6371;\r\n const footprintAngle =\r\n Math.acos(earthRadius / (earthRadius + altitude)) * (180 / Math.PI);\r\n const totalSats = planes * satsPerPlane;\r\n\r\n for (let li = 0; li < latitudes.length; li++) {\r\n const row: number[] = [];\r\n const lat = latitudes[li];\r\n const _latRad = (lat * Math.PI) / 180;\r\n\r\n for (let lj = 0; lj < longitudes.length; lj++) {\r\n let value: number;\r\n\r\n // Coverage depends on latitude vs inclination\r\n const latFactor =\r\n Math.abs(lat) <= inclination\r\n ? 1.0\r\n : Math.max(0, 1.0 - (Math.abs(lat) - inclination) / 20);\r\n\r\n // Base coverage from constellation density\r\n const densityFactor = totalSats / 100;\r\n const footprintOverlap = Math.min(\r\n 1,\r\n densityFactor * (footprintAngle / 30),\r\n );\r\n\r\n if (metric === \"visibility\") {\r\n // Percentage of time with at least 1 satellite visible\r\n value = Math.min(100, footprintOverlap * latFactor * 100);\r\n // Add polar convergence bonus\r\n if (Math.abs(lat) > 60) value = Math.min(100, value * 1.2);\r\n // Add noise\r\n value += (Math.random() - 0.5) * 5;\r\n value = Math.max(0, Math.min(100, value));\r\n } else if (metric === \"revisitTime\") {\r\n // Minutes between passes (lower is better)\r\n const baseRevisit = 90 / (footprintOverlap * latFactor + 0.01);\r\n value = Math.max(\r\n 1,\r\n Math.min(120, baseRevisit + (Math.random() - 0.5) * 10),\r\n );\r\n } else {\r\n // Latency in ms (one-way)\r\n const slantRange =\r\n altitude / Math.sin(Math.max(0.1, (latFactor * Math.PI) / 4));\r\n value = slantRange / 300 + 2 + Math.random() * 2; // ms\r\n }\r\n\r\n row.push(Math.round(value * 10) / 10);\r\n }\r\n coverage.push(row);\r\n }\r\n\r\n const units: Record<string, string> = {\r\n visibility: \"%\",\r\n revisitTime: \"min\",\r\n latency: \"ms\",\r\n };\r\n return { latitudes, longitudes, coverage, unit: units[metric] || \"%\" };\r\n}\r\n\r\n// =============================================================================\r\n// Conjunction Event Generator\r\n// =============================================================================\r\n\r\nexport interface ConjunctionGeneratorConfig {\r\n /** Primary object name */\r\n primaryName?: string;\r\n /** Number of events to generate */\r\n eventCount?: number;\r\n /** Time range in hours */\r\n timeRangeHours?: number;\r\n /** Include high-risk events */\r\n includeHighRisk?: boolean;\r\n}\r\n\r\n/**\r\n * Generate realistic conjunction/close approach events\r\n */\r\nexport function generateConjunctionEvents(\r\n config: ConjunctionGeneratorConfig = {},\r\n): Array<{\r\n id: string;\r\n primary: string;\r\n secondary: string;\r\n tca: number;\r\n missDistance: number;\r\n probability: number;\r\n relativeVelocity: number;\r\n position: { x: number; y: number; z: number };\r\n uncertainty?: { rx: number; ry: number; rz: number };\r\n}> {\r\n const {\r\n primaryName = \"SAT-ALPHA\",\r\n eventCount = 12,\r\n timeRangeHours = 72,\r\n includeHighRisk = true,\r\n } = config;\r\n\r\n const secondaries = [\r\n \"COSMOS-2251 DEB\",\r\n \"FENGYUN-1C DEB\",\r\n \"SL-16 R/B\",\r\n \"IRIDIUM 33 DEB\",\r\n \"NOAA 17 DEB\",\r\n \"ATLAS 5 CENTAUR R/B\",\r\n \"BREEZE-M DEB\",\r\n \"CZ-3B R/B\",\r\n \"UNKNOWN DEB\",\r\n \"MICROSAT-R DEB\",\r\n \"DELTA 2 R/B\",\r\n \"H-2A R/B\",\r\n ];\r\n\r\n const now = Date.now();\r\n const events = [];\r\n\r\n for (let i = 0; i < eventCount; i++) {\r\n const tca = now + Math.random() * timeRangeHours * 3600000;\r\n let missDistance: number;\r\n\r\n if (includeHighRisk && i < 2) {\r\n missDistance = 0.1 + Math.random() * 0.9; // Critical: < 1 km\r\n } else if (i < 5) {\r\n missDistance = 1 + Math.random() * 4; // Warning: 1-5 km\r\n } else {\r\n missDistance = 5 + Math.random() * 15; // Safe: > 5 km\r\n }\r\n\r\n const probability = Math.pow(10, -3 - missDistance * 1.5 + Math.random());\r\n const relativeVelocity = 5 + Math.random() * 12;\r\n\r\n const angle = Math.random() * 2 * Math.PI;\r\n const incAngle = (Math.random() - 0.5) * Math.PI;\r\n const radius = 6800 + Math.random() * 600;\r\n\r\n events.push({\r\n id: `CDM-${String(i + 1).padStart(3, \"0\")}`,\r\n primary: primaryName,\r\n secondary: secondaries[i % secondaries.length],\r\n tca,\r\n missDistance: Math.round(missDistance * 1000) / 1000,\r\n probability: Math.max(1e-10, probability),\r\n relativeVelocity: Math.round(relativeVelocity * 100) / 100,\r\n position: {\r\n x: Math.round(radius * Math.cos(angle) * Math.cos(incAngle)),\r\n y: Math.round(radius * Math.sin(angle) * Math.cos(incAngle)),\r\n z: Math.round(radius * Math.sin(incAngle)),\r\n },\r\n uncertainty: {\r\n rx: 20 + Math.random() * 100,\r\n ry: 50 + Math.random() * 300,\r\n rz: 10 + Math.random() * 60,\r\n },\r\n });\r\n }\r\n\r\n return events.sort((a, b) => a.tca - b.tca);\r\n}\r\n\r\nexport default {\r\n generatePowerData,\r\n generateAttitudeData,\r\n generateDopplerData,\r\n generateWaterfallData,\r\n generateContactWindows,\r\n generateHeliocentricOrbits,\r\n generateSpectrum,\r\n generateEclipseTimeline,\r\n generateConstellationCoverage,\r\n generateConjunctionEvents,\r\n};\r\n"],"mappings":";AAyBA,IAAM,iBAAiB;AACvB,IAAM,eAAe;AACrB,IAAM,WAAW;;;;;;;;;;AAoCjB,SAAgB,kBACd,SAA+B,CAAC,GACd;CAClB,MAAM,EACJ,cAAc,MACd,kBAAkB,MAClB,kBAAkB,IAClB,YAAY,IACZ,kBAAkB,KAClB,aAAa,IACb,uBAAuB,IACvB,SAAS,GACT,aAAa,OACX;CAEJ,MAAM,OAAyB,CAAC;CAChC,MAAM,gBAAgB,cAAc;CACpC,IAAI,aAAa;CACjB,MAAM,oBAAoB;CAG1B,MAAM,eAAe;CACrB,MAAM,aAAa,eAAe,kBAAkB;CAEpD,KAAK,IAAI,IAAI,GAAG,IAAI,eAAe,KAAK,YAAY;EAClD,MAAM,aAAc,IAAI,cAAe;EACvC,MAAM,YAAY,cAAc,gBAAgB,aAAa;EAG7D,MAAM,iBAAiB,KAAM,KAAM,KAAK,IAAI,aAAa,KAAK,KAAK,CAAC;EACpE,MAAM,aAAa,YAAY,IAAI,kBAAkB;EAGrD,MAAM,cAAc,YAChB,YAAY,uBACZ;EAGJ,MAAM,WAAW,aAAa;EAG9B,MAAM,cAAe,WAAW,aAAc;EAG9C,cAAgB,eADd,WAAW,IAAI,oBAAoB,IAAI,qBACS,kBAAmB;EACrE,aAAa,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,UAAU,CAAC;EAElD,KAAK,KAAK;GACR,MAAM,KAAK,IAAI,IAAI,IAAI;GACvB,YAAY,KAAK,MAAM,aAAa,EAAE,IAAI;GAC1C,aAAa,KAAK,MAAM,cAAc,EAAE,IAAI;GAC5C,UAAU,KAAK,MAAM,WAAW,EAAE,IAAI;GACtC,gBAAgB,KAAK,MAAM,aAAa,EAAE,IAAI;GAC9C,SAAS;EACX,CAAC;CACH;CAEA,OAAO;AACT;;;;;;;;;;AAgCA,SAAgB,qBACd,SAAkC,CAAC,GACd;CACrB,MAAM,EACJ,kBAAkB;EAAC;EAAG;EAAK;CAAE,GAC7B,iBAAiB;EAAC;EAAG;EAAI;CAAG,GAC5B,WAAW,IACX,aAAa,IACb,SAAS,KACT,eAAe,GACf,WAAW,QACT;CAEJ,MAAM,OAA4B,CAAC;CACnC,MAAM,KAAK,IAAI;CAGf,MAAM,gBAAgB,eAAe,KAAK,GAAG,MAAM,IAAI,gBAAgB,EAAE;CACzE,MAAM,aAAa,KAAK,KACtB,cAAc,QAAQ,KAAK,MAAM,MAAM,IAAI,GAAG,CAAC,CACjD;CACA,MAAM,eAAe,aAAa;CACd,cAAc,KAAK,MAAM,IAAI,UAAU;CAG3D,MAAM,oBAAoB;EACxB,MAAM,KAAK,KAAK,OAAO;EACvB,MAAM,KAAK,KAAK,OAAO;EACvB,OAAO,KAAK,KAAK,KAAK,KAAK,IAAI,EAAE,CAAC,IAAI,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE;CACjE;CAEA,IAAI,WAAW,gBAAgB;CAC/B,IAAI,YAAY,gBAAgB;CAChC,IAAI,UAAU,gBAAgB;CAE9B,KAAK,IAAI,IAAI,GAAG,IAAI,UAAU,KAAK,IAAI;EACrC,IAAI,MAAc,OAAe;EACjC,IAAI;EAEJ,IAAI,IAAI,cAAc;GAEpB,MAAM,WAAW,IAAI;GACrB,MAAM,iBAAiB,KAAM,KAAM,KAAK,IAAI,WAAW,KAAK,EAAE;GAC9D,OAAO,gBAAgB,KAAK,cAAc,KAAK;GAC/C,QAAQ,gBAAgB,KAAK,cAAc,KAAK;GAChD,MAAM,gBAAgB,KAAK,cAAc,KAAK;GAC9C,gBAAgB,cAAc,IAAI;EACpC,OAAO,IAAI,IAAI,eAAe,YAAY;GAExC,MAAM,kBAAkB,IAAI,gBAAgB;GAC5C,MAAM,cAAc,KAAK,IAAI,KAAK,cAAc;GAChD,MAAM,YACJ,MAAO,KAAK,IAAI,iBAAiB,KAAK,KAAK,CAAC,IAAI;GAElD,OAAO,eAAe,KAAK,YAAY,SAAS,YAAY;GAC5D,QAAQ,eAAe,KAAK,YAAY,SAAS,YAAY;GAC7D,MAAM,eAAe,KAAK,YAAY,SAAS,YAAY;GAC3D,gBAAgB,KAAK,IAAI,SAAS,IAAI,SAAS,KAAK,IAAI,YAAY,CAAC;EACvE,OAAO;GAEL,OAAO,eAAe,KAAK,SAAS,YAAY;GAChD,QAAQ,eAAe,KAAK,SAAS,YAAY;GACjD,MAAM,eAAe,KAAK,SAAS,YAAY;GAC/C,gBACE,SACA,KAAK,KACH,KAAK,IAAI,YAAY,GAAG,CAAC,IACvB,KAAK,IAAI,YAAY,GAAG,CAAC,IACzB,KAAK,IAAI,YAAY,GAAG,CAAC,CAC7B;EACJ;EAGA,MAAM,kBAAkB,KAAK,KAC3B,KAAK,KAAK,OAAO,YAAY,IAAI,CAAC,IAChC,KAAK,KAAK,QAAQ,aAAa,IAAI,CAAC,IACpC,KAAK,KAAK,MAAM,WAAW,IAAI,CAAC,CACpC;EAEA,KAAK,KAAK;GACR,MAAM,KAAK,IAAI,IAAI,IAAI;GACvB,MAAM,KAAK,MAAM,OAAO,GAAG,IAAI;GAC/B,OAAO,KAAK,MAAM,QAAQ,GAAG,IAAI;GACjC,KAAK,KAAK,MAAM,MAAM,GAAG,IAAI;GAC7B,eAAe,KAAK,MAAM,gBAAgB,GAAI,IAAI;GAClD,iBAAiB,KAAK,MAAM,kBAAkB,GAAI,IAAI;EACxD,CAAC;EAED,WAAW;EACX,YAAY;EACZ,UAAU;CACZ;CAEA,OAAO;AACT;;;;;;;;;AAiCA,SAAgB,oBAAoB,SAAiC,CAAC,GAIpE;CACA,MAAM,EACJ,mBAAmB,OACnB,WAAW,KACX,eAAe,IACf,eAAe,KACf,aAAa,GACb,mBAAmB,IACnB,gBAAgB,OAChB,eAAe,iBAAiB,mBAC9B;CAEJ,MAAM,YAAiC,CAAC;CACxC,MAAM,WAAgC,CAAC;CAGvC,MAAM,cAAc,eAAe;CAInC,MAAM,aACJ,oBAJsB,KAAK,KAAK,WAAW,WAItB,IAAkB,MAAQ;CAGjD,MAAM,eAAgB,eAAe,KAAK,KAAM;CAChD,MAAM,gBAAgB,KAAK,KAAK,IAAI;CAEpC,MAAM,MAAM,KAAK,IAAI;CACrB,MAAM,MAAM;CACZ,MAAM,MAAM,MAAM,eAAe;CACjC,MAAM,MAAM,MAAO,eAAe,IAAK;CAGvC,MAAM,oBAAoB;EACxB,MAAM,KAAK,KAAK,OAAO;EACvB,MAAM,KAAK,KAAK,OAAO;EACvB,OAAO,KAAK,KAAK,KAAK,KAAK,IAAI,EAAE,CAAC,IAAI,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE;CACjE;CAEA,KAAK,IAAI,IAAI,GAAG,KAAK,cAAc,KAAK,YAAY;EAClD,MAAM,OAAO,MAAM,IAAI;EAEvB,MAAM,SADY,IAAI,eACK,MAAO,IAAI;EAGtC,MAAM,eAAe,aAAa,KAAK,IAAI,KAAK;EAGhD,MAAM,YAAY,eAAe,KAAK,IAAI,KAAK;EAE/C,UAAU,KAAK;GACb;GACA,cAAc,KAAK,MAAM,YAAY;GACrC,WAAW,KAAK,MAAM,YAAY,EAAE,IAAI;EAC1C,CAAC;EAGD,MAAM,gBAAgB,eAAe,mBAAmB,YAAY;EACpE,SAAS,KAAK;GACZ;GACA,cAAc,KAAK,MAAM,aAAa;GACtC,WAAW,KAAK,MAAM,YAAY,EAAE,IAAI;EAC1C,CAAC;CACH;CAUA,OAAO;EAAE;EAAW;EAAU,UAAA;GAP5B,MAAM;GACN,KAAK,IAAI,KAAK,GAAG;GACjB,KAAK,IAAI,KAAK,GAAG;GACjB,KAAK,IAAI,KAAK,GAAG;GACjB;EAG4B;CAAS;AACzC;;;;;;;;;;;AA0CA,SAAgB,sBACd,SAAmC,CAAC,GACd;CACtB,MAAM,EACJ,kBAAkB,OAClB,YAAY,KACZ,UAAU,KACV,aAAa,MACb,cAAc,KACd,UAAU;EACR;GAAE,QAAQ;GAAO,OAAO;GAAK,WAAW;GAAK,MAAM;EAAc;EACjE;GAAE,QAAQ;GAAG,OAAO;GAAK,WAAW;GAAM,MAAM;EAAmB;EACnE;GAAE,QAAQ;GAAM,OAAO;GAAK,WAAW;GAAK,MAAM;EAAe;CACnE,MACE;CAEJ,MAAM,OAA6B,CAAC;CACpC,MAAM,WAAW,YAAY;CAC7B,MAAM,cAAc;CAGpB,MAAM,oBAAoB;EACxB,MAAM,KAAK,KAAK,OAAO;EACvB,MAAM,KAAK,KAAK,OAAO;EACvB,OAAO,KAAK,KAAK,KAAK,KAAK,IAAI,EAAE,CAAC,IAAI,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE;CACjE;CAGA,MAAM,cAAwB,CAAC;CAC/B,KAAK,IAAI,IAAI,GAAG,IAAI,SAAS,KAC3B,YAAY,KAAK,mBAAmB,IAAI,UAAU,KAAK,QAAQ;CAGjE,KAAK,IAAI,IAAI,GAAG,IAAI,aAAa,KAAK;EACpC,MAAM,SAAmB,CAAC;EAC1B,MAAM,OAAO,KAAK,IAAI,KAAK,cAAc,KAAK;EAE9C,KAAK,IAAI,IAAI,GAAG,IAAI,SAAS,KAAK;GAChC,MAAM,cAAc,IAAI,UAAU,KAAK;GACvC,IAAI,QAAQ,aAAa,cAAc,YAAY;GAGnD,KAAK,MAAM,UAAU,SAAS;IAC5B,MAAM,eACJ,OAAO,UAAU,OAAO,gBAAgB,MAAM,IAAI;IACpD,MAAM,WAAW,KAAK,IAAI,aAAa,YAAY;IAEnD,IAAI,OAAO,SAAS;SAEd,WAAW,OAAO,YAAY,GAAG;MACnC,MAAM,QAAQ,KAAK,IACjB,KAAK,IAAK,KAAK,KAAK,WAAY,OAAO,SAAS,KAC5C,KAAK,KAAK,WAAY,OAAO,YAAY,OAC7C,CACF;MACA,QAAQ,KAAK,IACX,OACA,OAAO,QAAQ,KAAK,KAAK,MAAM,QAAQ,IAAK,IAAI,YAAY,CAC9D;KACF;WACK,IAAI,OAAO,SAAS;SAGvB,cAAc,gBACd,cAAc,eAAe,OAAO,WACpC;MACA,MAAM,aAAa,KAAM,KAAM,KAAK,IAAI,IAAI,KAAM,IAAI,EAAG;MACzD,QAAQ,KAAK,IACX,OACA,OAAO,QAAQ,IAAI,IAAI,aAAa,IAAI,YAAY,CACtD;KACF;WACK,IAAI,OAAO,SAAS;SAErB,WAAW,OAAO,YAAY,GAChC,QAAQ,KAAK,IAAI,OAAO,OAAO,QAAQ,YAAY,CAAC;UAC/C,IAAI,WAAW,OAAO,WAAW;MACtC,MAAM,UACJ,KAAK,WAAW,OAAO,YAAY,MAAM,OAAO,YAAY;MAC9D,QAAQ,KAAK,IACX,OACA,OAAO,QAAQ,MAAM,IAAI,WAAW,YAAY,CAClD;KACF;WACK,IAAI,OAAO,SAAS;SAErB,WAAW,OAAO,WACpB,QAAQ,KAAK,IAAI,OAAO,OAAO,KAAK;IAAA;GAG1C;GAEA,OAAO,KAAK,KAAK,MAAM,QAAQ,EAAE,IAAI,EAAE;EACzC;EAEA,KAAK,KAAK;GAAE;GAAM,aAAa,CAAC,GAAG,WAAW;GAAG;EAAO,CAAC;CAC3D;CAEA,OAAO;AACT;;;;;;;;;AA+BA,SAAgB,uBACd,SAAiC,CAAC,GACb;CACrB,MAAM,EACJ,iBAAiB;EACf;GAAE,MAAM;GAAiB,UAAU;GAAM,WAAW;EAAK;EACzD;GAAE,MAAM;GAAiB,UAAU;GAAO,WAAW;EAAM;EAC3D;GAAE,MAAM;GAAgB,UAAU;GAAM,WAAW;EAAO;EAC1D;GAAE,MAAM;GAAgB,UAAU;GAAM,WAAW;EAAK;CAC1D,GACA,WAAW,KACX,cAAc,MACd,WAAW,IACX,eAAe,MACb;CAEJ,MAAM,SAA8B,CAAC;CACrC,MAAM,MAAM,KAAK,IAAI;CACrB,MAAM,cACJ,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,eAAe,UAAU,CAAC,IAAI,QAAQ;CACzE,MAAM,eAAe,KAAK,MAAO,WAAW,OAAQ,WAAW;CAE/D,KAAK,MAAM,MAAM,gBAAgB;EAC/B,MAAM,UAAwC,CAAC;EAI/C,IAAI,EADc,KAAK,IAAI,GAAG,QAAQ,KAAK,cAAc,KACzC;EAGhB,MAAM,mBAAmB,KAAK,MAC5B,gBAAgB,KAAM,KAAM,KAAK,IAAK,GAAG,WAAW,KAAK,KAAM,GAAG,EACpE;EAEA,KAAK,IAAI,IAAI,GAAG,IAAI,kBAAkB,KAAK;GAEzC,MAAM,aADY,MAAO,IAAI,WAAW,OAAO,MAAQ,oBACvB,KAAK,OAAO,IAAI,MAAO,cAAc;GAGrE,MAAM,QAAQ,eAAe,KAAK,OAAO,KAAK,KAAK;GACnD,MAAM,eAAe,MAAU,OAAQ,IAAI,QAAQ;GAEnD,MAAM,gBACJ,QAAQ,KAAK,SAAS,QAAQ,KAAK,aAAa;GAElD,QAAQ,KAAK;IACX,OAAO;IACP,KAAK,aAAa;IAClB,OAAO,QAAQ,IAAI;IACJ;IACf,WAAW,KAAK,MAAM,KAAK;GAC7B,CAAC;EACH;EAEA,OAAO,KAAK;GAAE,IAAI,GAAG;GAAM,MAAM,GAAG;GAAM;EAAQ,CAAC;CACrD;CAEA,OAAO;AACT;;;;AAyBA,SAAgB,2BACd,SAAsC,CAAC,GACd;CACzB,MAAM,EACJ,SAAS;EACP;GACE,MAAM;GACN,MAAM;GACN,eAAe;GACf,cAAc;GACd,aAAa;GACb,sBAAsB;GACtB,aAAa;GACb,OAAO;EACT;EACA;GACE,MAAM;GACN,MAAM;GACN,eAAe;GACf,cAAc;GACd,aAAa;GACb,sBAAsB;GACtB,aAAa;GACb,OAAO;EACT;EACA;GACE,MAAM;GACN,MAAM;GACN,eAAe;GACf,cAAc;GACd,aAAa;GACb,sBAAsB;GACtB,aAAa;GACb,OAAO;EACT;CACF,GACA,cAAc,OACZ;CAEJ,OAAO,OAAO,KAAK,SAAS;EAC1B,MAAM,EACJ,eAAe,GACf,cAAc,GACd,aAAa,GACb,sBAAsB,OACtB,aAAa,OACX;EAGJ,MAAM,YAAmD,CAAC;EAC1D,KAAK,IAAI,IAAI,GAAG,KAAK,aAAa,KAAK;GACrC,MAAM,QAAS,IAAI,cAAe,IAAI,KAAK;GAC3C,MAAM,IAAK,KAAK,IAAI,IAAI,MAAO,IAAI,IAAI,KAAK,IAAI,KAAK;GAGrD,MAAM,SAAS,IAAI,KAAK,IAAI,KAAK;GACjC,MAAM,SAAS,IAAI,KAAK,IAAI,KAAK;GAEjC,MAAM,WAAY,QAAQ,KAAK,KAAM;GACrC,MAAM,OAAQ,IAAI,KAAK,KAAM;GAE7B,MAAM,IACJ,SAAS,KAAK,IAAI,QAAQ,IAC1B,SAAS,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,QAAQ;GAC7C,MAAM,IACJ,SAAS,KAAK,IAAI,QAAQ,IAC1B,SAAS,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,QAAQ;GAC7C,MAAM,IAAI,SAAS,KAAK,IAAI,IAAI;GAEhC,UAAU,KAAK;IAAE;IAAG;IAAG;GAAE,CAAC;EAC5B;EAGA,MAAM,QAAS,KAAK,KAAK,KAAM;EAC/B,MAAM,IAAK,KAAK,IAAI,IAAI,MAAO,IAAI,IAAI,KAAK,IAAI,KAAK;EACrD,MAAM,SAAS,IAAI,KAAK,IAAI,KAAK;EACjC,MAAM,SAAS,IAAI,KAAK,IAAI,KAAK;EAEjC,MAAM,WAAY,QAAQ,KAAK,KAAM;EACrC,MAAM,OAAQ,IAAI,KAAK,KAAM;EAE7B,MAAM,IACJ,SAAS,KAAK,IAAI,QAAQ,IAC1B,SAAS,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,QAAQ;EAC7C,MAAM,IACJ,SAAS,KAAK,IAAI,QAAQ,IAC1B,SAAS,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,QAAQ;EAC7C,MAAM,IAAI,SAAS,KAAK,IAAI,IAAI;EAGhC,MAAM,SAAS,SAAS,KAAK,IAAI,GAAG,GAAG;EAEvC,OAAO;GACL,MAAM,KAAK;GACX,MAAM,KAAK;GACX;GACA;GACA;GACA;GACA,OAAO,KAAK;GACZ,eAAe;GACf;GACA,aAAa;GACb,MAAM,KAAK,SAAS,WAAW,KAAK;EACtC;CACF,CAAC;AACH;;;;AA0BA,SAAgB,iBACd,SAAkC,CAAC,GACd;CACrB,MAAM,EACJ,kBAAkB,MAClB,YAAY,KACZ,SAAS,KACT,aAAa,MACb,UAAU;EACR;GAAE,WAAW;GAAQ,OAAO;GAAK,WAAW;EAAM;EAClD;GAAE,WAAW;GAAU,OAAO;GAAK,WAAW;EAAK;EACnD;GAAE,WAAW;GAAU,OAAO;GAAK,WAAW;EAAK;CACrD,MACE;CAEJ,MAAM,OAA4B,CAAC;CACnC,MAAM,UAAU,kBAAkB,YAAY;CAC9C,MAAM,WAAW,YAAY;CAE7B,KAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,KAAK;EAC/B,MAAM,OAAO,UAAU,IAAI;EAC3B,IAAI,QAAQ,aAAa,KAAK,KAAK,OAAO,IAAI;EAE9C,KAAK,MAAM,UAAU,SAAS;GAC5B,MAAM,WAAW,KAAK,IAAI,OAAO,OAAO,SAAS;GACjD,IAAI,WAAW,OAAO,YAAY,GAAG;IACnC,MAAM,cACJ,KAAK,KAAK,MAAM,IAAI,YAAY,OAAO,YAAY,EAAE;IACvD,QAAQ,KAAK,IAAI,OAAO,OAAO,QAAQ,WAAW;GACpD;EACF;EAEA,KAAK,KAAK;GAAE,WAAW;GAAM,OAAO,KAAK,MAAM,QAAQ,EAAE,IAAI;EAAG,CAAC;CACnE;CAEA,OAAO;AACT;;;;AAoBA,SAAgB,wBACd,SAAiC,CAAC,GACX;CACvB,MAAM,EACJ,cAAc,MACd,kBAAkB,KAClB,SAAS,GACT,kBAAkB,SAChB;CAEJ,MAAM,OAA8B,CAAC;CACrC,MAAM,MAAM,KAAK,IAAI;CACrB,MAAM,mBAAmB,kBAAkB,KAAK;CAEhD,KAAK,IAAI,QAAQ,GAAG,QAAQ,QAAQ,SAAS;EAC3C,MAAM,aAAa,MAAM,QAAQ,cAAc;EAC/C,MAAM,eAAe,aAAa,cAAc,KAAM;EACtD,MAAM,aAAa,eAAe,cAAc,kBAAkB;EAGlE,KAAK,KAAK;GACR,OAAO;GACP,KAAK,eAAe,mBAAmB;GACvC,MAAM;GACN,aAAa,QAAQ;EACvB,CAAC;EAGD,IAAI,iBACF,KAAK,KAAK;GACR,OAAO,eAAe,mBAAmB;GACzC,KAAK;GACL,MAAM;GACN,aAAa,QAAQ;EACvB,CAAC;EAIH,KAAK,KAAK;GACR,OAAO;GACP,KAAK;GACL,MAAM;GACN,aAAa,QAAQ;EACvB,CAAC;EAGD,IAAI,iBACF,KAAK,KAAK;GACR,OAAO;GACP,KAAK,aAAa,mBAAmB;GACrC,MAAM;GACN,aAAa,QAAQ;EACvB,CAAC;EAIH,KAAK,KAAK;GACR,OAAO,aAAa,mBAAmB;GACvC,KAAK,aAAa,cAAc;GAChC,MAAM;GACN,aAAa,QAAQ;EACvB,CAAC;CACH;CAEA,OAAO;AACT;;;;;;;AA6BA,SAAgB,8BACd,SAAkC,CAAC,GAMnC;CACA,MAAM,EACJ,gBAAgB,GAChB,gBAAgB,GAChB,SAAS,GACT,eAAe,IACf,WAAW,KACX,cAAc,IACd,SAAS,iBACP;CAEJ,MAAM,YAAsB,CAAC;CAC7B,MAAM,aAAuB,CAAC;CAC9B,MAAM,WAAuB,CAAC;CAE9B,KAAK,IAAI,MAAM,KAAK,OAAO,IAAI,OAAO,eAAe,UAAU,KAAK,GAAG;CACvE,KAAK,IAAI,MAAM,MAAM,MAAM,KAAK,OAAO,eAAe,WAAW,KAAK,GAAG;CAGzE,MAAM,cAAc;CACpB,MAAM,iBACJ,KAAK,KAAK,eAAe,cAAc,SAAS,KAAK,MAAM,KAAK;CAClE,MAAM,YAAY,SAAS;CAE3B,KAAK,IAAI,KAAK,GAAG,KAAK,UAAU,QAAQ,MAAM;EAC5C,MAAM,MAAgB,CAAC;EACvB,MAAM,MAAM,UAAU;EACL,MAAM,KAAK,KAAM;EAElC,KAAK,IAAI,KAAK,GAAG,KAAK,WAAW,QAAQ,MAAM;GAC7C,IAAI;GAGJ,MAAM,YACJ,KAAK,IAAI,GAAG,KAAK,cACb,IACA,KAAK,IAAI,GAAG,KAAO,KAAK,IAAI,GAAG,IAAI,eAAe,EAAE;GAG1D,MAAM,gBAAgB,YAAY;GAClC,MAAM,mBAAmB,KAAK,IAC5B,GACA,iBAAiB,iBAAiB,GACpC;GAEA,IAAI,WAAW,cAAc;IAE3B,QAAQ,KAAK,IAAI,KAAK,mBAAmB,YAAY,GAAG;IAExD,IAAI,KAAK,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK,IAAI,KAAK,QAAQ,GAAG;IAEzD,UAAU,KAAK,OAAO,IAAI,MAAO;IACjC,QAAQ,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,KAAK,CAAC;GAC1C,OAAO,IAAI,WAAW,eAAe;IAEnC,MAAM,cAAc,MAAM,mBAAmB,YAAY;IACzD,QAAQ,KAAK,IACX,GACA,KAAK,IAAI,KAAK,eAAe,KAAK,OAAO,IAAI,MAAO,EAAE,CACxD;GACF,OAIE,QADE,WAAW,KAAK,IAAI,KAAK,IAAI,IAAM,YAAY,KAAK,KAAM,CAAC,CAAC,IACzC,MAAM,IAAI,KAAK,OAAO,IAAI;GAGjD,IAAI,KAAK,KAAK,MAAM,QAAQ,EAAE,IAAI,EAAE;EACtC;EACA,SAAS,KAAK,GAAG;CACnB;CAOA,OAAO;EAAE;EAAW;EAAY;EAAU,MAAM;GAJ9C,YAAY;GACZ,aAAa;GACb,SAAS;EAEqC,EAAM,WAAW;CAAI;AACvE;;;;AAoBA,SAAgB,0BACd,SAAqC,CAAC,GAWrC;CACD,MAAM,EACJ,cAAc,aACd,aAAa,IACb,iBAAiB,IACjB,kBAAkB,SAChB;CAEJ,MAAM,cAAc;EAClB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CAEA,MAAM,MAAM,KAAK,IAAI;CACrB,MAAM,SAAS,CAAC;CAEhB,KAAK,IAAI,IAAI,GAAG,IAAI,YAAY,KAAK;EACnC,MAAM,MAAM,MAAM,KAAK,OAAO,IAAI,iBAAiB;EACnD,IAAI;EAEJ,IAAI,mBAAmB,IAAI,GACzB,eAAe,KAAM,KAAK,OAAO,IAAI;OAChC,IAAI,IAAI,GACb,eAAe,IAAI,KAAK,OAAO,IAAI;OAEnC,eAAe,IAAI,KAAK,OAAO,IAAI;EAGrC,MAAM,cAAc,KAAK,IAAI,IAAI,KAAK,eAAe,MAAM,KAAK,OAAO,CAAC;EACxE,MAAM,mBAAmB,IAAI,KAAK,OAAO,IAAI;EAE7C,MAAM,QAAQ,KAAK,OAAO,IAAI,IAAI,KAAK;EACvC,MAAM,YAAY,KAAK,OAAO,IAAI,MAAO,KAAK;EAC9C,MAAM,SAAS,OAAO,KAAK,OAAO,IAAI;EAEtC,OAAO,KAAK;GACV,IAAI,OAAO,OAAO,IAAI,CAAC,CAAC,CAAC,SAAS,GAAG,GAAG;GACxC,SAAS;GACT,WAAW,YAAY,IAAI,YAAY;GACvC;GACA,cAAc,KAAK,MAAM,eAAe,GAAI,IAAI;GAChD,aAAa,KAAK,IAAI,OAAO,WAAW;GACxC,kBAAkB,KAAK,MAAM,mBAAmB,GAAG,IAAI;GACvD,UAAU;IACR,GAAG,KAAK,MAAM,SAAS,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,QAAQ,CAAC;IAC3D,GAAG,KAAK,MAAM,SAAS,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,QAAQ,CAAC;IAC3D,GAAG,KAAK,MAAM,SAAS,KAAK,IAAI,QAAQ,CAAC;GAC3C;GACA,aAAa;IACX,IAAI,KAAK,KAAK,OAAO,IAAI;IACzB,IAAI,KAAK,KAAK,OAAO,IAAI;IACzB,IAAI,KAAK,KAAK,OAAO,IAAI;GAC3B;EACF,CAAC;CACH;CAEA,OAAO,OAAO,MAAM,GAAG,MAAM,EAAE,MAAM,EAAE,GAAG;AAC5C"}
@@ -49,7 +49,7 @@ export type { PowerGeneratorConfig, AttitudeGeneratorConfig, DopplerGeneratorCon
49
49
  export { PowerOverviewChart, generateSamplePowerData, } from './PowerOverviewChart';
50
50
  export type { PowerOverviewChartProps, PowerTimelinePoint, PowerEvent, PowerState, OperationalMode, EventType, EventType as PowerEventType, } from './PowerOverviewChart';
51
51
  export type { PowerChartProps, AttitudeChartProps, ThermalHeatmapChartProps, LinkBudgetChartProps, SubsystemGaugeProps, OrbitChartProps, ContactWindowChartProps, SpectrumChartProps, ManeuverBudgetChartProps, EclipseTimelineChartProps, RoseDiagramProps, HeliocentricOrbitProps, Scatter3DChartProps, Bar3DChartProps, Surface3DChartProps, Lines3DChartProps, SphericalRadar3DChartProps, SphericalRadar3DData, TransferOrbit3DChartProps, TransferOrbitSegment, TransferOrbitWaypoint, AttitudeHistory3DChartProps, AttitudeHistoryPoint, ConjunctionAssessment3DChartProps, ConjunctionEvent, LaunchCorridor3DChartProps, LaunchCorridorData, AntennaPattern3DChartProps, AntennaPattern3DData, WaterfallChartProps, DopplerTrackChartProps, LinkMarginChartProps, ConstellationCoverageChartProps, ConjunctionChartProps, } from './domain';
52
- export { useChartStream, useWebSocketStream, } from './useChartStream';
52
+ export { useChartStream, useWebSocketStream } from './useChartStream';
53
53
  export type { StreamOptions, StreamController, WebSocketStreamOptions, WebSocketStreamController, } from './useChartStream';
54
54
  export { useChartSync, dispatchToGroup, syncZoomRange, resetGroupZoom, showGroupTooltip, hideGroupTooltip, getGroupCharts, exportGroupAsImages, exportGroupAsCSV, } from './sync';
55
55
  export type { UseChartSyncOptions } from './sync';
@@ -1,8 +1,7 @@
1
1
  import { default as React } from 'react';
2
2
  import { AstroChartHandle } from './AstroChart';
3
3
  import { AstroChartProps, AxisOptions } from './types';
4
-
5
- type PresetProps = Omit<AstroChartProps, 'type'>;
4
+ type PresetProps = Omit<AstroChartProps, "type">;
6
5
  export interface LineChartProps extends PresetProps {
7
6
  /** Enable smooth curves */
8
7
  smooth?: boolean;
@@ -35,7 +34,7 @@ export interface ScatterChartProps extends PresetProps {
35
34
  showRegression?: boolean;
36
35
  }
37
36
  export declare const ScatterChart: React.MemoExoticComponent<React.ForwardRefExoticComponent<ScatterChartProps & React.RefAttributes<AstroChartHandle>>>;
38
- export interface PieChartProps extends Omit<PresetProps, 'xAxis' | 'yAxis' | 'zoom'> {
37
+ export interface PieChartProps extends Omit<PresetProps, "xAxis" | "yAxis" | "zoom"> {
39
38
  /** Show as donut */
40
39
  donut?: boolean;
41
40
  /** Inner radius for donut (percentage) */
@@ -49,7 +48,7 @@ export interface PieChartProps extends Omit<PresetProps, 'xAxis' | 'yAxis' | 'zo
49
48
  }
50
49
  export declare const PieChart: React.MemoExoticComponent<React.ForwardRefExoticComponent<PieChartProps & React.RefAttributes<AstroChartHandle>>>;
51
50
  export declare const DonutChart: React.MemoExoticComponent<React.ForwardRefExoticComponent<PieChartProps & React.RefAttributes<AstroChartHandle>>>;
52
- export interface GaugeChartProps extends Omit<PresetProps, 'xAxis' | 'yAxis' | 'zoom' | 'series'> {
51
+ export interface GaugeChartProps extends Omit<PresetProps, "xAxis" | "yAxis" | "zoom" | "series"> {
53
52
  /** Current value */
54
53
  value: number;
55
54
  /** Minimum value */
@@ -71,7 +70,7 @@ export interface GaugeChartProps extends Omit<PresetProps, 'xAxis' | 'yAxis' | '
71
70
  showPointer?: boolean;
72
71
  }
73
72
  export declare const GaugeChart: React.MemoExoticComponent<React.ForwardRefExoticComponent<GaugeChartProps & React.RefAttributes<AstroChartHandle>>>;
74
- export interface RadarChartProps extends Omit<PresetProps, 'xAxis' | 'yAxis' | 'zoom'> {
73
+ export interface RadarChartProps extends Omit<PresetProps, "xAxis" | "yAxis" | "zoom"> {
75
74
  /** Indicator definitions */
76
75
  indicators: {
77
76
  name: string;
@@ -129,7 +128,7 @@ export interface HistogramChartProps extends PresetProps {
129
128
  showCurve?: boolean;
130
129
  }
131
130
  export declare const HistogramChart: React.MemoExoticComponent<React.ForwardRefExoticComponent<HistogramChartProps & React.RefAttributes<AstroChartHandle>>>;
132
- export interface SankeyChartProps extends Omit<PresetProps, 'series'> {
131
+ export interface SankeyChartProps extends Omit<PresetProps, "series"> {
133
132
  /** Node definitions */
134
133
  nodes: {
135
134
  name: string;
@@ -144,7 +143,7 @@ export interface SankeyChartProps extends Omit<PresetProps, 'series'> {
144
143
  value: number;
145
144
  }[];
146
145
  /** Orient vertical or horizontal */
147
- orient?: 'horizontal' | 'vertical';
146
+ orient?: "horizontal" | "vertical";
148
147
  }
149
148
  export declare const SankeyChart: React.MemoExoticComponent<React.ForwardRefExoticComponent<SankeyChartProps & React.RefAttributes<AstroChartHandle>>>;
150
149
  export interface TreemapDataNode {
@@ -155,7 +154,7 @@ export interface TreemapDataNode {
155
154
  color?: string;
156
155
  };
157
156
  }
158
- export interface TreemapChartProps extends Omit<PresetProps, 'series'> {
157
+ export interface TreemapChartProps extends Omit<PresetProps, "series"> {
159
158
  /** Hierarchical data */
160
159
  data: TreemapDataNode[];
161
160
  /** Show breadcrumb navigation */
@@ -172,7 +171,7 @@ export interface SunburstDataNode {
172
171
  color?: string;
173
172
  };
174
173
  }
175
- export interface SunburstChartProps extends Omit<PresetProps, 'series'> {
174
+ export interface SunburstChartProps extends Omit<PresetProps, "series"> {
176
175
  /** Hierarchical data */
177
176
  data: SunburstDataNode[];
178
177
  /** Inner radius (percentage or pixels) */
@@ -186,10 +185,10 @@ export interface ParallelAxisDef {
186
185
  name: string;
187
186
  min?: number;
188
187
  max?: number;
189
- type?: 'value' | 'category';
188
+ type?: "value" | "category";
190
189
  data?: string[];
191
190
  }
192
- export interface ParallelChartProps extends Omit<PresetProps, 'series'> {
191
+ export interface ParallelChartProps extends Omit<PresetProps, "series"> {
193
192
  /** Axis definitions */
194
193
  axes: ParallelAxisDef[];
195
194
  /** Data rows (each row is values for each axis) */
@@ -208,7 +207,7 @@ export interface CandlestickDataPoint {
208
207
  low: number;
209
208
  high: number;
210
209
  }
211
- export interface CandlestickChartProps extends Omit<PresetProps, 'series'> {
210
+ export interface CandlestickChartProps extends Omit<PresetProps, "series"> {
212
211
  /** OHLC data */
213
212
  data: CandlestickDataPoint[];
214
213
  /** Show volume bars */
@@ -242,7 +241,7 @@ export interface GraphCategory {
242
241
  color?: string;
243
242
  };
244
243
  }
245
- export interface GraphChartProps extends Omit<PresetProps, 'series'> {
244
+ export interface GraphChartProps extends Omit<PresetProps, "series"> {
246
245
  /** Node definitions */
247
246
  nodes: GraphNode[];
248
247
  /** Link definitions */
@@ -250,7 +249,7 @@ export interface GraphChartProps extends Omit<PresetProps, 'series'> {
250
249
  /** Category definitions */
251
250
  categories?: GraphCategory[];
252
251
  /** Layout type */
253
- layout?: 'force' | 'circular' | 'none';
252
+ layout?: "force" | "circular" | "none";
254
253
  }
255
254
  export declare const GraphChart: React.MemoExoticComponent<React.ForwardRefExoticComponent<GraphChartProps & React.RefAttributes<AstroChartHandle>>>;
256
255
  export interface BoxPlotDataPoint {
@@ -259,7 +258,7 @@ export interface BoxPlotDataPoint {
259
258
  /** Raw data values for computing boxplot statistics */
260
259
  values: number[];
261
260
  }
262
- export interface BoxPlotChartProps extends Omit<PresetProps, 'series'> {
261
+ export interface BoxPlotChartProps extends Omit<PresetProps, "series"> {
263
262
  /** Box plot data - each item contains a category name and array of values */
264
263
  data: BoxPlotDataPoint[];
265
264
  /** Show outliers as scatter points */