@zendir/ui 0.4.1 → 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 +34 -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 -538
  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 +11 -5
  229. package/dist/react/core/navigation/SideNav.js +857 -602
  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
@@ -1 +1 @@
1
- {"version":3,"file":"ObjectInventoryPanel.js","sources":["../../../src/react/panels/ObjectInventoryPanel.tsx"],"sourcesContent":["/**\n * @zendir/ui - ObjectInventoryPanel\n *\n * Themed list of simulation objects, grouped by `kind` (spacecraft /\n * ground stations / celestial bodies). Pair with `useSimulationScene`:\n *\n * ```tsx\n * const scene = useSimulationScene({ client, containerId, simulationId });\n * <ObjectInventoryPanel\n * objects={scene.objects}\n * onSelect={(obj) => zenRef.current?.focusOn(obj.id, {\n * zoom: recommendedFlyDistance(obj.kind),\n * })}\n * />\n * ```\n *\n * The panel renders the toggle UI only — it has no opinion about WHAT\n * happens on select. The consumer wires `onSelect` to its 3D viewer's\n * imperative handle (or anywhere else — the panel is reusable in any\n * dashboard or debug context).\n */\n\nimport { memo, useCallback, useState } from 'react';\nimport type { CSSProperties, ReactNode } from 'react';\nimport { useThemeTokens } from '../theme/ThemeProvider';\nimport { useSpatialSelection } from '../context/SpatialSelectionContext';\nimport type { SimulationSceneObject, StructureDiag, PositionTickDiag } from '../hooks/useSimulationScene';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport type ObjectInventoryKind = SimulationSceneObject['kind'];\n\nexport interface ObjectInventoryPanelProps {\n /** Objects to list. Typically `useSimulationScene().objects`. */\n objects: SimulationSceneObject[];\n /** Click handler — fires with the clicked object. Pure forward; the\n * panel does not navigate, focus, or fly anywhere itself. */\n onSelect?: (object: SimulationSceneObject) => void;\n /** Currently selected object id (highlights the row). Pass `null` for none. */\n selectedId?: string | null;\n\n /** Where to anchor the panel on its parent. Default: `top-left`. */\n position?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';\n /** Pixel offsets from the anchor. Defaults to (16, 56) so a top bar fits above. */\n offset?: { x?: number; y?: number };\n /** Hide the panel without unmounting (preserves `selectedId` state). */\n hidden?: boolean;\n /** Width in pixels. Default 330. */\n width?: number;\n /** Maximum height (CSS value). Default `'50vh'`. */\n maxHeight?: string | number;\n\n /** Allow the user to collapse / expand the panel. Default true. */\n collapsible?: boolean;\n /** Initial collapsed state. Default false. */\n defaultCollapsed?: boolean;\n\n /** Optional title override. Default: `\"API Objects · N\"`. */\n title?: ReactNode;\n\n /**\n * Optional structure diagnostic block (raw keys + counts from\n * getSimulationStructure). Useful in dev / debug builds; omit in\n * production for a cleaner look.\n */\n structureDiag?: StructureDiag | null;\n /** Optional position-tick diagnostic block. */\n positionTickDiag?: PositionTickDiag | null;\n\n /** Custom labels per kind (defaults: \"Spacecraft\", \"Ground Stations\", \"Celestial Bodies\"). */\n kindLabels?: Partial<Record<ObjectInventoryKind, string>>;\n\n /** Inline style override on the outer container. */\n style?: CSSProperties;\n}\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\n/** Stable short-form of a GUID for inline display. */\nfunction shortId(id: string): string {\n return id.length <= 8 ? id : id.slice(0, 8);\n}\n\nconst DEFAULT_KIND_LABELS: Record<ObjectInventoryKind, string> = {\n spacecraft: 'Spacecraft',\n groundStation: 'Ground Stations',\n celestialBody: 'Celestial Bodies',\n};\n\nconst KIND_ORDER: ObjectInventoryKind[] = ['spacecraft', 'groundStation', 'celestialBody'];\n\n// ─── Component ────────────────────────────────────────────────────────────────\n\nexport const ObjectInventoryPanel = memo(function ObjectInventoryPanel({\n objects,\n onSelect,\n selectedId,\n position = 'top-left',\n offset,\n hidden = false,\n width = 330,\n maxHeight = '50vh',\n collapsible = true,\n defaultCollapsed = false,\n title,\n structureDiag,\n positionTickDiag,\n kindLabels,\n style,\n}: ObjectInventoryPanelProps) {\n const tokens = useThemeTokens();\n const [collapsed, setCollapsed] = useState(defaultCollapsed);\n\n // Optional <SpatialSelectionProvider> integration. When present, the\n // panel uses the shared selection state so other components (3D\n // viewer, GroundTrackMap, etc.) stay synchronised. Explicit props\n // always win — consumers can still override per-instance.\n const ctx = useSpatialSelection();\n const effectiveSelectedId = selectedId !== undefined ? selectedId : ctx?.selectedId ?? null;\n const effectiveOnSelect = useCallback(\n (obj: SimulationSceneObject) => {\n onSelect?.(obj);\n // Also push into the shared context if no explicit onSelect wins it.\n if (!onSelect) ctx?.setSelectedId(obj.id);\n },\n [onSelect, ctx],\n );\n\n const labels = { ...DEFAULT_KIND_LABELS, ...kindLabels };\n const entries = Array.isArray(objects) ? objects : [];\n\n // Position anchor — translate the prop into top/left/right/bottom CSS.\n const offX = offset?.x ?? 16;\n const offY = offset?.y ?? 56;\n const anchor: CSSProperties = (() => {\n switch (position) {\n case 'top-right': return { top: offY, right: offX };\n case 'bottom-left': return { bottom: offY, left: offX };\n case 'bottom-right': return { bottom: offY, right: offX };\n case 'top-left':\n default: return { top: offY, left: offX };\n }\n })();\n\n if (hidden) return null;\n\n const dim: CSSProperties = { opacity: 0.55, fontSize: '0.9em' };\n\n return (\n <div\n data-testid=\"zendir-object-inventory\"\n style={{\n position: 'absolute',\n zIndex: 2,\n width,\n maxHeight,\n overflow: 'auto',\n padding: tokens.spacing.sm,\n borderRadius: tokens.borderRadius?.md ?? 6,\n border: '1px solid rgba(255,255,255,0.12)',\n background: 'rgba(0,0,0,0.72)',\n color: tokens.colors.text.primary,\n fontSize: tokens.typography.fontSize.xs,\n lineHeight: 1.35,\n ...anchor,\n ...style,\n }}\n >\n <PanelHeader\n title={title ?? `API Objects · ${entries.length}`}\n collapsible={collapsible}\n collapsed={collapsed}\n onToggle={() => setCollapsed((c) => !c)}\n />\n\n {!collapsed && (\n <>\n {KIND_ORDER.map((kind) => {\n const items = entries.filter((o) => o.kind === kind);\n return (\n <ObjectInventoryGroup\n key={kind}\n title={`${labels[kind]} (${items.length})`}\n items={items}\n selectedId={effectiveSelectedId}\n onSelect={onSelect != null ? onSelect : (ctx ? effectiveOnSelect : undefined)}\n />\n );\n })}\n\n {structureDiag !== undefined && (\n <StructureDiagBlock diag={structureDiag} dim={dim} />\n )}\n\n {positionTickDiag !== undefined && (\n <PositionTickDiagBlock diag={positionTickDiag} dim={dim} />\n )}\n </>\n )}\n </div>\n );\n});\n\n// ─── Sub-components ───────────────────────────────────────────────────────────\n\nconst PanelHeader = ({\n title,\n collapsible,\n collapsed,\n onToggle,\n}: {\n title: ReactNode;\n collapsible: boolean;\n collapsed: boolean;\n onToggle: () => void;\n}) => {\n if (!collapsible) {\n return <div style={{ marginBottom: 6, fontWeight: 600 }}>{title}</div>;\n }\n return (\n <button\n type=\"button\"\n onClick={onToggle}\n aria-expanded={!collapsed}\n style={{\n display: 'flex',\n width: '100%',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: 6,\n padding: 0,\n background: 'none',\n border: 'none',\n color: 'inherit',\n font: 'inherit',\n fontWeight: 600,\n cursor: 'pointer',\n textAlign: 'left',\n }}\n >\n <span>{title}</span>\n <span aria-hidden style={{ opacity: 0.7, fontSize: '0.85em' }}>\n {collapsed ? '▸' : '▾'}\n </span>\n </button>\n );\n};\n\nconst ObjectInventoryGroup = ({\n title,\n items,\n selectedId,\n onSelect,\n}: {\n title: string;\n items: SimulationSceneObject[];\n selectedId: string | null;\n onSelect?: (obj: SimulationSceneObject) => void;\n}) => (\n <div style={{ marginBottom: 6 }}>\n <div style={{ opacity: 0.85 }}>{title}</div>\n {items.length === 0 ? (\n <div style={{ opacity: 0.6 }}>—</div>\n ) : (\n items.map((item) => (\n <ObjectRow\n key={item.id}\n object={item}\n selected={item.id === selectedId}\n onSelect={onSelect}\n />\n ))\n )}\n </div>\n);\n\nconst ObjectRow = ({\n object,\n selected,\n onSelect,\n}: {\n object: SimulationSceneObject;\n selected: boolean;\n onSelect?: (obj: SimulationSceneObject) => void;\n}) => {\n const handleClick = useCallback(() => onSelect?.(object), [onSelect, object]);\n const interactive = onSelect != null;\n return (\n <div\n role={interactive ? 'button' : undefined}\n tabIndex={interactive ? 0 : undefined}\n onClick={interactive ? handleClick : undefined}\n onKeyDown={\n interactive\n ? (e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n handleClick();\n }\n }\n : undefined\n }\n style={{\n opacity: 0.95,\n padding: '1px 4px',\n borderRadius: 3,\n cursor: interactive ? 'pointer' : 'default',\n background: selected ? 'rgba(255,255,255,0.12)' : 'transparent',\n }}\n >\n {object.name} <span style={{ opacity: 0.6 }}>({shortId(object.id)})</span>\n </div>\n );\n};\n\nconst StructureDiagBlock = ({\n diag,\n dim,\n}: {\n diag: StructureDiag | null | undefined;\n dim: CSSProperties;\n}) => (\n <div style={{ marginTop: 8, borderTop: '1px solid rgba(255,255,255,0.1)', paddingTop: 6 }}>\n {diag ? (\n <>\n <div style={{ ...dim, marginBottom: 2 }}>Raw structure keys:</div>\n <div style={dim}>{diag.topLevelKeys.join(', ') || '—'}</div>\n <div style={{ ...dim, marginTop: 2 }}>\n Objects[]: {diag.rawObjectCount < 0 ? 'absent' : diag.rawObjectCount}\n {' · '}\n Systems[]: {diag.rawSystemCount < 0 ? 'absent' : diag.rawSystemCount}\n </div>\n </>\n ) : (\n <div style={{ ...dim, marginTop: 4 }}>Waiting for structure…</div>\n )}\n </div>\n);\n\nconst PositionTickDiagBlock = ({\n diag,\n dim,\n}: {\n diag: PositionTickDiag | null | undefined;\n dim: CSSProperties;\n}) => {\n if (!diag) return null;\n return (\n <div style={{ marginTop: 8, borderTop: '1px solid rgba(255,255,255,0.1)', paddingTop: 6 }}>\n <div style={{ ...dim, marginBottom: 2 }}>Last position tick:</div>\n <div style={dim}>\n ok {diag.parsedOk}/{diag.requested}\n {diag.parseFailed > 0 && ` · parseFail ${diag.parseFailed}`}\n {diag.requestFailed > 0 && ` · reqFail ${diag.requestFailed}`}\n </div>\n <div style={dim}>\n asked for:{' '}\n {diag.requestedProps\n ? diag.requestedProps.join(', ')\n : 'getAllProperties (fallback)'}\n </div>\n {diag.firstResponseKeys.length > 0 && (\n <div style={{ ...dim, wordBreak: 'break-all' }}>\n got keys: {diag.firstResponseKeys.slice(0, 12).join(', ')}\n {diag.firstResponseKeys.length > 12 && ' …'}\n </div>\n )}\n {diag.firstResponseSample && (\n <div style={{ ...dim, wordBreak: 'break-all' }}>{diag.firstResponseSample}</div>\n )}\n </div>\n );\n};\n\n// ─── Companion helper ─────────────────────────────────────────────────────────\n\n/**\n * Sensible default fly-to distance per object kind, for use with\n * `<ZenSpace3D />`'s imperative `focusOn(id, { zoom })` handle.\n *\n * spacecraft: 2 000 000 m (≈ 2 000 km — close orbital view)\n * groundStation: 1 500 000 m (≈ 1 500 km — high-altitude angled view)\n * celestialBody: 50 000 000 m (≈ 50 000 km — full-planet view)\n *\n * Override per call if the consumer wants tighter/looser framing.\n */\nexport function recommendedFlyDistance(kind: ObjectInventoryKind): number {\n switch (kind) {\n case 'spacecraft': return 2_000_000;\n case 'groundStation': return 1_500_000;\n case 'celestialBody': return 50_000_000;\n }\n}\n\nexport default ObjectInventoryPanel;\n"],"names":["ObjectInventoryPanel"],"mappings":"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"}
1
+ {"version":3,"file":"ObjectInventoryPanel.js","names":[],"sources":["../../../src/react/panels/ObjectInventoryPanel.tsx"],"sourcesContent":["/**\n * @zendir/ui - ObjectInventoryPanel\n *\n * Themed list of simulation objects, grouped by `kind` (spacecraft /\n * ground stations / celestial bodies). Pair with `useSimulationScene`:\n *\n * ```tsx\n * const scene = useSimulationScene({ client, containerId, simulationId });\n * <ObjectInventoryPanel\n * objects={scene.objects}\n * onSelect={(obj) => zenRef.current?.focusOn(obj.id, {\n * zoom: recommendedFlyDistance(obj.kind),\n * })}\n * />\n * ```\n *\n * The panel renders the toggle UI only — it has no opinion about WHAT\n * happens on select. The consumer wires `onSelect` to its 3D viewer's\n * imperative handle (or anywhere else — the panel is reusable in any\n * dashboard or debug context).\n */\n\nimport { memo, useCallback, useState } from \"react\";\nimport type { CSSProperties, ReactNode } from \"react\";\nimport { useThemeTokens } from \"../theme/ThemeProvider\";\nimport { useSpatialSelection } from \"../context/SpatialSelectionContext\";\nimport type {\n SimulationSceneObject,\n StructureDiag,\n PositionTickDiag,\n} from \"../hooks/useSimulationScene\";\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport type ObjectInventoryKind = SimulationSceneObject[\"kind\"];\n\nexport interface ObjectInventoryPanelProps {\n /** Objects to list. Typically `useSimulationScene().objects`. */\n objects: SimulationSceneObject[];\n /** Click handler — fires with the clicked object. Pure forward; the\n * panel does not navigate, focus, or fly anywhere itself. */\n onSelect?: (object: SimulationSceneObject) => void;\n /** Currently selected object id (highlights the row). Pass `null` for none. */\n selectedId?: string | null;\n\n /** Where to anchor the panel on its parent. Default: `top-left`. */\n position?: \"top-left\" | \"top-right\" | \"bottom-left\" | \"bottom-right\";\n /** Pixel offsets from the anchor. Defaults to (16, 56) so a top bar fits above. */\n offset?: { x?: number; y?: number };\n /** Hide the panel without unmounting (preserves `selectedId` state). */\n hidden?: boolean;\n /** Width in pixels. Default 330. */\n width?: number;\n /** Maximum height (CSS value). Default `'50vh'`. */\n maxHeight?: string | number;\n\n /** Allow the user to collapse / expand the panel. Default true. */\n collapsible?: boolean;\n /** Initial collapsed state. Default false. */\n defaultCollapsed?: boolean;\n\n /** Optional title override. Default: `\"API Objects · N\"`. */\n title?: ReactNode;\n\n /**\n * Optional structure diagnostic block (raw keys + counts from\n * getSimulationStructure). Useful in dev / debug builds; omit in\n * production for a cleaner look.\n */\n structureDiag?: StructureDiag | null;\n /** Optional position-tick diagnostic block. */\n positionTickDiag?: PositionTickDiag | null;\n\n /** Custom labels per kind (defaults: \"Spacecraft\", \"Ground Stations\", \"Celestial Bodies\"). */\n kindLabels?: Partial<Record<ObjectInventoryKind, string>>;\n\n /** Inline style override on the outer container. */\n style?: CSSProperties;\n}\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\n/** Stable short-form of a GUID for inline display. */\nfunction shortId(id: string): string {\n return id.length <= 8 ? id : id.slice(0, 8);\n}\n\nconst DEFAULT_KIND_LABELS: Record<ObjectInventoryKind, string> = {\n spacecraft: \"Spacecraft\",\n groundStation: \"Ground Stations\",\n celestialBody: \"Celestial Bodies\",\n};\n\nconst KIND_ORDER: ObjectInventoryKind[] = [\n \"spacecraft\",\n \"groundStation\",\n \"celestialBody\",\n];\n\n// ─── Component ────────────────────────────────────────────────────────────────\n\nexport const ObjectInventoryPanel = memo(function ObjectInventoryPanel({\n objects,\n onSelect,\n selectedId,\n position = \"top-left\",\n offset,\n hidden = false,\n width = 330,\n maxHeight = \"50vh\",\n collapsible = true,\n defaultCollapsed = false,\n title,\n structureDiag,\n positionTickDiag,\n kindLabels,\n style,\n}: ObjectInventoryPanelProps) {\n const tokens = useThemeTokens();\n const [collapsed, setCollapsed] = useState(defaultCollapsed);\n\n // Optional <SpatialSelectionProvider> integration. When present, the\n // panel uses the shared selection state so other components (3D\n // viewer, GroundTrackMap, etc.) stay synchronised. Explicit props\n // always win — consumers can still override per-instance.\n const ctx = useSpatialSelection();\n const effectiveSelectedId =\n selectedId !== undefined ? selectedId : (ctx?.selectedId ?? null);\n const effectiveOnSelect = useCallback(\n (obj: SimulationSceneObject) => {\n onSelect?.(obj);\n // Also push into the shared context if no explicit onSelect wins it.\n if (!onSelect) ctx?.setSelectedId(obj.id);\n },\n [onSelect, ctx],\n );\n\n const labels = { ...DEFAULT_KIND_LABELS, ...kindLabels };\n const entries = Array.isArray(objects) ? objects : [];\n\n // Position anchor — translate the prop into top/left/right/bottom CSS.\n const offX = offset?.x ?? 16;\n const offY = offset?.y ?? 56;\n const anchor: CSSProperties = (() => {\n switch (position) {\n case \"top-right\":\n return { top: offY, right: offX };\n case \"bottom-left\":\n return { bottom: offY, left: offX };\n case \"bottom-right\":\n return { bottom: offY, right: offX };\n case \"top-left\":\n default:\n return { top: offY, left: offX };\n }\n })();\n\n if (hidden) return null;\n\n const dim: CSSProperties = { opacity: 0.55, fontSize: \"0.9em\" };\n\n return (\n <div\n data-testid=\"zendir-object-inventory\"\n style={{\n position: \"absolute\",\n zIndex: 2,\n width,\n maxHeight,\n overflow: \"auto\",\n padding: tokens.spacing.sm,\n borderRadius: tokens.borderRadius?.md ?? 6,\n border: \"1px solid rgba(255,255,255,0.12)\",\n background: \"rgba(0,0,0,0.72)\",\n color: tokens.colors.text.primary,\n fontSize: tokens.typography.fontSize.xs,\n lineHeight: 1.35,\n ...anchor,\n ...style,\n }}\n >\n <PanelHeader\n title={title ?? `API Objects · ${entries.length}`}\n collapsible={collapsible}\n collapsed={collapsed}\n onToggle={() => setCollapsed((c) => !c)}\n />\n\n {!collapsed && (\n <>\n {KIND_ORDER.map((kind) => {\n const items = entries.filter((o) => o.kind === kind);\n return (\n <ObjectInventoryGroup\n key={kind}\n title={`${labels[kind]} (${items.length})`}\n items={items}\n selectedId={effectiveSelectedId}\n onSelect={\n onSelect != null\n ? onSelect\n : ctx\n ? effectiveOnSelect\n : undefined\n }\n />\n );\n })}\n\n {structureDiag !== undefined && (\n <StructureDiagBlock diag={structureDiag} dim={dim} />\n )}\n\n {positionTickDiag !== undefined && (\n <PositionTickDiagBlock diag={positionTickDiag} dim={dim} />\n )}\n </>\n )}\n </div>\n );\n});\n\n// ─── Sub-components ───────────────────────────────────────────────────────────\n\nconst PanelHeader = ({\n title,\n collapsible,\n collapsed,\n onToggle,\n}: {\n title: ReactNode;\n collapsible: boolean;\n collapsed: boolean;\n onToggle: () => void;\n}) => {\n if (!collapsible) {\n return <div style={{ marginBottom: 6, fontWeight: 600 }}>{title}</div>;\n }\n return (\n <button\n type=\"button\"\n onClick={onToggle}\n aria-expanded={!collapsed}\n style={{\n display: \"flex\",\n width: \"100%\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n marginBottom: 6,\n padding: 0,\n background: \"none\",\n border: \"none\",\n color: \"inherit\",\n font: \"inherit\",\n fontWeight: 600,\n cursor: \"pointer\",\n textAlign: \"left\",\n }}\n >\n <span>{title}</span>\n <span aria-hidden style={{ opacity: 0.7, fontSize: \"0.85em\" }}>\n {collapsed ? \"▸\" : \"▾\"}\n </span>\n </button>\n );\n};\n\nconst ObjectInventoryGroup = ({\n title,\n items,\n selectedId,\n onSelect,\n}: {\n title: string;\n items: SimulationSceneObject[];\n selectedId: string | null;\n onSelect?: (obj: SimulationSceneObject) => void;\n}) => (\n <div style={{ marginBottom: 6 }}>\n <div style={{ opacity: 0.85 }}>{title}</div>\n {items.length === 0 ? (\n <div style={{ opacity: 0.6 }}>—</div>\n ) : (\n items.map((item) => (\n <ObjectRow\n key={item.id}\n object={item}\n selected={item.id === selectedId}\n onSelect={onSelect}\n />\n ))\n )}\n </div>\n);\n\nconst ObjectRow = ({\n object,\n selected,\n onSelect,\n}: {\n object: SimulationSceneObject;\n selected: boolean;\n onSelect?: (obj: SimulationSceneObject) => void;\n}) => {\n const handleClick = useCallback(() => onSelect?.(object), [onSelect, object]);\n const interactive = onSelect != null;\n return (\n <div\n role={interactive ? \"button\" : undefined}\n tabIndex={interactive ? 0 : undefined}\n onClick={interactive ? handleClick : undefined}\n onKeyDown={\n interactive\n ? (e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n handleClick();\n }\n }\n : undefined\n }\n style={{\n opacity: 0.95,\n padding: \"1px 4px\",\n borderRadius: 3,\n cursor: interactive ? \"pointer\" : \"default\",\n background: selected ? \"rgba(255,255,255,0.12)\" : \"transparent\",\n }}\n >\n {object.name} <span style={{ opacity: 0.6 }}>({shortId(object.id)})</span>\n </div>\n );\n};\n\nconst StructureDiagBlock = ({\n diag,\n dim,\n}: {\n diag: StructureDiag | null | undefined;\n dim: CSSProperties;\n}) => (\n <div\n style={{\n marginTop: 8,\n borderTop: \"1px solid rgba(255,255,255,0.1)\",\n paddingTop: 6,\n }}\n >\n {diag ? (\n <>\n <div style={{ ...dim, marginBottom: 2 }}>Raw structure keys:</div>\n <div style={dim}>{diag.topLevelKeys.join(\", \") || \"—\"}</div>\n <div style={{ ...dim, marginTop: 2 }}>\n Objects[]: {diag.rawObjectCount < 0 ? \"absent\" : diag.rawObjectCount}\n {\" · \"}\n Systems[]: {diag.rawSystemCount < 0 ? \"absent\" : diag.rawSystemCount}\n </div>\n </>\n ) : (\n <div style={{ ...dim, marginTop: 4 }}>Waiting for structure…</div>\n )}\n </div>\n);\n\nconst PositionTickDiagBlock = ({\n diag,\n dim,\n}: {\n diag: PositionTickDiag | null | undefined;\n dim: CSSProperties;\n}) => {\n if (!diag) return null;\n return (\n <div\n style={{\n marginTop: 8,\n borderTop: \"1px solid rgba(255,255,255,0.1)\",\n paddingTop: 6,\n }}\n >\n <div style={{ ...dim, marginBottom: 2 }}>Last position tick:</div>\n <div style={dim}>\n ok {diag.parsedOk}/{diag.requested}\n {diag.parseFailed > 0 && ` · parseFail ${diag.parseFailed}`}\n {diag.requestFailed > 0 && ` · reqFail ${diag.requestFailed}`}\n </div>\n <div style={dim}>\n asked for:{\" \"}\n {diag.requestedProps\n ? diag.requestedProps.join(\", \")\n : \"getAllProperties (fallback)\"}\n </div>\n {diag.firstResponseKeys.length > 0 && (\n <div style={{ ...dim, wordBreak: \"break-all\" }}>\n got keys: {diag.firstResponseKeys.slice(0, 12).join(\", \")}\n {diag.firstResponseKeys.length > 12 && \" …\"}\n </div>\n )}\n {diag.firstResponseSample && (\n <div style={{ ...dim, wordBreak: \"break-all\" }}>\n {diag.firstResponseSample}\n </div>\n )}\n </div>\n );\n};\n\n// ─── Companion helper ─────────────────────────────────────────────────────────\n\n/**\n * Sensible default fly-to distance per object kind, for use with\n * `<ZenSpace3D />`'s imperative `focusOn(id, { zoom })` handle.\n *\n * spacecraft: 2 000 000 m (≈ 2 000 km — close orbital view)\n * groundStation: 1 500 000 m (≈ 1 500 km — high-altitude angled view)\n * celestialBody: 50 000 000 m (≈ 50 000 km — full-planet view)\n *\n * Override per call if the consumer wants tighter/looser framing.\n */\nexport function recommendedFlyDistance(kind: ObjectInventoryKind): number {\n switch (kind) {\n case \"spacecraft\":\n return 2_000_000;\n case \"groundStation\":\n return 1_500_000;\n case \"celestialBody\":\n return 50_000_000;\n }\n}\n\nexport default ObjectInventoryPanel;\n"],"mappings":"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"}
@@ -9,7 +9,7 @@
9
9
  * handle and props. Same separation of concerns as `<GroundTrackMap />`'s
