@zendir/ui 0.5.0 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (391) hide show
  1. package/CHANGELOG.md +419 -386
  2. package/README.md +640 -631
  3. package/dist/_virtual/_rolldown/runtime.js +13 -0
  4. package/dist/index.js +17 -221
  5. package/dist/react/3d/CesiumCaptureSource.d.ts +0 -1
  6. package/dist/react/3d/CesiumCaptureSource.js +364 -283
  7. package/dist/react/3d/CesiumCaptureSource.js.map +1 -1
  8. package/dist/react/3d/ZenSpace3D.d.ts +2 -3
  9. package/dist/react/3d/ZenSpace3D.js +1681 -1237
  10. package/dist/react/3d/ZenSpace3D.js.map +1 -1
  11. package/dist/react/3d/ZenSpace3DCesium.d.ts +0 -1
  12. package/dist/react/3d/ZenSpace3DCesium.js +513 -560
  13. package/dist/react/3d/ZenSpace3DCesium.js.map +1 -1
  14. package/dist/react/3d/ZenSpace3DShaders.js +61 -66
  15. package/dist/react/3d/ZenSpace3DShaders.js.map +1 -1
  16. package/dist/react/3d/ZenSpace3DTypes.d.ts +19 -20
  17. package/dist/react/3d/ZenSpace3DUtils.d.ts +0 -1
  18. package/dist/react/3d/ZenSpace3DUtils.js +37 -24
  19. package/dist/react/3d/ZenSpace3DUtils.js.map +1 -1
  20. package/dist/react/3d/capturePngAnalysis.js +42 -36
  21. package/dist/react/3d/capturePngAnalysis.js.map +1 -1
  22. package/dist/react/3d/index.d.ts +3 -3
  23. package/dist/react/3d/index.js +5 -53
  24. package/dist/react/3d/threeLoader.d.ts +1 -1
  25. package/dist/react/3d/threeLoader.js +23 -18
  26. package/dist/react/3d/threeLoader.js.map +1 -1
  27. package/dist/react/astro/ClassificationBanner.d.ts +2 -3
  28. package/dist/react/astro/ClassificationBanner.js +95 -79
  29. package/dist/react/astro/ClassificationBanner.js.map +1 -1
  30. package/dist/react/astro/GlobalStatusBar.d.ts +0 -1
  31. package/dist/react/astro/GlobalStatusBar.js +157 -163
  32. package/dist/react/astro/GlobalStatusBar.js.map +1 -1
  33. package/dist/react/astro/MissionClock.d.ts +7 -8
  34. package/dist/react/astro/MissionClock.js +377 -400
  35. package/dist/react/astro/MissionClock.js.map +1 -1
  36. package/dist/react/astro/MonitoringIcon.d.ts +1 -2
  37. package/dist/react/astro/MonitoringIcon.js +422 -358
  38. package/dist/react/astro/MonitoringIcon.js.map +1 -1
  39. package/dist/react/astro/Notification.d.ts +1 -2
  40. package/dist/react/astro/Notification.js +229 -126
  41. package/dist/react/astro/Notification.js.map +1 -1
  42. package/dist/react/astro/Progress.d.ts +0 -1
  43. package/dist/react/astro/Progress.js +199 -141
  44. package/dist/react/astro/Progress.js.map +1 -1
  45. package/dist/react/astro/SimulationControls.d.ts +3 -4
  46. package/dist/react/astro/SimulationControls.js +596 -650
  47. package/dist/react/astro/SimulationControls.js.map +1 -1
  48. package/dist/react/astro/StatusIndicator.d.ts +0 -1
  49. package/dist/react/astro/StatusIndicator.js +236 -170
  50. package/dist/react/astro/StatusIndicator.js.map +1 -1
  51. package/dist/react/astro/UnifiedTimeline.d.ts +9 -10
  52. package/dist/react/astro/UnifiedTimeline.js +2345 -2392
  53. package/dist/react/astro/UnifiedTimeline.js.map +1 -1
  54. package/dist/react/astro/index.d.ts +5 -5
  55. package/dist/react/astro/index.js +1 -25
  56. package/dist/react/cards/AccessCard.d.ts +0 -1
  57. package/dist/react/cards/AccessCard.js +471 -405
  58. package/dist/react/cards/AccessCard.js.map +1 -1
  59. package/dist/react/cards/OrbitCard.d.ts +0 -1
  60. package/dist/react/cards/OrbitCard.js +487 -364
  61. package/dist/react/cards/OrbitCard.js.map +1 -1
  62. package/dist/react/cards/SpacecraftCard.d.ts +0 -1
  63. package/dist/react/cards/SpacecraftCard.js +813 -925
  64. package/dist/react/cards/SpacecraftCard.js.map +1 -1
  65. package/dist/react/cards/TelemetryCard.d.ts +0 -1
  66. package/dist/react/cards/TelemetryCard.js +1055 -732
  67. package/dist/react/cards/TelemetryCard.js.map +1 -1
  68. package/dist/react/cards/TelemetryStreamCard.d.ts +0 -1
  69. package/dist/react/cards/TelemetryStreamCard.js +323 -297
  70. package/dist/react/cards/TelemetryStreamCard.js.map +1 -1
  71. package/dist/react/cards/index.d.ts +1 -1
  72. package/dist/react/cards/index.js +1 -8
  73. package/dist/react/charts/GroundTrackMap.d.ts +6 -7
  74. package/dist/react/charts/GroundTrackMap.js +1377 -1256
  75. package/dist/react/charts/GroundTrackMap.js.map +1 -1
  76. package/dist/react/charts/GroundTrackMapLeaflet.d.ts +1 -2
  77. package/dist/react/charts/GroundTrackMapLeaflet.js +1065 -987
  78. package/dist/react/charts/GroundTrackMapLeaflet.js.map +1 -1
  79. package/dist/react/charts/groundTrackMapLeafletTiles.js +34 -25
  80. package/dist/react/charts/groundTrackMapLeafletTiles.js.map +1 -1
  81. package/dist/react/charts/groundTrackMapLeafletUtils.js +70 -61
  82. package/dist/react/charts/groundTrackMapLeafletUtils.js.map +1 -1
  83. package/dist/react/charts/index.d.ts +1 -1
  84. package/dist/react/charts/index.js +7 -100
  85. package/dist/react/charts/unified/AstroChart.d.ts +1 -2
  86. package/dist/react/charts/unified/AstroChart.js +1331 -1411
  87. package/dist/react/charts/unified/AstroChart.js.map +1 -1
  88. package/dist/react/charts/unified/PowerOverviewChart.d.ts +3 -3
  89. package/dist/react/charts/unified/PowerOverviewChart.js +495 -478
  90. package/dist/react/charts/unified/PowerOverviewChart.js.map +1 -1
  91. package/dist/react/charts/unified/domain.d.ts +12 -13
  92. package/dist/react/charts/unified/domain.js +3999 -3145
  93. package/dist/react/charts/unified/domain.js.map +1 -1
  94. package/dist/react/charts/unified/generators.d.ts +3 -4
  95. package/dist/react/charts/unified/generators.js +561 -498
  96. package/dist/react/charts/unified/generators.js.map +1 -1
  97. package/dist/react/charts/unified/index.d.ts +1 -1
  98. package/dist/react/charts/unified/presets.d.ts +14 -15
  99. package/dist/react/charts/unified/presets.js +857 -994
  100. package/dist/react/charts/unified/presets.js.map +1 -1
  101. package/dist/react/charts/unified/sync.d.ts +2 -3
  102. package/dist/react/charts/unified/sync.js +229 -195
  103. package/dist/react/charts/unified/sync.js.map +1 -1
  104. package/dist/react/charts/unified/theme.d.ts +11 -12
  105. package/dist/react/charts/unified/theme.js +606 -642
  106. package/dist/react/charts/unified/theme.js.map +1 -1
  107. package/dist/react/charts/unified/types.d.ts +32 -33
  108. package/dist/react/charts/unified/useChartStream.d.ts +1 -2
  109. package/dist/react/charts/unified/useChartStream.js +203 -216
  110. package/dist/react/charts/unified/useChartStream.js.map +1 -1
  111. package/dist/react/chatgpt/AppCard.d.ts +1 -2
  112. package/dist/react/chatgpt/index.d.ts +7 -7
  113. package/dist/react/chatgpt/index.js +160 -139
  114. package/dist/react/chatgpt/index.js.map +1 -1
  115. package/dist/react/context/CategoryContext.d.ts +0 -1
  116. package/dist/react/context/CategoryContext.js +78 -29
  117. package/dist/react/context/CategoryContext.js.map +1 -1
  118. package/dist/react/context/DisplaySettingsContext.d.ts +1 -2
  119. package/dist/react/context/DisplaySettingsContext.js +205 -156
  120. package/dist/react/context/DisplaySettingsContext.js.map +1 -1
  121. package/dist/react/context/SpatialSelectionContext.d.ts +0 -1
  122. package/dist/react/context/SpatialSelectionContext.js +36 -7
  123. package/dist/react/context/SpatialSelectionContext.js.map +1 -1
  124. package/dist/react/core/data/DataTable.d.ts +3 -4
  125. package/dist/react/core/data/DataTable.js +473 -440
  126. package/dist/react/core/data/DataTable.js.map +1 -1
  127. package/dist/react/core/data/DataValue.d.ts +4 -5
  128. package/dist/react/core/data/DataValue.js +605 -571
  129. package/dist/react/core/data/DataValue.js.map +1 -1
  130. package/dist/react/core/data/propertyConfig.d.ts +1 -2
  131. package/dist/react/core/data/propertyConfig.js +446 -382
  132. package/dist/react/core/data/propertyConfig.js.map +1 -1
  133. package/dist/react/core/display/AstroIcon.d.ts +4 -5
  134. package/dist/react/core/display/AstroIcon.js +339 -429
  135. package/dist/react/core/display/AstroIcon.js.map +1 -1
  136. package/dist/react/core/display/Badge.d.ts +2 -3
  137. package/dist/react/core/display/Badge.js +131 -131
  138. package/dist/react/core/display/Badge.js.map +1 -1
  139. package/dist/react/core/display/CardHeader.d.ts +0 -1
  140. package/dist/react/core/display/CardHeader.js +398 -311
  141. package/dist/react/core/display/CardHeader.js.map +1 -1
  142. package/dist/react/core/display/Container.d.ts +2 -3
  143. package/dist/react/core/display/Container.js +640 -668
  144. package/dist/react/core/display/Container.js.map +1 -1
  145. package/dist/react/core/display/CopyButton.d.ts +1 -2
  146. package/dist/react/core/display/CopyButton.js +158 -101
  147. package/dist/react/core/display/CopyButton.js.map +1 -1
  148. package/dist/react/core/display/GlassCard.d.ts +3 -4
  149. package/dist/react/core/display/GlassCard.js +416 -369
  150. package/dist/react/core/display/GlassCard.js.map +1 -1
  151. package/dist/react/core/display/HeaderIconWithStatus.d.ts +0 -1
  152. package/dist/react/core/display/HeaderIconWithStatus.js +152 -152
  153. package/dist/react/core/display/HeaderIconWithStatus.js.map +1 -1
  154. package/dist/react/core/display/Icon.d.ts +2 -3
  155. package/dist/react/core/display/Icon.js +172 -143
  156. package/dist/react/core/display/Icon.js.map +1 -1
  157. package/dist/react/core/display/Typography.d.ts +24 -25
  158. package/dist/react/core/display/Typography.js +360 -178
  159. package/dist/react/core/display/Typography.js.map +1 -1
  160. package/dist/react/core/feedback/ConfirmDialog.d.ts +1 -2
  161. package/dist/react/core/feedback/ConfirmDialog.js +343 -304
  162. package/dist/react/core/feedback/ConfirmDialog.js.map +1 -1
  163. package/dist/react/core/feedback/Dialog.d.ts +2 -3
  164. package/dist/react/core/feedback/Dialog.js +189 -197
  165. package/dist/react/core/feedback/Dialog.js.map +1 -1
  166. package/dist/react/core/feedback/Toast.d.ts +2 -3
  167. package/dist/react/core/feedback/Toast.js +346 -207
  168. package/dist/react/core/feedback/Toast.js.map +1 -1
  169. package/dist/react/core/index.d.ts +26 -26
  170. package/dist/react/core/index.js +7 -119
  171. package/dist/react/core/inputs/Button.d.ts +2 -3
  172. package/dist/react/core/inputs/Button.js +281 -304
  173. package/dist/react/core/inputs/Button.js.map +1 -1
  174. package/dist/react/core/inputs/Checkbox.d.ts +2 -3
  175. package/dist/react/core/inputs/Checkbox.js +139 -127
  176. package/dist/react/core/inputs/Checkbox.js.map +1 -1
  177. package/dist/react/core/inputs/Input.d.ts +3 -4
  178. package/dist/react/core/inputs/Input.js +277 -285
  179. package/dist/react/core/inputs/Input.js.map +1 -1
  180. package/dist/react/core/inputs/LimitsBar.d.ts +1 -2
  181. package/dist/react/core/inputs/LimitsBar.js +271 -196
  182. package/dist/react/core/inputs/LimitsBar.js.map +1 -1
  183. package/dist/react/core/inputs/NumberInput.d.ts +2 -3
  184. package/dist/react/core/inputs/NumberInput.js +531 -503
  185. package/dist/react/core/inputs/NumberInput.js.map +1 -1
  186. package/dist/react/core/inputs/PinInput.d.ts +2 -3
  187. package/dist/react/core/inputs/PinInput.js +224 -207
  188. package/dist/react/core/inputs/PinInput.js.map +1 -1
  189. package/dist/react/core/inputs/Select.d.ts +1 -2
  190. package/dist/react/core/inputs/Select.js +298 -299
  191. package/dist/react/core/inputs/Select.js.map +1 -1
  192. package/dist/react/core/inputs/Toggle.d.ts +2 -3
  193. package/dist/react/core/inputs/Toggle.js +142 -148
  194. package/dist/react/core/inputs/Toggle.js.map +1 -1
  195. package/dist/react/core/layout/Box.d.ts +3 -4
  196. package/dist/react/core/layout/Box.js +118 -122
  197. package/dist/react/core/layout/Box.js.map +1 -1
  198. package/dist/react/core/layout/Center.d.ts +0 -1
  199. package/dist/react/core/layout/Center.js +45 -32
  200. package/dist/react/core/layout/Center.js.map +1 -1
  201. package/dist/react/core/layout/Divider.d.ts +1 -2
  202. package/dist/react/core/layout/Divider.js +112 -106
  203. package/dist/react/core/layout/Divider.js.map +1 -1
  204. package/dist/react/core/layout/Flex.d.ts +4 -5
  205. package/dist/react/core/layout/Flex.js +120 -124
  206. package/dist/react/core/layout/Flex.js.map +1 -1
  207. package/dist/react/core/layout/Grid.d.ts +5 -6
  208. package/dist/react/core/layout/Grid.js +131 -138
  209. package/dist/react/core/layout/Grid.js.map +1 -1
  210. package/dist/react/core/layout/Spacer.d.ts +0 -1
  211. package/dist/react/core/layout/Spacer.js +36 -29
  212. package/dist/react/core/layout/Spacer.js.map +1 -1
  213. package/dist/react/core/layout/Stack.d.ts +4 -5
  214. package/dist/react/core/layout/Stack.js +127 -70
  215. package/dist/react/core/layout/Stack.js.map +1 -1
  216. package/dist/react/core/layout/responsive.d.ts +1 -2
  217. package/dist/react/core/layout/responsive.js +25 -19
  218. package/dist/react/core/layout/responsive.js.map +1 -1
  219. package/dist/react/core/layout/useBreakpoint.d.ts +1 -1
  220. package/dist/react/core/layout/useBreakpoint.js +119 -66
  221. package/dist/react/core/layout/useBreakpoint.js.map +1 -1
  222. package/dist/react/core/navigation/AppBar.d.ts +1 -2
  223. package/dist/react/core/navigation/AppBar.js +827 -805
  224. package/dist/react/core/navigation/AppBar.js.map +1 -1
  225. package/dist/react/core/navigation/Pagination.d.ts +2 -3
  226. package/dist/react/core/navigation/Pagination.js +207 -187
  227. package/dist/react/core/navigation/Pagination.js.map +1 -1
  228. package/dist/react/core/navigation/SideNav.d.ts +5 -6
  229. package/dist/react/core/navigation/SideNav.js +855 -629
  230. package/dist/react/core/navigation/SideNav.js.map +1 -1
  231. package/dist/react/core/navigation/Tabs.d.ts +0 -1
  232. package/dist/react/core/navigation/Tabs.js +113 -119
  233. package/dist/react/core/navigation/Tabs.js.map +1 -1
  234. package/dist/react/core/overlays/Popover.d.ts +2 -3
  235. package/dist/react/core/overlays/Popover.js +303 -282
  236. package/dist/react/core/overlays/Popover.js.map +1 -1
  237. package/dist/react/core/overlays/SidePanel.d.ts +1 -2
  238. package/dist/react/core/overlays/SidePanel.js +217 -212
  239. package/dist/react/core/overlays/SidePanel.js.map +1 -1
  240. package/dist/react/core/overlays/Tooltip.d.ts +1 -2
  241. package/dist/react/core/overlays/Tooltip.js +170 -176
  242. package/dist/react/core/overlays/Tooltip.js.map +1 -1
  243. package/dist/react/core/widgets/ActivityPlanner.d.ts +0 -1
  244. package/dist/react/core/widgets/ActivityPlanner.js +855 -517
  245. package/dist/react/core/widgets/ActivityPlanner.js.map +1 -1
  246. package/dist/react/core/widgets/Capture.d.ts +2 -3
  247. package/dist/react/core/widgets/Capture.js +965 -779
  248. package/dist/react/core/widgets/Capture.js.map +1 -1
  249. package/dist/react/core/widgets/ChatPanel.d.ts +16 -17
  250. package/dist/react/core/widgets/ChatPanel.js +1734 -1034
  251. package/dist/react/core/widgets/ChatPanel.js.map +1 -1
  252. package/dist/react/core/widgets/ColorPickerPanel.d.ts +0 -1
  253. package/dist/react/core/widgets/ColorPickerPanel.js +298 -287
  254. package/dist/react/core/widgets/ColorPickerPanel.js.map +1 -1
  255. package/dist/react/core/widgets/CommandBuilder.d.ts +2 -3
  256. package/dist/react/core/widgets/CommandBuilder.js +624 -516
  257. package/dist/react/core/widgets/CommandBuilder.js.map +1 -1
  258. package/dist/react/core/widgets/ConnectionForm.d.ts +2 -3
  259. package/dist/react/core/widgets/ConnectionForm.js +528 -492
  260. package/dist/react/core/widgets/ConnectionForm.js.map +1 -1
  261. package/dist/react/core/widgets/FileExplorer.d.ts +3 -4
  262. package/dist/react/core/widgets/FileExplorer.js +617 -505
  263. package/dist/react/core/widgets/FileExplorer.js.map +1 -1
  264. package/dist/react/core/widgets/HexViewer.d.ts +2 -3
  265. package/dist/react/core/widgets/HexViewer.js +1353 -1091
  266. package/dist/react/core/widgets/HexViewer.js.map +1 -1
  267. package/dist/react/core/widgets/ImageFrame.d.ts +1 -2
  268. package/dist/react/core/widgets/ImageFrame.js +230 -193
  269. package/dist/react/core/widgets/ImageFrame.js.map +1 -1
  270. package/dist/react/core/widgets/ImageGallery.d.ts +2 -1
  271. package/dist/react/core/widgets/ImageGallery.js +380 -314
  272. package/dist/react/core/widgets/ImageGallery.js.map +1 -1
  273. package/dist/react/core/widgets/ImagePanel.d.ts +0 -1
  274. package/dist/react/core/widgets/ImagePanel.js +110 -101
  275. package/dist/react/core/widgets/ImagePanel.js.map +1 -1
  276. package/dist/react/core/widgets/LogViewer.d.ts +2 -3
  277. package/dist/react/core/widgets/LogViewer.js +711 -607
  278. package/dist/react/core/widgets/LogViewer.js.map +1 -1
  279. package/dist/react/core/widgets/MessageStream.d.ts +3 -4
  280. package/dist/react/core/widgets/MessageStream.js +514 -444
  281. package/dist/react/core/widgets/MessageStream.js.map +1 -1
  282. package/dist/react/core/widgets/MissionCalendar.d.ts +3 -4
  283. package/dist/react/core/widgets/MissionCalendar.js +1488 -1020
  284. package/dist/react/core/widgets/MissionCalendar.js.map +1 -1
  285. package/dist/react/core/widgets/PacketViewer.d.ts +2 -3
  286. package/dist/react/core/widgets/PacketViewer.js +550 -421
  287. package/dist/react/core/widgets/PacketViewer.js.map +1 -1
  288. package/dist/react/core/widgets/capture-placeholder.png.js +6 -5
  289. package/dist/react/core/widgets/capture-placeholder.png.js.map +1 -1
  290. package/dist/react/hooks/index.d.ts +5 -5
  291. package/dist/react/hooks/useAccessWindows.d.ts +0 -1
  292. package/dist/react/hooks/useCompactMode.d.ts +1 -1
  293. package/dist/react/hooks/useCompactMode.js +104 -58
  294. package/dist/react/hooks/useCompactMode.js.map +1 -1
  295. package/dist/react/hooks/useGroundTrackHistory.d.ts +0 -1
  296. package/dist/react/hooks/useSimulationScene.d.ts +1 -2
  297. package/dist/react/hooks/useSimulationScene.js +481 -374
  298. package/dist/react/hooks/useSimulationScene.js.map +1 -1
  299. package/dist/react/index.d.ts +3 -3
  300. package/dist/react/panels/LayerControlPanel.d.ts +1 -2
  301. package/dist/react/panels/LayerControlPanel.js +223 -180
  302. package/dist/react/panels/LayerControlPanel.js.map +1 -1
  303. package/dist/react/panels/ObjectInventoryPanel.d.ts +2 -3
  304. package/dist/react/panels/ObjectInventoryPanel.js +315 -250
  305. package/dist/react/panels/ObjectInventoryPanel.js.map +1 -1
  306. package/dist/react/panels/index.d.ts +1 -1
  307. package/dist/react/panels/index.js +1 -6
  308. package/dist/react/shared/ErrorBoundary.d.ts +1 -2
  309. package/dist/react/shared/ErrorBoundary.js +170 -139
  310. package/dist/react/shared/ErrorBoundary.js.map +1 -1
  311. package/dist/react/shared/Skeleton.d.ts +1 -2
  312. package/dist/react/shared/Skeleton.js +300 -301
  313. package/dist/react/shared/Skeleton.js.map +1 -1
  314. package/dist/react/theme/ThemeProvider.d.ts +2 -321
  315. package/dist/react/theme/ThemeProvider.js +313 -939
  316. package/dist/react/theme/ThemeProvider.js.map +1 -1
  317. package/dist/react/theme/cardAccent.d.ts +1 -2
  318. package/dist/react/theme/cardAccent.js +196 -126
  319. package/dist/react/theme/cardAccent.js.map +1 -1
  320. package/dist/react/theme/config.d.ts +0 -1
  321. package/dist/react/theme/config.js +47 -25
  322. package/dist/react/theme/config.js.map +1 -1
  323. package/dist/react/theme/index.d.ts +2 -2
  324. package/dist/react/theme/index.js +1 -16
  325. package/dist/react/theme/types.d.ts +332 -0
  326. package/dist/react/theme/types.js +39 -0
  327. package/dist/react/theme/types.js.map +1 -0
  328. package/dist/react/types.d.ts +8 -8
  329. package/dist/react/types.js +147 -47
  330. package/dist/react/types.js.map +1 -1
  331. package/dist/react/utils/categoryPalette.d.ts +0 -1
  332. package/dist/react/utils/categoryPalette.js +91 -102
  333. package/dist/react/utils/categoryPalette.js.map +1 -1
  334. package/dist/react/utils/index.d.ts +5 -5
  335. package/dist/react/utils/index.js +457 -371
  336. package/dist/react/utils/index.js.map +1 -1
  337. package/dist/react/visualizations/EclipseTimerCard.d.ts +0 -1
  338. package/dist/react/visualizations/LinkBudgetCard.d.ts +0 -1
  339. package/dist/react/visualizations/NavBallCard.d.ts +0 -1
  340. package/dist/react/visualizations/PropulsionCard.d.ts +1 -2
  341. package/dist/react/visualizations/SensorFootprintCard.d.ts +1 -2
  342. package/dist/react/visualizations/ThermalHeatmapCard.d.ts +0 -1
  343. package/dist/react/visualizations/index.d.ts +3 -3
  344. package/dist/react.d.ts +2 -1
  345. package/dist/react.js +17 -221
  346. package/dist/shaders/atmosphere.frag.js +6 -5
  347. package/dist/shaders/atmosphere.frag.js.map +1 -1
  348. package/dist/shaders/atmosphere.vert.js +6 -5
  349. package/dist/shaders/atmosphere.vert.js.map +1 -1
  350. package/dist/shaders/stars.frag.js +6 -5
  351. package/dist/shaders/stars.frag.js.map +1 -1
  352. package/dist/shaders/stars.vert.js +6 -5
  353. package/dist/shaders/stars.vert.js.map +1 -1
  354. package/dist/style.css +26 -3
  355. package/dist/tokens/core.d.ts +159 -0
  356. package/dist/tokens/core.js +144 -0
  357. package/dist/tokens/core.js.map +1 -0
  358. package/dist/tokens/css-vars.d.ts +213 -2
  359. package/dist/tokens/css-vars.js +590 -227
  360. package/dist/tokens/css-vars.js.map +1 -1
  361. package/dist/tokens/index.d.ts +31 -228
  362. package/dist/tokens/index.js +281 -366
  363. package/dist/tokens/index.js.map +1 -1
  364. package/dist/tokens/palettes/astro.d.ts +129 -0
  365. package/dist/tokens/palettes/astro.js +112 -0
  366. package/dist/tokens/palettes/astro.js.map +1 -0
  367. package/dist/tokens/palettes/index.d.ts +288 -0
  368. package/dist/tokens/palettes/index.js +35 -0
  369. package/dist/tokens/palettes/index.js.map +1 -0
  370. package/dist/tokens/palettes/tailwind.d.ts +324 -0
  371. package/dist/tokens/palettes/tailwind.js +201 -0
  372. package/dist/tokens/palettes/tailwind.js.map +1 -0
  373. package/dist/tokens/palettes/zendir.d.ts +126 -0
  374. package/dist/tokens/palettes/zendir.js +92 -0
  375. package/dist/tokens/palettes/zendir.js.map +1 -0
  376. package/dist/tokens/themes.d.ts +30 -0
  377. package/dist/tokens/themes.js +704 -0
  378. package/dist/tokens/themes.js.map +1 -0
  379. package/dist/tokens/tokens.css +533 -155
  380. package/dist/types/index.d.ts +2 -2
  381. package/package.json +310 -313
  382. package/dist/index.js.map +0 -1
  383. package/dist/react/3d/index.js.map +0 -1
  384. package/dist/react/astro/index.js.map +0 -1
  385. package/dist/react/cards/index.js.map +0 -1
  386. package/dist/react/charts/index.js.map +0 -1
  387. package/dist/react/core/index.js.map +0 -1
  388. package/dist/react/panels/index.js.map +0 -1
  389. package/dist/react/theme/astro-tokens.d.ts +0 -153
  390. package/dist/react/theme/index.js.map +0 -1
  391. package/dist/react.js.map +0 -1
