@zendir/ui 0.5.0 → 0.6.0

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 +20 -0
  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 +312 -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 +217 -194
  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 +419 -41
  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
@@ -59,7 +59,7 @@ export interface SpacecraftPosition {
59
59
  /** Orbital inclination in degrees */
60
60
  inclination?: number;
61
61
  /** Health/operational status using AstroUXDS 6-level system */
62
- status?: 'off' | 'standby' | 'normal' | 'caution' | 'serious' | 'critical';
62
+ status?: "off" | "standby" | "normal" | "caution" | "serious" | "critical";
63
63
  }
64
64
  export interface Spacecraft {
65
65
  id: string;
@@ -67,7 +67,7 @@ export interface Spacecraft {
67
67
  noradId?: number;
68
68
  type?: string;
69
69
  /** Status using AstroUXDS 6-level system */
70
- status?: 'off' | 'standby' | 'normal' | 'caution' | 'serious' | 'critical';
70
+ status?: "off" | "standby" | "normal" | "caution" | "serious" | "critical";
71
71
  }
72
72
  export interface GroundStation {
73
73
  id: string;
@@ -257,7 +257,7 @@ export interface AttitudeData {
257
257
  /** Target direction vector [x, y, z] */
258
258
  targetDirection?: [number, number, number];
259
259
  }
260
- export type PointingMode = 'nadir' | 'sun' | 'target' | 'inertial' | 'velocity';
260
+ export type PointingMode = "nadir" | "sun" | "target" | "inertial" | "velocity";
261
261
  export interface EclipseInfo {
262
262
  inEclipse: boolean;
263
263
  timeToEclipse: number;
@@ -307,7 +307,7 @@ export interface ThermalData {
307
307
  export interface ThrusterStatus {
308
308
  id: string;
309
309
  name: string;
310
- status: 'ready' | 'firing' | 'disabled' | 'error';
310
+ status: "ready" | "firing" | "disabled" | "error";
311
311
  fuelFlow?: number;
312
312
  }
313
313
  export interface PropulsionSummary {
@@ -324,7 +324,7 @@ export interface ReactionWheelData {
324
324
  /** Display name (e.g. "RW-X", "RW-1") */
325
325
  name: string;
326
326
  /** Mounted axis */
327
- axis: 'X' | 'Y' | 'Z' | 'skew';
327
+ axis: "X" | "Y" | "Z" | "skew";
328
328
  /** Current stored angular momentum in N·m·s */
329
329
  momentumNms: number;
330
330
  /** Maximum momentum capacity in N·m·s */
@@ -334,7 +334,7 @@ export interface ReactionWheelData {
334
334
  /** Maximum wheel speed in RPM */
335
335
  maxSpeedRpm: number;
336
336
  /** Operational status */
337
- status: 'nominal' | 'saturated' | 'desaturating' | 'off' | 'error';
337
+ status: "nominal" | "saturated" | "desaturating" | "off" | "error";
338
338
  /** Power consumption in Watts */
339
339
  powerW?: number;
340
340
  /** Bearing temperature in °C */
@@ -373,9 +373,9 @@ export interface ThrusterFireEvent {
373
373
  /** Burn duration in seconds */
374
374
  durationSeconds: number;
375
375
  /** Event type */
376
- type: 'impulsive' | 'finite' | 'continuous';
376
+ type: "impulsive" | "finite" | "continuous";
377
377
  }
378
- export type PlanetId = 'sun' | 'mercury' | 'venus' | 'earth' | 'moon' | 'mars' | 'jupiter' | 'saturn' | 'uranus' | 'neptune' | 'pluto';
378
+ export type PlanetId = "sun" | "mercury" | "venus" | "earth" | "moon" | "mars" | "jupiter" | "saturn" | "uranus" | "neptune" | "pluto";
379
379
  export interface PlanetInfo {
380
380
  id: PlanetId;
381
381
  name: string;
@@ -1,58 +1,158 @@
1
+ //#region src/react/types.ts
2
+ /**
3
+ * Estimate orbital period from altitude (simplified)
4
+ */
1
5
  function estimateOrbitalPeriod(altitudeKm) {
2
- const earthRadiusKm = 6371;
3
- const mu = 398600.4418;
4
- const semiMajorAxis = earthRadiusKm + altitudeKm;
5
- const period = 2 * Math.PI * Math.sqrt(Math.pow(semiMajorAxis, 3) / mu);
6
- return period / 60;
6
+ const earthRadiusKm = 6371;
7
+ const mu = 398600.4418;
8
+ const semiMajorAxis = earthRadiusKm + altitudeKm;
9
+ return 2 * Math.PI * Math.sqrt(Math.pow(semiMajorAxis, 3) / mu) / 60;
7
10
  }
11
+ /**
12
+ * Estimate orbital velocity from altitude (simplified)
13
+ */
8
14
  function estimateOrbitalVelocity(altitudeKm) {
9
- const earthRadiusKm = 6371;
10
- const mu = 398600.4418;
11
- const radius = earthRadiusKm + altitudeKm;
12
- return Math.sqrt(mu / radius);
15
+ const earthRadiusKm = 6371;
16
+ const mu = 398600.4418;
17
+ const radius = earthRadiusKm + altitudeKm;
18
+ return Math.sqrt(mu / radius);
13
19
  }
20
+ /**
21
+ * Convert AU to kilometers
22
+ */
14
23
  function auToKm(au) {
15
- return au * 1495978707e-1;
24
+ return au * 149597870.7;
16
25
  }
26
+ /**
27
+ * Normalize planet name to PlanetId
28
+ */
17
29
  function normalizePlanetName(name) {
18
- const normalized = name.toLowerCase().trim();
19
- const validPlanets = [
20
- "sun",
21
- "mercury",
22
- "venus",
23
- "earth",
24
- "moon",
25
- "mars",
26
- "jupiter",
27
- "saturn",
28
- "uranus",
29
- "neptune",
30
- "pluto"
31
- ];
32
- return validPlanets.includes(normalized) ? normalized : null;
30
+ const normalized = name.toLowerCase().trim();
31
+ return [
32
+ "sun",
33
+ "mercury",
34
+ "venus",
35
+ "earth",
36
+ "moon",
37
+ "mars",
38
+ "jupiter",
39
+ "saturn",
40
+ "uranus",
41
+ "neptune",
42
+ "pluto"
43
+ ].includes(normalized) ? normalized : null;
33
44
  }
45
+ /**
46
+ * Get planet info by ID
47
+ */
34
48
  function getPlanet(id) {
35
- return PLANETS.find((p) => p.id === id);
49
+ return PLANETS.find((p) => p.id === id);
36
50
  }
37
- const PLANETS = [
38
- { id: "sun", name: "Sun", radius: 696340, mass: 1989e27, semiMajorAxis: 0, orbitalPeriod: 0, color: "#ffcc00" },
39
- { id: "mercury", name: "Mercury", radius: 2439.7, mass: 33011e19, semiMajorAxis: 0.387, orbitalPeriod: 88, color: "#b5b5b5" },
40
- { id: "venus", name: "Venus", radius: 6051.8, mass: 48675e20, semiMajorAxis: 0.723, orbitalPeriod: 225, color: "#e6c87a" },
41
- { id: "earth", name: "Earth", radius: 6371, mass: 5972e21, semiMajorAxis: 1, orbitalPeriod: 365, color: "#4da6ff" },
42
- { id: "moon", name: "Moon", radius: 1737.4, mass: 7342e19, semiMajorAxis: 257e-5, orbitalPeriod: 27.3, color: "#c0c0c0" },
43
- { id: "mars", name: "Mars", radius: 3389.5, mass: 64171e19, semiMajorAxis: 1.524, orbitalPeriod: 687, color: "#e07b4a" },
44
- { id: "jupiter", name: "Jupiter", radius: 69911, mass: 18982e23, semiMajorAxis: 5.203, orbitalPeriod: 4333, color: "#d8ca9d" },
45
- { id: "saturn", name: "Saturn", radius: 58232, mass: 56834e22, semiMajorAxis: 9.537, orbitalPeriod: 10759, color: "#f4d59e" },
46
- { id: "uranus", name: "Uranus", radius: 25362, mass: 8681e22, semiMajorAxis: 19.19, orbitalPeriod: 30687, color: "#b3e0e6" },
47
- { id: "neptune", name: "Neptune", radius: 24622, mass: 102413e21, semiMajorAxis: 30.07, orbitalPeriod: 60190, color: "#5b7fff" },
48
- { id: "pluto", name: "Pluto", radius: 1188.3, mass: 1303e19, semiMajorAxis: 39.48, orbitalPeriod: 90560, color: "#c9b79c" }
51
+ /**
52
+ * Planet data (simplified)
53
+ */
54
+ var PLANETS = [
55
+ {
56
+ id: "sun",
57
+ name: "Sun",
58
+ radius: 696340,
59
+ mass: 1989e27,
60
+ semiMajorAxis: 0,
61
+ orbitalPeriod: 0,
62
+ color: "#ffcc00"
63
+ },
64
+ {
65
+ id: "mercury",
66
+ name: "Mercury",
67
+ radius: 2439.7,
68
+ mass: 33011e19,
69
+ semiMajorAxis: .387,
70
+ orbitalPeriod: 88,
71
+ color: "#b5b5b5"
72
+ },
73
+ {
74
+ id: "venus",
75
+ name: "Venus",
76
+ radius: 6051.8,
77
+ mass: 48675e20,
78
+ semiMajorAxis: .723,
79
+ orbitalPeriod: 225,
80
+ color: "#e6c87a"
81
+ },
82
+ {
83
+ id: "earth",
84
+ name: "Earth",
85
+ radius: 6371,
86
+ mass: 5972e21,
87
+ semiMajorAxis: 1,
88
+ orbitalPeriod: 365,
89
+ color: "#4da6ff"
90
+ },
91
+ {
92
+ id: "moon",
93
+ name: "Moon",
94
+ radius: 1737.4,
95
+ mass: 7342e19,
96
+ semiMajorAxis: .00257,
97
+ orbitalPeriod: 27.3,
98
+ color: "#c0c0c0"
99
+ },
100
+ {
101
+ id: "mars",
102
+ name: "Mars",
103
+ radius: 3389.5,
104
+ mass: 64171e19,
105
+ semiMajorAxis: 1.524,
106
+ orbitalPeriod: 687,
107
+ color: "#e07b4a"
108
+ },
109
+ {
110
+ id: "jupiter",
111
+ name: "Jupiter",
112
+ radius: 69911,
113
+ mass: 18982e23,
114
+ semiMajorAxis: 5.203,
115
+ orbitalPeriod: 4333,
116
+ color: "#d8ca9d"
117
+ },
118
+ {
119
+ id: "saturn",
120
+ name: "Saturn",
121
+ radius: 58232,
122
+ mass: 56834e22,
123
+ semiMajorAxis: 9.537,
124
+ orbitalPeriod: 10759,
125
+ color: "#f4d59e"
126
+ },
127
+ {
128
+ id: "uranus",
129
+ name: "Uranus",
130
+ radius: 25362,
131
+ mass: 8681e22,
132
+ semiMajorAxis: 19.19,
133
+ orbitalPeriod: 30687,
134
+ color: "#b3e0e6"
135
+ },
136
+ {
137
+ id: "neptune",
138
+ name: "Neptune",
139
+ radius: 24622,
140
+ mass: 102413e21,
141
+ semiMajorAxis: 30.07,
142
+ orbitalPeriod: 60190,
143
+ color: "#5b7fff"
144
+ },
145
+ {
146
+ id: "pluto",
147
+ name: "Pluto",
148
+ radius: 1188.3,
149
+ mass: 1303e19,
150
+ semiMajorAxis: 39.48,
151
+ orbitalPeriod: 90560,
152
+ color: "#c9b79c"
153
+ }
49
154
  ];
50
- export {
51
- PLANETS,
52
- auToKm,
53
- estimateOrbitalPeriod,
54
- estimateOrbitalVelocity,
55
- getPlanet,
56
- normalizePlanetName
57
- };
58
- //# sourceMappingURL=types.js.map
155
+ //#endregion
156
+ export { PLANETS, auToKm, estimateOrbitalPeriod, estimateOrbitalVelocity, getPlanet, normalizePlanetName };
157
+
158
+ //# sourceMappingURL=types.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sources":["../../src/react/types.ts"],"sourcesContent":["/**\r\n * @zendir/ui - Local Type Definitions\r\n *\r\n * UI-domain types (`Quaternion`, `Vector3D`, `PointingMode`, etc.) used by\r\n * the visualization components. These live in `@zendir/ui` because they\r\n * describe what the UI renders — they are NOT shipped by `zendir-ts`,\r\n * which is REST-only and intentionally minimal.\r\n *\r\n * Helpers like `estimateOrbitalPeriod` / `estimateOrbitalVelocity` are\r\n * pure client-side approximations used for quick UI estimates; for\r\n * physics-accurate values, fetch the real properties from the engine\r\n * via `client.getProperties(...)`.\r\n */\r\n\r\n// =============================================================================\r\n// Category / Group Primitive\r\n// =============================================================================\r\n\r\n/**\r\n * A named, colored data category — the SDK's shared concept for any secondary\r\n * grouping dimension (teams, squads, subsystems, mission phases, etc.).\r\n *\r\n * Components that support category-aware coloring accept `CategoryDef` arrays\r\n * and/or a `categoryId` field on individual data items. The `CategoryPalette`\r\n * utility resolves ids → colors/labels consistently across an entire dashboard.\r\n *\r\n * @example\r\n * const categories: CategoryDef[] = [\r\n * { id: 'alpha', label: 'Team Alpha', color: '#2dccff' },\r\n * { id: 'bravo', label: 'Team Bravo', color: '#fce83a' },\r\n * ];\r\n */\r\nexport interface CategoryDef {\r\n /** Stable unique identifier (string or numeric) */\r\n id: string | number;\r\n /** Human-readable display name */\r\n label: string;\r\n /** CSS color used for visual accents (stripes, rings, swatches, series lines) */\r\n color: string;\r\n /** Optional icon name from the Astro icon set */\r\n icon?: string;\r\n /** Arbitrary metadata for app-specific needs */\r\n meta?: Record<string, unknown>;\r\n}\r\n\r\n// =============================================================================\r\n// Spacecraft Types\r\n// =============================================================================\r\n\r\nexport interface SpacecraftPosition {\r\n /** Optional spacecraft id (when combined with Spacecraft) */\r\n id?: string;\r\n /** Optional display name */\r\n name?: string;\r\n /** Latitude in degrees (-90 to 90) */\r\n latitude: number;\r\n /** Longitude in degrees (-180 to 180) */\r\n longitude: number;\r\n /** Altitude in kilometers */\r\n altitude: number;\r\n /** Velocity in km/s */\r\n velocity?: number;\r\n /** Heading in degrees */\r\n heading?: number;\r\n /** Timestamp */\r\n timestamp?: string;\r\n /** Orbit type (e.g. LEO, GEO) */\r\n orbitType?: string;\r\n /** Orbital inclination in degrees */\r\n inclination?: number;\r\n /** Health/operational status using AstroUXDS 6-level system */\r\n status?: 'off' | 'standby' | 'normal' | 'caution' | 'serious' | 'critical';\r\n}\r\n\r\nexport interface Spacecraft {\r\n id: string;\r\n name: string;\r\n noradId?: number;\r\n type?: string;\r\n /** Status using AstroUXDS 6-level system */\r\n status?: 'off' | 'standby' | 'normal' | 'caution' | 'serious' | 'critical';\r\n}\r\n\r\n// =============================================================================\r\n// Ground Station Types\r\n// =============================================================================\r\n\r\nexport interface GroundStation {\r\n id: string;\r\n name: string;\r\n latitude: number;\r\n longitude: number;\r\n elevation?: number;\r\n /** Minimum elevation angle for visibility (degrees) */\r\n minElevation?: number;\r\n network?: string;\r\n}\r\n\r\nexport interface GroundTrackPoint {\r\n latitude: number;\r\n longitude: number;\r\n altitude: number;\r\n timestamp: string;\r\n}\r\n\r\n// =============================================================================\r\n// Layer Definition (shared by 2D map + 3D viewer panels)\r\n// =============================================================================\r\n\r\n/**\r\n * Developer-defined toggle in a Layers panel. The component that owns the\r\n * panel only renders the toggle UI — it does NOT render the layer's\r\n * content. The consumer app listens to the panel's `onChange` and\r\n * renders/hides its own overlay accordingly.\r\n *\r\n * Used by both `<GroundTrackMap />` (2D map overlays) and the upcoming\r\n * `<LayerControlPanel />` for the 3D viewer.\r\n */\r\nexport interface LayerDef {\r\n /** Unique identifier (e.g. 'heatmap', 'coverage', 'spacecraft'). */\r\n id: string;\r\n /** Display label in the Layers panel. */\r\n label: string;\r\n /** Whether the layer is on by default (default true). */\r\n defaultEnabled?: boolean;\r\n /** Optional grouping bucket for the panel ('overlays', 'objects', etc.). */\r\n category?: string;\r\n}\r\n\r\n/**\r\n * @deprecated Use `LayerDef`. Alias kept for backward compatibility with\r\n * existing `<GroundTrackMap />` consumers.\r\n */\r\nexport type MapLayerDef = LayerDef;\r\n\r\n// =============================================================================\r\n// Access / Contact Types\r\n// =============================================================================\r\n\r\nexport interface AccessData {\r\n stationId: string;\r\n stationName: string;\r\n spacecraftId: string;\r\n aos: string; // Acquisition of Signal - ISO timestamp\r\n los: string; // Loss of Signal - ISO timestamp\r\n maxElevation: number;\r\n azimuthAos?: number;\r\n azimuthLos?: number;\r\n /** Whether link is currently accessible */\r\n isAccessible?: boolean;\r\n /** Current elevation angle (degrees) */\r\n elevation?: number;\r\n /** Current azimuth (degrees) */\r\n azimuth?: number;\r\n /** Slant range in km */\r\n slantRange?: number;\r\n /** Signal strength 0-100 */\r\n signalStrength?: number;\r\n /** Link budget details */\r\n linkBudget?: {\r\n receivedPower?: number;\r\n snr?: number;\r\n dataRate?: number;\r\n };\r\n}\r\n\r\nexport interface AccessWindow {\r\n aos: string;\r\n los: string;\r\n maxElevation: number;\r\n stationId: string;\r\n /** Start time (ISO or ms) */\r\n startTime?: string | number;\r\n /** Duration in seconds */\r\n duration?: number;\r\n}\r\n\r\n// =============================================================================\r\n// Telemetry Types\r\n// =============================================================================\r\n\r\nexport interface TelemetryData {\r\n timestamp: string;\r\n subsystems: {\r\n power?: {\r\n status: string;\r\n batteryLevel?: number;\r\n solarArrayOutput?: number;\r\n voltage?: number;\r\n solarGeneration?: number;\r\n consumption?: number;\r\n };\r\n thermal?: {\r\n status: string;\r\n cpuTemp?: number;\r\n batteryTemp?: number;\r\n };\r\n comms?: {\r\n status: string;\r\n signalStrength?: number;\r\n dataRate?: number;\r\n downlinkRate?: number;\r\n transmitterStatus?: string;\r\n packetsQueued?: number;\r\n bytesTransmitted?: number;\r\n packetsTransmitted?: number;\r\n };\r\n attitude?: {\r\n status: string;\r\n pointingError?: number;\r\n eulerAngles?: EulerAngles;\r\n targetMode?: string;\r\n };\r\n };\r\n /** Health status (convenience alias / extended) */\r\n health?: {\r\n status?: string;\r\n anomalies?: Array<{ id: string; message: string; severity?: string }>;\r\n };\r\n /** Power (convenience alias for subsystems.power / extended) */\r\n power?: {\r\n status?: string;\r\n batteryLevel?: number;\r\n solarArrayOutput?: number;\r\n voltage?: number;\r\n solarGeneration?: number;\r\n consumption?: number;\r\n };\r\n /** Attitude (convenience alias / extended) */\r\n attitude?: {\r\n status?: string;\r\n eulerAngles?: EulerAngles;\r\n targetMode?: string;\r\n pointingError?: number;\r\n };\r\n /** Communications (convenience alias / extended) */\r\n communications?: {\r\n status?: string;\r\n signalStrength?: number;\r\n dataRate?: number;\r\n downlinkRate?: number;\r\n transmitterStatus?: string;\r\n packetsQueued?: number;\r\n bytesTransmitted?: number;\r\n packetsTransmitted?: number;\r\n };\r\n alerts?: Array<{\r\n id: string;\r\n severity: string;\r\n message: string;\r\n timestamp: string;\r\n }>;\r\n}\r\n\r\n// =============================================================================\r\n// Orbital Types\r\n// =============================================================================\r\n\r\nexport interface OrbitalElements {\r\n semiMajorAxis: number;\r\n eccentricity: number;\r\n inclination: number;\r\n raan: number; // Right Ascension of Ascending Node\r\n argumentOfPerigee: number;\r\n trueAnomaly: number;\r\n period?: number;\r\n epoch?: string;\r\n}\r\n\r\n// =============================================================================\r\n// Attitude Types\r\n// =============================================================================\r\n\r\nexport interface Quaternion {\r\n x: number;\r\n y: number;\r\n z: number;\r\n w: number;\r\n}\r\n\r\nexport interface EulerAngles {\r\n roll: number;\r\n pitch: number;\r\n yaw: number;\r\n}\r\n\r\nexport interface AngularVelocity {\r\n x: number;\r\n y: number;\r\n z: number;\r\n}\r\n\r\nexport interface AttitudeData {\r\n quaternion: Quaternion;\r\n eulerAngles: EulerAngles;\r\n angularVelocity: AngularVelocity;\r\n targetMode?: string;\r\n /** Pointing error in degrees */\r\n pointingError?: number;\r\n /** Target direction vector [x, y, z] */\r\n targetDirection?: [number, number, number];\r\n}\r\n\r\nexport type PointingMode = 'nadir' | 'sun' | 'target' | 'inertial' | 'velocity';\r\n\r\n// =============================================================================\r\n// Eclipse Types\r\n// =============================================================================\r\n\r\nexport interface EclipseInfo {\r\n inEclipse: boolean;\r\n timeToEclipse: number; // seconds\r\n eclipseDuration: number; // seconds\r\n sunlightDuration: number; // seconds\r\n /** Umbra duration in seconds */\r\n umbraDuration?: number;\r\n /** Penumbra duration in seconds */\r\n penumbraDuration?: number;\r\n /** Seconds until sunlight (when in eclipse) */\r\n timeToSunlight?: number;\r\n}\r\n\r\n// =============================================================================\r\n// Link Budget Types\r\n// =============================================================================\r\n\r\nexport interface DetailedLinkBudget {\r\n spacecraftId: string;\r\n groundStationId: string;\r\n frequency: number;\r\n eirp: number;\r\n pathLoss: number;\r\n atmosphericLoss: number;\r\n receiverGain: number;\r\n systemNoiseTemp: number;\r\n cnoRequired: number;\r\n cnoActual: number;\r\n margin: number;\r\n dataRate: number;\r\n}\r\n\r\n// =============================================================================\r\n// Thermal Types\r\n// =============================================================================\r\n\r\nexport interface ThermalZone {\r\n id: string;\r\n name: string;\r\n temperature: number;\r\n minLimit: number;\r\n maxLimit: number;\r\n}\r\n\r\nexport interface ThermalData {\r\n timestamp: string;\r\n zones: ThermalZone[];\r\n averageTemp: number;\r\n hottest: { zone: string; temp: number };\r\n coldest: { zone: string; temp: number };\r\n}\r\n\r\n// =============================================================================\r\n// Propulsion Types\r\n// =============================================================================\r\n\r\nexport interface ThrusterStatus {\r\n id: string;\r\n name: string;\r\n status: 'ready' | 'firing' | 'disabled' | 'error';\r\n fuelFlow?: number;\r\n}\r\n\r\nexport interface PropulsionSummary {\r\n fuelRemaining: number;\r\n fuelCapacity: number;\r\n thrusterStatus: ThrusterStatus[];\r\n deltaVRemaining: number;\r\n deltaVUsed: number;\r\n lastManeuver?: string;\r\n}\r\n\r\n// =============================================================================\r\n// Reaction Wheel / Momentum Types\r\n// =============================================================================\r\n\r\nexport interface ReactionWheelData {\r\n /** Unique wheel identifier */\r\n id: string;\r\n /** Display name (e.g. \"RW-X\", \"RW-1\") */\r\n name: string;\r\n /** Mounted axis */\r\n axis: 'X' | 'Y' | 'Z' | 'skew';\r\n /** Current stored angular momentum in N·m·s */\r\n momentumNms: number;\r\n /** Maximum momentum capacity in N·m·s */\r\n maxMomentumNms: number;\r\n /** Current wheel speed in RPM */\r\n speedRpm: number;\r\n /** Maximum wheel speed in RPM */\r\n maxSpeedRpm: number;\r\n /** Operational status */\r\n status: 'nominal' | 'saturated' | 'desaturating' | 'off' | 'error';\r\n /** Power consumption in Watts */\r\n powerW?: number;\r\n /** Bearing temperature in °C */\r\n temperatureC?: number;\r\n}\r\n\r\n/** LVLH (Local Vertical Local Horizontal) frame vector */\r\nexport interface LVLHVector {\r\n /** Radial component (local vertical, positive away from Earth) */\r\n radial: number;\r\n /** In-track component (along velocity vector) */\r\n inTrack: number;\r\n /** Cross-track component (normal to orbital plane) */\r\n crossTrack: number;\r\n}\r\n\r\n/** Time-stamped LVLH state for trajectory plotting */\r\nexport interface LVLHState {\r\n /** Timestamp in milliseconds */\r\n time: number;\r\n /** Position in LVLH frame (km) */\r\n position: LVLHVector;\r\n /** Velocity in LVLH frame (km/s) */\r\n velocity: LVLHVector;\r\n}\r\n\r\n/** Thruster firing event */\r\nexport interface ThrusterFireEvent {\r\n /** Event timestamp in milliseconds */\r\n time: number;\r\n /** Thruster ID */\r\n thrusterId: string;\r\n /** Display name */\r\n name: string;\r\n /** Delta-V magnitude in m/s */\r\n deltaVMs: number;\r\n /** Delta-V direction in LVLH frame (unit vector) */\r\n deltaVDirection?: LVLHVector;\r\n /** Burn duration in seconds */\r\n durationSeconds: number;\r\n /** Event type */\r\n type: 'impulsive' | 'finite' | 'continuous';\r\n}\r\n\r\n// =============================================================================\r\n// Planet Types\r\n// =============================================================================\r\n\r\nexport type PlanetId = \r\n | 'sun' \r\n | 'mercury' \r\n | 'venus' \r\n | 'earth' \r\n | 'moon' \r\n | 'mars' \r\n | 'jupiter' \r\n | 'saturn' \r\n | 'uranus' \r\n | 'neptune' \r\n | 'pluto';\r\n\r\nexport interface PlanetInfo {\r\n id: PlanetId;\r\n name: string;\r\n radius: number; // km\r\n /** @deprecated Use radius */\r\n radiusKm?: number;\r\n mass: number; // kg\r\n semiMajorAxis: number; // AU\r\n /** Distance from Sun in AU (alias for semiMajorAxis) */\r\n distanceFromSunAU?: number;\r\n orbitalPeriod: number; // Earth days\r\n color: string;\r\n}\r\n\r\n// =============================================================================\r\n// Utility Functions (fallbacks when SDK not available)\r\n// =============================================================================\r\n\r\n/**\r\n * Estimate orbital period from altitude (simplified)\r\n */\r\nexport function estimateOrbitalPeriod(altitudeKm: number): number {\r\n const earthRadiusKm = 6371;\r\n const mu = 398600.4418; // km³/s² - Earth's gravitational parameter\r\n const semiMajorAxis = earthRadiusKm + altitudeKm;\r\n const period = 2 * Math.PI * Math.sqrt(Math.pow(semiMajorAxis, 3) / mu);\r\n return period / 60; // Return in minutes\r\n}\r\n\r\n/**\r\n * Estimate orbital velocity from altitude (simplified)\r\n */\r\nexport function estimateOrbitalVelocity(altitudeKm: number): number {\r\n const earthRadiusKm = 6371;\r\n const mu = 398600.4418; // km³/s²\r\n const radius = earthRadiusKm + altitudeKm;\r\n return Math.sqrt(mu / radius); // km/s\r\n}\r\n\r\n/**\r\n * Convert AU to kilometers\r\n */\r\nexport function auToKm(au: number): number {\r\n return au * 149597870.7;\r\n}\r\n\r\n/**\r\n * Normalize planet name to PlanetId\r\n */\r\nexport function normalizePlanetName(name: string): PlanetId | null {\r\n const normalized = name.toLowerCase().trim();\r\n const validPlanets: PlanetId[] = [\r\n 'sun', 'mercury', 'venus', 'earth', 'moon', \r\n 'mars', 'jupiter', 'saturn', 'uranus', 'neptune', 'pluto'\r\n ];\r\n return validPlanets.includes(normalized as PlanetId) \r\n ? (normalized as PlanetId) \r\n : null;\r\n}\r\n\r\n/**\r\n * Get planet info by ID\r\n */\r\nexport function getPlanet(id: PlanetId): PlanetInfo | undefined {\r\n return PLANETS.find(p => p.id === id);\r\n}\r\n\r\n/**\r\n * Planet data (simplified)\r\n */\r\nexport const PLANETS: PlanetInfo[] = [\r\n { id: 'sun', name: 'Sun', radius: 696340, mass: 1.989e30, semiMajorAxis: 0, orbitalPeriod: 0, color: '#ffcc00' },\r\n { id: 'mercury', name: 'Mercury', radius: 2439.7, mass: 3.3011e23, semiMajorAxis: 0.387, orbitalPeriod: 88, color: '#b5b5b5' },\r\n { id: 'venus', name: 'Venus', radius: 6051.8, mass: 4.8675e24, semiMajorAxis: 0.723, orbitalPeriod: 225, color: '#e6c87a' },\r\n { id: 'earth', name: 'Earth', radius: 6371, mass: 5.972e24, semiMajorAxis: 1.0, orbitalPeriod: 365, color: '#4da6ff' },\r\n { id: 'moon', name: 'Moon', radius: 1737.4, mass: 7.342e22, semiMajorAxis: 0.00257, orbitalPeriod: 27.3, color: '#c0c0c0' },\r\n { id: 'mars', name: 'Mars', radius: 3389.5, mass: 6.4171e23, semiMajorAxis: 1.524, orbitalPeriod: 687, color: '#e07b4a' },\r\n { id: 'jupiter', name: 'Jupiter', radius: 69911, mass: 1.8982e27, semiMajorAxis: 5.203, orbitalPeriod: 4333, color: '#d8ca9d' },\r\n { id: 'saturn', name: 'Saturn', radius: 58232, mass: 5.6834e26, semiMajorAxis: 9.537, orbitalPeriod: 10759, color: '#f4d59e' },\r\n { id: 'uranus', name: 'Uranus', radius: 25362, mass: 8.6810e25, semiMajorAxis: 19.19, orbitalPeriod: 30687, color: '#b3e0e6' },\r\n { id: 'neptune', name: 'Neptune', radius: 24622, mass: 1.02413e26, semiMajorAxis: 30.07, orbitalPeriod: 60190, color: '#5b7fff' },\r\n { id: 'pluto', name: 'Pluto', radius: 1188.3, mass: 1.303e22, semiMajorAxis: 39.48, orbitalPeriod: 90560, color: '#c9b79c' },\r\n];\r\n"],"names":[],"mappings":"AAoeO,SAAS,sBAAsB,YAA4B;AAChE,QAAM,gBAAgB;AACtB,QAAM,KAAK;AACX,QAAM,gBAAgB,gBAAgB;AACtC,QAAM,SAAS,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,eAAe,CAAC,IAAI,EAAE;AACtE,SAAO,SAAS;AAClB;AAKO,SAAS,wBAAwB,YAA4B;AAClE,QAAM,gBAAgB;AACtB,QAAM,KAAK;AACX,QAAM,SAAS,gBAAgB;AAC/B,SAAO,KAAK,KAAK,KAAK,MAAM;AAC9B;AAKO,SAAS,OAAO,IAAoB;AACzC,SAAO,KAAK;AACd;AAKO,SAAS,oBAAoB,MAA+B;AACjE,QAAM,aAAa,KAAK,YAAA,EAAc,KAAA;AACtC,QAAM,eAA2B;AAAA,IAC/B;AAAA,IAAO;AAAA,IAAW;AAAA,IAAS;AAAA,IAAS;AAAA,IACpC;AAAA,IAAQ;AAAA,IAAW;AAAA,IAAU;AAAA,IAAU;AAAA,IAAW;AAAA,EAAA;AAEpD,SAAO,aAAa,SAAS,UAAsB,IAC9C,aACD;AACN;AAKO,SAAS,UAAU,IAAsC;AAC9D,SAAO,QAAQ,KAAK,CAAA,MAAK,EAAE,OAAO,EAAE;AACtC;AAKO,MAAM,UAAwB;AAAA,EACnC,EAAE,IAAI,OAAO,MAAM,OAAO,QAAQ,QAAQ,MAAM,SAAU,eAAe,GAAG,eAAe,GAAG,OAAO,UAAA;AAAA,EACrG,EAAE,IAAI,WAAW,MAAM,WAAW,QAAQ,QAAQ,MAAM,UAAW,eAAe,OAAO,eAAe,IAAI,OAAO,UAAA;AAAA,EACnH,EAAE,IAAI,SAAS,MAAM,SAAS,QAAQ,QAAQ,MAAM,UAAW,eAAe,OAAO,eAAe,KAAK,OAAO,UAAA;AAAA,EAChH,EAAE,IAAI,SAAS,MAAM,SAAS,QAAQ,MAAM,MAAM,SAAU,eAAe,GAAK,eAAe,KAAK,OAAO,UAAA;AAAA,EAC3G,EAAE,IAAI,QAAQ,MAAM,QAAQ,QAAQ,QAAQ,MAAM,SAAU,eAAe,QAAS,eAAe,MAAM,OAAO,UAAA;AAAA,EAChH,EAAE,IAAI,QAAQ,MAAM,QAAQ,QAAQ,QAAQ,MAAM,UAAW,eAAe,OAAO,eAAe,KAAK,OAAO,UAAA;AAAA,EAC9G,EAAE,IAAI,WAAW,MAAM,WAAW,QAAQ,OAAO,MAAM,UAAW,eAAe,OAAO,eAAe,MAAM,OAAO,UAAA;AAAA,EACpH,EAAE,IAAI,UAAU,MAAM,UAAU,QAAQ,OAAO,MAAM,UAAW,eAAe,OAAO,eAAe,OAAO,OAAO,UAAA;AAAA,EACnH,EAAE,IAAI,UAAU,MAAM,UAAU,QAAQ,OAAO,MAAM,SAAW,eAAe,OAAO,eAAe,OAAO,OAAO,UAAA;AAAA,EACnH,EAAE,IAAI,WAAW,MAAM,WAAW,QAAQ,OAAO,MAAM,WAAY,eAAe,OAAO,eAAe,OAAO,OAAO,UAAA;AAAA,EACtH,EAAE,IAAI,SAAS,MAAM,SAAS,QAAQ,QAAQ,MAAM,SAAU,eAAe,OAAO,eAAe,OAAO,OAAO,UAAA;AACnH;"}
1
+ {"version":3,"file":"types.js","names":[],"sources":["../../src/react/types.ts"],"sourcesContent":["/**\n * @zendir/ui - Local Type Definitions\n *\n * UI-domain types (`Quaternion`, `Vector3D`, `PointingMode`, etc.) used by\n * the visualization components. These live in `@zendir/ui` because they\n * describe what the UI renders — they are NOT shipped by `zendir-ts`,\n * which is REST-only and intentionally minimal.\n *\n * Helpers like `estimateOrbitalPeriod` / `estimateOrbitalVelocity` are\n * pure client-side approximations used for quick UI estimates; for\n * physics-accurate values, fetch the real properties from the engine\n * via `client.getProperties(...)`.\n */\n\n// =============================================================================\n// Category / Group Primitive\n// =============================================================================\n\n/**\n * A named, colored data category — the SDK's shared concept for any secondary\n * grouping dimension (teams, squads, subsystems, mission phases, etc.).\n *\n * Components that support category-aware coloring accept `CategoryDef` arrays\n * and/or a `categoryId` field on individual data items. The `CategoryPalette`\n * utility resolves ids → colors/labels consistently across an entire dashboard.\n *\n * @example\n * const categories: CategoryDef[] = [\n * { id: 'alpha', label: 'Team Alpha', color: '#2dccff' },\n * { id: 'bravo', label: 'Team Bravo', color: '#fce83a' },\n * ];\n */\nexport interface CategoryDef {\n /** Stable unique identifier (string or numeric) */\n id: string | number;\n /** Human-readable display name */\n label: string;\n /** CSS color used for visual accents (stripes, rings, swatches, series lines) */\n color: string;\n /** Optional icon name from the Astro icon set */\n icon?: string;\n /** Arbitrary metadata for app-specific needs */\n meta?: Record<string, unknown>;\n}\n\n// =============================================================================\n// Spacecraft Types\n// =============================================================================\n\nexport interface SpacecraftPosition {\n /** Optional spacecraft id (when combined with Spacecraft) */\n id?: string;\n /** Optional display name */\n name?: string;\n /** Latitude in degrees (-90 to 90) */\n latitude: number;\n /** Longitude in degrees (-180 to 180) */\n longitude: number;\n /** Altitude in kilometers */\n altitude: number;\n /** Velocity in km/s */\n velocity?: number;\n /** Heading in degrees */\n heading?: number;\n /** Timestamp */\n timestamp?: string;\n /** Orbit type (e.g. LEO, GEO) */\n orbitType?: string;\n /** Orbital inclination in degrees */\n inclination?: number;\n /** Health/operational status using AstroUXDS 6-level system */\n status?: \"off\" | \"standby\" | \"normal\" | \"caution\" | \"serious\" | \"critical\";\n}\n\nexport interface Spacecraft {\n id: string;\n name: string;\n noradId?: number;\n type?: string;\n /** Status using AstroUXDS 6-level system */\n status?: \"off\" | \"standby\" | \"normal\" | \"caution\" | \"serious\" | \"critical\";\n}\n\n// =============================================================================\n// Ground Station Types\n// =============================================================================\n\nexport interface GroundStation {\n id: string;\n name: string;\n latitude: number;\n longitude: number;\n elevation?: number;\n /** Minimum elevation angle for visibility (degrees) */\n minElevation?: number;\n network?: string;\n}\n\nexport interface GroundTrackPoint {\n latitude: number;\n longitude: number;\n altitude: number;\n timestamp: string;\n}\n\n// =============================================================================\n// Layer Definition (shared by 2D map + 3D viewer panels)\n// =============================================================================\n\n/**\n * Developer-defined toggle in a Layers panel. The component that owns the\n * panel only renders the toggle UI — it does NOT render the layer's\n * content. The consumer app listens to the panel's `onChange` and\n * renders/hides its own overlay accordingly.\n *\n * Used by both `<GroundTrackMap />` (2D map overlays) and the upcoming\n * `<LayerControlPanel />` for the 3D viewer.\n */\nexport interface LayerDef {\n /** Unique identifier (e.g. 'heatmap', 'coverage', 'spacecraft'). */\n id: string;\n /** Display label in the Layers panel. */\n label: string;\n /** Whether the layer is on by default (default true). */\n defaultEnabled?: boolean;\n /** Optional grouping bucket for the panel ('overlays', 'objects', etc.). */\n category?: string;\n}\n\n/**\n * @deprecated Use `LayerDef`. Alias kept for backward compatibility with\n * existing `<GroundTrackMap />` consumers.\n */\nexport type MapLayerDef = LayerDef;\n\n// =============================================================================\n// Access / Contact Types\n// =============================================================================\n\nexport interface AccessData {\n stationId: string;\n stationName: string;\n spacecraftId: string;\n aos: string; // Acquisition of Signal - ISO timestamp\n los: string; // Loss of Signal - ISO timestamp\n maxElevation: number;\n azimuthAos?: number;\n azimuthLos?: number;\n /** Whether link is currently accessible */\n isAccessible?: boolean;\n /** Current elevation angle (degrees) */\n elevation?: number;\n /** Current azimuth (degrees) */\n azimuth?: number;\n /** Slant range in km */\n slantRange?: number;\n /** Signal strength 0-100 */\n signalStrength?: number;\n /** Link budget details */\n linkBudget?: {\n receivedPower?: number;\n snr?: number;\n dataRate?: number;\n };\n}\n\nexport interface AccessWindow {\n aos: string;\n los: string;\n maxElevation: number;\n stationId: string;\n /** Start time (ISO or ms) */\n startTime?: string | number;\n /** Duration in seconds */\n duration?: number;\n}\n\n// =============================================================================\n// Telemetry Types\n// =============================================================================\n\nexport interface TelemetryData {\n timestamp: string;\n subsystems: {\n power?: {\n status: string;\n batteryLevel?: number;\n solarArrayOutput?: number;\n voltage?: number;\n solarGeneration?: number;\n consumption?: number;\n };\n thermal?: {\n status: string;\n cpuTemp?: number;\n batteryTemp?: number;\n };\n comms?: {\n status: string;\n signalStrength?: number;\n dataRate?: number;\n downlinkRate?: number;\n transmitterStatus?: string;\n packetsQueued?: number;\n bytesTransmitted?: number;\n packetsTransmitted?: number;\n };\n attitude?: {\n status: string;\n pointingError?: number;\n eulerAngles?: EulerAngles;\n targetMode?: string;\n };\n };\n /** Health status (convenience alias / extended) */\n health?: {\n status?: string;\n anomalies?: Array<{ id: string; message: string; severity?: string }>;\n };\n /** Power (convenience alias for subsystems.power / extended) */\n power?: {\n status?: string;\n batteryLevel?: number;\n solarArrayOutput?: number;\n voltage?: number;\n solarGeneration?: number;\n consumption?: number;\n };\n /** Attitude (convenience alias / extended) */\n attitude?: {\n status?: string;\n eulerAngles?: EulerAngles;\n targetMode?: string;\n pointingError?: number;\n };\n /** Communications (convenience alias / extended) */\n communications?: {\n status?: string;\n signalStrength?: number;\n dataRate?: number;\n downlinkRate?: number;\n transmitterStatus?: string;\n packetsQueued?: number;\n bytesTransmitted?: number;\n packetsTransmitted?: number;\n };\n alerts?: Array<{\n id: string;\n severity: string;\n message: string;\n timestamp: string;\n }>;\n}\n\n// =============================================================================\n// Orbital Types\n// =============================================================================\n\nexport interface OrbitalElements {\n semiMajorAxis: number;\n eccentricity: number;\n inclination: number;\n raan: number; // Right Ascension of Ascending Node\n argumentOfPerigee: number;\n trueAnomaly: number;\n period?: number;\n epoch?: string;\n}\n\n// =============================================================================\n// Attitude Types\n// =============================================================================\n\nexport interface Quaternion {\n x: number;\n y: number;\n z: number;\n w: number;\n}\n\nexport interface EulerAngles {\n roll: number;\n pitch: number;\n yaw: number;\n}\n\nexport interface AngularVelocity {\n x: number;\n y: number;\n z: number;\n}\n\nexport interface AttitudeData {\n quaternion: Quaternion;\n eulerAngles: EulerAngles;\n angularVelocity: AngularVelocity;\n targetMode?: string;\n /** Pointing error in degrees */\n pointingError?: number;\n /** Target direction vector [x, y, z] */\n targetDirection?: [number, number, number];\n}\n\nexport type PointingMode = \"nadir\" | \"sun\" | \"target\" | \"inertial\" | \"velocity\";\n\n// =============================================================================\n// Eclipse Types\n// =============================================================================\n\nexport interface EclipseInfo {\n inEclipse: boolean;\n timeToEclipse: number; // seconds\n eclipseDuration: number; // seconds\n sunlightDuration: number; // seconds\n /** Umbra duration in seconds */\n umbraDuration?: number;\n /** Penumbra duration in seconds */\n penumbraDuration?: number;\n /** Seconds until sunlight (when in eclipse) */\n timeToSunlight?: number;\n}\n\n// =============================================================================\n// Link Budget Types\n// =============================================================================\n\nexport interface DetailedLinkBudget {\n spacecraftId: string;\n groundStationId: string;\n frequency: number;\n eirp: number;\n pathLoss: number;\n atmosphericLoss: number;\n receiverGain: number;\n systemNoiseTemp: number;\n cnoRequired: number;\n cnoActual: number;\n margin: number;\n dataRate: number;\n}\n\n// =============================================================================\n// Thermal Types\n// =============================================================================\n\nexport interface ThermalZone {\n id: string;\n name: string;\n temperature: number;\n minLimit: number;\n maxLimit: number;\n}\n\nexport interface ThermalData {\n timestamp: string;\n zones: ThermalZone[];\n averageTemp: number;\n hottest: { zone: string; temp: number };\n coldest: { zone: string; temp: number };\n}\n\n// =============================================================================\n// Propulsion Types\n// =============================================================================\n\nexport interface ThrusterStatus {\n id: string;\n name: string;\n status: \"ready\" | \"firing\" | \"disabled\" | \"error\";\n fuelFlow?: number;\n}\n\nexport interface PropulsionSummary {\n fuelRemaining: number;\n fuelCapacity: number;\n thrusterStatus: ThrusterStatus[];\n deltaVRemaining: number;\n deltaVUsed: number;\n lastManeuver?: string;\n}\n\n// =============================================================================\n// Reaction Wheel / Momentum Types\n// =============================================================================\n\nexport interface ReactionWheelData {\n /** Unique wheel identifier */\n id: string;\n /** Display name (e.g. \"RW-X\", \"RW-1\") */\n name: string;\n /** Mounted axis */\n axis: \"X\" | \"Y\" | \"Z\" | \"skew\";\n /** Current stored angular momentum in N·m·s */\n momentumNms: number;\n /** Maximum momentum capacity in N·m·s */\n maxMomentumNms: number;\n /** Current wheel speed in RPM */\n speedRpm: number;\n /** Maximum wheel speed in RPM */\n maxSpeedRpm: number;\n /** Operational status */\n status: \"nominal\" | \"saturated\" | \"desaturating\" | \"off\" | \"error\";\n /** Power consumption in Watts */\n powerW?: number;\n /** Bearing temperature in °C */\n temperatureC?: number;\n}\n\n/** LVLH (Local Vertical Local Horizontal) frame vector */\nexport interface LVLHVector {\n /** Radial component (local vertical, positive away from Earth) */\n radial: number;\n /** In-track component (along velocity vector) */\n inTrack: number;\n /** Cross-track component (normal to orbital plane) */\n crossTrack: number;\n}\n\n/** Time-stamped LVLH state for trajectory plotting */\nexport interface LVLHState {\n /** Timestamp in milliseconds */\n time: number;\n /** Position in LVLH frame (km) */\n position: LVLHVector;\n /** Velocity in LVLH frame (km/s) */\n velocity: LVLHVector;\n}\n\n/** Thruster firing event */\nexport interface ThrusterFireEvent {\n /** Event timestamp in milliseconds */\n time: number;\n /** Thruster ID */\n thrusterId: string;\n /** Display name */\n name: string;\n /** Delta-V magnitude in m/s */\n deltaVMs: number;\n /** Delta-V direction in LVLH frame (unit vector) */\n deltaVDirection?: LVLHVector;\n /** Burn duration in seconds */\n durationSeconds: number;\n /** Event type */\n type: \"impulsive\" | \"finite\" | \"continuous\";\n}\n\n// =============================================================================\n// Planet Types\n// =============================================================================\n\nexport type PlanetId =\n | \"sun\"\n | \"mercury\"\n | \"venus\"\n | \"earth\"\n | \"moon\"\n | \"mars\"\n | \"jupiter\"\n | \"saturn\"\n | \"uranus\"\n | \"neptune\"\n | \"pluto\";\n\nexport interface PlanetInfo {\n id: PlanetId;\n name: string;\n radius: number; // km\n /** @deprecated Use radius */\n radiusKm?: number;\n mass: number; // kg\n semiMajorAxis: number; // AU\n /** Distance from Sun in AU (alias for semiMajorAxis) */\n distanceFromSunAU?: number;\n orbitalPeriod: number; // Earth days\n color: string;\n}\n\n// =============================================================================\n// Utility Functions (fallbacks when SDK not available)\n// =============================================================================\n\n/**\n * Estimate orbital period from altitude (simplified)\n */\nexport function estimateOrbitalPeriod(altitudeKm: number): number {\n const earthRadiusKm = 6371;\n const mu = 398600.4418; // km³/s² - Earth's gravitational parameter\n const semiMajorAxis = earthRadiusKm + altitudeKm;\n const period = 2 * Math.PI * Math.sqrt(Math.pow(semiMajorAxis, 3) / mu);\n return period / 60; // Return in minutes\n}\n\n/**\n * Estimate orbital velocity from altitude (simplified)\n */\nexport function estimateOrbitalVelocity(altitudeKm: number): number {\n const earthRadiusKm = 6371;\n const mu = 398600.4418; // km³/s²\n const radius = earthRadiusKm + altitudeKm;\n return Math.sqrt(mu / radius); // km/s\n}\n\n/**\n * Convert AU to kilometers\n */\nexport function auToKm(au: number): number {\n return au * 149597870.7;\n}\n\n/**\n * Normalize planet name to PlanetId\n */\nexport function normalizePlanetName(name: string): PlanetId | null {\n const normalized = name.toLowerCase().trim();\n const validPlanets: PlanetId[] = [\n \"sun\",\n \"mercury\",\n \"venus\",\n \"earth\",\n \"moon\",\n \"mars\",\n \"jupiter\",\n \"saturn\",\n \"uranus\",\n \"neptune\",\n \"pluto\",\n ];\n return validPlanets.includes(normalized as PlanetId)\n ? (normalized as PlanetId)\n : null;\n}\n\n/**\n * Get planet info by ID\n */\nexport function getPlanet(id: PlanetId): PlanetInfo | undefined {\n return PLANETS.find((p) => p.id === id);\n}\n\n/**\n * Planet data (simplified)\n */\nexport const PLANETS: PlanetInfo[] = [\n {\n id: \"sun\",\n name: \"Sun\",\n radius: 696340,\n mass: 1.989e30,\n semiMajorAxis: 0,\n orbitalPeriod: 0,\n color: \"#ffcc00\",\n },\n {\n id: \"mercury\",\n name: \"Mercury\",\n radius: 2439.7,\n mass: 3.3011e23,\n semiMajorAxis: 0.387,\n orbitalPeriod: 88,\n color: \"#b5b5b5\",\n },\n {\n id: \"venus\",\n name: \"Venus\",\n radius: 6051.8,\n mass: 4.8675e24,\n semiMajorAxis: 0.723,\n orbitalPeriod: 225,\n color: \"#e6c87a\",\n },\n {\n id: \"earth\",\n name: \"Earth\",\n radius: 6371,\n mass: 5.972e24,\n semiMajorAxis: 1.0,\n orbitalPeriod: 365,\n color: \"#4da6ff\",\n },\n {\n id: \"moon\",\n name: \"Moon\",\n radius: 1737.4,\n mass: 7.342e22,\n semiMajorAxis: 0.00257,\n orbitalPeriod: 27.3,\n color: \"#c0c0c0\",\n },\n {\n id: \"mars\",\n name: \"Mars\",\n radius: 3389.5,\n mass: 6.4171e23,\n semiMajorAxis: 1.524,\n orbitalPeriod: 687,\n color: \"#e07b4a\",\n },\n {\n id: \"jupiter\",\n name: \"Jupiter\",\n radius: 69911,\n mass: 1.8982e27,\n semiMajorAxis: 5.203,\n orbitalPeriod: 4333,\n color: \"#d8ca9d\",\n },\n {\n id: \"saturn\",\n name: \"Saturn\",\n radius: 58232,\n mass: 5.6834e26,\n semiMajorAxis: 9.537,\n orbitalPeriod: 10759,\n color: \"#f4d59e\",\n },\n {\n id: \"uranus\",\n name: \"Uranus\",\n radius: 25362,\n mass: 8.681e25,\n semiMajorAxis: 19.19,\n orbitalPeriod: 30687,\n color: \"#b3e0e6\",\n },\n {\n id: \"neptune\",\n name: \"Neptune\",\n radius: 24622,\n mass: 1.02413e26,\n semiMajorAxis: 30.07,\n orbitalPeriod: 60190,\n color: \"#5b7fff\",\n },\n {\n id: \"pluto\",\n name: \"Pluto\",\n radius: 1188.3,\n mass: 1.303e22,\n semiMajorAxis: 39.48,\n orbitalPeriod: 90560,\n color: \"#c9b79c\",\n },\n];\n"],"mappings":";;;;AAoeA,SAAgB,sBAAsB,YAA4B;CAChE,MAAM,gBAAgB;CACtB,MAAM,KAAK;CACX,MAAM,gBAAgB,gBAAgB;CAEtC,OADe,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,eAAe,CAAC,IAAI,EAAE,IACtD;AAClB;;;;AAKA,SAAgB,wBAAwB,YAA4B;CAClE,MAAM,gBAAgB;CACtB,MAAM,KAAK;CACX,MAAM,SAAS,gBAAgB;CAC/B,OAAO,KAAK,KAAK,KAAK,MAAM;AAC9B;;;;AAKA,SAAgB,OAAO,IAAoB;CACzC,OAAO,KAAK;AACd;;;;AAKA,SAAgB,oBAAoB,MAA+B;CACjE,MAAM,aAAa,KAAK,YAAY,CAAC,CAAC,KAAK;CAc3C,OAAO;EAZL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CAEK,CAAA,CAAa,SAAS,UAAsB,IAC9C,aACD;AACN;;;;AAKA,SAAgB,UAAU,IAAsC;CAC9D,OAAO,QAAQ,MAAM,MAAM,EAAE,OAAO,EAAE;AACxC;;;;AAKA,IAAa,UAAwB;CACnC;EACE,IAAI;EACJ,MAAM;EACN,QAAQ;EACR,MAAM;EACN,eAAe;EACf,eAAe;EACf,OAAO;CACT;CACA;EACE,IAAI;EACJ,MAAM;EACN,QAAQ;EACR,MAAM;EACN,eAAe;EACf,eAAe;EACf,OAAO;CACT;CACA;EACE,IAAI;EACJ,MAAM;EACN,QAAQ;EACR,MAAM;EACN,eAAe;EACf,eAAe;EACf,OAAO;CACT;CACA;EACE,IAAI;EACJ,MAAM;EACN,QAAQ;EACR,MAAM;EACN,eAAe;EACf,eAAe;EACf,OAAO;CACT;CACA;EACE,IAAI;EACJ,MAAM;EACN,QAAQ;EACR,MAAM;EACN,eAAe;EACf,eAAe;EACf,OAAO;CACT;CACA;EACE,IAAI;EACJ,MAAM;EACN,QAAQ;EACR,MAAM;EACN,eAAe;EACf,eAAe;EACf,OAAO;CACT;CACA;EACE,IAAI;EACJ,MAAM;EACN,QAAQ;EACR,MAAM;EACN,eAAe;EACf,eAAe;EACf,OAAO;CACT;CACA;EACE,IAAI;EACJ,MAAM;EACN,QAAQ;EACR,MAAM;EACN,eAAe;EACf,eAAe;EACf,OAAO;CACT;CACA;EACE,IAAI;EACJ,MAAM;EACN,QAAQ;EACR,MAAM;EACN,eAAe;EACf,eAAe;EACf,OAAO;CACT;CACA;EACE,IAAI;EACJ,MAAM;EACN,QAAQ;EACR,MAAM;EACN,eAAe;EACf,eAAe;EACf,OAAO;CACT;CACA;EACE,IAAI;EACJ,MAAM;EACN,QAAQ;EACR,MAAM;EACN,eAAe;EACf,eAAe;EACf,OAAO;CACT;AACF"}
@@ -1,5 +1,4 @@
1
1
  import { CategoryDef } from '../types';
2
-
3
2
  export declare class CategoryPalette {
4
3
  /** Registered categories (insertion order) */
5
4
  private readonly _defs;
@@ -1,104 +1,93 @@
1
- var __defProp = Object.defineProperty;
2
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
- var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
4
- const DEFAULT_FALLBACK_PALETTE = [
5
- "#3E3CFF",
6
- // Zendir Electric
7
- "#9D70FF",
8
- // Zendir Purple
9
- "#6B69FF",
10
- // Electric 20 % lighter
11
- "#B48DFF",
12
- // Purple 20 % lighter
13
- "#3548C0",
14
- // Prussian Blue lighter
15
- "#9997FF",
16
- // Electric 35 % lighter
17
- "#C9A8FF",
18
- // Purple 35 % lighter
19
- "#1B2DA0",
20
- // Prussian Blue
21
- "#3230CC",
22
- // Electric 20 % darker
23
- "#7E5ACC",
24
- // Purple 20 % darker
25
- "#4A5FD6"
26
- // Prussian Blue lightest
1
+ //#region src/react/utils/categoryPalette.ts
2
+ /**
3
+ * Default fallback palette Astro-compliant data-viz colors.
4
+ * Used when a category has no explicit color or when an unknown id is
5
+ * encountered at runtime (auto-assignment by insertion order).
6
+ */
7
+ var DEFAULT_FALLBACK_PALETTE = [
8
+ "#3E3CFF",
9
+ "#9D70FF",
10
+ "#6B69FF",
11
+ "#B48DFF",
12
+ "#3548C0",
13
+ "#9997FF",
14
+ "#C9A8FF",
15
+ "#1B2DA0",
16
+ "#3230CC",
17
+ "#7E5ACC",
18
+ "#4A5FD6"
27
19
  ];
28
- class CategoryPalette {
29
- /**
30
- * @param categories - Initial category definitions (id, label, color).
31
- * @param fallbackPalette - Optional custom palette for auto-assigned unknowns.
32
- * Defaults to the Astro UXDS–compliant Zendir data-viz palette.
33
- */
34
- constructor(categories = [], fallbackPalette) {
35
- /** Registered categories (insertion order) */
36
- __publicField(this, "_defs");
37
- /** Auto-assigned colors for ids not in the initial set */
38
- __publicField(this, "_autoColors");
39
- /** Fallback palette used for auto-assignment */
40
- __publicField(this, "_fallback");
41
- /** Counter for round-robin auto-assignment */
42
- __publicField(this, "_autoIndex");
43
- this._defs = /* @__PURE__ */ new Map();
44
- this._autoColors = /* @__PURE__ */ new Map();
45
- this._fallback = fallbackPalette ?? DEFAULT_FALLBACK_PALETTE;
46
- this._autoIndex = 0;
47
- for (const cat of categories) {
48
- this._defs.set(String(cat.id), cat);
49
- }
50
- }
51
- /** All registered categories (in insertion order). */
52
- get all() {
53
- return [...this._defs.values()];
54
- }
55
- /** Number of registered categories. */
56
- get size() {
57
- return this._defs.size;
58
- }
59
- /** Returns the full definition for a registered id, or `undefined`. */
60
- getCategory(id) {
61
- return this._defs.get(String(id));
62
- }
63
- /** Returns `true` if the id was registered in the constructor. */
64
- has(id) {
65
- return this._defs.has(String(id));
66
- }
67
- /**
68
- * Resolve a color for any id.
69
- * - Registered ids their explicit `color`.
70
- * - Unknown ids → stable auto-assigned color from the fallback palette
71
- * (same id always gets the same color within this palette instance).
72
- */
73
- getColor(id) {
74
- const key = String(id);
75
- const def = this._defs.get(key);
76
- if (def) return def.color;
77
- let auto = this._autoColors.get(key);
78
- if (!auto) {
79
- auto = this._fallback[this._autoIndex % this._fallback.length];
80
- this._autoColors.set(key, auto);
81
- this._autoIndex++;
82
- }
83
- return auto;
84
- }
85
- /**
86
- * Resolve a label for any id.
87
- * Registered ids → their `label`; unknown ids → the stringified id.
88
- */
89
- getLabel(id) {
90
- var _a;
91
- return ((_a = this._defs.get(String(id))) == null ? void 0 : _a.label) ?? String(id);
92
- }
93
- /**
94
- * Convert a `CategoryDef` array to a palette instance.
95
- * Convenience factory — identical to `new CategoryPalette(defs)`.
96
- */
97
- static from(defs, fallbackPalette) {
98
- return new CategoryPalette(defs, fallbackPalette);
99
- }
100
- }
101
- export {
102
- CategoryPalette
20
+ var CategoryPalette = class CategoryPalette {
21
+ /** Registered categories (insertion order) */
22
+ _defs;
23
+ /** Auto-assigned colors for ids not in the initial set */
24
+ _autoColors;
25
+ /** Fallback palette used for auto-assignment */
26
+ _fallback;
27
+ /** Counter for round-robin auto-assignment */
28
+ _autoIndex;
29
+ /**
30
+ * @param categories - Initial category definitions (id, label, color).
31
+ * @param fallbackPalette - Optional custom palette for auto-assigned unknowns.
32
+ * Defaults to the Astro UXDS–compliant Zendir data-viz palette.
33
+ */
34
+ constructor(categories = [], fallbackPalette) {
35
+ this._defs = /* @__PURE__ */ new Map();
36
+ this._autoColors = /* @__PURE__ */ new Map();
37
+ this._fallback = fallbackPalette ?? DEFAULT_FALLBACK_PALETTE;
38
+ this._autoIndex = 0;
39
+ for (const cat of categories) this._defs.set(String(cat.id), cat);
40
+ }
41
+ /** All registered categories (in insertion order). */
42
+ get all() {
43
+ return [...this._defs.values()];
44
+ }
45
+ /** Number of registered categories. */
46
+ get size() {
47
+ return this._defs.size;
48
+ }
49
+ /** Returns the full definition for a registered id, or `undefined`. */
50
+ getCategory(id) {
51
+ return this._defs.get(String(id));
52
+ }
53
+ /** Returns `true` if the id was registered in the constructor. */
54
+ has(id) {
55
+ return this._defs.has(String(id));
56
+ }
57
+ /**
58
+ * Resolve a color for any id.
59
+ * - Registered ids → their explicit `color`.
60
+ * - Unknown ids → stable auto-assigned color from the fallback palette
61
+ * (same id always gets the same color within this palette instance).
62
+ */
63
+ getColor(id) {
64
+ const key = String(id);
65
+ const def = this._defs.get(key);
66
+ if (def) return def.color;
67
+ let auto = this._autoColors.get(key);
68
+ if (!auto) {
69
+ auto = this._fallback[this._autoIndex % this._fallback.length];
70
+ this._autoColors.set(key, auto);
71
+ this._autoIndex++;
72
+ }
73
+ return auto;
74
+ }
75
+ /**
76
+ * Resolve a label for any id.
77
+ * Registered ids → their `label`; unknown ids → the stringified id.
78
+ */
79
+ getLabel(id) {
80
+ return this._defs.get(String(id))?.label ?? String(id);
81
+ }
82
+ /**
83
+ * Convert a `CategoryDef` array to a palette instance.
84
+ * Convenience factory — identical to `new CategoryPalette(defs)`.
85
+ */
86
+ static from(defs, fallbackPalette) {
87
+ return new CategoryPalette(defs, fallbackPalette);
88
+ }
103
89
  };
104
- //# sourceMappingURL=categoryPalette.js.map
90
+ //#endregion
91
+ export { CategoryPalette };
92
+
93
+ //# sourceMappingURL=categoryPalette.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"categoryPalette.js","sources":["../../../src/react/utils/categoryPalette.ts"],"sourcesContent":["/**\r\n * @zendir/ui — CategoryPalette\r\n *\r\n * A lightweight utility that maps category ids to stable colors and labels.\r\n * Designed for dashboards where multiple components (Timeline, Map, Charts,\r\n * DataTable) should share a consistent visual identity for the same\r\n * grouping dimension — teams, squads, subsystems, mission phases, etc.\r\n *\r\n * @example\r\n * ```ts\r\n * import { CategoryPalette } from '@zendir/ui';\r\n *\r\n * const palette = new CategoryPalette([\r\n * { id: 'alpha', label: 'Team Alpha', color: '#2dccff' },\r\n * { id: 'bravo', label: 'Team Bravo', color: '#fce83a' },\r\n * ]);\r\n *\r\n * palette.getColor('alpha'); // '#2dccff'\r\n * palette.getLabel('alpha'); // 'Team Alpha'\r\n * palette.getColor('unknown-id'); // auto-assigned from fallback palette\r\n * ```\r\n */\r\n\r\nimport type { CategoryDef } from '../types';\r\n\r\n/**\r\n * Default fallback palette — Astro-compliant data-viz colors.\r\n * Used when a category has no explicit color or when an unknown id is\r\n * encountered at runtime (auto-assignment by insertion order).\r\n */\r\nconst DEFAULT_FALLBACK_PALETTE: readonly string[] = [\r\n '#3E3CFF', // Zendir Electric\r\n '#9D70FF', // Zendir Purple\r\n '#6B69FF', // Electric 20 % lighter\r\n '#B48DFF', // Purple 20 % lighter\r\n '#3548C0', // Prussian Blue lighter\r\n '#9997FF', // Electric 35 % lighter\r\n '#C9A8FF', // Purple 35 % lighter\r\n '#1B2DA0', // Prussian Blue\r\n '#3230CC', // Electric 20 % darker\r\n '#7E5ACC', // Purple 20 % darker\r\n '#4A5FD6', // Prussian Blue lightest\r\n];\r\n\r\nexport class CategoryPalette {\r\n /** Registered categories (insertion order) */\r\n private readonly _defs: Map<string, CategoryDef>;\r\n /** Auto-assigned colors for ids not in the initial set */\r\n private readonly _autoColors: Map<string, string>;\r\n /** Fallback palette used for auto-assignment */\r\n private readonly _fallback: readonly string[];\r\n /** Counter for round-robin auto-assignment */\r\n private _autoIndex: number;\r\n\r\n /**\r\n * @param categories - Initial category definitions (id, label, color).\r\n * @param fallbackPalette - Optional custom palette for auto-assigned unknowns.\r\n * Defaults to the Astro UXDS–compliant Zendir data-viz palette.\r\n */\r\n constructor(\r\n categories: CategoryDef[] = [],\r\n fallbackPalette?: string[],\r\n ) {\r\n this._defs = new Map();\r\n this._autoColors = new Map();\r\n this._fallback = fallbackPalette ?? DEFAULT_FALLBACK_PALETTE;\r\n this._autoIndex = 0;\r\n\r\n for (const cat of categories) {\r\n this._defs.set(String(cat.id), cat);\r\n }\r\n }\r\n\r\n /** All registered categories (in insertion order). */\r\n get all(): CategoryDef[] {\r\n return [...this._defs.values()];\r\n }\r\n\r\n /** Number of registered categories. */\r\n get size(): number {\r\n return this._defs.size;\r\n }\r\n\r\n /** Returns the full definition for a registered id, or `undefined`. */\r\n getCategory(id: string | number): CategoryDef | undefined {\r\n return this._defs.get(String(id));\r\n }\r\n\r\n /** Returns `true` if the id was registered in the constructor. */\r\n has(id: string | number): boolean {\r\n return this._defs.has(String(id));\r\n }\r\n\r\n /**\r\n * Resolve a color for any id.\r\n * - Registered ids → their explicit `color`.\r\n * - Unknown ids → stable auto-assigned color from the fallback palette\r\n * (same id always gets the same color within this palette instance).\r\n */\r\n getColor(id: string | number): string {\r\n const key = String(id);\r\n const def = this._defs.get(key);\r\n if (def) return def.color;\r\n\r\n let auto = this._autoColors.get(key);\r\n if (!auto) {\r\n auto = this._fallback[this._autoIndex % this._fallback.length];\r\n this._autoColors.set(key, auto);\r\n this._autoIndex++;\r\n }\r\n return auto;\r\n }\r\n\r\n /**\r\n * Resolve a label for any id.\r\n * Registered ids → their `label`; unknown ids → the stringified id.\r\n */\r\n getLabel(id: string | number): string {\r\n return this._defs.get(String(id))?.label ?? String(id);\r\n }\r\n\r\n /**\r\n * Convert a `CategoryDef` array to a palette instance.\r\n * Convenience factory — identical to `new CategoryPalette(defs)`.\r\n */\r\n static from(defs: CategoryDef[], fallbackPalette?: string[]): CategoryPalette {\r\n return new CategoryPalette(defs, fallbackPalette);\r\n }\r\n}\r\n"],"names":[],"mappings":";;;AA8BA,MAAM,2BAA8C;AAAA,EAClD;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AACF;AAEO,MAAM,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAe3B,YACE,aAA4B,CAAA,GAC5B,iBACA;AAhBe;AAAA;AAEA;AAAA;AAEA;AAAA;AAET;AAAA;AAWN,SAAK,4BAAY,IAAA;AACjB,SAAK,kCAAkB,IAAA;AACvB,SAAK,YAAY,mBAAmB;AACpC,SAAK,aAAa;AAElB,eAAW,OAAO,YAAY;AAC5B,WAAK,MAAM,IAAI,OAAO,IAAI,EAAE,GAAG,GAAG;AAAA,IACpC;AAAA,EACF;AAAA;AAAA,EAGA,IAAI,MAAqB;AACvB,WAAO,CAAC,GAAG,KAAK,MAAM,QAAQ;AAAA,EAChC;AAAA;AAAA,EAGA,IAAI,OAAe;AACjB,WAAO,KAAK,MAAM;AAAA,EACpB;AAAA;AAAA,EAGA,YAAY,IAA8C;AACxD,WAAO,KAAK,MAAM,IAAI,OAAO,EAAE,CAAC;AAAA,EAClC;AAAA;AAAA,EAGA,IAAI,IAA8B;AAChC,WAAO,KAAK,MAAM,IAAI,OAAO,EAAE,CAAC;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,SAAS,IAA6B;AACpC,UAAM,MAAM,OAAO,EAAE;AACrB,UAAM,MAAM,KAAK,MAAM,IAAI,GAAG;AAC9B,QAAI,YAAY,IAAI;AAEpB,QAAI,OAAO,KAAK,YAAY,IAAI,GAAG;AACnC,QAAI,CAAC,MAAM;AACT,aAAO,KAAK,UAAU,KAAK,aAAa,KAAK,UAAU,MAAM;AAC7D,WAAK,YAAY,IAAI,KAAK,IAAI;AAC9B,WAAK;AAAA,IACP;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAS,IAA6B;AAvFxC;AAwFI,aAAO,UAAK,MAAM,IAAI,OAAO,EAAE,CAAC,MAAzB,mBAA4B,UAAS,OAAO,EAAE;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,KAAK,MAAqB,iBAA6C;AAC5E,WAAO,IAAI,gBAAgB,MAAM,eAAe;AAAA,EAClD;AACF;"}
1
+ {"version":3,"file":"categoryPalette.js","names":[],"sources":["../../../src/react/utils/categoryPalette.ts"],"sourcesContent":["/**\n * @zendir/ui — CategoryPalette\n *\n * A lightweight utility that maps category ids to stable colors and labels.\n * Designed for dashboards where multiple components (Timeline, Map, Charts,\n * DataTable) should share a consistent visual identity for the same\n * grouping dimension — teams, squads, subsystems, mission phases, etc.\n *\n * @example\n * ```ts\n * import { CategoryPalette } from '@zendir/ui';\n *\n * const palette = new CategoryPalette([\n * { id: 'alpha', label: 'Team Alpha', color: '#2dccff' },\n * { id: 'bravo', label: 'Team Bravo', color: '#fce83a' },\n * ]);\n *\n * palette.getColor('alpha'); // '#2dccff'\n * palette.getLabel('alpha'); // 'Team Alpha'\n * palette.getColor('unknown-id'); // auto-assigned from fallback palette\n * ```\n */\n\nimport type { CategoryDef } from \"../types\";\n\n/**\n * Default fallback palette — Astro-compliant data-viz colors.\n * Used when a category has no explicit color or when an unknown id is\n * encountered at runtime (auto-assignment by insertion order).\n */\nconst DEFAULT_FALLBACK_PALETTE: readonly string[] = [\n \"#3E3CFF\", // Zendir Electric\n \"#9D70FF\", // Zendir Purple\n \"#6B69FF\", // Electric 20 % lighter\n \"#B48DFF\", // Purple 20 % lighter\n \"#3548C0\", // Prussian Blue lighter\n \"#9997FF\", // Electric 35 % lighter\n \"#C9A8FF\", // Purple 35 % lighter\n \"#1B2DA0\", // Prussian Blue\n \"#3230CC\", // Electric 20 % darker\n \"#7E5ACC\", // Purple 20 % darker\n \"#4A5FD6\", // Prussian Blue lightest\n];\n\nexport class CategoryPalette {\n /** Registered categories (insertion order) */\n private readonly _defs: Map<string, CategoryDef>;\n /** Auto-assigned colors for ids not in the initial set */\n private readonly _autoColors: Map<string, string>;\n /** Fallback palette used for auto-assignment */\n private readonly _fallback: readonly string[];\n /** Counter for round-robin auto-assignment */\n private _autoIndex: number;\n\n /**\n * @param categories - Initial category definitions (id, label, color).\n * @param fallbackPalette - Optional custom palette for auto-assigned unknowns.\n * Defaults to the Astro UXDS–compliant Zendir data-viz palette.\n */\n constructor(categories: CategoryDef[] = [], fallbackPalette?: string[]) {\n this._defs = new Map();\n this._autoColors = new Map();\n this._fallback = fallbackPalette ?? DEFAULT_FALLBACK_PALETTE;\n this._autoIndex = 0;\n\n for (const cat of categories) {\n this._defs.set(String(cat.id), cat);\n }\n }\n\n /** All registered categories (in insertion order). */\n get all(): CategoryDef[] {\n return [...this._defs.values()];\n }\n\n /** Number of registered categories. */\n get size(): number {\n return this._defs.size;\n }\n\n /** Returns the full definition for a registered id, or `undefined`. */\n getCategory(id: string | number): CategoryDef | undefined {\n return this._defs.get(String(id));\n }\n\n /** Returns `true` if the id was registered in the constructor. */\n has(id: string | number): boolean {\n return this._defs.has(String(id));\n }\n\n /**\n * Resolve a color for any id.\n * - Registered ids → their explicit `color`.\n * - Unknown ids → stable auto-assigned color from the fallback palette\n * (same id always gets the same color within this palette instance).\n */\n getColor(id: string | number): string {\n const key = String(id);\n const def = this._defs.get(key);\n if (def) return def.color;\n\n let auto = this._autoColors.get(key);\n if (!auto) {\n auto = this._fallback[this._autoIndex % this._fallback.length];\n this._autoColors.set(key, auto);\n this._autoIndex++;\n }\n return auto;\n }\n\n /**\n * Resolve a label for any id.\n * Registered ids → their `label`; unknown ids → the stringified id.\n */\n getLabel(id: string | number): string {\n return this._defs.get(String(id))?.label ?? String(id);\n }\n\n /**\n * Convert a `CategoryDef` array to a palette instance.\n * Convenience factory — identical to `new CategoryPalette(defs)`.\n */\n static from(\n defs: CategoryDef[],\n fallbackPalette?: string[],\n ): CategoryPalette {\n return new CategoryPalette(defs, fallbackPalette);\n }\n}\n"],"mappings":";;;;;;AA8BA,IAAM,2BAA8C;CAClD;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAEA,IAAa,kBAAb,MAAa,gBAAgB;;CAE3B;;CAEA;;CAEA;;CAEA;;;;;;CAOA,YAAY,aAA4B,CAAC,GAAG,iBAA4B;EACtE,KAAK,wBAAQ,IAAI,IAAI;EACrB,KAAK,8BAAc,IAAI,IAAI;EAC3B,KAAK,YAAY,mBAAmB;EACpC,KAAK,aAAa;EAElB,KAAK,MAAM,OAAO,YAChB,KAAK,MAAM,IAAI,OAAO,IAAI,EAAE,GAAG,GAAG;CAEtC;;CAGA,IAAI,MAAqB;EACvB,OAAO,CAAC,GAAG,KAAK,MAAM,OAAO,CAAC;CAChC;;CAGA,IAAI,OAAe;EACjB,OAAO,KAAK,MAAM;CACpB;;CAGA,YAAY,IAA8C;EACxD,OAAO,KAAK,MAAM,IAAI,OAAO,EAAE,CAAC;CAClC;;CAGA,IAAI,IAA8B;EAChC,OAAO,KAAK,MAAM,IAAI,OAAO,EAAE,CAAC;CAClC;;;;;;;CAQA,SAAS,IAA6B;EACpC,MAAM,MAAM,OAAO,EAAE;EACrB,MAAM,MAAM,KAAK,MAAM,IAAI,GAAG;EAC9B,IAAI,KAAK,OAAO,IAAI;EAEpB,IAAI,OAAO,KAAK,YAAY,IAAI,GAAG;EACnC,IAAI,CAAC,MAAM;GACT,OAAO,KAAK,UAAU,KAAK,aAAa,KAAK,UAAU;GACvD,KAAK,YAAY,IAAI,KAAK,IAAI;GAC9B,KAAK;EACP;EACA,OAAO;CACT;;;;;CAMA,SAAS,IAA6B;EACpC,OAAO,KAAK,MAAM,IAAI,OAAO,EAAE,CAAC,CAAC,EAAE,SAAS,OAAO,EAAE;CACvD;;;;;CAMA,OAAO,KACL,MACA,iBACiB;EACjB,OAAO,IAAI,gBAAgB,MAAM,eAAe;CAClD;AACF"}