10
10
  * `MapLayerDef` pattern — UI here, rendering there.
11
11
  */
12
- export { ObjectInventoryPanel, recommendedFlyDistance } from './ObjectInventoryPanel';
12
+ export { ObjectInventoryPanel, recommendedFlyDistance, } from './ObjectInventoryPanel';
13
13
  export type { ObjectInventoryPanelProps, ObjectInventoryKind, } from './ObjectInventoryPanel';
14
14
  export { LayerControlPanel } from './LayerControlPanel';
15
15
  export type { LayerControlPanelProps, RenderLayers, GroupVisibility, GroupCounts, } from './LayerControlPanel';
@@ -1,8 +1,3 @@
1
1
  import { ObjectInventoryPanel, recommendedFlyDistance } from "./ObjectInventoryPanel.js";
2
2
  import { LayerControlPanel } from "./LayerControlPanel.js";
3
- export {
4
- LayerControlPanel,
5
- ObjectInventoryPanel,
6
- recommendedFlyDistance
7
- };
8
- //# sourceMappingURL=index.js.map
3
+ export { LayerControlPanel, ObjectInventoryPanel, recommendedFlyDistance };
@@ -1,5 +1,4 @@
1
1
  import { default as React, Component, ErrorInfo, ReactNode } from 'react';