@@ -1,219 +1,253 @@
1
- import { useRef, useEffect } from "react";
2
- const syncGroups = /* @__PURE__ */ new Map();
1
+ import { useEffect, useRef } from "react";
2
+ //#region src/react/charts/unified/sync.ts
3
+ /**
4
+ * @zendir/ui - Chart Synchronization Utilities
5
+ *
6
+ * Enables crosshair, tooltip, and zoom synchronization across multiple charts.
7
+ * Useful for dashboard views with related time-series data.
8
+ */
9
+ var syncGroups = /* @__PURE__ */ new Map();
10
+ /**
11
+ * Create or get a sync group
12
+ */
3
13
  function getOrCreateGroup(groupId, options = {}) {
4
- let group = syncGroups.get(groupId);
5
- if (!group) {
6
- group = {
7
- id: groupId,
8
- charts: /* @__PURE__ */ new Set(),
9
- options: {
10
- tooltip: true,
11
- crosshair: true,
12
- zoom: true,
13
- legend: true,
14
- ...options
15
- }
16
- };
17
- syncGroups.set(groupId, group);
18
- }
19
- return group;
14
+ let group = syncGroups.get(groupId);
15
+ if (!group) {
16
+ group = {
17
+ id: groupId,
18
+ charts: /* @__PURE__ */ new Set(),
19
+ options: {
20
+ tooltip: true,
21
+ crosshair: true,
22
+ zoom: true,
23
+ legend: true,
24
+ ...options
25
+ }
26
+ };
27
+ syncGroups.set(groupId, group);
28
+ }
29
+ return group;
20
30
  }
