@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
package/CHANGELOG.md CHANGED
@@ -1,386 +1,419 @@
1
- # @zendir/ui
2
-
3
- ## 0.5.0
4
-
5
- ### Minor Changes
6
-
7
- - Add a `stat` variant to `DataValue` for compact top-bar telemetry chips
8
- (value over a small uppercase label, status-tinted).
9
- - Refresh `SideNav` styling and layout.
10
-
11
- ### Patch Changes
12
-
13
- - Harden Popover first-open positioning: seed the panel's position state as
14
- `fixed` and gate visibility on a `positioned` flag that resets on close, so
15
- neither the first open nor any reopen flashes at stale coordinates.
16
-
17
- ## 0.4.1
18
-
19
- ### Patch Changes
20
-
21
- - Fix Popover first-open positioning flash: panel now renders with
22
- `visibility: hidden` until the initial `requestAnimationFrame` resolves
23
- real coordinates, preventing the one-frame misposition on first open.
24
-
25
- ## 0.4.0
26
-
27
- ### Minor Changes
28
-
29
- - Add `ImageFrame` widget: renders a single-channel sensor/CCD data frame
30
- (`number[]` of samples) as a false-colour image on a canvas, with
31
- fixed-ceiling normalisation, `cividis`/`gray` colormaps, an optional raw
32
- value grid, and loading/empty states. Purely presentational — callers
33
- pass the frame data in. Also exports the pure `decodeImage` helper.
34
-
35
- ### Patch Changes
36
-
37
- - Scope the Dialog focus trap to the open transition so typing in a dialog
38
- input isn't interrupted when the surrounding parent re-renders.
39
-
40
- ## 0.3.0
41
-
42
- **Upgrade from npm:** The latest public release on the registry is
43
- [0.2.21](https://www.npmjs.com/package/@zendir/ui). This **0.3.0** release
44
- is the next version on npm and combines the hook / 3D integration work
45
- with the token / `react/core/` architecture pass below.
46
-
47
- This release reframes the React hook layer around a single, well-defined
48
- bridge from `zendir-ts` to the live `<ZenSpace3D />` surface, and
49
- replaces three legacy SDK-coupled hooks with smaller, REST-aligned
50
- primitives. The Cesium backend gains proper sub-satellite ground-track
51
- alignment, and the `ZenSpace3DUtils` helper module is slimmed to only
52
- what the live backends actually consume. It also eliminates token drift
53
- hazards by consolidating literals, auto-generating `tokens.css`, and
54
- reorganising `react/core/` into thematic subfolders.
55
-
56
- ### Features
57
-
58
- - **`useSimulationScene`** — primary integration hook
59
- (`@zendir/ui/react/hooks` and `@zendir/ui/react/3d`). Bridges a
60
- `zendir-ts` `ZendirClient` to `ZenSpace3D` props: fetches
61
- `GetSimulationStructure` once, buckets spacecraft / ground stations /
62
- planets, and polls `Position_BN_N` / `Velocity_BN_N` on a configurable
63
- interval (default 2 s). Exports `SimulationSceneClient`,
64
- `SimulationSceneObject`, `StructureDiag`, `PositionTickDiag`, and
65
- `UseSimulationSceneResult` for typed app integration.
66
- - **Operator 3D surface** the hook is intended to drive a full-screen
67
- `ZenSpace3D` in host apps (e.g. `space-range-operator`
68
- `/admin/3d/:containerId/:simulationId`). Feed
69
- `useSimulationScene` with `containerId`, `simulationId`, and the
70
- session `client`.
71
- - **`ZenSpace3DProps.referenceTime`** new `Date` prop used by the
72
- Cesium backend to convert ECI/J2000 positions into the Earth-Fixed
73
- (ECEF) frame Cesium renders. Passing the simulation clock (sim epoch
74
- + sim seconds) lines the sub-satellite point on Earth up with the
75
- true ground track; omitting it falls back to wall-clock time and the
76
- ground track will drift.
77
- - **Top-level re-exports** `ZenSpace3D`, `useSimulationScene`, and
78
- their types are now available from the main `@zendir/ui/react`
79
- entry in addition to the `react/3d` and `react/hooks` subpaths.
80
-
81
- ### Breaking Changes
82
-
83
- - **Removed legacy SDK hooks**: `useTelemetry`, `useSpacecraftPosition`,
84
- and `useSimulationTime` no longer exist. Their
85
- responsibilities are covered by `useSimulationScene` (live position /
86
- velocity bucketed onto scene objects) and by the `referenceDate` /
87
- `positionTickDiag` fields on its result.
88
- - **`useAccessWindows` is now pure client-side math**. The Zendir REST
89
- API does not expose a server-side access-prediction endpoint, so the
90
- hook no longer attempts to load `zendir-ts` or fetch passes. It now
91
- accepts a `windows: AccessPass[]` input (compute these with your own
92
- propagator / SGP4 / demo data) and returns `TimerConfig` objects for
93
- `<MissionClock />`. Removed options: `spacecraftId`, `groundStationId`,
94
- `passCount`. Removed result fields: `isConnected`, `isSdkAvailable`,
95
- `error`. The `manualWindows` option is kept as a deprecated alias
96
- for `windows` for one minor.
97
- - **Renames in `useAccessWindows`**: the `AccessWindow` type is now
98
- `AccessPass`, and `createDemoAccessWindows` is now
99
- `createDemoAccessPasses`. Update imports accordingly.
100
- - **`ZenSpace3DUtils` pruned to the live surface**. Unused helpers were
101
- removed: `cartesianToLatLonAlt`, `cartesianToSpherical`,
102
- `sphericalToCartesian`, `eciToEcef`, `calculateGMST`,
103
- `dateToJulianDate`, `parseTLE`, `propagateSGP4Simple`,
104
- `propagateSatellite`, `generateOrbitPath`, `isVisible`,
105
- `calculateVisibilityConeGeometry`, `calculateFootprint`,
106
- `generateHexGrid`, `updateHexGridCoverage`, all vector-math helpers
107
- (`dot`, `cross`, `magnitude`, `normalize`, `subtract`, `add`,
108
- `scale`, `distance`, `lerp`), `easeInOutCubic`, `smoothstep`,
109
- `lerpColor`, `hexToRgb`, `getGradientColor`, `formatDuration`,
110
- `formatDistance`, `formatVelocity`, `formatDateTime`, and the
111
- constants `EARTH_MU`, `AU_KM`, `J2000_EPOCH`. Retained:
112
- `EARTH_RADIUS_KM`, `DEG_TO_RAD`, `RAD_TO_DEG`, `SCENE_EARTH_RADIUS`,
113
- `KM_TO_SCENE`, `latLonAltToCartesian`, `easeOutCubic`. For orbital
114
- mechanics, use a dedicated library (`satellite.js` for SGP4) or
115
- Cesium's built-in transforms; the Three.js path already draws
116
- coverage from the explicit `SatelliteCoverage` props.
117
-
118
- ### Improvements
119
-
120
- - **`useZendirSession`** reworked container + simulation lifecycle
121
- (provision container, poll until `RUNNING`, then create a simulation),
122
- with a new `SessionInfo` export and `preloadZendirSdk` /
123
- `isZendirSdkAvailable` utilities.
124
- - **`ZenSpace3D` Cesium backend** substantial rework
125
- (`ZenSpace3DCesium.tsx`) so positions streamed in J2000/ECI are
126
- correctly rotated into ECEF each frame using the simulation clock,
127
- keeping the orbit and its ground track visually consistent.
128
- - **`ZenSpace3DTypes` docs** updated SDK-compatibility example to the
129
- new `useSimulationScene` pattern and clarified that coverage geometry
130
- is either explicit (`footprintPolygon` / `halfAngle`) or computed
131
- locally by the viewer.
132
- - **`types.ts`** clarified that UI-domain types (`Quaternion`,
133
- `Vector3D`, `PointingMode`, etc.) ship with `@zendir/ui` and are not
134
- provided by `zendir-ts` (which is REST-only and intentionally
135
- minimal). Helpers like `estimateOrbitalPeriod` /
136
- `estimateOrbitalVelocity` are documented as client-side approximations.
137
- - **Docs refresh** — `SDKIntegration.mdx`, `ComponentsOverview.mdx`,
138
- and `Introduction.mdx` updated to reflect the `zendir-ts` rename
139
- (previously `@zendir/sdk`) and the new hook surface.
140
-
141
- ### Migration
142
-
143
- ```tsx
144
- // Before (0.2.x)
145
- import { useTelemetry, useSpacecraftPosition, useSimulationTime } from '@zendir/ui/react/hooks';
146
-
147
- // After (0.3.0)
148
- import { useSimulationScene } from '@zendir/ui/react/hooks';
149
-
150
- const scene = useSimulationScene({ client, containerId, simulationId });
151
- // scene.satellites, scene.groundStations, scene.referenceDate, scene.positionTickDiag
152
- ```
153
-
154
- ```tsx
155
- // Before (0.2.x)
156
- import { useAccessWindows, createDemoAccessWindows, AccessWindow } from '@zendir/ui/react/hooks';
157
-
158
- const { aosTimer, losTimer } = useAccessWindows({
159
- spacecraftId: 'my-sat',
160
- groundStationId: 'gs-1',
161
- });
162
-
163
- // After (0.3.0)
164
- import { useAccessWindows, createDemoAccessPasses, AccessPass } from '@zendir/ui/react/hooks';
165
-
166
- const passes: AccessPass[] = computePasses(satellite, groundStation); // your propagator
167
- const { aosTimer, losTimer } = useAccessWindows({ windows: passes });
168
- ```
169
-
170
- ### Notes
171
-
172
- - Consumer apps that use a published tarball should depend on
173
- `"@zendir/ui": "^0.3.0"`. Monorepo/local development can keep
174
- `"@zendir/ui": "file:../zendir-ui"`.
175
- - After `npm publish` in this package, run `npm install` in consuming
176
- apps to pick up 0.3.0 (no automatic push; release is manual).
177
-
178
-
179
- ### Architecture — `core/` reorganised
180
-
181
- The 42-file flat `react/core/` folder is split into thematic subfolders:
182
- `inputs/`, `feedback/`, `overlays/`, `navigation/`, `data/`, `display/`,
183
- `widgets/` (alongside the existing `layout/`).
184
-
185
- - The `core/index.ts` barrel still exports everything by name. Consumers
186
- using `import { Button } from '@zendir/ui'` or `from '@zendir/ui/react/core'`
187
- are unaffected.
188
- - Deep imports like `from '@zendir/ui/react/core/Button'` now resolve via
189
- the new path; if you have these, switch to the barrel for stability.
190
-
191
- ### Theme + a11y
192
-
193
- - **JS-side `tokens.animation.*` honours `prefers-reduced-motion`.**
194
- The global CSS @media rule already stripped CSS animations; this
195
- extends the same behaviour to the JS-side tokens surface so animation
196
- libraries (Framer Motion etc.) reading `tokens.animation.fast` get
197
- collapsed values too.
198
-
199
-
200
- ### Removed
201
-
202
- - Legacy `EarthViewer` and `SolarSystemViewer` 3D components (~1.6k LOC
203
- of dead code; superseded by `ZenSpace3D`).
204
- - Deprecated `ChatGPTCard` alias (use `AppCard`) and `useIntrinsicHeight`
205
- no-op hook (use `useMaxHeight`).
206
- - `scripts/build-tokens.js` (had its own duplicate token literal —
207
- replaced by `build-tokens.ts` that imports from `tokens/index.ts`).
208
-
209
- ### Internal
210
-
211
- - `src/react/core/` reorganised — see "Architecture" above.
212
- - Operator and dashboard verified working with new structure.
213
- - **Toolchain** — ESLint 9 flat config (`eslint.config.js`), `typescript-eslint` v8,
214
- Vitest 2.1 + Vite 5.4; `npm audit fix -w @zendir/ui --legacy-peer-deps` at monorepo
215
- root to clear hoisted dev CVEs without `--force` onto Vite 8. Storybook 8
216
- `eslint-plugin-storybook` rules removed until Storybook 10+ (plugin v0.8 uses
217
- APIs dropped in ESLint 9).
218
- - 284/284 tests pass; typecheck clean; build clean.
219
-
220
- ---
221
-
222
- ## 0.2.21
223
-
224
- ### Improvements
225
-
226
- - **SidePanel**: Fixed sudden layout shift when opening/closing — width animates from `0px` smoothly during the `opening` phase (previously snapped to full width instantly, causing the flex layout to jump). Closing transition no longer drops width to `0px` instantly while the panel is still sliding out.
227
- - **SidePanel**: Slowed transitions from `0.5s` to `0.6s` and switched to a calmer `cubic-bezier(0.2, 0.8, 0.2, 1)` ease curve for a smoother, less jarring feel — based on UX research showing 500–600ms with deceleration easing reads as "calm" without feeling sluggish.
228
-
229
- ---
230
-
231
- ## 0.2.20
232
-
233
- ### Improvements
234
-
235
- - **SidePanel**: Smoother open/close animation CSS transitions increased from 0.3s to 0.5s with matched JavaScript timing (550ms closing timeout) to prevent premature unmount during slide-out.
236
-
237
- ---
238
-
239
- ## 0.2.5
240
-
241
- ### Bug Fixes
242
-
243
- - **Container**: Fixed `[object Object]` rendering when `subtitle` is a React element. Non-string subtitles (JSX) are now rendered directly below the `CardHeader` instead of being coerced via `String()`.
244
-
245
- ---
246
-
247
- ## 0.2.4
248
-
249
- ### Features
250
-
251
- #### GroundTrackMap Layers Panel
252
-
253
- - **Layers icon + dropdown panel** — the top-right control bar now shows a stacked-diamond icon that opens a clean dropdown panel with two sections: **Base Map** (Dark/Satellite radio) and **Overlays** (toggle switches for Day/Night terminator, Grid Lines, and custom layers).
254
- - **Custom layers API** — pass `customLayers: MapLayerDef[]` to add your own toggle items to the Overlays section. The map provides the toggle UI; the consumer app renders its own overlay content via `onLayerChange(layerId, enabled)`.
255
- - **Persistent tile style** — Dark/Satellite choice is saved to `localStorage` and restored across tabs and page reloads.
256
- - **Unified control bar** — Recenter, Layers, and Zoom (+/−) are now a single horizontal row at top-right, replacing both the old separate controls and Leaflet's native zoom.
257
- - **Runtime overlay toggling** — built-in overlays (Terminator, Grid) can now be toggled on/off at runtime from the Layers panel without remounting the map.
258
-
259
- ### Breaking Changes
260
-
261
- - `showMapStyleToggle` prop is still accepted but now controls whether the "Base Map" section appears in the Layers panel (default `true`).
262
- - Leaflet's native zoom controls have been replaced by custom-styled buttons matching the Astro UXDS dark ops aesthetic.
263
-
264
- ### Documentation
265
-
266
- - **LayersPanel** story — demonstrates the full layers panel with base map toggle and overlay switches.
267
- - **CustomLayers** story — shows how to add developer-defined overlay toggles with `MapLayerDef[]` and respond via `onLayerChange`.
268
-
269
- ---
270
-
271
- ## 0.2.3
272
-
273
- ### Features
274
-
275
- #### GroundTrackMap — Map Style Toggle
276
-
277
- - **Built-in Dark / Satellite tile switcher** — when no explicit `tileUrl` is passed, a compact toggle appears below the Leaflet zoom controls allowing operators to switch between Dark (CartoDB) and Satellite (Esri World Imagery) tile layers.
278
- - **No-flash tile swap** — toggling swaps only the tile layer without recreating the Leaflet map, preserving the current zoom, pan, and overlay state.
279
- - **`showMapStyleToggle` prop** — defaults to `true`. Set to `false` to hide the toggle. Automatically hidden when an explicit `tileUrl` is provided (backward compatible).
280
- - **`TILE_PRESETS`** — exported preset URLs (`dark`, `satellite`, `light`) for quick tile configuration.
281
-
282
- #### GroundTrackMap — Terminator Boundary Line
283
-
284
- - **Geometric terminator line** a subtle dashed line at the 0° solar depression boundary (geometric sunset/sunrise) is now drawn on both Canvas and Leaflet backends, giving a clear visual reference for the day/night edge while the graduated fade provides the realistic transition.
285
-
286
- #### UnifiedTimelinePlayhead Auto-Follow
287
-
288
- - **Auto-scroll to playhead** — when the playhead marker moves near the edge of the visible chart viewport, the view auto-scrolls to keep it centered. Throttled at 300ms to avoid fighting user scrolling.
289
- - **Smooth playhead animation** — the playhead line now uses a CSS transition (`left 0.4s linear`) for glide-smooth movement between position updates.
290
-
291
- ### Documentation
292
-
293
- - **Map Style Toggle** story — demonstrates the built-in tile switcher with a satellite track and terminator, including opt-out patterns.
294
- - Updated component description with Map Style Toggle feature.
295
-
296
- ### Internal
297
-
298
- - Refactored tile layer lifecycle in `GroundTrackMapLeaflet` — tile creation is now a separate effect from map initialization, enabling smooth in-place tile swaps.
299
- - **Fixed duplicate tile layer on mount** the initial mount effect no longer creates a tile layer; the dedicated tile-swap effect is solely responsible, eliminating z-order conflicts that caused the terminator overlay to render behind tiles.
300
- - **Attribution management** — tile swap effect now properly adds/removes Carto vs OSM attribution when switching tile styles.
301
- - Map controls repositioned to bottom-left for reliable visibility across container sizes.
302
-
303
- ---
304
-
305
- ## 0.2.2
306
-
307
- ### Features
308
-
309
- #### GroundTrackMap — Night Visualization
310
-
311
- - **Seamless night polygon** — completely rewritten terminator geometry: sunset/sunrise curves are now computed as continuous longitude pairs, producing a single closed polygon with no antimeridian artifacts. Eliminates all "jerk" lines and rendering glitches at the poles.
312
- - **`nightTileUrl` prop** — optional second tile layer (e.g. NASA Black Marble, VIIRS city lights) rendered beneath the terminator overlay. The graduated twilight gradient naturally masks the day-to-night tile transition. Leaflet backend only.
313
- - **`lightSources` prop** array of point light sources (`LightSource` interface) rendered as soft glow dots on the night side of the map. Each light is masked by the terminator: invisible in daylight, fading in through twilight, full brightness at night. Supports custom colors, radii, intensity, and labels.
314
- - **Solar elevation masking** — light source visibility is computed per-point using the exact solar elevation angle (not polygon containment), giving a smooth and physically correct twilight fade for each individual light.
315
-
316
- ### Documentation
317
-
318
- - **City Lights at Night** story — 35+ world cities as `lightSources`, demonstrating realistic nighttime glow.
319
- - **City Lights Time Travel** story interactive UTC hour slider showing lights switching on/off as the terminator sweeps.
320
- - **Custom Light Sources** story — mission scenario with colored RF emitters, bases, and relay nodes.
321
- - **Night Tile Layer** story demonstrates `nightTileUrl` combined with `lightSources`.
322
- - Updated component description with Night Tile Layer and Dynamic Light Sources sections.
323
-
324
- ### Bug Fixes
325
-
326
- - Fixed terminator night polygon antimeridian wrapping sunset and sunrise curves are now generated as continuous coordinate pairs (no `lon ± 180` mirroring), preventing the polygon from crossing the day side.
327
- - Removed unused `buildBandPolygon` function from Leaflet backend.
328
-
329
- ---
330
-
331
- ## 0.2.0
332
-
333
- ### Features
334
-
335
- #### SDK Category System (New)
336
- - **`CategoryDef`** — shared interface for a named, colored data category (`id`, `color`, `label?`), used across Timeline, GroundTrackMap, and any future component.
337
- - **`CategoryPalette`** — utility class that maps category IDs to stable colors and labels, with built-in fallback palettes for auto-assignment.
338
- - **`CategoryProvider` / `useCategoryPalette`** — optional React Context for sharing a `CategoryPalette` and a custom display label (e.g. "Squad", "Division") across an entire dashboard. Fully opt-in; components work standalone without it.
339
- - New Storybook documentation page (`SDK Category Concept`) with interactive examples, architecture diagrams, and integration guidance.
340
-
341
- #### UnifiedTimeline
342
- - **Team / category-aware events** events now carry structured team identity (`id`, `color`, `label?`), enabling category-colored event bars and badges.
343
- - **Multi-select team filter** — replaces the former boolean `teamColoredOnly` toggle; users can filter by specific teams via pill-style checkboxes.
344
- - **`teamLabel` prop** — devs can rename "Team" to any domain-specific term (e.g. "Squad", "Division"); also readable from `CategoryProvider` context.
345
- - **Day markers** — `showDayMarkers` draws labeled day boundaries on multi-day timelines.
346
- - **Redesigned filter bar** — collapsible panel with Astro UX filter icon, search field moved to top header row, responsive breakpoints.
347
- - **Performance** — bounding-box culling for `ChartView` events outside the visible viewport.
348
-
349
- #### GroundTrackMap
350
- - **Twilight terminator with gradient zones** — realistic Civil / Nautical / Astronomical / Full Night shading derived from solar depression angle, replacing the former hard-edge day/night line. Uses `depressionDeg` for precise boundaries.
351
- - **Collaborative pins** new `MapPin` interface and `pins` / `pinsEditable` / `onPinAdd` / `onPinUpdate` / `onPinRemove` props for placing colored points-of-interest synced across terminals.
352
- - **Enhanced satellite visualization** — `showFootprint` / `footprintRadius` for sensor coverage circles, `futureTrackIndex` for solid-past / dashed-future track split, `passMarkers` for AOS/LOS diamonds.
353
- - **Ground station antenna icons** — `dish`, `phased-array`, `omni`, and `relay` icon types with coverage circles and Astro status colors.
354
- - **Legend overlay** — auto-generated satellite + ground station legend with status indicators.
355
- - Category-aware pin colors via `CategoryProvider` integration.
356
-
357
- #### SimulationControls
358
- - Increased control-button background opacities for better visibility on dark themes.
359
-
360
- ### Documentation
361
- - Comprehensive Storybook updates for Timeline (`WithCategoryProvider`, `MultiDayWithCategories` stories) and GroundTrackMap (`SDK Category Integration` section).
362
- - New `CategoryConcept` Storybook page with `PaletteBasics`, `ProviderAndHook`, and `DynamicCategories` interactive stories.
363
-
364
- ### Breaking Changes
365
- - `TimelineEvent.color` replaced by `TimelineEvent.team` (`TimelineTeam` / `CategoryDef`). Plain string colors are still accepted for backward compatibility but are treated as legacy entries.
366
- - `TimelineFilter.teamColoredOnly` replaced by `TimelineFilter.teams` (multi-select `string[]`).
367
-
368
- ---
369
-
370
- ## 0.1.0
371
-
372
- Initial public release.
373
-
374
- ### Features
375
-
376
- - 60+ React components for space, air, land, and maritime operations
377
- - Built on Astro UX Design System
378
- - Themeable (Zen, Hybrid, Astro, Glass) with dark/light mode
379
- - ECharts-based charting (line, area, bar, radar, treemap, sankey, and more)
380
- - 3D viewers (Earth, Solar System, ZenSpace3D) via Three.js
381
- - Ground track maps (Leaflet and canvas backends)
382
- - Mission control widgets (MissionClock, SimulationControls, UnifiedTimeline)
383
- - Layout primitives (Box, Flex, Grid, Stack, Container, SideNav, SidePanel)
384
- - Accessibility-first (WCAG 2.2 AA oriented)
385
- - Design tokens as JS objects and CSS custom properties
386
- - Optional `zendir-ts` (Zendir TypeScript SDK) integration with graceful fallback
1
+ # @zendir/ui
2
+
3
+ ## 0.6.1
4
+
5
+ ### Patch Changes
6
+
7
+ - **ThemeProvider**: set the theme variant on `data-theme` and the mode on
8
+ `data-mode` (previously `data-theme` carried the mode and the variant went
9
+ to the unused `data-variant`). The generated `tokens.css` keys its blocks on
10
+ `[data-theme="<variant>"]` / `[data-mode="light"]`, so the mismatch meant the
11
+ static `--zendir-*` CSS variables always resolved to the default (hybrid)
12
+ block — non-hybrid variants (nebula, astro, purple-hue) only themed via
13
+ `useThemeTokens()`, not via CSS variables. CSS-variable consumers now get the
14
+ selected variant. `data-variant` is retained for backward compatibility.
15
+
16
+ ## 0.6.0
17
+
18
+ ### Minor Changes
19
+
20
+ - **ImageGallery**: new optional `badge` field on `GalleryImage` renders an
21
+ overlay pill on thumbnails (e.g. flagging newly downlinked images).
22
+ - **ThemeProvider**: explicit `theme`/`mode` props are now authoritative and
23
+ no longer overridden by persisted preferences; use `defaultVariant`/
24
+ `defaultMode` to opt into localStorage restore.
25
+ - New opt-in `nebula` theme (Prussian Slate / Ultraviolet).
26
+ - Primitive color scales are now importable from `@zendir/ui/tokens` (Zendir
27
+ brand, Astro UXDS status, Tailwind v4.2) and emitted as `--zendir-*` CSS
28
+ variables, so product code and charts can reference endorsed palette stops
29
+ directly.
30
+ - Theme types and palettes extracted into dedicated modules
31
+ (`react/theme/types`, `tokens/palettes`, `tokens/core`); public API
32
+ unchanged.
33
+ - Toolchain security refresh: Vitest 4, Vite 8, Storybook 10 — clears every
34
+ outstanding dependency audit advisory (production deps were already clean).
35
+
36
+ ## 0.5.0
37
+
38
+ ### Minor Changes
39
+
40
+ - Add a `stat` variant to `DataValue` for compact top-bar telemetry chips
41
+ (value over a small uppercase label, status-tinted).
42
+ - Refresh `SideNav` styling and layout.
43
+
44
+ ### Patch Changes
45
+
46
+ - Harden Popover first-open positioning: seed the panel's position state as
47
+ `fixed` and gate visibility on a `positioned` flag that resets on close, so
48
+ neither the first open nor any reopen flashes at stale coordinates.
49
+
50
+ ## 0.4.1
51
+
52
+ ### Patch Changes
53
+
54
+ - Fix Popover first-open positioning flash: panel now renders with
55
+ `visibility: hidden` until the initial `requestAnimationFrame` resolves
56
+ real coordinates, preventing the one-frame misposition on first open.
57
+
58
+ ## 0.4.0
59
+
60
+ ### Minor Changes
61
+
62
+ - Add `ImageFrame` widget: renders a single-channel sensor/CCD data frame
63
+ (`number[]` of samples) as a false-colour image on a canvas, with
64
+ fixed-ceiling normalisation, `cividis`/`gray` colormaps, an optional raw
65
+ value grid, and loading/empty states. Purely presentational — callers
66
+ pass the frame data in. Also exports the pure `decodeImage` helper.
67
+
68
+ ### Patch Changes
69
+
70
+ - Scope the Dialog focus trap to the open transition so typing in a dialog
71
+ input isn't interrupted when the surrounding parent re-renders.
72
+
73
+ ## 0.3.0
74
+
75
+ **Upgrade from npm:** The latest public release on the registry is
76
+ [0.2.21](https://www.npmjs.com/package/@zendir/ui). This **0.3.0** release
77
+ is the next version on npm and combines the hook / 3D integration work
78
+ with the token / `react/core/` architecture pass below.
79
+
80
+ This release reframes the React hook layer around a single, well-defined
81
+ bridge from `zendir-ts` to the live `<ZenSpace3D />` surface, and
82
+ replaces three legacy SDK-coupled hooks with smaller, REST-aligned
83
+ primitives. The Cesium backend gains proper sub-satellite ground-track
84
+ alignment, and the `ZenSpace3DUtils` helper module is slimmed to only
85
+ what the live backends actually consume. It also eliminates token drift
86
+ hazards by consolidating literals, auto-generating `tokens.css`, and
87
+ reorganising `react/core/` into thematic subfolders.
88
+
89
+ ### Features
90
+
91
+ - **`useSimulationScene`** primary integration hook
92
+ (`@zendir/ui/react/hooks` and `@zendir/ui/react/3d`). Bridges a
93
+ `zendir-ts` `ZendirClient` to `ZenSpace3D` props: fetches
94
+ `GetSimulationStructure` once, buckets spacecraft / ground stations /
95
+ planets, and polls `Position_BN_N` / `Velocity_BN_N` on a configurable
96
+ interval (default 2 s). Exports `SimulationSceneClient`,
97
+ `SimulationSceneObject`, `StructureDiag`, `PositionTickDiag`, and
98
+ `UseSimulationSceneResult` for typed app integration.
99
+ - **Operator 3D surface** — the hook is intended to drive a full-screen
100
+ `ZenSpace3D` in host apps (e.g. `space-range-operator`
101
+ `/admin/3d/:containerId/:simulationId`). Feed
102
+ `useSimulationScene` with `containerId`, `simulationId`, and the
103
+ session `client`.
104
+ - **`ZenSpace3DProps.referenceTime`** — new `Date` prop used by the
105
+ Cesium backend to convert ECI/J2000 positions into the Earth-Fixed
106
+ (ECEF) frame Cesium renders. Passing the simulation clock (sim epoch
107
+ + sim seconds) lines the sub-satellite point on Earth up with the
108
+ true ground track; omitting it falls back to wall-clock time and the
109
+ ground track will drift.
110
+ - **Top-level re-exports** — `ZenSpace3D`, `useSimulationScene`, and
111
+ their types are now available from the main `@zendir/ui/react`
112
+ entry in addition to the `react/3d` and `react/hooks` subpaths.
113
+
114
+ ### Breaking Changes
115
+
116
+ - **Removed legacy SDK hooks**: `useTelemetry`, `useSpacecraftPosition`,
117
+ and `useSimulationTime` no longer exist. Their
118
+ responsibilities are covered by `useSimulationScene` (live position /
119
+ velocity bucketed onto scene objects) and by the `referenceDate` /
120
+ `positionTickDiag` fields on its result.
121
+ - **`useAccessWindows` is now pure client-side math**. The Zendir REST
122
+ API does not expose a server-side access-prediction endpoint, so the
123
+ hook no longer attempts to load `zendir-ts` or fetch passes. It now
124
+ accepts a `windows: AccessPass[]` input (compute these with your own
125
+ propagator / SGP4 / demo data) and returns `TimerConfig` objects for
126
+ `<MissionClock />`. Removed options: `spacecraftId`, `groundStationId`,
127
+ `passCount`. Removed result fields: `isConnected`, `isSdkAvailable`,
128
+ `error`. The `manualWindows` option is kept as a deprecated alias
129
+ for `windows` for one minor.
130
+ - **Renames in `useAccessWindows`**: the `AccessWindow` type is now
131
+ `AccessPass`, and `createDemoAccessWindows` is now
132
+ `createDemoAccessPasses`. Update imports accordingly.
133
+ - **`ZenSpace3DUtils` pruned to the live surface**. Unused helpers were
134
+ removed: `cartesianToLatLonAlt`, `cartesianToSpherical`,
135
+ `sphericalToCartesian`, `eciToEcef`, `calculateGMST`,
136
+ `dateToJulianDate`, `parseTLE`, `propagateSGP4Simple`,
137
+ `propagateSatellite`, `generateOrbitPath`, `isVisible`,
138
+ `calculateVisibilityConeGeometry`, `calculateFootprint`,
139
+ `generateHexGrid`, `updateHexGridCoverage`, all vector-math helpers
140
+ (`dot`, `cross`, `magnitude`, `normalize`, `subtract`, `add`,
141
+ `scale`, `distance`, `lerp`), `easeInOutCubic`, `smoothstep`,
142
+ `lerpColor`, `hexToRgb`, `getGradientColor`, `formatDuration`,
143
+ `formatDistance`, `formatVelocity`, `formatDateTime`, and the
144
+ constants `EARTH_MU`, `AU_KM`, `J2000_EPOCH`. Retained:
145
+ `EARTH_RADIUS_KM`, `DEG_TO_RAD`, `RAD_TO_DEG`, `SCENE_EARTH_RADIUS`,
146
+ `KM_TO_SCENE`, `latLonAltToCartesian`, `easeOutCubic`. For orbital
147
+ mechanics, use a dedicated library (`satellite.js` for SGP4) or
148
+ Cesium's built-in transforms; the Three.js path already draws
149
+ coverage from the explicit `SatelliteCoverage` props.
150
+
151
+ ### Improvements
152
+
153
+ - **`useZendirSession`** — reworked container + simulation lifecycle
154
+ (provision container, poll until `RUNNING`, then create a simulation),
155
+ with a new `SessionInfo` export and `preloadZendirSdk` /
156
+ `isZendirSdkAvailable` utilities.
157
+ - **`ZenSpace3D` Cesium backend** — substantial rework
158
+ (`ZenSpace3DCesium.tsx`) so positions streamed in J2000/ECI are
159
+ correctly rotated into ECEF each frame using the simulation clock,
160
+ keeping the orbit and its ground track visually consistent.
161
+ - **`ZenSpace3DTypes` docs** — updated SDK-compatibility example to the
162
+ new `useSimulationScene` pattern and clarified that coverage geometry
163
+ is either explicit (`footprintPolygon` / `halfAngle`) or computed
164
+ locally by the viewer.
165
+ - **`types.ts`** — clarified that UI-domain types (`Quaternion`,
166
+ `Vector3D`, `PointingMode`, etc.) ship with `@zendir/ui` and are not
167
+ provided by `zendir-ts` (which is REST-only and intentionally
168
+ minimal). Helpers like `estimateOrbitalPeriod` /
169
+ `estimateOrbitalVelocity` are documented as client-side approximations.
170
+ - **Docs refresh** — `SDKIntegration.mdx`, `ComponentsOverview.mdx`,
171
+ and `Introduction.mdx` updated to reflect the `zendir-ts` rename
172
+ (previously `@zendir/sdk`) and the new hook surface.
173
+
174
+ ### Migration
175
+
176
+ ```tsx
177
+ // Before (0.2.x)
178
+ import { useTelemetry, useSpacecraftPosition, useSimulationTime } from '@zendir/ui/react/hooks';
179
+
180
+ // After (0.3.0)
181
+ import { useSimulationScene } from '@zendir/ui/react/hooks';
182
+
183
+ const scene = useSimulationScene({ client, containerId, simulationId });
184
+ // scene.satellites, scene.groundStations, scene.referenceDate, scene.positionTickDiag
185
+ ```
186
+
187
+ ```tsx
188
+ // Before (0.2.x)
189
+ import { useAccessWindows, createDemoAccessWindows, AccessWindow } from '@zendir/ui/react/hooks';
190
+
191
+ const { aosTimer, losTimer } = useAccessWindows({
192
+ spacecraftId: 'my-sat',
193
+ groundStationId: 'gs-1',
194
+ });
195
+
196
+ // After (0.3.0)
197
+ import { useAccessWindows, createDemoAccessPasses, AccessPass } from '@zendir/ui/react/hooks';
198
+
199
+ const passes: AccessPass[] = computePasses(satellite, groundStation); // your propagator
200
+ const { aosTimer, losTimer } = useAccessWindows({ windows: passes });
201
+ ```
202
+
203
+ ### Notes
204
+
205
+ - Consumer apps that use a published tarball should depend on
206
+ `"@zendir/ui": "^0.3.0"`. Monorepo/local development can keep
207
+ `"@zendir/ui": "file:../zendir-ui"`.
208
+ - After `npm publish` in this package, run `npm install` in consuming
209
+ apps to pick up 0.3.0 (no automatic push; release is manual).
210
+
211
+
212
+ ### Architecture `core/` reorganised
213
+
214
+ The 42-file flat `react/core/` folder is split into thematic subfolders:
215
+ `inputs/`, `feedback/`, `overlays/`, `navigation/`, `data/`, `display/`,
216
+ `widgets/` (alongside the existing `layout/`).
217
+
218
+ - The `core/index.ts` barrel still exports everything by name. Consumers
219
+ using `import { Button } from '@zendir/ui'` or `from '@zendir/ui/react/core'`
220
+ are unaffected.
221
+ - Deep imports like `from '@zendir/ui/react/core/Button'` now resolve via
222
+ the new path; if you have these, switch to the barrel for stability.
223
+
224
+ ### Theme + a11y
225
+
226
+ - **JS-side `tokens.animation.*` honours `prefers-reduced-motion`.**
227
+ The global CSS @media rule already stripped CSS animations; this
228
+ extends the same behaviour to the JS-side tokens surface so animation
229
+ libraries (Framer Motion etc.) reading `tokens.animation.fast` get
230
+ collapsed values too.
231
+
232
+
233
+ ### Removed
234
+
235
+ - Legacy `EarthViewer` and `SolarSystemViewer` 3D components (~1.6k LOC
236
+ of dead code; superseded by `ZenSpace3D`).
237
+ - Deprecated `ChatGPTCard` alias (use `AppCard`) and `useIntrinsicHeight`
238
+ no-op hook (use `useMaxHeight`).
239
+ - `scripts/build-tokens.js` (had its own duplicate token literal —
240
+ replaced by `build-tokens.ts` that imports from `tokens/index.ts`).
241
+
242
+ ### Internal
243
+
244
+ - `src/react/core/` reorganised — see "Architecture" above.
245
+ - Operator and dashboard verified working with new structure.
246
+ - **Toolchain** — ESLint 9 flat config (`eslint.config.js`), `typescript-eslint` v8,
247
+ Vitest 2.1 + Vite 5.4; `npm audit fix -w @zendir/ui --legacy-peer-deps` at monorepo
248
+ root to clear hoisted dev CVEs without `--force` onto Vite 8. Storybook 8
249
+ `eslint-plugin-storybook` rules removed until Storybook 10+ (plugin v0.8 uses
250
+ APIs dropped in ESLint 9).
251
+ - 284/284 tests pass; typecheck clean; build clean.
252
+
253
+ ---
254
+
255
+ ## 0.2.21
256
+
257
+ ### Improvements
258
+
259
+ - **SidePanel**: Fixed sudden layout shift when opening/closing — width animates from `0px` smoothly during the `opening` phase (previously snapped to full width instantly, causing the flex layout to jump). Closing transition no longer drops width to `0px` instantly while the panel is still sliding out.
260
+ - **SidePanel**: Slowed transitions from `0.5s` to `0.6s` and switched to a calmer `cubic-bezier(0.2, 0.8, 0.2, 1)` ease curve for a smoother, less jarring feel — based on UX research showing 500–600ms with deceleration easing reads as "calm" without feeling sluggish.
261
+
262
+ ---
263
+
264
+ ## 0.2.20
265
+
266
+ ### Improvements
267
+
268
+ - **SidePanel**: Smoother open/close animation — CSS transitions increased from 0.3s to 0.5s with matched JavaScript timing (550ms closing timeout) to prevent premature unmount during slide-out.
269
+
270
+ ---
271
+
272
+ ## 0.2.5
273
+
274
+ ### Bug Fixes
275
+
276
+ - **Container**: Fixed `[object Object]` rendering when `subtitle` is a React element. Non-string subtitles (JSX) are now rendered directly below the `CardHeader` instead of being coerced via `String()`.
277
+
278
+ ---
279
+
280
+ ## 0.2.4
281
+
282
+ ### Features
283
+
284
+ #### GroundTrackMapLayers Panel
285
+
286
+ - **Layers icon + dropdown panel** the top-right control bar now shows a stacked-diamond icon that opens a clean dropdown panel with two sections: **Base Map** (Dark/Satellite radio) and **Overlays** (toggle switches for Day/Night terminator, Grid Lines, and custom layers).
287
+ - **Custom layers API** — pass `customLayers: MapLayerDef[]` to add your own toggle items to the Overlays section. The map provides the toggle UI; the consumer app renders its own overlay content via `onLayerChange(layerId, enabled)`.
288
+ - **Persistent tile style** — Dark/Satellite choice is saved to `localStorage` and restored across tabs and page reloads.
289
+ - **Unified control bar** — Recenter, Layers, and Zoom (+/−) are now a single horizontal row at top-right, replacing both the old separate controls and Leaflet's native zoom.
290
+ - **Runtime overlay toggling** — built-in overlays (Terminator, Grid) can now be toggled on/off at runtime from the Layers panel without remounting the map.
291
+
292
+ ### Breaking Changes
293
+
294
+ - `showMapStyleToggle` prop is still accepted but now controls whether the "Base Map" section appears in the Layers panel (default `true`).
295
+ - Leaflet's native zoom controls have been replaced by custom-styled buttons matching the Astro UXDS dark ops aesthetic.
296
+
297
+ ### Documentation
298
+
299
+ - **LayersPanel** storydemonstrates the full layers panel with base map toggle and overlay switches.
300
+ - **CustomLayers** story shows how to add developer-defined overlay toggles with `MapLayerDef[]` and respond via `onLayerChange`.
301
+
302
+ ---
303
+
304
+ ## 0.2.3
305
+
306
+ ### Features
307
+
308
+ #### GroundTrackMap — Map Style Toggle
309
+
310
+ - **Built-in Dark / Satellite tile switcher** — when no explicit `tileUrl` is passed, a compact toggle appears below the Leaflet zoom controls allowing operators to switch between Dark (CartoDB) and Satellite (Esri World Imagery) tile layers.
311
+ - **No-flash tile swap** — toggling swaps only the tile layer without recreating the Leaflet map, preserving the current zoom, pan, and overlay state.
312
+ - **`showMapStyleToggle` prop** — defaults to `true`. Set to `false` to hide the toggle. Automatically hidden when an explicit `tileUrl` is provided (backward compatible).
313
+ - **`TILE_PRESETS`**exported preset URLs (`dark`, `satellite`, `light`) for quick tile configuration.
314
+
315
+ #### GroundTrackMap — Terminator Boundary Line
316
+
317
+ - **Geometric terminator line** — a subtle dashed line at the 0° solar depression boundary (geometric sunset/sunrise) is now drawn on both Canvas and Leaflet backends, giving a clear visual reference for the day/night edge while the graduated fade provides the realistic transition.
318
+
319
+ #### UnifiedTimelinePlayhead Auto-Follow
320
+
321
+ - **Auto-scroll to playhead** — when the playhead marker moves near the edge of the visible chart viewport, the view auto-scrolls to keep it centered. Throttled at 300ms to avoid fighting user scrolling.
322
+ - **Smooth playhead animation** the playhead line now uses a CSS transition (`left 0.4s linear`) for glide-smooth movement between position updates.
323
+
324
+ ### Documentation
325
+
326
+ - **Map Style Toggle** storydemonstrates the built-in tile switcher with a satellite track and terminator, including opt-out patterns.
327
+ - Updated component description with Map Style Toggle feature.
328
+
329
+ ### Internal
330
+
331
+ - Refactored tile layer lifecycle in `GroundTrackMapLeaflet` — tile creation is now a separate effect from map initialization, enabling smooth in-place tile swaps.
332
+ - **Fixed duplicate tile layer on mount** — the initial mount effect no longer creates a tile layer; the dedicated tile-swap effect is solely responsible, eliminating z-order conflicts that caused the terminator overlay to render behind tiles.
333
+ - **Attribution management** — tile swap effect now properly adds/removes Carto vs OSM attribution when switching tile styles.
334
+ - Map controls repositioned to bottom-left for reliable visibility across container sizes.
335
+
336
+ ---
337
+
338
+ ## 0.2.2
339
+
340
+ ### Features
341
+
342
+ #### GroundTrackMapNight Visualization
343
+
344
+ - **Seamless night polygon** — completely rewritten terminator geometry: sunset/sunrise curves are now computed as continuous longitude pairs, producing a single closed polygon with no antimeridian artifacts. Eliminates all "jerk" lines and rendering glitches at the poles.
345
+ - **`nightTileUrl` prop** — optional second tile layer (e.g. NASA Black Marble, VIIRS city lights) rendered beneath the terminator overlay. The graduated twilight gradient naturally masks the day-to-night tile transition. Leaflet backend only.
346
+ - **`lightSources` prop** — array of point light sources (`LightSource` interface) rendered as soft glow dots on the night side of the map. Each light is masked by the terminator: invisible in daylight, fading in through twilight, full brightness at night. Supports custom colors, radii, intensity, and labels.
347
+ - **Solar elevation masking** — light source visibility is computed per-point using the exact solar elevation angle (not polygon containment), giving a smooth and physically correct twilight fade for each individual light.
348
+
349
+ ### Documentation
350
+
351
+ - **City Lights at Night** story 35+ world cities as `lightSources`, demonstrating realistic nighttime glow.
352
+ - **City Lights Time Travel** story interactive UTC hour slider showing lights switching on/off as the terminator sweeps.
353
+ - **Custom Light Sources** story mission scenario with colored RF emitters, bases, and relay nodes.
354
+ - **Night Tile Layer** story demonstrates `nightTileUrl` combined with `lightSources`.
355
+ - Updated component description with Night Tile Layer and Dynamic Light Sources sections.
356
+
357
+ ### Bug Fixes
358
+
359
+ - Fixed terminator night polygon antimeridian wrapping — sunset and sunrise curves are now generated as continuous coordinate pairs (no `lon ± 180` mirroring), preventing the polygon from crossing the day side.
360
+ - Removed unused `buildBandPolygon` function from Leaflet backend.
361
+
362
+ ---
363
+
364
+ ## 0.2.0
365
+
366
+ ### Features
367
+
368
+ #### SDK Category System (New)
369
+ - **`CategoryDef`** — shared interface for a named, colored data category (`id`, `color`, `label?`), used across Timeline, GroundTrackMap, and any future component.
370
+ - **`CategoryPalette`** — utility class that maps category IDs to stable colors and labels, with built-in fallback palettes for auto-assignment.
371
+ - **`CategoryProvider` / `useCategoryPalette`** — optional React Context for sharing a `CategoryPalette` and a custom display label (e.g. "Squad", "Division") across an entire dashboard. Fully opt-in; components work standalone without it.
372
+ - New Storybook documentation page (`SDK Category Concept`) with interactive examples, architecture diagrams, and integration guidance.
373
+
374
+ #### UnifiedTimeline
375
+ - **Team / category-aware events** — events now carry structured team identity (`id`, `color`, `label?`), enabling category-colored event bars and badges.
376
+ - **Multi-select team filter** replaces the former boolean `teamColoredOnly` toggle; users can filter by specific teams via pill-style checkboxes.
377
+ - **`teamLabel` prop** devs can rename "Team" to any domain-specific term (e.g. "Squad", "Division"); also readable from `CategoryProvider` context.
378
+ - **Day markers** `showDayMarkers` draws labeled day boundaries on multi-day timelines.
379
+ - **Redesigned filter bar** collapsible panel with Astro UX filter icon, search field moved to top header row, responsive breakpoints.
380
+ - **Performance** bounding-box culling for `ChartView` events outside the visible viewport.
381
+
382
+ #### GroundTrackMap
383
+ - **Twilight terminator with gradient zones** realistic Civil / Nautical / Astronomical / Full Night shading derived from solar depression angle, replacing the former hard-edge day/night line. Uses `depressionDeg` for precise boundaries.
384
+ - **Collaborative pins** — new `MapPin` interface and `pins` / `pinsEditable` / `onPinAdd` / `onPinUpdate` / `onPinRemove` props for placing colored points-of-interest synced across terminals.
385
+ - **Enhanced satellite visualization** `showFootprint` / `footprintRadius` for sensor coverage circles, `futureTrackIndex` for solid-past / dashed-future track split, `passMarkers` for AOS/LOS diamonds.
386
+ - **Ground station antenna icons** — `dish`, `phased-array`, `omni`, and `relay` icon types with coverage circles and Astro status colors.
387
+ - **Legend overlay** — auto-generated satellite + ground station legend with status indicators.
388
+ - Category-aware pin colors via `CategoryProvider` integration.
389
+
390
+ #### SimulationControls
391
+ - Increased control-button background opacities for better visibility on dark themes.
392
+
393
+ ### Documentation
394
+ - Comprehensive Storybook updates for Timeline (`WithCategoryProvider`, `MultiDayWithCategories` stories) and GroundTrackMap (`SDK Category Integration` section).
395
+ - New `CategoryConcept` Storybook page with `PaletteBasics`, `ProviderAndHook`, and `DynamicCategories` interactive stories.
396
+
397
+ ### Breaking Changes
398
+ - `TimelineEvent.color` replaced by `TimelineEvent.team` (`TimelineTeam` / `CategoryDef`). Plain string colors are still accepted for backward compatibility but are treated as legacy entries.
399
+ - `TimelineFilter.teamColoredOnly` replaced by `TimelineFilter.teams` (multi-select `string[]`).
400
+
401
+ ---
402
+
403
+ ## 0.1.0
404
+
405
+ Initial public release.
406
+
407
+ ### Features
408
+
409
+ - 60+ React components for space, air, land, and maritime operations
410
+ - Built on Astro UX Design System
411
+ - Themeable (Zen, Hybrid, Astro, Glass) with dark/light mode
412
+ - ECharts-based charting (line, area, bar, radar, treemap, sankey, and more)
413
+ - 3D viewers (Earth, Solar System, ZenSpace3D) via Three.js
414
+ - Ground track maps (Leaflet and canvas backends)
415
+ - Mission control widgets (MissionClock, SimulationControls, UnifiedTimeline)
416
+ - Layout primitives (Box, Flex, Grid, Stack, Container, SideNav, SidePanel)
417
+ - Accessibility-first (WCAG 2.2 AA oriented)
418
+ - Design tokens as JS objects and CSS custom properties
419
+ - Optional `zendir-ts` (Zendir TypeScript SDK) integration with graceful fallback