2
-
3
2
  export interface ErrorBoundaryProps {
4
3
  /** Custom fallback UI or render function */
5
4
  fallback?: ReactNode | ((error: Error, retry: () => void) => ReactNode);
@@ -59,5 +58,5 @@ export declare class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBo
59
58
  * });
60
59
  * ```
61
60
  */
62
- export declare function withErrorBoundary<P extends object>(Component: React.ComponentType<P>, options?: Omit<ErrorBoundaryProps, 'children'>): React.FC<P>;
61
+ export declare function withErrorBoundary<P extends object>(Component: React.ComponentType<P>, options?: Omit<ErrorBoundaryProps, "children">): React.FC<P>;
63
62
  export {};
@@ -1,142 +1,173 @@
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
- import { jsx, jsxs } from "react/jsx-runtime";
5
- import { Component } from "react";
6
1
  import { getStatusColor } from "../utils/index.js";
7
- class ErrorBoundary extends Component {
8
- constructor(props) {
9
- super(props);
10
- __publicField(this, "handleRetry", () => {
11
- this.setState({ hasError: false, error: null });
12
- });
13
- this.state = { hasError: false, error: null };
14
- }
15
- static getDerivedStateFromError(error) {
16
- return { hasError: true, error };
17
- }
18
- componentDidCatch(error, errorInfo) {
19
- var _a, _b;
20
- (_b = (_a = this.props).onError) == null ? void 0 : _b.call(_a, error, errorInfo);
21
- if (process.env.NODE_ENV === "development") {
22
- console.error("ErrorBoundary caught an error:", error, errorInfo);
23
- }
24
- }
25
- render() {
26
- if (this.state.hasError) {
27
- const { fallback, componentName } = this.props;
28
- const { error } = this.state;
29
- if (typeof fallback === "function" && error) {
30
- return fallback(error, this.handleRetry);
31
- }
32
- if (fallback && typeof fallback !== "function") {
33
- return fallback;
34
- }
35
- return /* @__PURE__ */ jsx(
36
- DefaultErrorFallback,
37
- {
38
- error,
39
- componentName,
40
- onRetry: this.handleRetry
41
- }
42
- );
43
- }
44
- return this.props.children;
45
- }
46
- }
47
- function DefaultErrorFallback({
48
- error,
49
- componentName,
50
- onRetry
51
- }) {
52
- const criticalColor = getStatusColor("critical");
53
- return /* @__PURE__ */ jsxs(
54
- "div",
55
- {
56
- role: "alert",
57
- style: {
58
- display: "flex",
59
- flexDirection: "column",
60
- alignItems: "center",
61
- justifyContent: "center",
62
- padding: 24,
63
- minHeight: 120,
64
- backgroundColor: "var(--color-background-surface, #1b2d3e)",
65
- borderRadius: 8,
66
- border: `1px solid ${criticalColor}40`,
67
- textAlign: "center"
68
- },
69
- children: [
70
- /* @__PURE__ */ jsx(
71
- "svg",
72
- {
73
- viewBox: "0 0 24 24",
74
- fill: criticalColor,
75
- width: "32",
76
- height: "32",
77
- style: { marginBottom: 12, opacity: 0.8 },
78
- children: /* @__PURE__ */ jsx("path", { d: "M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z" })
79
- }
80
- ),
81
- /* @__PURE__ */ jsx(
82
- "h3",
83
- {
84
- style: {
85
- margin: 0,
86
- marginBottom: 8,
87
- fontSize: "0.875rem",
88
- // 14px in rem
89
- fontWeight: 500,
90
- // AstroUXDS medium
91
- color: "var(--color-text-primary, #ffffff)"
92
- },
93
- children: componentName ? `${componentName} Error` : "Something went wrong"
94
- }
95
- ),
96
- /* @__PURE__ */ jsx(
97
- "p",
98
- {
99
- style: {
100
- margin: 0,
101
- marginBottom: 16,
102
- fontSize: 12,
103
- color: "var(--color-text-secondary, #a4abb6)",
104
- maxWidth: 280
105
- },
106
- children: (error == null ? void 0 : error.message) ?? "An unexpected error occurred"
107
- }
108
- ),
109
- /* @__PURE__ */ jsx(
110
- "button",
111
- {
112
- onClick: onRetry,
113
- style: {
114
- padding: "8px 16px",
115
- fontSize: 12,
116
- fontWeight: 500,
117
- color: "#ffffff",
118
- backgroundColor: "var(--color-interactive-default, #4dacff)",
119
- border: "none",
120
- borderRadius: 4,
121
- cursor: "pointer",
122
- transition: "background-color 150ms ease"
123
- },
124
- onMouseEnter: (e) => e.currentTarget.style.backgroundColor = "var(--color-interactive-hover, #92cbff)",
125
- onMouseLeave: (e) => e.currentTarget.style.backgroundColor = "var(--color-interactive-default, #4dacff)",
126
- children: "Try Again"
127
- }
128
- )
129
- ]
130
- }
131
- );
2
+ import { Component } from "react";
3
+ import { jsx, jsxs } from "react/jsx-runtime";
4
+ //#region src/react/shared/ErrorBoundary.tsx
5
+ /**
6
+ * @zendir/ui - ErrorBoundary Component
7
+ *
8
+ * React error boundary that catches JavaScript errors in child components.
9
+ * Prevents white screen of death and displays graceful fallback UI.
10
+ *
11
+ * Features:
12
+ * - Customizable fallback UI
13
+ * - Error callback for logging/reporting
14
+ * - Retry functionality
15
+ * - Accessible error display
16
+ */
17
+ /**
18
+ * ErrorBoundary - Catches and handles component errors gracefully
19
+ *
20
+ * @example
21
+ * ```tsx
22
+ * <ErrorBoundary
23
+ * fallback={<ErrorCard message="Failed to load" />}
24
+ * onError={(error) => logError(error)}
25
+ * >
26
+ * <SpacecraftCard {...props} />
27
+ * </ErrorBoundary>
28
+ * ```
29
+ *
30
+ * @example
31
+ * ```tsx
32
+ * <ErrorBoundary
33
+ * fallback={(error, retry) => (
34
+ * <div>
35
+ * <p>Error: {error.message}</p>
36
+ * <button onClick={retry}>Retry</button>
37
+ * </div>
38
+ * )}
39
+ * >
40
+ * <TelemetryCard {...props} />
41
+ * </ErrorBoundary>
42
+ * ```
43
+ */
44
+ var ErrorBoundary = class extends Component {
45
+ constructor(props) {
46
+ super(props);
47
+ this.state = {
48
+ hasError: false,
49
+ error: null
50
+ };
51
+ }
52
+ static getDerivedStateFromError(error) {
53
+ return {
54
+ hasError: true,
55
+ error
56
+ };
57
+ }
58
+ componentDidCatch(error, errorInfo) {
59
+ this.props.onError?.(error, errorInfo);
60
+ if (process.env.NODE_ENV === "development") console.error("ErrorBoundary caught an error:", error, errorInfo);
61
+ }
62
+ handleRetry = () => {
63
+ this.setState({
64
+ hasError: false,
65
+ error: null
66
+ });
67
+ };
68
+ render() {
69
+ if (this.state.hasError) {
70
+ const { fallback, componentName } = this.props;
71
+ const { error } = this.state;
72
+ if (typeof fallback === "function" && error) return fallback(error, this.handleRetry);
73
+ if (fallback && typeof fallback !== "function") return fallback;
74
+ return /* @__PURE__ */ jsx(DefaultErrorFallback, {
75
+ error,
76
+ componentName,
77
+ onRetry: this.handleRetry
78
+ });
79
+ }
80
+ return this.props.children;
81
+ }
82
+ };
83
+ function DefaultErrorFallback({ error, componentName, onRetry }) {
84
+ const criticalColor = getStatusColor("critical");
85
+ return /* @__PURE__ */ jsxs("div", {
86
+ role: "alert",
87
+ style: {
88
+ display: "flex",
89
+ flexDirection: "column",
90
+ alignItems: "center",
91
+ justifyContent: "center",
92
+ padding: 24,
93
+ minHeight: 120,
94
+ backgroundColor: "var(--zendir-bg-surface, #1b2d3e)",
95
+ borderRadius: 8,
96
+ border: `1px solid ${criticalColor}40`,
97
+ textAlign: "center"
98
+ },
99
+ children: [
100
+ /* @__PURE__ */ jsx("svg", {
101
+ viewBox: "0 0 24 24",
102
+ fill: criticalColor,
103
+ width: "32",
104
+ height: "32",
105
+ style: {
106
+ marginBottom: 12,
107
+ opacity: .8
108
+ },
109
+ children: /* @__PURE__ */ jsx("path", { d: "M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z" })
110
+ }),
111
+ /* @__PURE__ */ jsx("h3", {
112
+ style: {
113
+ margin: 0,
114
+ marginBottom: 8,
115
+ fontSize: "0.875rem",
116
+ fontWeight: 500,
117
+ color: "var(--zendir-text-primary, #ffffff)"
118
+ },
119
+ children: componentName ? `${componentName} Error` : "Something went wrong"
120
+ }),
121
+ /* @__PURE__ */ jsx("p", {
122
+ style: {
123
+ margin: 0,
124
+ marginBottom: 16,
125
+ fontSize: 12,
126
+ color: "var(--zendir-text-secondary, #a4abb6)",
127
+ maxWidth: 280
128
+ },
129
+ children: error?.message ?? "An unexpected error occurred"
130
+ }),
131
+ /* @__PURE__ */ jsx("button", {
132
+ onClick: onRetry,
133
+ style: {
134
+ padding: "8px 16px",
135
+ fontSize: 12,
136
+ fontWeight: 500,
137
+ color: "#ffffff",
138
+ backgroundColor: "var(--zendir-accent-primary, #4dacff)",
139
+ border: "none",
140
+ borderRadius: 4,
141
+ cursor: "pointer",
142
+ transition: "background-color 150ms ease"
143
+ },
144
+ onMouseEnter: (e) => e.currentTarget.style.backgroundColor = "var(--zendir-accent-secondary, #92cbff)",
145
+ onMouseLeave: (e) => e.currentTarget.style.backgroundColor = "var(--zendir-accent-primary, #4dacff)",
146
+ children: "Try Again"
147
+ })
148
+ ]
149
+ });
132
150
  }
133
- function withErrorBoundary(Component2, options = {}) {
134
- const WrappedComponent = (props) => /* @__PURE__ */ jsx(ErrorBoundary, { ...options, children: /* @__PURE__ */ jsx(Component2, { ...props }) });
135
- WrappedComponent.displayName = `WithErrorBoundary(${Component2.displayName ?? Component2.name ?? "Component"})`;
136
- return WrappedComponent;
151
+ /**
152
+ * Wraps a component with an ErrorBoundary
153
+ *
154
+ * @example
155
+ * ```tsx
156
+ * const SafeSpacecraftCard = withErrorBoundary(SpacecraftCard, {
157
+ * componentName: 'SpacecraftCard',
158
+ * onError: (error) => logError(error),
159
+ * });
160
+ * ```
161
+ */
162
+ function withErrorBoundary(Component, options = {}) {
163
+ const WrappedComponent = (props) => /* @__PURE__ */ jsx(ErrorBoundary, {
164
+ ...options,
165
+ children: /* @__PURE__ */ jsx(Component, { ...props })
166
+ });
167
+ WrappedComponent.displayName = `WithErrorBoundary(${Component.displayName ?? Component.name ?? "Component"})`;
168
+ return WrappedComponent;
137
169
  }
138
- export {
139
- ErrorBoundary,
140
- withErrorBoundary
141
- };
142
- //# sourceMappingURL=ErrorBoundary.js.map
170
+ //#endregion
171
+ export { ErrorBoundary, withErrorBoundary };
172
+
173
+ //# sourceMappingURL=ErrorBoundary.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ErrorBoundary.js","sources":["../../../src/react/shared/ErrorBoundary.tsx"],"sourcesContent":["/**\n * @zendir/ui - ErrorBoundary Component\n * \n * React error boundary that catches JavaScript errors in child components.\n * Prevents white screen of death and displays graceful fallback UI.\n * \n * Features:\n * - Customizable fallback UI\n * - Error callback for logging/reporting\n * - Retry functionality\n * - Accessible error display\n */\n\nimport React, { Component, ErrorInfo, ReactNode } from 'react';\nimport { getStatusColor } from '../utils';\n\nexport interface ErrorBoundaryProps {\n /** Custom fallback UI or render function */\n fallback?: ReactNode | ((error: Error, retry: () => void) => ReactNode);\n /** Callback when error is caught */\n onError?: (error: Error, errorInfo: ErrorInfo) => void;\n /** Children to render */\n children: ReactNode;\n /** Component name for error context */\n componentName?: string;\n}\n\ninterface ErrorBoundaryState {\n hasError: boolean;\n error: Error | null;\n}\n\n/**\n * ErrorBoundary - Catches and handles component errors gracefully\n * \n * @example\n * ```tsx\n * <ErrorBoundary \n * fallback={<ErrorCard message=\"Failed to load\" />}\n * onError={(error) => logError(error)}\n * >\n * <SpacecraftCard {...props} />\n * </ErrorBoundary>\n * ```\n * \n * @example\n * ```tsx\n * <ErrorBoundary \n * fallback={(error, retry) => (\n * <div>\n * <p>Error: {error.message}</p>\n * <button onClick={retry}>Retry</button>\n * </div>\n * )}\n * >\n * <TelemetryCard {...props} />\n * </ErrorBoundary>\n * ```\n */\nexport class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = { hasError: false, error: null };\n }\n\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\n return { hasError: true, error };\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo): void {\n this.props.onError?.(error, errorInfo);\n \n // Log to console in development\n if (process.env.NODE_ENV === 'development') {\n console.error('ErrorBoundary caught an error:', error, errorInfo);\n }\n }\n\n handleRetry = (): void => {\n this.setState({ hasError: false, error: null });\n };\n\n render(): ReactNode {\n if (this.state.hasError) {\n const { fallback, componentName } = this.props;\n const { error } = this.state;\n\n // Custom fallback render function\n if (typeof fallback === 'function' && error) {\n return fallback(error, this.handleRetry);\n }\n\n // Custom fallback element (exclude function - already handled above)\n if (fallback && typeof fallback !== 'function') {\n return fallback;\n }\n\n // Default fallback UI\n return (\n <DefaultErrorFallback\n error={error}\n componentName={componentName}\n onRetry={this.handleRetry}\n />\n );\n }\n\n return this.props.children;\n }\n}\n\n// ============================================================================\n// Default Error Fallback\n// ============================================================================\n\ninterface DefaultErrorFallbackProps {\n error: Error | null;\n componentName?: string;\n onRetry: () => void;\n}\n\nfunction DefaultErrorFallback({\n error,\n componentName,\n onRetry,\n}: DefaultErrorFallbackProps): React.ReactElement {\n const criticalColor = getStatusColor('critical');\n\n return (\n <div\n role=\"alert\"\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n padding: 24,\n minHeight: 120,\n backgroundColor: 'var(--color-background-surface, #1b2d3e)',\n borderRadius: 8,\n border: `1px solid ${criticalColor}40`,\n textAlign: 'center',\n }}\n >\n {/* Error icon */}\n <svg\n viewBox=\"0 0 24 24\"\n fill={criticalColor}\n width=\"32\"\n height=\"32\"\n style={{ marginBottom: 12, opacity: 0.8 }}\n >\n <path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z\" />\n </svg>\n\n {/* Error message */}\n <h3\n style={{\n margin: 0,\n marginBottom: 8,\n fontSize: '0.875rem', // 14px in rem\n fontWeight: 500, // AstroUXDS medium\n color: 'var(--color-text-primary, #ffffff)',\n }}\n >\n {componentName ? `${componentName} Error` : 'Something went wrong'}\n </h3>\n\n <p\n style={{\n margin: 0,\n marginBottom: 16,\n fontSize: 12,\n color: 'var(--color-text-secondary, #a4abb6)',\n maxWidth: 280,\n }}\n >\n {error?.message ?? 'An unexpected error occurred'}\n </p>\n\n {/* Retry button */}\n <button\n onClick={onRetry}\n style={{\n padding: '8px 16px',\n fontSize: 12,\n fontWeight: 500,\n color: '#ffffff',\n backgroundColor: 'var(--color-interactive-default, #4dacff)',\n border: 'none',\n borderRadius: 4,\n cursor: 'pointer',\n transition: 'background-color 150ms ease',\n }}\n onMouseEnter={(e) =>\n (e.currentTarget.style.backgroundColor = 'var(--color-interactive-hover, #92cbff)')\n }\n onMouseLeave={(e) =>\n (e.currentTarget.style.backgroundColor = 'var(--color-interactive-default, #4dacff)')\n }\n >\n Try Again\n </button>\n </div>\n );\n}\n\n// ============================================================================\n// Higher-Order Component for Error Boundaries\n// ============================================================================\n\n/**\n * Wraps a component with an ErrorBoundary\n * \n * @example\n * ```tsx\n * const SafeSpacecraftCard = withErrorBoundary(SpacecraftCard, {\n * componentName: 'SpacecraftCard',\n * onError: (error) => logError(error),\n * });\n * ```\n */\nexport function withErrorBoundary<P extends object>(\n Component: React.ComponentType<P>,\n options: Omit<ErrorBoundaryProps, 'children'> = {}\n): React.FC<P> {\n const WrappedComponent: React.FC<P> = (props) => (\n <ErrorBoundary {...options}>\n <Component {...props} />\n </ErrorBoundary>\n );\n\n WrappedComponent.displayName = `WithErrorBoundary(${Component.displayName ?? Component.name ?? 'Component'})`;\n\n return WrappedComponent;\n}\n"],"names":["Component"],"mappings":"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"}
1
+ {"version":3,"file":"ErrorBoundary.js","names":[],"sources":["../../../src/react/shared/ErrorBoundary.tsx"],"sourcesContent":["/**\n * @zendir/ui - ErrorBoundary Component\n *\n * React error boundary that catches JavaScript errors in child components.\n * Prevents white screen of death and displays graceful fallback UI.\n *\n * Features:\n * - Customizable fallback UI\n * - Error callback for logging/reporting\n * - Retry functionality\n * - Accessible error display\n */\n\nimport React, { Component, ErrorInfo, ReactNode } from \"react\";\nimport { getStatusColor } from \"../utils\";\n\nexport interface ErrorBoundaryProps {\n /** Custom fallback UI or render function */\n fallback?: ReactNode | ((error: Error, retry: () => void) => ReactNode);\n /** Callback when error is caught */\n onError?: (error: Error, errorInfo: ErrorInfo) => void;\n /** Children to render */\n children: ReactNode;\n /** Component name for error context */\n componentName?: string;\n}\n\ninterface ErrorBoundaryState {\n hasError: boolean;\n error: Error | null;\n}\n\n/**\n * ErrorBoundary - Catches and handles component errors gracefully\n *\n * @example\n * ```tsx\n * <ErrorBoundary\n * fallback={<ErrorCard message=\"Failed to load\" />}\n * onError={(error) => logError(error)}\n * >\n * <SpacecraftCard {...props} />\n * </ErrorBoundary>\n * ```\n *\n * @example\n * ```tsx\n * <ErrorBoundary\n * fallback={(error, retry) => (\n * <div>\n * <p>Error: {error.message}</p>\n * <button onClick={retry}>Retry</button>\n * </div>\n * )}\n * >\n * <TelemetryCard {...props} />\n * </ErrorBoundary>\n * ```\n */\nexport class ErrorBoundary extends Component<\n ErrorBoundaryProps,\n ErrorBoundaryState\n> {\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = { hasError: false, error: null };\n }\n\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\n return { hasError: true, error };\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo): void {\n this.props.onError?.(error, errorInfo);\n\n // Log to console in development\n if (process.env.NODE_ENV === \"development\") {\n console.error(\"ErrorBoundary caught an error:\", error, errorInfo);\n }\n }\n\n handleRetry = (): void => {\n this.setState({ hasError: false, error: null });\n };\n\n render(): ReactNode {\n if (this.state.hasError) {\n const { fallback, componentName } = this.props;\n const { error } = this.state;\n\n // Custom fallback render function\n if (typeof fallback === \"function\" && error) {\n return fallback(error, this.handleRetry);\n }\n\n // Custom fallback element (exclude function - already handled above)\n if (fallback && typeof fallback !== \"function\") {\n return fallback;\n }\n\n // Default fallback UI\n return (\n <DefaultErrorFallback\n error={error}\n componentName={componentName}\n onRetry={this.handleRetry}\n />\n );\n }\n\n return this.props.children;\n }\n}\n\n// ============================================================================\n// Default Error Fallback\n// ============================================================================\n\ninterface DefaultErrorFallbackProps {\n error: Error | null;\n componentName?: string;\n onRetry: () => void;\n}\n\nfunction DefaultErrorFallback({\n error,\n componentName,\n onRetry,\n}: DefaultErrorFallbackProps): React.ReactElement {\n const criticalColor = getStatusColor(\"critical\");\n\n return (\n <div\n role=\"alert\"\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: 24,\n minHeight: 120,\n backgroundColor: \"var(--zendir-bg-surface, #1b2d3e)\",\n borderRadius: 8,\n border: `1px solid ${criticalColor}40`,\n textAlign: \"center\",\n }}\n >\n {/* Error icon */}\n <svg\n viewBox=\"0 0 24 24\"\n fill={criticalColor}\n width=\"32\"\n height=\"32\"\n style={{ marginBottom: 12, opacity: 0.8 }}\n >\n <path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z\" />\n </svg>\n\n {/* Error message */}\n <h3\n style={{\n margin: 0,\n marginBottom: 8,\n fontSize: \"0.875rem\", // 14px in rem\n fontWeight: 500, // AstroUXDS medium\n color: \"var(--zendir-text-primary, #ffffff)\",\n }}\n >\n {componentName ? `${componentName} Error` : \"Something went wrong\"}\n </h3>\n\n <p\n style={{\n margin: 0,\n marginBottom: 16,\n fontSize: 12,\n color: \"var(--zendir-text-secondary, #a4abb6)\",\n maxWidth: 280,\n }}\n >\n {error?.message ?? \"An unexpected error occurred\"}\n </p>\n\n {/* Retry button */}\n <button\n onClick={onRetry}\n style={{\n padding: \"8px 16px\",\n fontSize: 12,\n fontWeight: 500,\n color: \"#ffffff\",\n backgroundColor: \"var(--zendir-accent-primary, #4dacff)\",\n border: \"none\",\n borderRadius: 4,\n cursor: \"pointer\",\n transition: \"background-color 150ms ease\",\n }}\n onMouseEnter={(e) =>\n (e.currentTarget.style.backgroundColor =\n \"var(--zendir-accent-secondary, #92cbff)\")\n }\n onMouseLeave={(e) =>\n (e.currentTarget.style.backgroundColor =\n \"var(--zendir-accent-primary, #4dacff)\")\n }\n >\n Try Again\n </button>\n </div>\n );\n}\n\n// ============================================================================\n// Higher-Order Component for Error Boundaries\n// ============================================================================\n\n/**\n * Wraps a component with an ErrorBoundary\n *\n * @example\n * ```tsx\n * const SafeSpacecraftCard = withErrorBoundary(SpacecraftCard, {\n * componentName: 'SpacecraftCard',\n * onError: (error) => logError(error),\n * });\n * ```\n */\nexport function withErrorBoundary<P extends object>(\n Component: React.ComponentType<P>,\n options: Omit<ErrorBoundaryProps, \"children\"> = {},\n): React.FC<P> {\n const WrappedComponent: React.FC<P> = (props) => (\n <ErrorBoundary {...options}>\n <Component {...props} />\n </ErrorBoundary>\n );\n\n WrappedComponent.displayName = `WithErrorBoundary(${Component.displayName ?? Component.name ?? \"Component\"})`;\n\n return WrappedComponent;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2DA,IAAa,gBAAb,cAAmC,UAGjC;CACA,YAAY,OAA2B;EACrC,MAAM,KAAK;EACX,KAAK,QAAQ;GAAE,UAAU;GAAO,OAAO;EAAK;CAC9C;CAEA,OAAO,yBAAyB,OAAkC;EAChE,OAAO;GAAE,UAAU;GAAM;EAAM;CACjC;CAEA,kBAAkB,OAAc,WAA4B;EAC1D,KAAK,MAAM,UAAU,OAAO,SAAS;EAGrC,IAAA,QAAA,IAAA,aAA6B,eAC3B,QAAQ,MAAM,kCAAkC,OAAO,SAAS;CAEpE;CAEA,oBAA0B;EACxB,KAAK,SAAS;GAAE,UAAU;GAAO,OAAO;EAAK,CAAC;CAChD;CAEA,SAAoB;EAClB,IAAI,KAAK,MAAM,UAAU;GACvB,MAAM,EAAE,UAAU,kBAAkB,KAAK;GACzC,MAAM,EAAE,UAAU,KAAK;GAGvB,IAAI,OAAO,aAAa,cAAc,OACpC,OAAO,SAAS,OAAO,KAAK,WAAW;GAIzC,IAAI,YAAY,OAAO,aAAa,YAClC,OAAO;GAIT,OACE,oBAAC,sBAAD;IACS;IACQ;IACf,SAAS,KAAK;GACf,CAAA;EAEL;EAEA,OAAO,KAAK,MAAM;CACpB;AACF;AAYA,SAAS,qBAAqB,EAC5B,OACA,eACA,WACgD;CAChD,MAAM,gBAAgB,eAAe,UAAU;CAE/C,OACE,qBAAC,OAAD;EACE,MAAK;EACL,OAAO;GACL,SAAS;GACT,eAAe;GACf,YAAY;GACZ,gBAAgB;GAChB,SAAS;GACT,WAAW;GACX,iBAAiB;GACjB,cAAc;GACd,QAAQ,aAAa,cAAc;GACnC,WAAW;EACb;YAbF;GAgBE,oBAAC,OAAD;IACE,SAAQ;IACR,MAAM;IACN,OAAM;IACN,QAAO;IACP,OAAO;KAAE,cAAc;KAAI,SAAS;IAAI;cAExC,oBAAC,QAAD,EAAM,GAAE,mGAAoG,CAAA;GACzG,CAAA;GAGL,oBAAC,MAAD;IACE,OAAO;KACL,QAAQ;KACR,cAAc;KACd,UAAU;KACV,YAAY;KACZ,OAAO;IACT;cAEC,gBAAgB,GAAG,cAAc,UAAU;GAC1C,CAAA;GAEJ,oBAAC,KAAD;IACE,OAAO;KACL,QAAQ;KACR,cAAc;KACd,UAAU;KACV,OAAO;KACP,UAAU;IACZ;cAEC,OAAO,WAAW;GAClB,CAAA;GAGH,oBAAC,UAAD;IACE,SAAS;IACT,OAAO;KACL,SAAS;KACT,UAAU;KACV,YAAY;KACZ,OAAO;KACP,iBAAiB;KACjB,QAAQ;KACR,cAAc;KACd,QAAQ;KACR,YAAY;IACd;IACA,eAAe,MACZ,EAAE,cAAc,MAAM,kBACrB;IAEJ,eAAe,MACZ,EAAE,cAAc,MAAM,kBACrB;cAEL;GAEO,CAAA;EACL;;AAET;;;;;;;;;;;;AAiBA,SAAgB,kBACd,WACA,UAAgD,CAAC,GACpC;CACb,MAAM,oBAAiC,UACrC,oBAAC,eAAD;EAAe,GAAI;YACjB,oBAAC,WAAD,EAAW,GAAI,MAAQ,CAAA;CACV,CAAA;CAGjB,iBAAiB,cAAc,qBAAqB,UAAU,eAAe,UAAU,QAAQ,YAAY;CAE3G,OAAO;AACT"}
@@ -1,5 +1,4 @@
1
1
  import { default as React } from 'react';
2
-
3
2
  export interface SkeletonTextProps {
4
3
  /** Number of lines to render */
5
4
  lines?: number;
@@ -80,7 +79,7 @@ export interface SkeletonChartProps {
80
79
  /** Chart height */
81
80
  height?: number;
82
81
  /** Chart type visualization */
83
- type?: 'line' | 'bar' | 'area';
82
+ type?: "line" | "bar" | "area";
84
83
  /** Custom className */
85
84
  className?: string;
86
85
  }