31
+ /**
32
+ * Register a chart with a sync group
33
+ */
21
34
  function registerChart(groupId, chart) {
22
- const group = getOrCreateGroup(groupId);
23
- group.charts.add(chart);
24
- const handlers = setupSyncHandlers(chart, group);
25
- return () => {
26
- handlers.forEach((cleanup) => cleanup());
27
- group.charts.delete(chart);
28
- if (group.charts.size === 0) {
29
- syncGroups.delete(groupId);
30
- }
31
- };
35
+ const group = getOrCreateGroup(groupId);
36
+ group.charts.add(chart);
37
+ const handlers = setupSyncHandlers(chart, group);
38
+ return () => {
39
+ handlers.forEach((cleanup) => cleanup());
40
+ group.charts.delete(chart);
41
+ if (group.charts.size === 0) syncGroups.delete(groupId);
42
+ };
32
43
  }
44
+ /**
45
+ * Setup synchronization event handlers
46
+ */
33
47
  function setupSyncHandlers(sourceChart, group) {
34
- const cleanups = [];
35
- if (group.options.tooltip || group.options.crosshair) {
36
- const handleAxisPointer = (params) => {
37
- const p = params;
38
- group.charts.forEach((chart) => {
39
- if (chart === sourceChart) return;
40
- try {
41
- if (p.axesInfo && p.axesInfo.length > 0) {
42
- const axisInfo = p.axesInfo[0];
43
- chart.dispatchAction({
44
- type: "showTip",
45
- x: axisInfo.value,
46
- seriesIndex: 0
47
- });
48
- } else if (p.dataIndex !== void 0) {
49
- chart.dispatchAction({
50
- type: "showTip",
51
- seriesIndex: p.seriesIndex || 0,
52
- dataIndex: p.dataIndex
53
- });
54
- }
55
- } catch (e) {
56
- }
57
- });
58
- };
59
- const handleMouseOut = () => {
60
- group.charts.forEach((chart) => {
61
- if (chart === sourceChart) return;
62
- try {
63
- chart.dispatchAction({ type: "hideTip" });
64
- } catch (e) {
65
- }
66
- });
67
- };
68
- sourceChart.on("updateAxisPointer", handleAxisPointer);
69
- sourceChart.getZr().on("mouseout", handleMouseOut);
70
- cleanups.push(() => {
71
- var _a;
72
- sourceChart.off("updateAxisPointer", handleAxisPointer);
73
- (_a = sourceChart.getZr()) == null ? void 0 : _a.off("mouseout", handleMouseOut);
74
- });
75
- }
76
- if (group.options.zoom) {
77
- const handleDataZoom = (params) => {
78
- var _a, _b, _c, _d;
79
- const p = params;
80
- const start = ((_b = (_a = p.batch) == null ? void 0 : _a[0]) == null ? void 0 : _b.start) ?? p.start;
81
- const end = ((_d = (_c = p.batch) == null ? void 0 : _c[0]) == null ? void 0 : _d.end) ?? p.end;
82
- if (start === void 0 || end === void 0) return;
83
- group.charts.forEach((chart) => {
84
- if (chart === sourceChart) return;
85
- try {
86
- chart.dispatchAction({
87
- type: "dataZoom",
88
- start,
89
- end
90
- });
91
- } catch (e) {
92
- }
93
- });
94
- };
95
- sourceChart.on("datazoom", handleDataZoom);
96
- cleanups.push(() => sourceChart.off("datazoom", handleDataZoom));
97
- }
98
- if (group.options.legend) {
99
- const handleLegendSelect = (params) => {
100
- const p = params;
101
- group.charts.forEach((chart) => {
102
- if (chart === sourceChart) return;
103
- try {
104
- chart.dispatchAction({
105
- type: "legendToggleSelect",
106
- name: p.name
107
- });
108
- } catch (e) {
109
- }
110
- });
111
- };
112
- sourceChart.on("legendselectchanged", handleLegendSelect);
113
- cleanups.push(() => sourceChart.off("legendselectchanged", handleLegendSelect));
114
- }
115
- return cleanups;
48
+ const cleanups = [];
49
+ if (group.options.tooltip || group.options.crosshair) {
50
+ const handleAxisPointer = (params) => {
51
+ const p = params;
52
+ group.charts.forEach((chart) => {
53
+ if (chart === sourceChart) return;
54
+ try {
55
+ if (p.axesInfo && p.axesInfo.length > 0) {
56
+ const axisInfo = p.axesInfo[0];
57
+ chart.dispatchAction({
58
+ type: "showTip",
59
+ x: axisInfo.value,
60
+ seriesIndex: 0
61
+ });
62
+ } else if (p.dataIndex !== void 0) chart.dispatchAction({
63
+ type: "showTip",
64
+ seriesIndex: p.seriesIndex || 0,
65
+ dataIndex: p.dataIndex
66
+ });
67
+ } catch (e) {}
68
+ });
69
+ };
70
+ const handleMouseOut = () => {
71
+ group.charts.forEach((chart) => {
72
+ if (chart === sourceChart) return;
73
+ try {
74
+ chart.dispatchAction({ type: "hideTip" });
75
+ } catch (e) {}
76
+ });
77
+ };
78
+ sourceChart.on("updateAxisPointer", handleAxisPointer);
79
+ sourceChart.getZr().on("mouseout", handleMouseOut);
80
+ cleanups.push(() => {
81
+ sourceChart.off("updateAxisPointer", handleAxisPointer);
82
+ sourceChart.getZr()?.off("mouseout", handleMouseOut);
83
+ });
84
+ }
85
+ if (group.options.zoom) {
86
+ const handleDataZoom = (params) => {
87
+ const p = params;
88
+ const start = p.batch?.[0]?.start ?? p.start;
89
+ const end = p.batch?.[0]?.end ?? p.end;
90
+ if (start === void 0 || end === void 0) return;
91
+ group.charts.forEach((chart) => {
92
+ if (chart === sourceChart) return;
93
+ try {
94
+ chart.dispatchAction({
95
+ type: "dataZoom",
96
+ start,
97
+ end
98
+ });
99
+ } catch (e) {}
100
+ });
101
+ };
102
+ sourceChart.on("datazoom", handleDataZoom);
103
+ cleanups.push(() => sourceChart.off("datazoom", handleDataZoom));
104
+ }
105
+ if (group.options.legend) {
106
+ const handleLegendSelect = (params) => {
107
+ const p = params;
108
+ group.charts.forEach((chart) => {
109
+ if (chart === sourceChart) return;
110
+ try {
111
+ chart.dispatchAction({
112
+ type: "legendToggleSelect",
113
+ name: p.name
114
+ });
115
+ } catch (e) {}
116
+ });
117
+ };
118
+ sourceChart.on("legendselectchanged", handleLegendSelect);
119
+ cleanups.push(() => sourceChart.off("legendselectchanged", handleLegendSelect));
120
+ }
121
+ return cleanups;
116
122
  }
123
+ /**
124
+ * Hook to synchronize a chart with other charts in the same group
125
+ *
126
+ * @example
127
+ * ```tsx
128
+ * const chartRef = useRef<AstroChartHandle>(null);
129
+ * useChartSync(chartRef, { groupId: 'dashboard-charts' });
130
+ * ```
131
+ */
117
132
  function useChartSync(chartRef, options) {
118
- const { groupId, enabled = true, ..._syncOptions } = options;
119
- const cleanupRef = useRef(null);
120
- useEffect(() => {
121
- var _a;
122
- if (!enabled) return;
123
- const chart = (_a = chartRef.current) == null ? void 0 : _a.getChart();
124
- if (!chart) return;
125
- cleanupRef.current = registerChart(groupId, chart);
126
- return () => {
127
- var _a2;
128
- (_a2 = cleanupRef.current) == null ? void 0 : _a2.call(cleanupRef);
129
- cleanupRef.current = null;
130
- };
131
- }, [chartRef, groupId, enabled]);
133
+ const { groupId, enabled = true, ..._syncOptions } = options;
134
+ const cleanupRef = useRef(null);
135
+ useEffect(() => {
136
+ if (!enabled) return;
137
+ const chart = chartRef.current?.getChart();
138
+ if (!chart) return;
139
+ cleanupRef.current = registerChart(groupId, chart);
140
+ return () => {
141
+ cleanupRef.current?.();
142
+ cleanupRef.current = null;
143
+ };
144
+ }, [
145
+ chartRef,
146
+ groupId,
147
+ enabled
148
+ ]);
132
149
  }
150
+ /**
151
+ * Dispatch action to all charts in a group
152
+ */
133
153
  function dispatchToGroup(groupId, action) {
134
- const group = syncGroups.get(groupId);
135
- if (!group) return;
136
- group.charts.forEach((chart) => {
137
- try {
138
- chart.dispatchAction(action);
139
- } catch (e) {
140
- }
141
- });
154
+ const group = syncGroups.get(groupId);
155
+ if (!group) return;
156
+ group.charts.forEach((chart) => {
157
+ try {
158
+ chart.dispatchAction(action);
159
+ } catch (e) {}
160
+ });
142
161
  }
162
+ /**
163
+ * Sync zoom range across all charts in a group
164
+ */
143
165
  function syncZoomRange(groupId, start, end) {
144
- dispatchToGroup(groupId, { type: "dataZoom", start, end });
166
+ dispatchToGroup(groupId, {
167
+ type: "dataZoom",
168
+ start,
169
+ end
170
+ });
145
171
  }
172
+ /**
173
+ * Reset zoom for all charts in a group
174
+ */
146
175
  function resetGroupZoom(groupId) {
147
- dispatchToGroup(groupId, { type: "dataZoom", start: 0, end: 100 });
176
+ dispatchToGroup(groupId, {
177
+ type: "dataZoom",
178
+ start: 0,
179
+ end: 100
180
+ });
148
181
  }
182
+ /**
183
+ * Show tooltip at specific data index for all charts
184
+ */
149
185
  function showGroupTooltip(groupId, seriesIndex, dataIndex) {
150
- dispatchToGroup(groupId, { type: "showTip", seriesIndex, dataIndex });
186
+ dispatchToGroup(groupId, {
187
+ type: "showTip",
188
+ seriesIndex,
189
+ dataIndex
190
+ });
151
191
  }
192
+ /**
193
+ * Hide tooltip for all charts in a group
194
+ */
152
195
  function hideGroupTooltip(groupId) {
153
- dispatchToGroup(groupId, { type: "hideTip" });
196
+ dispatchToGroup(groupId, { type: "hideTip" });
154
197
  }
198
+ /**
199
+ * Get all chart instances in a group
200
+ */
155
201
  function getGroupCharts(groupId) {
156
- const group = syncGroups.get(groupId);
157
- return group ? Array.from(group.charts) : [];
202
+ const group = syncGroups.get(groupId);
203
+ return group ? Array.from(group.charts) : [];
158
204
  }
205
+ /**
206
+ * Export all charts in a group as images
207
+ */
159
208
  function exportGroupAsImages(groupId, options = {}) {
160
- const { type = "png", pixelRatio = 2, fileName: _fileName = "chart" } = options;
161
- const charts = getGroupCharts(groupId);
162
- return charts.map((chart, _index) => {
163
- return chart.getDataURL({
164
- type,
165
- pixelRatio,
166
- backgroundColor: "transparent"
167
- });
168
- });
209
+ const { type = "png", pixelRatio = 2, fileName: _fileName = "chart" } = options;
210
+ return getGroupCharts(groupId).map((chart, _index) => {
211
+ return chart.getDataURL({
212
+ type,
213
+ pixelRatio,
214
+ backgroundColor: "transparent"
215
+ });
216
+ });
169
217
  }
218
+ /**
219
+ * Export all charts in a group as a combined CSV
220
+ */
170
221
  function exportGroupAsCSV(groupId, options = {}) {
171
- const { includeHeaders = true } = options;
172
- const charts = getGroupCharts(groupId);
173
- const rows = [];
174
- charts.forEach((chart, chartIndex) => {
175
- const option = chart.getOption();
176
- const series = option.series;
177
- if (!series || series.length === 0) return;
178
- if (includeHeaders) {
179
- rows.push([`Chart ${chartIndex + 1}`]);
180
- rows.push(["Index", ...series.map((s) => s.name || `Series ${chartIndex}`)]);
181
- }
182
- const maxLen = Math.max(...series.map((s) => {
183
- var _a;
184
- return ((_a = s.data) == null ? void 0 : _a.length) || 0;
185
- }));
186
- for (let i = 0; i < maxLen; i++) {
187
- const row = [i.toString()];
188
- series.forEach((s) => {
189
- var _a, _b, _c;
190
- const value = (_a = s.data) == null ? void 0 : _a[i];
191
- if (typeof value === "number") {
192
- row.push(value.toString());
193
- } else if (Array.isArray(value)) {
194
- row.push(((_b = value[1]) == null ? void 0 : _b.toString()) || "");
195
- } else if (value && typeof value === "object") {
196
- const v = value;
197
- row.push(((_c = v.value ?? v.y) == null ? void 0 : _c.toString()) || "");
198
- } else {
199
- row.push("");
200
- }
201
- });
202
- rows.push(row);
203
- }
204
- rows.push([]);
205
- });
206
- return rows.map((row) => row.join(",")).join("\n");
222
+ const { includeHeaders = true } = options;
223
+ const charts = getGroupCharts(groupId);
224
+ const rows = [];
225
+ charts.forEach((chart, chartIndex) => {
226
+ const series = chart.getOption().series;
227
+ if (!series || series.length === 0) return;
228
+ if (includeHeaders) {
229
+ rows.push([`Chart ${chartIndex + 1}`]);
230
+ rows.push(["Index", ...series.map((s) => s.name || `Series ${chartIndex}`)]);
231
+ }
232
+ const maxLen = Math.max(...series.map((s) => s.data?.length || 0));
233
+ for (let i = 0; i < maxLen; i++) {
234
+ const row = [i.toString()];
235
+ series.forEach((s) => {
236
+ const value = s.data?.[i];
237
+ if (typeof value === "number") row.push(value.toString());
238
+ else if (Array.isArray(value)) row.push(value[1]?.toString() || "");
239
+ else if (value && typeof value === "object") {
240
+ const v = value;
241
+ row.push((v.value ?? v.y)?.toString() || "");
242
+ } else row.push("");
243
+ });
244
+ rows.push(row);
245
+ }
246
+ rows.push([]);
247
+ });
248
+ return rows.map((row) => row.join(",")).join("\n");
207
249
  }
208
- export {
209
- dispatchToGroup,
210
- exportGroupAsCSV,
211
- exportGroupAsImages,
212
- getGroupCharts,
213
- hideGroupTooltip,
214
- resetGroupZoom,
215
- showGroupTooltip,
216
- syncZoomRange,
217
- useChartSync
218
- };
219
- //# sourceMappingURL=sync.js.map
250
+ //#endregion
251
+ export { dispatchToGroup, exportGroupAsCSV, exportGroupAsImages, getGroupCharts, hideGroupTooltip, resetGroupZoom, showGroupTooltip, syncZoomRange, useChartSync };
252
+
253
+ //# sourceMappingURL=sync.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sync.js","sources":["../../../../src/react/charts/unified/sync.ts"],"sourcesContent":["/**\n * @zendir/ui - Chart Synchronization Utilities\n * \n * Enables crosshair, tooltip, and zoom synchronization across multiple charts.\n * Useful for dashboard views with related time-series data.\n */\n\nimport { useEffect, useRef } from 'react';\nimport type { ECharts } from 'echarts';\nimport type { AstroChartHandle } from './AstroChart';\n\n// =============================================================================\n// Sync Group Manager\n// =============================================================================\n\ninterface SyncGroup {\n id: string;\n charts: Set<ECharts>;\n options: SyncGroupOptions;\n}\n\ninterface SyncGroupOptions {\n /** Sync tooltip position */\n tooltip?: boolean;\n /** Sync crosshair */\n crosshair?: boolean;\n /** Sync zoom/pan */\n zoom?: boolean;\n /** Sync legend selection */\n legend?: boolean;\n}\n\n// Global registry of sync groups\nconst syncGroups = new Map<string, SyncGroup>();\n\n/**\n * Create or get a sync group\n */\nfunction getOrCreateGroup(groupId: string, options: SyncGroupOptions = {}): SyncGroup {\n let group = syncGroups.get(groupId);\n if (!group) {\n group = {\n id: groupId,\n charts: new Set(),\n options: {\n tooltip: true,\n crosshair: true,\n zoom: true,\n legend: true,\n ...options,\n },\n };\n syncGroups.set(groupId, group);\n }\n return group;\n}\n\n/**\n * Register a chart with a sync group\n */\nfunction registerChart(groupId: string, chart: ECharts): () => void {\n const group = getOrCreateGroup(groupId);\n group.charts.add(chart);\n\n // Setup event handlers\n const handlers = setupSyncHandlers(chart, group);\n\n // Return cleanup function\n return () => {\n handlers.forEach(cleanup => cleanup());\n group.charts.delete(chart);\n if (group.charts.size === 0) {\n syncGroups.delete(groupId);\n }\n };\n}\n\n/**\n * Setup synchronization event handlers\n */\nfunction setupSyncHandlers(sourceChart: ECharts, group: SyncGroup): (() => void)[] {\n const cleanups: (() => void)[] = [];\n\n // Tooltip/Crosshair sync\n if (group.options.tooltip || group.options.crosshair) {\n const handleAxisPointer = (params: unknown) => {\n const p = params as { \n axesInfo?: { axisDim: string; value: unknown }[];\n seriesIndex?: number;\n dataIndex?: number;\n };\n \n group.charts.forEach(chart => {\n if (chart === sourceChart) return;\n\n try {\n if (p.axesInfo && p.axesInfo.length > 0) {\n const axisInfo = p.axesInfo[0];\n chart.dispatchAction({\n type: 'showTip',\n x: axisInfo.value as number,\n seriesIndex: 0,\n });\n } else if (p.dataIndex !== undefined) {\n chart.dispatchAction({\n type: 'showTip',\n seriesIndex: p.seriesIndex || 0,\n dataIndex: p.dataIndex,\n });\n }\n } catch (e) {\n // Ignore errors from disposed charts\n }\n });\n };\n\n const handleMouseOut = () => {\n group.charts.forEach(chart => {\n if (chart === sourceChart) return;\n try {\n chart.dispatchAction({ type: 'hideTip' });\n } catch (e) {\n // Ignore\n }\n });\n };\n\n sourceChart.on('updateAxisPointer', handleAxisPointer);\n sourceChart.getZr().on('mouseout', handleMouseOut);\n\n cleanups.push(() => {\n sourceChart.off('updateAxisPointer', handleAxisPointer);\n sourceChart.getZr()?.off('mouseout', handleMouseOut);\n });\n }\n\n // Zoom sync\n if (group.options.zoom) {\n const handleDataZoom = (params: unknown) => {\n const p = params as { \n batch?: { start: number; end: number }[];\n start?: number;\n end?: number;\n };\n \n const start = p.batch?.[0]?.start ?? p.start;\n const end = p.batch?.[0]?.end ?? p.end;\n\n if (start === undefined || end === undefined) return;\n\n group.charts.forEach(chart => {\n if (chart === sourceChart) return;\n try {\n chart.dispatchAction({\n type: 'dataZoom',\n start,\n end,\n });\n } catch (e) {\n // Ignore\n }\n });\n };\n\n sourceChart.on('datazoom', handleDataZoom);\n cleanups.push(() => sourceChart.off('datazoom', handleDataZoom));\n }\n\n // Legend sync\n if (group.options.legend) {\n const handleLegendSelect = (params: unknown) => {\n const p = params as { name: string; selected: Record<string, boolean> };\n \n group.charts.forEach(chart => {\n if (chart === sourceChart) return;\n try {\n chart.dispatchAction({\n type: 'legendToggleSelect',\n name: p.name,\n });\n } catch (e) {\n // Ignore\n }\n });\n };\n\n sourceChart.on('legendselectchanged', handleLegendSelect);\n cleanups.push(() => sourceChart.off('legendselectchanged', handleLegendSelect));\n }\n\n return cleanups;\n}\n\n// =============================================================================\n// React Hook\n// =============================================================================\n\nexport interface UseChartSyncOptions extends SyncGroupOptions {\n /** Sync group ID */\n groupId: string;\n /** Whether sync is enabled */\n enabled?: boolean;\n}\n\n/**\n * Hook to synchronize a chart with other charts in the same group\n * \n * @example\n * ```tsx\n * const chartRef = useRef<AstroChartHandle>(null);\n * useChartSync(chartRef, { groupId: 'dashboard-charts' });\n * ```\n */\nexport function useChartSync(\n chartRef: React.RefObject<AstroChartHandle>,\n options: UseChartSyncOptions\n): void {\n const { groupId, enabled = true, ..._syncOptions } = options;\n const cleanupRef = useRef<(() => void) | null>(null);\n\n useEffect(() => {\n if (!enabled) return;\n\n // Get chart instance\n const chart = chartRef.current?.getChart() as ECharts | undefined;\n if (!chart) return;\n\n // Register with group\n cleanupRef.current = registerChart(groupId, chart);\n\n return () => {\n cleanupRef.current?.();\n cleanupRef.current = null;\n };\n }, [chartRef, groupId, enabled]);\n}\n\n// =============================================================================\n// Programmatic API\n// =============================================================================\n\n/**\n * Dispatch action to all charts in a group\n */\nexport function dispatchToGroup(\n groupId: string, \n action: Parameters<ECharts['dispatchAction']>[0]\n): void {\n const group = syncGroups.get(groupId);\n if (!group) return;\n\n group.charts.forEach(chart => {\n try {\n chart.dispatchAction(action);\n } catch (e) {\n // Ignore disposed charts\n }\n });\n}\n\n/**\n * Sync zoom range across all charts in a group\n */\nexport function syncZoomRange(\n groupId: string,\n start: number,\n end: number\n): void {\n dispatchToGroup(groupId, { type: 'dataZoom', start, end });\n}\n\n/**\n * Reset zoom for all charts in a group\n */\nexport function resetGroupZoom(groupId: string): void {\n dispatchToGroup(groupId, { type: 'dataZoom', start: 0, end: 100 });\n}\n\n/**\n * Show tooltip at specific data index for all charts\n */\nexport function showGroupTooltip(\n groupId: string,\n seriesIndex: number,\n dataIndex: number\n): void {\n dispatchToGroup(groupId, { type: 'showTip', seriesIndex, dataIndex });\n}\n\n/**\n * Hide tooltip for all charts in a group\n */\nexport function hideGroupTooltip(groupId: string): void {\n dispatchToGroup(groupId, { type: 'hideTip' });\n}\n\n/**\n * Get all chart instances in a group\n */\nexport function getGroupCharts(groupId: string): ECharts[] {\n const group = syncGroups.get(groupId);\n return group ? Array.from(group.charts) : [];\n}\n\n// =============================================================================\n// Export Utilities\n// =============================================================================\n\n/**\n * Export all charts in a group as images\n */\nexport function exportGroupAsImages(\n groupId: string,\n options: {\n type?: 'png' | 'svg';\n pixelRatio?: number;\n fileName?: string;\n } = {}\n): string[] {\n const { type = 'png', pixelRatio = 2, fileName: _fileName = 'chart' } = options;\n const charts = getGroupCharts(groupId);\n \n return charts.map((chart, _index) => {\n return chart.getDataURL({\n type,\n pixelRatio,\n backgroundColor: 'transparent',\n });\n });\n}\n\n/**\n * Export all charts in a group as a combined CSV\n */\nexport function exportGroupAsCSV(\n groupId: string,\n options: {\n fileName?: string;\n includeHeaders?: boolean;\n } = {}\n): string {\n const { includeHeaders = true } = options;\n const charts = getGroupCharts(groupId);\n const rows: string[][] = [];\n\n charts.forEach((chart, chartIndex) => {\n const option = chart.getOption();\n const series = option.series as Array<{ name: string; data: unknown[] }>;\n \n if (!series || series.length === 0) return;\n\n // Add chart header\n if (includeHeaders) {\n rows.push([`Chart ${chartIndex + 1}`]);\n rows.push(['Index', ...series.map(s => s.name || `Series ${chartIndex}`)]);\n }\n\n // Find max data length\n const maxLen = Math.max(...series.map(s => s.data?.length || 0));\n\n // Add data rows\n for (let i = 0; i < maxLen; i++) {\n const row = [i.toString()];\n series.forEach(s => {\n const value = s.data?.[i];\n if (typeof value === 'number') {\n row.push(value.toString());\n } else if (Array.isArray(value)) {\n row.push(value[1]?.toString() || '');\n } else if (value && typeof value === 'object') {\n const v = value as { value?: number; y?: number };\n row.push((v.value ?? v.y)?.toString() || '');\n } else {\n row.push('');\n }\n });\n rows.push(row);\n }\n\n rows.push([]); // Empty row between charts\n });\n\n return rows.map(row => row.join(',')).join('\\n');\n}\n"],"names":["_a"],"mappings":"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"}
1
+ {"version":3,"file":"sync.js","names":[],"sources":["../../../../src/react/charts/unified/sync.ts"],"sourcesContent":["/**\r\n * @zendir/ui - Chart Synchronization Utilities\r\n *\r\n * Enables crosshair, tooltip, and zoom synchronization across multiple charts.\r\n * Useful for dashboard views with related time-series data.\r\n */\r\n\r\nimport { useEffect, useRef } from \"react\";\r\nimport type { ECharts } from \"echarts\";\r\nimport type { AstroChartHandle } from \"./AstroChart\";\r\n\r\n// =============================================================================\r\n// Sync Group Manager\r\n// =============================================================================\r\n\r\ninterface SyncGroup {\r\n id: string;\r\n charts: Set<ECharts>;\r\n options: SyncGroupOptions;\r\n}\r\n\r\ninterface SyncGroupOptions {\r\n /** Sync tooltip position */\r\n tooltip?: boolean;\r\n /** Sync crosshair */\r\n crosshair?: boolean;\r\n /** Sync zoom/pan */\r\n zoom?: boolean;\r\n /** Sync legend selection */\r\n legend?: boolean;\r\n}\r\n\r\n// Global registry of sync groups\r\nconst syncGroups = new Map<string, SyncGroup>();\r\n\r\n/**\r\n * Create or get a sync group\r\n */\r\nfunction getOrCreateGroup(\r\n groupId: string,\r\n options: SyncGroupOptions = {},\r\n): SyncGroup {\r\n let group = syncGroups.get(groupId);\r\n if (!group) {\r\n group = {\r\n id: groupId,\r\n charts: new Set(),\r\n options: {\r\n tooltip: true,\r\n crosshair: true,\r\n zoom: true,\r\n legend: true,\r\n ...options,\r\n },\r\n };\r\n syncGroups.set(groupId, group);\r\n }\r\n return group;\r\n}\r\n\r\n/**\r\n * Register a chart with a sync group\r\n */\r\nfunction registerChart(groupId: string, chart: ECharts): () => void {\r\n const group = getOrCreateGroup(groupId);\r\n group.charts.add(chart);\r\n\r\n // Setup event handlers\r\n const handlers = setupSyncHandlers(chart, group);\r\n\r\n // Return cleanup function\r\n return () => {\r\n handlers.forEach((cleanup) => cleanup());\r\n group.charts.delete(chart);\r\n if (group.charts.size === 0) {\r\n syncGroups.delete(groupId);\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * Setup synchronization event handlers\r\n */\r\nfunction setupSyncHandlers(\r\n sourceChart: ECharts,\r\n group: SyncGroup,\r\n): (() => void)[] {\r\n const cleanups: (() => void)[] = [];\r\n\r\n // Tooltip/Crosshair sync\r\n if (group.options.tooltip || group.options.crosshair) {\r\n const handleAxisPointer = (params: unknown) => {\r\n const p = params as {\r\n axesInfo?: { axisDim: string; value: unknown }[];\r\n seriesIndex?: number;\r\n dataIndex?: number;\r\n };\r\n\r\n group.charts.forEach((chart) => {\r\n if (chart === sourceChart) return;\r\n\r\n try {\r\n if (p.axesInfo && p.axesInfo.length > 0) {\r\n const axisInfo = p.axesInfo[0];\r\n chart.dispatchAction({\r\n type: \"showTip\",\r\n x: axisInfo.value as number,\r\n seriesIndex: 0,\r\n });\r\n } else if (p.dataIndex !== undefined) {\r\n chart.dispatchAction({\r\n type: \"showTip\",\r\n seriesIndex: p.seriesIndex || 0,\r\n dataIndex: p.dataIndex,\r\n });\r\n }\r\n } catch (e) {\r\n // Ignore errors from disposed charts\r\n }\r\n });\r\n };\r\n\r\n const handleMouseOut = () => {\r\n group.charts.forEach((chart) => {\r\n if (chart === sourceChart) return;\r\n try {\r\n chart.dispatchAction({ type: \"hideTip\" });\r\n } catch (e) {\r\n // Ignore\r\n }\r\n });\r\n };\r\n\r\n sourceChart.on(\"updateAxisPointer\", handleAxisPointer);\r\n sourceChart.getZr().on(\"mouseout\", handleMouseOut);\r\n\r\n cleanups.push(() => {\r\n sourceChart.off(\"updateAxisPointer\", handleAxisPointer);\r\n sourceChart.getZr()?.off(\"mouseout\", handleMouseOut);\r\n });\r\n }\r\n\r\n // Zoom sync\r\n if (group.options.zoom) {\r\n const handleDataZoom = (params: unknown) => {\r\n const p = params as {\r\n batch?: { start: number; end: number }[];\r\n start?: number;\r\n end?: number;\r\n };\r\n\r\n const start = p.batch?.[0]?.start ?? p.start;\r\n const end = p.batch?.[0]?.end ?? p.end;\r\n\r\n if (start === undefined || end === undefined) return;\r\n\r\n group.charts.forEach((chart) => {\r\n if (chart === sourceChart) return;\r\n try {\r\n chart.dispatchAction({\r\n type: \"dataZoom\",\r\n start,\r\n end,\r\n });\r\n } catch (e) {\r\n // Ignore\r\n }\r\n });\r\n };\r\n\r\n sourceChart.on(\"datazoom\", handleDataZoom);\r\n cleanups.push(() => sourceChart.off(\"datazoom\", handleDataZoom));\r\n }\r\n\r\n // Legend sync\r\n if (group.options.legend) {\r\n const handleLegendSelect = (params: unknown) => {\r\n const p = params as { name: string; selected: Record<string, boolean> };\r\n\r\n group.charts.forEach((chart) => {\r\n if (chart === sourceChart) return;\r\n try {\r\n chart.dispatchAction({\r\n type: \"legendToggleSelect\",\r\n name: p.name,\r\n });\r\n } catch (e) {\r\n // Ignore\r\n }\r\n });\r\n };\r\n\r\n sourceChart.on(\"legendselectchanged\", handleLegendSelect);\r\n cleanups.push(() =>\r\n sourceChart.off(\"legendselectchanged\", handleLegendSelect),\r\n );\r\n }\r\n\r\n return cleanups;\r\n}\r\n\r\n// =============================================================================\r\n// React Hook\r\n// =============================================================================\r\n\r\nexport interface UseChartSyncOptions extends SyncGroupOptions {\r\n /** Sync group ID */\r\n groupId: string;\r\n /** Whether sync is enabled */\r\n enabled?: boolean;\r\n}\r\n\r\n/**\r\n * Hook to synchronize a chart with other charts in the same group\r\n *\r\n * @example\r\n * ```tsx\r\n * const chartRef = useRef<AstroChartHandle>(null);\r\n * useChartSync(chartRef, { groupId: 'dashboard-charts' });\r\n * ```\r\n */\r\nexport function useChartSync(\r\n chartRef: React.RefObject<AstroChartHandle>,\r\n options: UseChartSyncOptions,\r\n): void {\r\n const { groupId, enabled = true, ..._syncOptions } = options;\r\n const cleanupRef = useRef<(() => void) | null>(null);\r\n\r\n useEffect(() => {\r\n if (!enabled) return;\r\n\r\n // Get chart instance\r\n const chart = chartRef.current?.getChart() as ECharts | undefined;\r\n if (!chart) return;\r\n\r\n // Register with group\r\n cleanupRef.current = registerChart(groupId, chart);\r\n\r\n return () => {\r\n cleanupRef.current?.();\r\n cleanupRef.current = null;\r\n };\r\n }, [chartRef, groupId, enabled]);\r\n}\r\n\r\n// =============================================================================\r\n// Programmatic API\r\n// =============================================================================\r\n\r\n/**\r\n * Dispatch action to all charts in a group\r\n */\r\nexport function dispatchToGroup(\r\n groupId: string,\r\n action: Parameters<ECharts[\"dispatchAction\"]>[0],\r\n): void {\r\n const group = syncGroups.get(groupId);\r\n if (!group) return;\r\n\r\n group.charts.forEach((chart) => {\r\n try {\r\n chart.dispatchAction(action);\r\n } catch (e) {\r\n // Ignore disposed charts\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Sync zoom range across all charts in a group\r\n */\r\nexport function syncZoomRange(\r\n groupId: string,\r\n start: number,\r\n end: number,\r\n): void {\r\n dispatchToGroup(groupId, { type: \"dataZoom\", start, end });\r\n}\r\n\r\n/**\r\n * Reset zoom for all charts in a group\r\n */\r\nexport function resetGroupZoom(groupId: string): void {\r\n dispatchToGroup(groupId, { type: \"dataZoom\", start: 0, end: 100 });\r\n}\r\n\r\n/**\r\n * Show tooltip at specific data index for all charts\r\n */\r\nexport function showGroupTooltip(\r\n groupId: string,\r\n seriesIndex: number,\r\n dataIndex: number,\r\n): void {\r\n dispatchToGroup(groupId, { type: \"showTip\", seriesIndex, dataIndex });\r\n}\r\n\r\n/**\r\n * Hide tooltip for all charts in a group\r\n */\r\nexport function hideGroupTooltip(groupId: string): void {\r\n dispatchToGroup(groupId, { type: \"hideTip\" });\r\n}\r\n\r\n/**\r\n * Get all chart instances in a group\r\n */\r\nexport function getGroupCharts(groupId: string): ECharts[] {\r\n const group = syncGroups.get(groupId);\r\n return group ? Array.from(group.charts) : [];\r\n}\r\n\r\n// =============================================================================\r\n// Export Utilities\r\n// =============================================================================\r\n\r\n/**\r\n * Export all charts in a group as images\r\n */\r\nexport function exportGroupAsImages(\r\n groupId: string,\r\n options: {\r\n type?: \"png\" | \"svg\";\r\n pixelRatio?: number;\r\n fileName?: string;\r\n } = {},\r\n): string[] {\r\n const {\r\n type = \"png\",\r\n pixelRatio = 2,\r\n fileName: _fileName = \"chart\",\r\n } = options;\r\n const charts = getGroupCharts(groupId);\r\n\r\n return charts.map((chart, _index) => {\r\n return chart.getDataURL({\r\n type,\r\n pixelRatio,\r\n backgroundColor: \"transparent\",\r\n });\r\n });\r\n}\r\n\r\n/**\r\n * Export all charts in a group as a combined CSV\r\n */\r\nexport function exportGroupAsCSV(\r\n groupId: string,\r\n options: {\r\n fileName?: string;\r\n includeHeaders?: boolean;\r\n } = {},\r\n): string {\r\n const { includeHeaders = true } = options;\r\n const charts = getGroupCharts(groupId);\r\n const rows: string[][] = [];\r\n\r\n charts.forEach((chart, chartIndex) => {\r\n const option = chart.getOption();\r\n const series = option.series as Array<{ name: string; data: unknown[] }>;\r\n\r\n if (!series || series.length === 0) return;\r\n\r\n // Add chart header\r\n if (includeHeaders) {\r\n rows.push([`Chart ${chartIndex + 1}`]);\r\n rows.push([\r\n \"Index\",\r\n ...series.map((s) => s.name || `Series ${chartIndex}`),\r\n ]);\r\n }\r\n\r\n // Find max data length\r\n const maxLen = Math.max(...series.map((s) => s.data?.length || 0));\r\n\r\n // Add data rows\r\n for (let i = 0; i < maxLen; i++) {\r\n const row = [i.toString()];\r\n series.forEach((s) => {\r\n const value = s.data?.[i];\r\n if (typeof value === \"number\") {\r\n row.push(value.toString());\r\n } else if (Array.isArray(value)) {\r\n row.push(value[1]?.toString() || \"\");\r\n } else if (value && typeof value === \"object\") {\r\n const v = value as { value?: number; y?: number };\r\n row.push((v.value ?? v.y)?.toString() || \"\");\r\n } else {\r\n row.push(\"\");\r\n }\r\n });\r\n rows.push(row);\r\n }\r\n\r\n rows.push([]); // Empty row between charts\r\n });\r\n\r\n return rows.map((row) => row.join(\",\")).join(\"\\n\");\r\n}\r\n"],"mappings":";;;;;;;;AAiCA,IAAM,6BAAa,IAAI,IAAuB;;;;AAK9C,SAAS,iBACP,SACA,UAA4B,CAAC,GAClB;CACX,IAAI,QAAQ,WAAW,IAAI,OAAO;CAClC,IAAI,CAAC,OAAO;EACV,QAAQ;GACN,IAAI;GACJ,wBAAQ,IAAI,IAAI;GAChB,SAAS;IACP,SAAS;IACT,WAAW;IACX,MAAM;IACN,QAAQ;IACR,GAAG;GACL;EACF;EACA,WAAW,IAAI,SAAS,KAAK;CAC/B;CACA,OAAO;AACT;;;;AAKA,SAAS,cAAc,SAAiB,OAA4B;CAClE,MAAM,QAAQ,iBAAiB,OAAO;CACtC,MAAM,OAAO,IAAI,KAAK;CAGtB,MAAM,WAAW,kBAAkB,OAAO,KAAK;CAG/C,aAAa;EACX,SAAS,SAAS,YAAY,QAAQ,CAAC;EACvC,MAAM,OAAO,OAAO,KAAK;EACzB,IAAI,MAAM,OAAO,SAAS,GACxB,WAAW,OAAO,OAAO;CAE7B;AACF;;;;AAKA,SAAS,kBACP,aACA,OACgB;CAChB,MAAM,WAA2B,CAAC;CAGlC,IAAI,MAAM,QAAQ,WAAW,MAAM,QAAQ,WAAW;EACpD,MAAM,qBAAqB,WAAoB;GAC7C,MAAM,IAAI;GAMV,MAAM,OAAO,SAAS,UAAU;IAC9B,IAAI,UAAU,aAAa;IAE3B,IAAI;KACF,IAAI,EAAE,YAAY,EAAE,SAAS,SAAS,GAAG;MACvC,MAAM,WAAW,EAAE,SAAS;MAC5B,MAAM,eAAe;OACnB,MAAM;OACN,GAAG,SAAS;OACZ,aAAa;MACf,CAAC;KACH,OAAO,IAAI,EAAE,cAAc,KAAA,GACzB,MAAM,eAAe;MACnB,MAAM;MACN,aAAa,EAAE,eAAe;MAC9B,WAAW,EAAE;KACf,CAAC;IAEL,SAAS,GAAG,CAEZ;GACF,CAAC;EACH;EAEA,MAAM,uBAAuB;GAC3B,MAAM,OAAO,SAAS,UAAU;IAC9B,IAAI,UAAU,aAAa;IAC3B,IAAI;KACF,MAAM,eAAe,EAAE,MAAM,UAAU,CAAC;IAC1C,SAAS,GAAG,CAEZ;GACF,CAAC;EACH;EAEA,YAAY,GAAG,qBAAqB,iBAAiB;EACrD,YAAY,MAAM,CAAC,CAAC,GAAG,YAAY,cAAc;EAEjD,SAAS,WAAW;GAClB,YAAY,IAAI,qBAAqB,iBAAiB;GACtD,YAAY,MAAM,CAAC,EAAE,IAAI,YAAY,cAAc;EACrD,CAAC;CACH;CAGA,IAAI,MAAM,QAAQ,MAAM;EACtB,MAAM,kBAAkB,WAAoB;GAC1C,MAAM,IAAI;GAMV,MAAM,QAAQ,EAAE,QAAQ,EAAE,EAAE,SAAS,EAAE;GACvC,MAAM,MAAM,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE;GAEnC,IAAI,UAAU,KAAA,KAAa,QAAQ,KAAA,GAAW;GAE9C,MAAM,OAAO,SAAS,UAAU;IAC9B,IAAI,UAAU,aAAa;IAC3B,IAAI;KACF,MAAM,eAAe;MACnB,MAAM;MACN;MACA;KACF,CAAC;IACH,SAAS,GAAG,CAEZ;GACF,CAAC;EACH;EAEA,YAAY,GAAG,YAAY,cAAc;EACzC,SAAS,WAAW,YAAY,IAAI,YAAY,cAAc,CAAC;CACjE;CAGA,IAAI,MAAM,QAAQ,QAAQ;EACxB,MAAM,sBAAsB,WAAoB;GAC9C,MAAM,IAAI;GAEV,MAAM,OAAO,SAAS,UAAU;IAC9B,IAAI,UAAU,aAAa;IAC3B,IAAI;KACF,MAAM,eAAe;MACnB,MAAM;MACN,MAAM,EAAE;KACV,CAAC;IACH,SAAS,GAAG,CAEZ;GACF,CAAC;EACH;EAEA,YAAY,GAAG,uBAAuB,kBAAkB;EACxD,SAAS,WACP,YAAY,IAAI,uBAAuB,kBAAkB,CAC3D;CACF;CAEA,OAAO;AACT;;;;;;;;;;AAsBA,SAAgB,aACd,UACA,SACM;CACN,MAAM,EAAE,SAAS,UAAU,MAAM,GAAG,iBAAiB;CACrD,MAAM,aAAa,OAA4B,IAAI;CAEnD,gBAAgB;EACd,IAAI,CAAC,SAAS;EAGd,MAAM,QAAQ,SAAS,SAAS,SAAS;EACzC,IAAI,CAAC,OAAO;EAGZ,WAAW,UAAU,cAAc,SAAS,KAAK;EAEjD,aAAa;GACX,WAAW,UAAU;GACrB,WAAW,UAAU;EACvB;CACF,GAAG;EAAC;EAAU;EAAS;CAAO,CAAC;AACjC;;;;AASA,SAAgB,gBACd,SACA,QACM;CACN,MAAM,QAAQ,WAAW,IAAI,OAAO;CACpC,IAAI,CAAC,OAAO;CAEZ,MAAM,OAAO,SAAS,UAAU;EAC9B,IAAI;GACF,MAAM,eAAe,MAAM;EAC7B,SAAS,GAAG,CAEZ;CACF,CAAC;AACH;;;;AAKA,SAAgB,cACd,SACA,OACA,KACM;CACN,gBAAgB,SAAS;EAAE,MAAM;EAAY;EAAO;CAAI,CAAC;AAC3D;;;;AAKA,SAAgB,eAAe,SAAuB;CACpD,gBAAgB,SAAS;EAAE,MAAM;EAAY,OAAO;EAAG,KAAK;CAAI,CAAC;AACnE;;;;AAKA,SAAgB,iBACd,SACA,aACA,WACM;CACN,gBAAgB,SAAS;EAAE,MAAM;EAAW;EAAa;CAAU,CAAC;AACtE;;;;AAKA,SAAgB,iBAAiB,SAAuB;CACtD,gBAAgB,SAAS,EAAE,MAAM,UAAU,CAAC;AAC9C;;;;AAKA,SAAgB,eAAe,SAA4B;CACzD,MAAM,QAAQ,WAAW,IAAI,OAAO;CACpC,OAAO,QAAQ,MAAM,KAAK,MAAM,MAAM,IAAI,CAAC;AAC7C;;;;AASA,SAAgB,oBACd,SACA,UAII,CAAC,GACK;CACV,MAAM,EACJ,OAAO,OACP,aAAa,GACb,UAAU,YAAY,YACpB;CAGJ,OAFe,eAAe,OAEvB,CAAA,CAAO,KAAK,OAAO,WAAW;EACnC,OAAO,MAAM,WAAW;GACtB;GACA;GACA,iBAAiB;EACnB,CAAC;CACH,CAAC;AACH;;;;AAKA,SAAgB,iBACd,SACA,UAGI,CAAC,GACG;CACR,MAAM,EAAE,iBAAiB,SAAS;CAClC,MAAM,SAAS,eAAe,OAAO;CACrC,MAAM,OAAmB,CAAC;CAE1B,OAAO,SAAS,OAAO,eAAe;EAEpC,MAAM,SADS,MAAM,UACN,CAAA,CAAO;EAEtB,IAAI,CAAC,UAAU,OAAO,WAAW,GAAG;EAGpC,IAAI,gBAAgB;GAClB,KAAK,KAAK,CAAC,SAAS,aAAa,GAAG,CAAC;GACrC,KAAK,KAAK,CACR,SACA,GAAG,OAAO,KAAK,MAAM,EAAE,QAAQ,UAAU,YAAY,CACvD,CAAC;EACH;EAGA,MAAM,SAAS,KAAK,IAAI,GAAG,OAAO,KAAK,MAAM,EAAE,MAAM,UAAU,CAAC,CAAC;EAGjE,KAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,KAAK;GAC/B,MAAM,MAAM,CAAC,EAAE,SAAS,CAAC;GACzB,OAAO,SAAS,MAAM;IACpB,MAAM,QAAQ,EAAE,OAAO;IACvB,IAAI,OAAO,UAAU,UACnB,IAAI,KAAK,MAAM,SAAS,CAAC;SACpB,IAAI,MAAM,QAAQ,KAAK,GAC5B,IAAI,KAAK,MAAM,EAAE,EAAE,SAAS,KAAK,EAAE;SAC9B,IAAI,SAAS,OAAO,UAAU,UAAU;KAC7C,MAAM,IAAI;KACV,IAAI,MAAM,EAAE,SAAS,EAAE,EAAA,EAAI,SAAS,KAAK,EAAE;IAC7C,OACE,IAAI,KAAK,EAAE;GAEf,CAAC;GACD,KAAK,KAAK,GAAG;EACf;EAEA,KAAK,KAAK,CAAC,CAAC;CACd,CAAC;CAED,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI;AACnD"}
@@ -1,5 +1,4 @@
1
1
  import { ThemeTokens, ThemeMode, ThemeVariant } from '../../theme';
2
-
3
2
  /**
4
3
  * Zendir Brand Colors (from Brand Guide v2026)
5
4
  * Core: Electric (#3E3CFF), Purple (#9D70FF), Prussian Blue (#1B2DA0)
@@ -76,22 +75,22 @@ export declare const ASTRO_DATA_VIZ_COLORS: {
76
75
  *
77
76
  * NOTE: Status colors (green, yellow, red) reserved for status indication only
78
77
  */
79
- mixed: ("#3E3CFF" | "#9D70FF" | "#6B69FF" | "#B48DFF" | "#3548C0" | "#9997FF" | "#C9A8FF" | "#1B2DA0" | "#3230CC" | "#7E5ACC" | "#4A5FD6")[];
78
+ mixed: ("#3E3CFF" | "#1B2DA0" | "#9D70FF" | "#6B69FF" | "#B48DFF" | "#3548C0" | "#9997FF" | "#C9A8FF" | "#3230CC" | "#7E5ACC" | "#4A5FD6")[];
80
79
  /**
81
80
  * Zendir Brand palette - Full brand spectrum
82
81
  * Complete set of Zendir brand colors for maximum brand expression
83
82
  */
84
- zendir: ("#3E3CFF" | "#9D70FF" | "#6B69FF" | "#B48DFF" | "#3548C0" | "#9997FF" | "#C9A8FF" | "#1B2DA0")[];
83
+ zendir: ("#3E3CFF" | "#1B2DA0" | "#9D70FF" | "#6B69FF" | "#B48DFF" | "#3548C0" | "#9997FF" | "#C9A8FF")[];
85
84
  /**
86
85
  * Extended Zendir palette - All shades for complex visualizations
87
86
  * Includes dark and light variants for maximum differentiation
88
87
  */
89
- zendirExtended: ("#3E3CFF" | "#9D70FF" | "#6B69FF" | "#B48DFF" | "#3548C0" | "#9997FF" | "#C9A8FF" | "#1B2DA0" | "#3230CC" | "#7E5ACC" | "#142380")[];
88
+ zendirExtended: ("#3E3CFF" | "#1B2DA0" | "#9D70FF" | "#6B69FF" | "#B48DFF" | "#3548C0" | "#9997FF" | "#C9A8FF" | "#3230CC" | "#7E5ACC" | "#142380")[];
90
89
  /**
91
90
  * Cool palette - Blues and purples
92
91
  * Professional Zendir-branded cool tones
93
92
  */
94
- cool: ("#3E3CFF" | "#9D70FF" | "#6B69FF" | "#B48DFF" | "#3548C0" | "#9997FF" | "#1B2DA0" | "#4A5FD6")[];
93
+ cool: ("#3E3CFF" | "#1B2DA0" | "#9D70FF" | "#6B69FF" | "#B48DFF" | "#3548C0" | "#9997FF" | "#4A5FD6")[];
95
94
  /**
96
95
  * Warm accent palette - For charts needing warm tones
97
96
  * Use sparingly - not part of Zendir brand
@@ -106,12 +105,12 @@ export declare const ASTRO_DATA_VIZ_COLORS: {
106
105
  * Prussian-Electric gradient palette
107
106
  * Deep to vibrant brand progression
108
107
  */
109
- prussianElectric: ("#3E3CFF" | "#6B69FF" | "#3548C0" | "#1B2DA0" | "#3230CC" | "#142380")[];
108
+ prussianElectric: ("#3E3CFF" | "#1B2DA0" | "#6B69FF" | "#3548C0" | "#3230CC" | "#142380")[];
110
109
  /**
111
110
  * Full Zendir spectrum gradient
112
111
  * Prussian Blue → Electric → Purple
113
112
  */
114
- zendirSpectrum: ("#3E3CFF" | "#9D70FF" | "#6B69FF" | "#B48DFF" | "#3548C0" | "#1B2DA0")[];
113
+ zendirSpectrum: ("#3E3CFF" | "#1B2DA0" | "#9D70FF" | "#6B69FF" | "#B48DFF" | "#3548C0")[];
115
114
  /**
116
115
  * Sequential palettes for heatmaps and gradual data
117
116
  * Zendir brand-forward gradients
@@ -384,7 +383,7 @@ export declare function getStatusColor(value: number, thresholds: {
384
383
  * const brandColor = getSeriesColor(0, ASTRO_DATA_VIZ_COLORS.zendir);
385
384
  * ```
386
385
  */
387
- export declare function getSeriesColor(index: number, palette?: ("#3E3CFF" | "#9D70FF" | "#6B69FF" | "#B48DFF" | "#3548C0" | "#9997FF" | "#C9A8FF" | "#1B2DA0" | "#3230CC" | "#7E5ACC" | "#4A5FD6")[]): string;
386
+ export declare function getSeriesColor(index: number, palette?: ("#3E3CFF" | "#1B2DA0" | "#9D70FF" | "#6B69FF" | "#B48DFF" | "#3548C0" | "#9997FF" | "#C9A8FF" | "#3230CC" | "#7E5ACC" | "#4A5FD6")[]): string;
388
387
  /**
389
388
  * Get Zendir brand color by role
390
389
  * Use for consistent branding across the application
@@ -415,12 +414,12 @@ export declare function getZendirAccentColor(role: keyof typeof ZENDIR_ACCENT_CO
415
414
  * const statusColors = getPaletteForDataType('status');
416
415
  * ```
417
416
  */
418
- export declare function getPaletteForDataType(dataType: 'categorical' | 'sequential' | 'diverging' | 'status' | 'zendir' | 'zendirExtended' | 'cool' | 'warm' | 'astro-official', useAstroTheme?: boolean): string[];
417
+ export declare function getPaletteForDataType(dataType: "categorical" | "sequential" | "diverging" | "status" | "zendir" | "zendirExtended" | "cool" | "warm" | "astro-official", useAstroTheme?: boolean): string[];
419
418
  /**
420
419
  * Create gradient for area charts
421
420
  */
422
- export declare function createAreaGradient(color: string, direction?: 'vertical' | 'horizontal'): {
423
- type: 'linear';
421
+ export declare function createAreaGradient(color: string, direction?: "vertical" | "horizontal"): {
422
+ type: "linear";
424
423
  x: number;
425
424
  y: number;
426
425
  x2: number;
@@ -433,7 +432,7 @@ export declare function createAreaGradient(color: string, direction?: 'vertical'
433
432
  /**
434
433
  * Format time for axis labels
435
434
  */
436
- export declare function formatTimeLabel(timestamp: number, format?: 'short' | 'medium' | 'long'): string;
435
+ export declare function formatTimeLabel(timestamp: number, format?: "short" | "medium" | "long"): string;
437
436
  /**
438
437
  * Format number with unit suffix
439
438
  */