@zendir/ui 0.2.21 → 0.3.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 (261) hide show
  1. package/CHANGELOG.md +183 -1
  2. package/README.md +70 -28
  3. package/dist/index.d.ts +1 -1
  4. package/dist/index.js +51 -42
  5. package/dist/index.js.map +1 -1
  6. package/dist/react/3d/CesiumCaptureSource.d.ts +1 -1
  7. package/dist/react/3d/CesiumCaptureSource.js +1 -1
  8. package/dist/react/3d/CesiumCaptureSource.js.map +1 -1
  9. package/dist/react/3d/ZenSpace3D.js +1253 -0
  10. package/dist/react/3d/ZenSpace3D.js.map +1 -0
  11. package/dist/react/3d/ZenSpace3DCesium.js +579 -0
  12. package/dist/react/3d/ZenSpace3DCesium.js.map +1 -0
  13. package/dist/react/3d/ZenSpace3DTypes.d.ts +28 -1
  14. package/dist/react/3d/ZenSpace3DUtils.d.ts +17 -173
  15. package/dist/react/3d/ZenSpace3DUtils.js +20 -1
  16. package/dist/react/3d/ZenSpace3DUtils.js.map +1 -1
  17. package/dist/react/3d/index.d.ts +6 -12
  18. package/dist/react/3d/threeLoader.js +18 -0
  19. package/dist/react/3d/threeLoader.js.map +1 -0
  20. package/dist/react/astro/MonitoringIcon.js +1 -1
  21. package/dist/react/astro/MonitoringIcon.js.map +1 -1
  22. package/dist/react/astro/SimulationControls.js +2 -2
  23. package/dist/react/astro/SimulationControls.js.map +1 -1
  24. package/dist/react/astro/UnifiedTimeline.js +4 -4
  25. package/dist/react/astro/UnifiedTimeline.js.map +1 -1
  26. package/dist/react/charts/GroundTrackMap.d.ts +2 -15
  27. package/dist/react/charts/GroundTrackMap.js +1 -1
  28. package/dist/react/charts/GroundTrackMap.js.map +1 -1
  29. package/dist/react/charts/unified/AstroChart.js +34 -13
  30. package/dist/react/charts/unified/AstroChart.js.map +1 -1
  31. package/dist/react/chatgpt/AppCard.d.ts +0 -4
  32. package/dist/react/chatgpt/index.d.ts +0 -19
  33. package/dist/react/context/SpatialSelectionContext.d.ts +40 -0
  34. package/dist/react/context/SpatialSelectionContext.js +10 -0
  35. package/dist/react/context/SpatialSelectionContext.js.map +1 -0
  36. package/dist/react/context/index.d.ts +2 -0
  37. package/dist/react/core/{DataTable.d.ts → data/DataTable.d.ts} +1 -1
  38. package/dist/react/core/{DataTable.js → data/DataTable.js} +4 -4
  39. package/dist/react/core/data/DataTable.js.map +1 -0
  40. package/dist/react/core/{DataValue.d.ts → data/DataValue.d.ts} +2 -2
  41. package/dist/react/core/{DataValue.js → data/DataValue.js} +2 -2
  42. package/dist/react/core/data/DataValue.js.map +1 -0
  43. package/dist/react/core/{propertyConfig.d.ts → data/propertyConfig.d.ts} +2 -2
  44. package/dist/react/core/data/propertyConfig.js.map +1 -0
  45. package/dist/react/core/{AstroIcon.js → display/AstroIcon.js} +1 -1
  46. package/dist/react/core/display/AstroIcon.js.map +1 -0
  47. package/dist/react/core/{Badge.d.ts → display/Badge.d.ts} +1 -1
  48. package/dist/react/core/{Badge.js → display/Badge.js} +2 -2
  49. package/dist/react/core/display/Badge.js.map +1 -0
  50. package/dist/react/core/{CardHeader.d.ts → display/CardHeader.d.ts} +1 -1
  51. package/dist/react/core/{CardHeader.js → display/CardHeader.js} +2 -2
  52. package/dist/react/core/display/CardHeader.js.map +1 -0
  53. package/dist/react/core/{Container.d.ts → display/Container.d.ts} +1 -1
  54. package/dist/react/core/{Container.js → display/Container.js} +3 -3
  55. package/dist/react/core/display/Container.js.map +1 -0
  56. package/dist/react/core/{CopyButton.js → display/CopyButton.js} +1 -1
  57. package/dist/react/core/display/CopyButton.js.map +1 -0
  58. package/dist/react/core/{GlassCard.d.ts → display/GlassCard.d.ts} +1 -1
  59. package/dist/react/core/{GlassCard.js → display/GlassCard.js} +2 -2
  60. package/dist/react/core/display/GlassCard.js.map +1 -0
  61. package/dist/react/core/{HeaderIconWithStatus.d.ts → display/HeaderIconWithStatus.d.ts} +1 -1
  62. package/dist/react/core/{HeaderIconWithStatus.js → display/HeaderIconWithStatus.js} +1 -1
  63. package/dist/react/core/display/HeaderIconWithStatus.js.map +1 -0
  64. package/dist/react/core/{Icon.d.ts → display/Icon.d.ts} +1 -1
  65. package/dist/react/core/{Icon.js → display/Icon.js} +1 -1
  66. package/dist/react/core/display/Icon.js.map +1 -0
  67. package/dist/react/core/{Typography.d.ts → display/Typography.d.ts} +13 -4
  68. package/dist/react/core/{Typography.js → display/Typography.js} +1 -1
  69. package/dist/react/core/display/Typography.js.map +1 -0
  70. package/dist/react/core/{ConfirmDialog.js → feedback/ConfirmDialog.js} +1 -1
  71. package/dist/react/core/feedback/ConfirmDialog.js.map +1 -0
  72. package/dist/react/core/{Dialog.js → feedback/Dialog.js} +2 -2
  73. package/dist/react/core/feedback/Dialog.js.map +1 -0
  74. package/dist/react/core/{Toast.js → feedback/Toast.js} +3 -3
  75. package/dist/react/core/feedback/Toast.js.map +1 -0
  76. package/dist/react/core/index.d.ts +85 -85
  77. package/dist/react/core/{Button.js → inputs/Button.js} +2 -2
  78. package/dist/react/core/inputs/Button.js.map +1 -0
  79. package/dist/react/core/{Checkbox.js → inputs/Checkbox.js} +2 -2
  80. package/dist/react/core/inputs/Checkbox.js.map +1 -0
  81. package/dist/react/core/{Input.d.ts → inputs/Input.d.ts} +1 -1
  82. package/dist/react/core/{Input.js → inputs/Input.js} +3 -3
  83. package/dist/react/core/inputs/Input.js.map +1 -0
  84. package/dist/react/core/{LimitsBar.js → inputs/LimitsBar.js} +1 -1
  85. package/dist/react/core/inputs/LimitsBar.js.map +1 -0
  86. package/dist/react/core/{NumberInput.d.ts → inputs/NumberInput.d.ts} +2 -2
  87. package/dist/react/core/{NumberInput.js → inputs/NumberInput.js} +3 -3
  88. package/dist/react/core/inputs/NumberInput.js.map +1 -0
  89. package/dist/react/core/{PinInput.js → inputs/PinInput.js} +2 -2
  90. package/dist/react/core/inputs/PinInput.js.map +1 -0
  91. package/dist/react/core/{Select.js → inputs/Select.js} +3 -3
  92. package/dist/react/core/inputs/Select.js.map +1 -0
  93. package/dist/react/core/{Toggle.js → inputs/Toggle.js} +2 -2
  94. package/dist/react/core/inputs/Toggle.js.map +1 -0
  95. package/dist/react/core/{AppBar.d.ts → navigation/AppBar.d.ts} +1 -1
  96. package/dist/react/core/{AppBar.js → navigation/AppBar.js} +7 -7
  97. package/dist/react/core/navigation/AppBar.js.map +1 -0
  98. package/dist/react/core/{Pagination.js → navigation/Pagination.js} +2 -2
  99. package/dist/react/core/navigation/Pagination.js.map +1 -0
  100. package/dist/react/core/{SideNav.d.ts → navigation/SideNav.d.ts} +1 -1
  101. package/dist/react/core/{SideNav.js → navigation/SideNav.js} +3 -3
  102. package/dist/react/core/navigation/SideNav.js.map +1 -0
  103. package/dist/react/core/{Tabs.js → navigation/Tabs.js} +2 -2
  104. package/dist/react/core/navigation/Tabs.js.map +1 -0
  105. package/dist/react/core/{Popover.js → overlays/Popover.js} +1 -1
  106. package/dist/react/core/overlays/Popover.js.map +1 -0
  107. package/dist/react/core/{SidePanel.js → overlays/SidePanel.js} +3 -3
  108. package/dist/react/core/overlays/SidePanel.js.map +1 -0
  109. package/dist/react/core/{Tooltip.js → overlays/Tooltip.js} +2 -2
  110. package/dist/react/core/overlays/Tooltip.js.map +1 -0
  111. package/dist/react/core/{ActivityPlanner.js → widgets/ActivityPlanner.js} +1 -1
  112. package/dist/react/core/widgets/ActivityPlanner.js.map +1 -0
  113. package/dist/react/core/{Capture.js → widgets/Capture.js} +3 -3
  114. package/dist/react/core/widgets/Capture.js.map +1 -0
  115. package/dist/react/core/{ChatPanel.d.ts → widgets/ChatPanel.d.ts} +1 -1
  116. package/dist/react/core/{ChatPanel.js → widgets/ChatPanel.js} +2 -2
  117. package/dist/react/core/widgets/ChatPanel.js.map +1 -0
  118. package/dist/react/core/{ColorPickerPanel.d.ts → widgets/ColorPickerPanel.d.ts} +1 -1
  119. package/dist/react/core/{ColorPickerPanel.js → widgets/ColorPickerPanel.js} +3 -3
  120. package/dist/react/core/widgets/ColorPickerPanel.js.map +1 -0
  121. package/dist/react/core/{CommandBuilder.js → widgets/CommandBuilder.js} +1 -1
  122. package/dist/react/core/widgets/CommandBuilder.js.map +1 -0
  123. package/dist/react/core/{ConnectionForm.d.ts → widgets/ConnectionForm.d.ts} +1 -1
  124. package/dist/react/core/{ConnectionForm.js → widgets/ConnectionForm.js} +2 -2
  125. package/dist/react/core/widgets/ConnectionForm.js.map +1 -0
  126. package/dist/react/core/{FileExplorer.js → widgets/FileExplorer.js} +2 -2
  127. package/dist/react/core/widgets/FileExplorer.js.map +1 -0
  128. package/dist/react/core/{HexViewer.js → widgets/HexViewer.js} +1 -1
  129. package/dist/react/core/widgets/HexViewer.js.map +1 -0
  130. package/dist/react/core/{ImageGallery.d.ts → widgets/ImageGallery.d.ts} +1 -1
  131. package/dist/react/core/{ImageGallery.js → widgets/ImageGallery.js} +3 -3
  132. package/dist/react/core/widgets/ImageGallery.js.map +1 -0
  133. package/dist/react/core/{LogViewer.d.ts → widgets/LogViewer.d.ts} +13 -3
  134. package/dist/react/core/{LogViewer.js → widgets/LogViewer.js} +28 -8
  135. package/dist/react/core/widgets/LogViewer.js.map +1 -0
  136. package/dist/react/core/{MessageStream.d.ts → widgets/MessageStream.d.ts} +2 -2
  137. package/dist/react/core/{MessageStream.js → widgets/MessageStream.js} +4 -4
  138. package/dist/react/core/widgets/MessageStream.js.map +1 -0
  139. package/dist/react/core/{MissionCalendar.js → widgets/MissionCalendar.js} +2 -2
  140. package/dist/react/core/widgets/MissionCalendar.js.map +1 -0
  141. package/dist/react/core/{PacketViewer.js → widgets/PacketViewer.js} +1 -1
  142. package/dist/react/core/widgets/PacketViewer.js.map +1 -0
  143. package/dist/react/core/widgets/capture-placeholder.png.js.map +1 -0
  144. package/dist/react/hooks/index.d.ts +9 -11
  145. package/dist/react/hooks/useAccessWindows.d.ts +15 -19
  146. package/dist/react/hooks/useGroundTrackHistory.d.ts +34 -0
  147. package/dist/react/hooks/useSimulationScene.d.ts +141 -0
  148. package/dist/react/hooks/useSimulationScene.js +401 -0
  149. package/dist/react/hooks/useSimulationScene.js.map +1 -0
  150. package/dist/react/hooks/useZendirSession.d.ts +44 -69
  151. package/dist/react/index.d.ts +7 -3
  152. package/dist/react/panels/LayerControlPanel.d.ts +54 -0
  153. package/dist/react/panels/LayerControlPanel.js +184 -0
  154. package/dist/react/panels/LayerControlPanel.js.map +1 -0
  155. package/dist/react/panels/ObjectInventoryPanel.d.ts +57 -0
  156. package/dist/react/panels/ObjectInventoryPanel.js +261 -0
  157. package/dist/react/panels/ObjectInventoryPanel.js.map +1 -0
  158. package/dist/react/panels/index.d.ts +15 -0
  159. package/dist/react/theme/ThemeProvider.d.ts +2 -0
  160. package/dist/react/theme/ThemeProvider.js +50 -72
  161. package/dist/react/theme/ThemeProvider.js.map +1 -1
  162. package/dist/react/types.d.ts +32 -3
  163. package/dist/react/types.js.map +1 -1
  164. package/dist/react.js +51 -42
  165. package/dist/react.js.map +1 -1
  166. package/dist/shaders/atmosphere.frag.js +5 -0
  167. package/dist/shaders/atmosphere.frag.js.map +1 -0
  168. package/dist/shaders/atmosphere.vert.js +5 -0
  169. package/dist/shaders/atmosphere.vert.js.map +1 -0
  170. package/dist/shaders/stars.frag.js +5 -0
  171. package/dist/shaders/stars.frag.js.map +1 -0
  172. package/dist/shaders/stars.vert.js +5 -0
  173. package/dist/shaders/stars.vert.js.map +1 -0
  174. package/dist/style.css +6 -4
  175. package/dist/tokens/css-vars.d.ts +91 -0
  176. package/dist/tokens/css-vars.js +228 -0
  177. package/dist/tokens/css-vars.js.map +1 -0
  178. package/dist/tokens/index.d.ts +71 -18
  179. package/dist/tokens/index.js +206 -97
  180. package/dist/tokens/index.js.map +1 -1
  181. package/dist/tokens/tokens.css +50 -50
  182. package/package.json +26 -22
  183. package/sdk-stub.js +10 -5
  184. package/dist/react/3d/EarthViewer.d.ts +0 -46
  185. package/dist/react/3d/SolarSystemViewer.d.ts +0 -43
  186. package/dist/react/chatgpt/ChatGPTCard.d.ts +0 -6
  187. package/dist/react/core/ActivityPlanner.js.map +0 -1
  188. package/dist/react/core/AppBar.js.map +0 -1
  189. package/dist/react/core/AstroIcon.js.map +0 -1
  190. package/dist/react/core/Badge.js.map +0 -1
  191. package/dist/react/core/Button.js.map +0 -1
  192. package/dist/react/core/Capture.js.map +0 -1
  193. package/dist/react/core/CardHeader.js.map +0 -1
  194. package/dist/react/core/ChatPanel.js.map +0 -1
  195. package/dist/react/core/Checkbox.js.map +0 -1
  196. package/dist/react/core/ColorPickerPanel.js.map +0 -1
  197. package/dist/react/core/CommandBuilder.js.map +0 -1
  198. package/dist/react/core/ConfirmDialog.js.map +0 -1
  199. package/dist/react/core/ConnectionForm.js.map +0 -1
  200. package/dist/react/core/Container.js.map +0 -1
  201. package/dist/react/core/CopyButton.js.map +0 -1
  202. package/dist/react/core/DataTable.js.map +0 -1
  203. package/dist/react/core/DataValue.js.map +0 -1
  204. package/dist/react/core/Dialog.js.map +0 -1
  205. package/dist/react/core/FileExplorer.js.map +0 -1
  206. package/dist/react/core/GlassCard.js.map +0 -1
  207. package/dist/react/core/HeaderIconWithStatus.js.map +0 -1
  208. package/dist/react/core/HexViewer.js.map +0 -1
  209. package/dist/react/core/Icon.js.map +0 -1
  210. package/dist/react/core/ImageGallery.js.map +0 -1
  211. package/dist/react/core/Input.js.map +0 -1
  212. package/dist/react/core/LimitsBar.js.map +0 -1
  213. package/dist/react/core/LogViewer.js.map +0 -1
  214. package/dist/react/core/MessageStream.js.map +0 -1
  215. package/dist/react/core/MissionCalendar.js.map +0 -1
  216. package/dist/react/core/NumberInput.js.map +0 -1
  217. package/dist/react/core/PacketViewer.js.map +0 -1
  218. package/dist/react/core/Pagination.js.map +0 -1
  219. package/dist/react/core/PinInput.js.map +0 -1
  220. package/dist/react/core/Popover.js.map +0 -1
  221. package/dist/react/core/Select.js.map +0 -1
  222. package/dist/react/core/SideNav.js.map +0 -1
  223. package/dist/react/core/SidePanel.js.map +0 -1
  224. package/dist/react/core/Tabs.js.map +0 -1
  225. package/dist/react/core/Toast.js.map +0 -1
  226. package/dist/react/core/Toggle.js.map +0 -1
  227. package/dist/react/core/Tooltip.js.map +0 -1
  228. package/dist/react/core/Typography.js.map +0 -1
  229. package/dist/react/core/capture-placeholder.png.js.map +0 -1
  230. package/dist/react/core/propertyConfig.js.map +0 -1
  231. package/dist/react/hooks/useSimulationTime.d.ts +0 -61
  232. package/dist/react/hooks/useSpacecraftPosition.d.ts +0 -50
  233. package/dist/react/hooks/useTelemetry.d.ts +0 -55
  234. package/dist/types.d.ts +0 -1
  235. package/dist/types.js +0 -2
  236. package/dist/types.js.map +0 -1
  237. /package/dist/react/core/{propertyConfig.js → data/propertyConfig.js} +0 -0
  238. /package/dist/react/core/{AstroIcon.d.ts → display/AstroIcon.d.ts} +0 -0
  239. /package/dist/react/core/{CopyButton.d.ts → display/CopyButton.d.ts} +0 -0
  240. /package/dist/react/core/{ConfirmDialog.d.ts → feedback/ConfirmDialog.d.ts} +0 -0
  241. /package/dist/react/core/{Dialog.d.ts → feedback/Dialog.d.ts} +0 -0
  242. /package/dist/react/core/{Toast.d.ts → feedback/Toast.d.ts} +0 -0
  243. /package/dist/react/core/{Button.d.ts → inputs/Button.d.ts} +0 -0
  244. /package/dist/react/core/{Checkbox.d.ts → inputs/Checkbox.d.ts} +0 -0
  245. /package/dist/react/core/{LimitsBar.d.ts → inputs/LimitsBar.d.ts} +0 -0
  246. /package/dist/react/core/{PinInput.d.ts → inputs/PinInput.d.ts} +0 -0
  247. /package/dist/react/core/{Select.d.ts → inputs/Select.d.ts} +0 -0
  248. /package/dist/react/core/{Toggle.d.ts → inputs/Toggle.d.ts} +0 -0
  249. /package/dist/react/core/{Pagination.d.ts → navigation/Pagination.d.ts} +0 -0
  250. /package/dist/react/core/{Tabs.d.ts → navigation/Tabs.d.ts} +0 -0
  251. /package/dist/react/core/{Popover.d.ts → overlays/Popover.d.ts} +0 -0
  252. /package/dist/react/core/{SidePanel.d.ts → overlays/SidePanel.d.ts} +0 -0
  253. /package/dist/react/core/{Tooltip.d.ts → overlays/Tooltip.d.ts} +0 -0
  254. /package/dist/react/core/{ActivityPlanner.d.ts → widgets/ActivityPlanner.d.ts} +0 -0
  255. /package/dist/react/core/{Capture.d.ts → widgets/Capture.d.ts} +0 -0
  256. /package/dist/react/core/{CommandBuilder.d.ts → widgets/CommandBuilder.d.ts} +0 -0
  257. /package/dist/react/core/{FileExplorer.d.ts → widgets/FileExplorer.d.ts} +0 -0
  258. /package/dist/react/core/{HexViewer.d.ts → widgets/HexViewer.d.ts} +0 -0
  259. /package/dist/react/core/{MissionCalendar.d.ts → widgets/MissionCalendar.d.ts} +0 -0
  260. /package/dist/react/core/{PacketViewer.d.ts → widgets/PacketViewer.d.ts} +0 -0
  261. /package/dist/react/core/{capture-placeholder.png.js → widgets/capture-placeholder.png.js} +0 -0
@@ -1,12 +1,12 @@
1
1
  import { jsxs, jsx } from "react/jsx-runtime";
2
- import { memo, forwardRef, useRef, useMemo, useCallback, useImperativeHandle, useState, useEffect } from "react";
2
+ import { memo, forwardRef, useRef, useMemo, useCallback, useImperativeHandle, useEffect, useState } from "react";
3
3
  import ReactEChartsCore from "echarts-for-react/lib/core";
4
4
  import * as echarts from "echarts/core";
5
5
  import { LineChart, BarChart, PieChart, ScatterChart, RadarChart, GaugeChart, HeatmapChart, CandlestickChart, BoxplotChart, TreemapChart, SunburstChart, FunnelChart, SankeyChart, CustomChart, GraphChart, ParallelChart } from "echarts/charts";
6
6
  import { GridComponent, TooltipComponent, TitleComponent, LegendComponent, DataZoomComponent, ToolboxComponent, MarkLineComponent, MarkAreaComponent, MarkPointComponent, VisualMapComponent, BrushComponent, PolarComponent, RadarComponent, GeoComponent, ParallelComponent } from "echarts/components";
7
7
  import { CanvasRenderer, SVGRenderer } from "echarts/renderers";
8
- import { AstroIcon } from "../../core/AstroIcon.js";
9
- import { HeaderIconWithStatus } from "../../core/HeaderIconWithStatus.js";
8
+ import { AstroIcon } from "../../core/display/AstroIcon.js";
9
+ import { HeaderIconWithStatus } from "../../core/display/HeaderIconWithStatus.js";
10
10
  import { useCardBorderStyle } from "../../context/DisplaySettingsContext.js";
11
11
  import { createAstroEChartsTheme, getSeriesColor, createAreaGradient } from "./theme.js";
12
12
  import { useTheme } from "../../theme/ThemeProvider.js";
@@ -748,6 +748,8 @@ const AstroChart = memo(forwardRef(
748
748
  (_a2 = getChart()) == null ? void 0 : _a2.dispatchAction(action);
749
749
  }
750
750
  }), [getChart, series, realTime]);
751
+ const userZoomRef = useRef(null);
752
+ const programmaticRef = useRef(false);
751
753
  const handleEvents = useMemo(() => {
752
754
  const events = {};
753
755
  if (onClick) {
@@ -760,16 +762,22 @@ const AstroChart = memo(forwardRef(
760
762
  onHover(params);
761
763
  };
762
764
  }
763
- if (onZoomChange) {
764
- events.datazoom = (params) => {
765
- var _a2, _b2, _c2, _d2;
766
- const p = params;
767
- onZoomChange({
768
- start: ((_b2 = (_a2 = p.batch) == null ? void 0 : _a2[0]) == null ? void 0 : _b2.start) ?? p.start ?? 0,
769
- end: ((_d2 = (_c2 = p.batch) == null ? void 0 : _c2[0]) == null ? void 0 : _d2.end) ?? p.end ?? 100
770
- });
771
- };
772
- }
765
+ events.datazoom = (params) => {
766
+ var _a2;
767
+ if (programmaticRef.current) {
768
+ programmaticRef.current = false;
769
+ return;
770
+ }
771
+ const p = params;
772
+ const b = (_a2 = p.batch) == null ? void 0 : _a2[0];
773
+ const start = (b == null ? void 0 : b.start) ?? p.start ?? 0;
774
+ const end = (b == null ? void 0 : b.end) ?? p.end ?? 100;
775
+ const startValue = (b == null ? void 0 : b.startValue) ?? p.startValue;
776
+ const endValue = (b == null ? void 0 : b.endValue) ?? p.endValue;
777
+ const isFullRange = start <= 0 && end >= 100;
778
+ userZoomRef.current = isFullRange ? null : { start, end, startValue, endValue };
779
+ if (onZoomChange) onZoomChange({ start, end });
780
+ };
773
781
  if (onBrushSelect) {
774
782
  events.brushselected = (params) => {
775
783
  onBrushSelect(params);
@@ -777,6 +785,19 @@ const AstroChart = memo(forwardRef(
777
785
  }
778
786
  return events;
779
787
  }, [onClick, onHover, onZoomChange, onBrushSelect]);
788
+ useEffect(() => {
789
+ const saved = userZoomRef.current;
790
+ if (!saved) return;
791
+ const chart = getChart();
792
+ if (!chart || typeof chart.isDisposed === "function" && chart.isDisposed()) return;
793
+ const hasAbsolute = saved.startValue !== void 0 && saved.endValue !== void 0;
794
+ programmaticRef.current = true;
795
+ try {
796
+ chart.dispatchAction(hasAbsolute ? { type: "dataZoom", startValue: saved.startValue, endValue: saved.endValue } : { type: "dataZoom", start: saved.start, end: saved.end });
797
+ } catch {
798
+ programmaticRef.current = false;
799
+ }
800
+ }, [options, getChart]);
780
801
  const handleChartReady = useCallback((chart) => {
781
802
  onChartReady == null ? void 0 : onChartReady(chart);
782
803
  }, [onChartReady]);
@@ -1 +1 @@
1
- {"version":3,"file":"AstroChart.js","sources":["../../../../src/react/charts/unified/AstroChart.tsx"],"sourcesContent":["/**\n * @zendir/ui - AstroChart Component\n * \n * Enterprise-grade unified charting component built on ECharts.\n * Follows AstroUXD design patterns with full theme integration.\n * \n * Features:\n * - 15+ chart types\n * - Real-time streaming support\n * - Zoom, pan, brush selection\n * - Annotations (thresholds, regions)\n * - Export (PNG, SVG, CSV)\n * - Crosshair sync across charts\n * - Full accessibility support\n * - Dark/light theme support\n */\n\nimport React, { \n useRef, \n useEffect, \n useMemo, \n useCallback, \n useState,\n forwardRef,\n useImperativeHandle,\n memo,\n} from 'react';\nimport ReactEChartsCore from 'echarts-for-react/lib/core';\nimport * as echarts from 'echarts/core';\nimport {\n LineChart,\n BarChart,\n PieChart,\n ScatterChart,\n RadarChart,\n GaugeChart,\n HeatmapChart,\n CandlestickChart,\n BoxplotChart,\n TreemapChart,\n SunburstChart,\n FunnelChart,\n SankeyChart,\n CustomChart,\n GraphChart,\n ParallelChart as EChartsParallelChart,\n} from 'echarts/charts';\nimport {\n GridComponent,\n TooltipComponent,\n TitleComponent,\n LegendComponent,\n DataZoomComponent,\n ToolboxComponent,\n MarkLineComponent,\n MarkAreaComponent,\n MarkPointComponent,\n VisualMapComponent,\n BrushComponent,\n PolarComponent,\n RadarComponent,\n GeoComponent,\n ParallelComponent,\n} from 'echarts/components';\nimport { CanvasRenderer, SVGRenderer } from 'echarts/renderers';\nimport type { EChartsOption, ECharts } from 'echarts';\n\nimport { useTheme } from '../../theme';\nimport { AstroIcon, type AstroIconName } from '../../core/AstroIcon';\nimport { HeaderIconWithStatus } from '../../core/HeaderIconWithStatus';\nimport { useCardBorderStyle } from '../../context/DisplaySettingsContext';\nimport { createAstroEChartsTheme, createAreaGradient, getSeriesColor } from './theme';\nimport type {\n AstroChartProps,\n SeriesData,\n ChartType,\n ChartEventParams,\n DataPoint,\n TimeSeriesPoint,\n ExportFileNameContext,\n ChartStatus,\n} from './types';\n\n// =============================================================================\n// Status Shape SVGs (matching DataValue component for consistency)\n// =============================================================================\n\nconst STATUS_SHAPES: Record<ChartStatus, (size: number, color: string) => React.ReactNode> = {\n off: (size, color) => (\n <svg viewBox=\"0 0 12 12\" width={size} height={size}>\n <circle cx=\"6\" cy=\"6\" r=\"5\" fill={color} />\n </svg>\n ),\n standby: (size, color) => (\n <svg viewBox=\"0 0 12 12\" width={size} height={size}>\n <circle cx=\"6\" cy=\"6\" r=\"5\" fill={color} />\n </svg>\n ),\n normal: (size, color) => (\n <svg viewBox=\"0 0 12 12\" width={size} height={size}>\n <circle cx=\"6\" cy=\"6\" r=\"5\" fill={color} />\n </svg>\n ),\n caution: (size, color) => (\n <svg viewBox=\"0 0 12 12\" width={size} height={size}>\n <rect x=\"1\" y=\"1\" width=\"10\" height=\"10\" fill={color} />\n </svg>\n ),\n serious: (size, color) => (\n <svg viewBox=\"0 0 12 12\" width={size} height={size}>\n <polygon points=\"6,1 11,6 6,11 1,6\" fill={color} />\n </svg>\n ),\n critical: (size, color) => (\n <svg viewBox=\"0 0 12 12\" width={size} height={size}>\n <polygon points=\"6,11 1,2 11,2\" fill={color} />\n </svg>\n ),\n};\n\n/**\n * Astro UX Status Labels\n * Follows Astro UXDS naming conventions\n * https://www.astrouxds.com/patterns/status-system/\n */\nconst STATUS_LABELS: Record<ChartStatus, string> = {\n off: 'Off',\n standby: 'Standby',\n normal: 'Normal',\n caution: 'Caution',\n serious: 'Serious',\n critical: 'Critical',\n};\n\n/** Slug for safe filenames: lowercase, alphanumeric and hyphens only */\nfunction slug(str: string): string {\n return str\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-|-$/g, '');\n}\n\n/** Build base export name from title, series names, and chart type */\nfunction derivedExportBaseName(\n title: string | undefined,\n seriesNames: string[],\n chartType: string\n): string {\n const parts: string[] = ['zendir'];\n if (title) parts.push(slug(title));\n else parts.push('chart');\n const seriesSlug = seriesNames.slice(0, 4).map(slug).filter(Boolean).join('-');\n if (seriesSlug) parts.push(seriesSlug);\n parts.push(slug(chartType));\n return parts.join('-') || 'zendir-chart';\n}\n\n// Register ECharts components\necharts.use([\n LineChart,\n BarChart,\n PieChart,\n ScatterChart,\n RadarChart,\n GaugeChart,\n HeatmapChart,\n CandlestickChart,\n BoxplotChart,\n TreemapChart,\n SunburstChart,\n FunnelChart,\n SankeyChart,\n CustomChart,\n GraphChart,\n EChartsParallelChart,\n GridComponent,\n TooltipComponent,\n TitleComponent,\n LegendComponent,\n DataZoomComponent,\n ToolboxComponent,\n MarkLineComponent,\n MarkAreaComponent,\n MarkPointComponent,\n VisualMapComponent,\n BrushComponent,\n PolarComponent,\n RadarComponent,\n GeoComponent,\n ParallelComponent,\n CanvasRenderer,\n SVGRenderer,\n]);\n\n// =============================================================================\n// Chart Instance Handle\n// =============================================================================\n\nexport interface AstroChartHandle {\n /** Get ECharts instance */\n getChart: () => ECharts | undefined;\n /** Resize chart */\n resize: () => void;\n /** Export as image (png, jpeg, svg) */\n exportImage: (type?: 'png' | 'jpeg' | 'jpg' | 'svg', pixelRatio?: number) => string | undefined;\n /** Export data as CSV */\n exportCSV: () => string;\n /** Suggested export filename from title, series names, and chart type (with optional extension and timestamp) */\n getExportFileName: (extension?: string, includeTimestamp?: boolean) => string;\n /** Append data for real-time updates */\n appendData: (seriesIndex: number, data: DataPoint | TimeSeriesPoint) => void;\n /** Clear all data */\n clearData: () => void;\n /** Dispatch action */\n dispatchAction: (action: unknown) => void;\n}\n\n// =============================================================================\n// Series Transformer\n// =============================================================================\n\nfunction transformSeriesToECharts(\n series: SeriesData[],\n chartType: ChartType,\n theme: ReturnType<typeof createAstroEChartsTheme>\n): EChartsOption['series'] {\n return series.map((s, index) => {\n const seriesType = s.type || chartType;\n const color = s.color || getSeriesColor(index);\n \n // Base series config\n const baseSeries: Record<string, unknown> = {\n id: s.id,\n name: s.name,\n type: mapChartType(seriesType),\n data: transformData(s.data, seriesType),\n yAxisIndex: s.yAxisIndex || 0,\n showSymbol: seriesType === 'scatter' || (s.symbol?.type !== 'none'),\n smooth: s.smooth ?? (seriesType === 'line' || seriesType === 'area'),\n };\n\n // Line/Area specific\n if (seriesType === 'line' || seriesType === 'area') {\n baseSeries.lineStyle = {\n width: s.lineStyle?.width ?? 2,\n type: s.lineStyle?.type ?? 'solid',\n opacity: s.lineStyle?.opacity ?? 1,\n };\n baseSeries.itemStyle = { color };\n \n if (seriesType === 'area') {\n baseSeries.areaStyle = s.areaStyle || {\n opacity: 0.3,\n color: createAreaGradient(color),\n };\n }\n \n if (s.symbol) {\n baseSeries.symbol = s.symbol.type || 'circle';\n baseSeries.symbolSize = s.symbol.size || 6;\n }\n }\n\n // Bar specific\n if (seriesType === 'bar') {\n baseSeries.itemStyle = {\n color,\n borderRadius: [4, 4, 0, 0],\n };\n if (s.stack) {\n baseSeries.stack = s.stack;\n }\n }\n\n // Pie/Donut specific — theme color, no white border on labels\n if (seriesType === 'pie' || seriesType === 'donut') {\n baseSeries.radius = seriesType === 'donut' ? ['40%', '70%'] : '70%';\n baseSeries.label = {\n show: true,\n formatter: '{b}: {d}%',\n color: theme.textStyle.color,\n textBorderWidth: 0,\n textBorderColor: 'transparent',\n };\n baseSeries.emphasis = {\n itemStyle: {\n shadowBlur: 10,\n shadowOffsetX: 0,\n shadowColor: 'rgba(0, 0, 0, 0.5)',\n },\n };\n }\n\n // Scatter specific\n if (seriesType === 'scatter') {\n baseSeries.symbolSize = s.symbol?.size || 10;\n baseSeries.itemStyle = { color };\n }\n\n // Gauge specific\n if (seriesType === 'gauge') {\n baseSeries.detail = {\n formatter: '{value}%',\n fontSize: 20,\n color: theme.textStyle.color,\n };\n baseSeries.axisLine = {\n lineStyle: {\n width: 10,\n color: [\n [0.3, theme.color[1]], // Green\n [0.7, theme.color[3]], // Yellow\n [1, theme.color[2]], // Red\n ],\n },\n };\n }\n\n return baseSeries;\n });\n}\n\nfunction mapChartType(type: ChartType): string {\n switch (type) {\n case 'area':\n return 'line';\n case 'donut':\n return 'pie';\n default:\n return type;\n }\n}\n\nfunction transformData(\n data: SeriesData['data'],\n type: ChartType\n): unknown[] {\n if (!data || data.length === 0) return [];\n \n // Handle array of numbers\n if (typeof data[0] === 'number') {\n return data as number[];\n }\n \n // Handle [x, y] tuples\n if (Array.isArray(data[0])) {\n return data;\n }\n \n // Handle DataPoint or TimeSeriesPoint\n const firstItem = data[0] as DataPoint | TimeSeriesPoint;\n \n if ('time' in firstItem) {\n // TimeSeriesPoint\n return (data as TimeSeriesPoint[]).map(d => [d.time, d.value]);\n }\n \n // For pie/donut charts, ECharts expects { name, value } format\n if (type === 'pie' || type === 'donut') {\n return (data as DataPoint[]).map(d => ({ \n name: String(d.x), \n value: d.y,\n // Apply color via itemStyle if specified\n ...(d.color ? { itemStyle: { color: d.color } } : {}),\n // Preserve any additional metadata\n ...(d.meta || {}),\n }));\n }\n \n // For scatter charts, preserve per-point color as itemStyle\n if (type === 'scatter') {\n return (data as DataPoint[]).map(d => ({\n value: [d.x, d.y],\n ...(d.color ? { itemStyle: { color: d.color } } : {}),\n ...(d.label ? { name: d.label } : {}),\n }));\n }\n\n // DataPoint for other chart types\n return (data as DataPoint[]).map(d => [d.x, d.y]);\n}\n\n// =============================================================================\n// Options Builder\n// =============================================================================\n\nfunction buildEChartsOptions(\n props: AstroChartProps,\n theme: ReturnType<typeof createAstroEChartsTheme>,\n hideTitle = false\n): EChartsOption {\n const {\n type,\n series,\n title,\n subtitle,\n xAxis,\n yAxis,\n tooltip,\n legend,\n zoom,\n annotations,\n loading,\n compactAxes = true, // Default: hide axis names for more chart space\n } = props;\n \n // Hide title when using custom header (transparent theme with icon)\n const showEChartsTitle = title && !hideTitle;\n \n // Note: When compactAxes is true, axis names are hidden from the chart\n // but developers can access xAxis.name and yAxis.name via props for custom tooltips\n\n const isPolar = type === 'radar';\n const isPie = type === 'pie' || type === 'donut';\n const isGauge = type === 'gauge';\n const isSankey = type === 'sankey';\n const isTreemap = type === 'treemap' || type === 'sunburst';\n const isGraph = props.echartsOptions?.series && \n Array.isArray(props.echartsOptions.series) && \n props.echartsOptions.series.some((s: unknown) => (s as { type?: string })?.type === 'graph');\n \n // Detect 3D charts (they use grid3D, xAxis3D, etc. - should NOT have 2D axes)\n const is3D = !!(props.echartsOptions?.grid3D || props.echartsOptions?.xAxis3D || \n props.echartsOptions?.globe || \n (props.echartsOptions?.series && Array.isArray(props.echartsOptions.series) && \n props.echartsOptions.series.some((s: unknown) => {\n const seriesType = (s as { type?: string })?.type || '';\n return seriesType.includes('3D') || seriesType.includes('3d');\n })));\n \n // Charts that don't need cartesian grid/axes\n const needsGrid = !isPolar && !isPie && !isGauge && !isSankey && !isTreemap && !isGraph && !is3D && !props.hideAxes;\n \n // Calculate layout based on title and legend position\n // Default legend to bottom for better chart space utilization\n // When using custom header (hideTitle=true), we still need top spacing for the header\n const hasTitle = hideTitle ? true : !!title;\n const hasSubtitle = hideTitle ? false : !!subtitle;\n const legendPosition = legend?.position ?? 'bottom'; // Default to bottom\n const legendAtTop = legendPosition === 'top';\n const legendAtBottom = legendPosition === 'bottom';\n const showLegend = legend?.show !== false;\n\n // Build options\n const options: EChartsOption = {\n // Title - positioned to avoid legend overlap (hidden when using custom header)\n title: showEChartsTitle ? {\n text: title,\n subtext: subtitle,\n left: 'center',\n top: legendAtTop && showLegend ? 35 : 10,\n textStyle: { ...theme.title.textStyle, fontWeight: (theme.title.textStyle.fontWeight as 'normal' | 'bold') ?? 'normal' },\n subtextStyle: theme.title.subtextStyle,\n } : undefined,\n\n // Tooltip with improved contrast\n // When compactAxes is true, axis names are shown in the axisPointer label on hover\n tooltip: tooltip?.enabled !== false ? ({\n trigger: tooltip?.trigger || (isPie ? 'item' : 'axis'),\n axisPointer: {\n type: tooltip?.crosshair === true || tooltip?.crosshair === 'both' ? 'cross' : 'line',\n lineStyle: theme.axisPointer.lineStyle,\n crossStyle: theme.axisPointer.crossStyle,\n // Show axis value labels on hover (includes axis name context)\n label: compactAxes ? {\n show: true,\n backgroundColor: theme.tooltip.backgroundColor,\n borderColor: theme.tooltip.borderColor,\n color: theme.tooltip.textStyle.color,\n fontSize: 11,\n padding: [4, 8],\n // Add axis name prefix to the label when in compact mode\n formatter: (params: { axisDimension: string; axisIndex: number; value: number | string }) => {\n const axisName = params.axisDimension === 'x' \n ? xAxis?.name \n : (Array.isArray(yAxis) ? yAxis[params.axisIndex]?.name : yAxis?.name);\n const value = typeof params.value === 'number' \n ? params.value.toLocaleString() \n : params.value;\n return axisName ? `${axisName}: ${value}` : String(value);\n },\n } : undefined,\n },\n backgroundColor: theme.tooltip.backgroundColor,\n borderColor: theme.tooltip.borderColor,\n borderWidth: theme.tooltip.borderWidth,\n textStyle: {\n ...theme.tooltip.textStyle,\n fontSize: 14, // AstroUXDS minimum 14pt\n },\n extraCssText: theme.tooltip.extraCssText,\n confine: tooltip?.confine ?? true,\n formatter: tooltip?.formatter as unknown as undefined,\n } as any) : undefined,\n\n // Legend - ultra-compact styling for maximum chart space\n legend: showLegend ? {\n show: true,\n type: 'scroll',\n orient: legend?.orient || 'horizontal',\n left: legend?.position === 'left' ? 'left' : \n legend?.position === 'right' ? 'right' : 'center',\n top: legendAtTop ? 4 : undefined,\n bottom: legendAtBottom ? 2 : undefined,\n padding: [2, 6],\n itemGap: 8,\n itemWidth: 12,\n itemHeight: 6,\n textStyle: {\n ...theme.legend.textStyle,\n fontSize: 10, // Ultra-compact for maximum chart space\n },\n inactiveColor: theme.legend.inactiveColor,\n selectedMode: legend?.interactive !== false,\n } : { show: false },\n\n // Grid - minimal spacing for maximum chart plotting area\n // When compactAxes is true, axis names are hidden so we need minimal padding\n // containLabel: true ensures axis tick labels don't get cut off\n // Extra space only needed for slider zoom (inside zoom is invisible)\n grid: needsGrid ? {\n left: compactAxes ? 8 : 40,\n right: Array.isArray(yAxis) && yAxis.length > 1 ? (compactAxes ? 8 : 40) : 8,\n top: hasTitle ? (hasSubtitle ? 50 : 36) : (legendAtTop && showLegend ? 26 : 4),\n bottom: (legendAtBottom && showLegend ? 26 : 16) + ((zoom?.type === 'slider' || zoom?.type === 'both') ? 26 : 0),\n containLabel: true,\n } : undefined,\n\n // X Axis - compact font sizes for more chart space\n // In compact mode, hide axis name (shown in tooltip instead)\n xAxis: needsGrid ? {\n type: (xAxis?.type || 'time') as 'value' | 'category' | 'time' | 'log',\n name: compactAxes ? undefined : xAxis?.name,\n nameLocation: xAxis?.nameLocation || 'middle',\n nameGap: 18,\n nameTextStyle: {\n ...theme.xAxis.nameTextStyle,\n fontSize: 10, // Ultra-compact for maximum chart space\n fontWeight: 500,\n },\n min: xAxis?.min,\n max: xAxis?.max,\n axisLine: {\n show: xAxis?.showLine !== false,\n lineStyle: theme.xAxis.axisLine.lineStyle,\n },\n axisTick: {\n lineStyle: theme.xAxis.axisTick.lineStyle,\n },\n axisLabel: {\n ...theme.xAxis.axisLabel,\n fontSize: 10, // Ultra-compact for maximum chart space\n formatter: xAxis?.labelFormatter as unknown as undefined,\n // Prevent label overlap - auto-hide overlapping labels\n hideOverlap: true,\n // Rotate labels slightly if needed for better fit\n rotate: 0,\n // Show fewer labels when space is tight\n interval: 'auto',\n },\n splitLine: {\n show: xAxis?.showGrid !== false,\n lineStyle: { ...theme.xAxis.splitLine.lineStyle, type: (theme.xAxis.splitLine.lineStyle.type as 'solid' | 'dashed' | 'dotted') ?? 'solid' },\n },\n inverse: xAxis?.inverse,\n } : undefined,\n\n // Y Axis - ultra-compact font sizes for maximum chart space\n // In compact mode, hide axis name (shown in tooltip instead)\n yAxis: (needsGrid ? (Array.isArray(yAxis) ? yAxis : [yAxis || {}]).map((axis, i) => ({\n type: (axis?.type || 'value') as 'value' | 'category' | 'time' | 'log',\n name: compactAxes ? undefined : axis?.name,\n nameLocation: axis?.nameLocation || 'middle',\n nameGap: 28,\n nameTextStyle: {\n ...theme.yAxis.nameTextStyle,\n fontSize: 10, // Ultra-compact for maximum chart space\n fontWeight: 500,\n },\n position: axis?.position || (i === 0 ? 'left' : 'right'),\n min: axis?.min,\n max: axis?.max,\n splitNumber: axis?.splitNumber,\n axisLine: {\n show: axis?.showLine !== false,\n lineStyle: theme.yAxis.axisLine.lineStyle,\n },\n axisTick: {\n lineStyle: theme.yAxis.axisTick.lineStyle,\n },\n axisLabel: {\n ...theme.yAxis.axisLabel,\n fontSize: 10, // Ultra-compact for maximum chart space\n formatter: axis?.labelFormatter \n ? axis.labelFormatter as unknown as undefined\n : axis?.unit \n ? (v: number) => `${v}${axis.unit}`\n : undefined,\n },\n splitLine: {\n show: axis?.showGrid !== false,\n lineStyle: theme.yAxis.splitLine.lineStyle,\n },\n inverse: axis?.inverse,\n })) : undefined) as EChartsOption['yAxis'],\n\n // Radar (for radar charts) - transparent background for glassmorphic look\n radar: isPolar ? {\n indicator: series[0]?.data?.map((d: unknown) => {\n const point = d as DataPoint;\n return {\n name: point.label || point.category || String(point.x),\n max: 100,\n };\n }) || [],\n splitArea: {\n show: true,\n areaStyle: {\n color: ['transparent', 'transparent', 'transparent', 'transparent', 'transparent'],\n },\n },\n splitLine: {\n lineStyle: {\n color: theme.xAxis.splitLine.lineStyle.color,\n opacity: 0.4,\n },\n },\n axisLine: {\n lineStyle: {\n color: theme.xAxis.axisLine.lineStyle.color,\n opacity: 0.4,\n },\n },\n axisName: {\n color: theme.xAxis.axisLabel.color,\n fontSize: 12,\n },\n } : undefined,\n\n // Data Zoom - inside zoom enabled by default for mouse wheel/pinch\n // Use zoom={{ enabled: false }} to disable, or zoom={{ type: 'slider' }} for slider\n dataZoom: zoom?.enabled === false ? undefined : [\n // Inside zoom (mouse wheel / pinch) - ENABLED BY DEFAULT\n ...((zoom?.type === 'inside' || zoom?.type === 'both' || !zoom?.type) ? [{\n type: 'inside' as const,\n xAxisIndex: (zoom?.axis === 'x' || zoom?.axis === 'both' || !zoom?.axis) ? 0 : undefined,\n yAxisIndex: zoom?.axis === 'y' || zoom?.axis === 'both' ? 0 : undefined,\n start: zoom?.start ?? 0,\n end: zoom?.end ?? 100,\n minSpan: zoom?.minSpan,\n maxSpan: zoom?.maxSpan,\n // Smooth zoom animation\n throttle: 50,\n }] : []),\n // Slider zoom (only when explicitly requested)\n ...(zoom?.type === 'slider' || zoom?.type === 'both' ? [{\n type: 'slider' as const,\n show: true,\n xAxisIndex: zoom?.axis === 'x' || zoom?.axis === 'both' ? 0 : undefined,\n yAxisIndex: zoom?.axis === 'y' || zoom?.axis === 'both' ? 0 : undefined,\n start: zoom?.start ?? 0,\n end: zoom?.end ?? 100,\n minSpan: zoom?.minSpan,\n maxSpan: zoom?.maxSpan,\n backgroundColor: theme.dataZoom.backgroundColor,\n borderColor: theme.dataZoom.borderColor,\n fillerColor: theme.dataZoom.fillerColor,\n handleStyle: { color: theme.dataZoom.handleColor },\n textStyle: theme.dataZoom.textStyle,\n height: 25,\n bottom: 10,\n }] : []),\n ],\n\n // Toolbox (export) – always use custom dropdown for consistent UI\n toolbox: props.export?.enabled ? (() => {\n return {\n show: false, // Hide ECharts toolbox, use custom export button instead\n right: 20,\n top: 10,\n feature: {\n dataView: props.export.formats?.includes('json') ? {\n show: true,\n readOnly: true,\n } : undefined,\n },\n iconStyle: {\n borderColor: theme.textStyle.color,\n },\n };\n })() : undefined,\n\n // Series\n series: transformSeriesToECharts(series, type, theme),\n\n // Animation\n animation: !loading,\n animationDuration: 300,\n animationEasing: 'cubicOut',\n };\n\n // Add mark lines (thresholds)\n if (annotations?.markLines && options.series) {\n const seriesArray = options.series as Array<Record<string, unknown>>;\n if (seriesArray.length > 0) {\n seriesArray[0].markLine = {\n silent: true,\n symbol: 'none',\n data: annotations.markLines.data.map(line => ({\n ...line,\n lineStyle: {\n color: line.color || theme.color[2],\n type: line.lineStyle?.type || 'dashed',\n width: line.lineStyle?.width || 1,\n },\n label: {\n show: !!line.label,\n formatter: line.label,\n position: 'middle', // center of line so label doesn't overlap y-axis at bottom\n distance: 8,\n color: theme.textStyle.color,\n fontWeight: 600,\n fontSize: 11,\n textBorderWidth: 0,\n textBorderColor: 'transparent',\n backgroundColor: theme.tooltip.backgroundColor,\n borderColor: line.color || theme.color[2],\n borderWidth: 1,\n borderRadius: 4,\n padding: [2, 6],\n },\n })),\n };\n }\n }\n\n // Add mark areas (regions) — label style: no white border, crisp and slightly faded; optional icon\n if (annotations?.markAreas && options.series) {\n const seriesArray = options.series as Array<Record<string, unknown>>;\n const axisLabelColor = (theme.xAxis as { axisLabel?: { color?: string } })?.axisLabel?.color ?? theme.textStyle?.color ?? '#94a3b8';\n const fadedColor = axisLabelColor.startsWith('rgba') ? axisLabelColor : `${axisLabelColor}cc`;\n const defaultLabelStyle = {\n show: true,\n color: fadedColor,\n fontSize: 11,\n fontWeight: '500' as const,\n textBorderWidth: 0,\n textBorderColor: 'transparent',\n formatter: (params: { name?: string; value?: unknown }) => {\n const name = (params?.name ?? '') || (typeof params?.value === 'string' ? params.value : '');\n if (!name) return '';\n const icon = name.toLowerCase().includes('eclipse') ? '\\u25D0 ' : ''; // ◐ symbol for eclipse\n return icon ? `${icon}${name}` : name;\n },\n };\n if (seriesArray.length > 0) {\n seriesArray[0].markArea = {\n silent: true,\n data: annotations.markAreas.data.map((pair: [{ xAxis?: number | string; yAxis?: number; name?: string }, { xAxis?: number | string; yAxis?: number }]) => {\n const [start, end] = pair;\n return [\n { ...start, label: { ...defaultLabelStyle, formatter: defaultLabelStyle.formatter } },\n end,\n ];\n }),\n itemStyle: annotations.markAreas.itemStyle,\n };\n }\n }\n\n // Merge custom options\n if (props.echartsOptions) {\n return mergeOptions(options, props.echartsOptions);\n }\n\n return options;\n}\n\nfunction mergeOptions(base: EChartsOption, custom: Partial<EChartsOption>): EChartsOption {\n // Smart series merging logic\n let mergedSeries = base.series;\n \n if (custom.series) {\n const baseSeries = base.series as Array<{ type?: string; data?: unknown[] }> || [];\n const customSeries = custom.series as unknown[];\n \n // Check if all base series are empty (no data or empty data array)\n const allBaseSeriesEmpty = baseSeries.length === 0 || baseSeries.every(s => {\n if (!s) return true;\n if (!s.data) return true;\n if (Array.isArray(s.data) && s.data.length === 0) return true;\n return false;\n });\n \n // Single full override: presets (e.g. GaugeChart) pass one full series config; use it only so we don't render two gauges\n const baseLen = baseSeries.length;\n const customLen = customSeries.length;\n if (baseLen === 1 && customLen === 1) {\n const b = baseSeries[0];\n const c = customSeries[0] as { type?: string };\n if (b?.type === 'gauge' && c?.type === 'gauge') {\n mergedSeries = customSeries as EChartsOption['series'];\n } else if (allBaseSeriesEmpty) {\n mergedSeries = customSeries as EChartsOption['series'];\n } else {\n mergedSeries = [...baseSeries, ...customSeries] as EChartsOption['series'];\n }\n } else if (allBaseSeriesEmpty) {\n mergedSeries = customSeries as EChartsOption['series'];\n } else {\n mergedSeries = [...baseSeries, ...customSeries] as EChartsOption['series'];\n }\n }\n \n return {\n ...base,\n ...custom,\n series: mergedSeries,\n };\n}\n\n// =============================================================================\n// Main Component\n// =============================================================================\n\nexport const AstroChart = memo(forwardRef<AstroChartHandle, AstroChartProps>(\n function AstroChart(props, ref) {\n const {\n width = '100%',\n height = 400,\n loading = false,\n emptyMessage = 'No data available',\n className = '',\n style,\n ariaLabel,\n onChartReady,\n onClick,\n onHover,\n onZoomChange,\n onBrushSelect,\n realTime,\n series = [],\n infoTooltip,\n // Header icon/status system\n icon,\n iconStatus,\n statusMessage,\n showStatusBadge = false,\n } = props;\n\n const chartRef = useRef<ReactEChartsCore>(null);\n const { tokens, mode, theme: themeVariant } = useTheme();\n \n // Detect transparent theme for glassmorphic styling\n const isTransparentTheme = themeVariant === 'transparent' || themeVariant === 'transparent-bold' || themeVariant === 'transparent-minimal';\n const isBoldVariant = themeVariant === 'transparent-bold';\n const isMinimalVariant = themeVariant === 'transparent-minimal';\n \n // Get card border style based on accentBorders setting\n const cardBorderStyle = useCardBorderStyle(tokens, isTransparentTheme);\n \n // Glass accent colors for bold/minimal themes (matching Container)\n const glassAccentColor = tokens.colors.accent.primary;\n const glassAccentMuted = `${glassAccentColor}66`;\n\n const headingConfig = tokens.layout?.card?.heading ?? {\n iconSize: 20,\n iconSizeCompact: 16,\n titleFontSize: '1.125rem',\n titleFontSizeChart: '0.875rem',\n titleFontWeight: 500,\n gap: 8,\n };\n const chartTitleFontSize = headingConfig.titleFontSizeChart ?? headingConfig.titleFontSize;\n\n // Generate theme - uses official AstroUXDS colors for 'astro' theme, Zendir colors for others\n const theme = useMemo(\n () => createAstroEChartsTheme(tokens, mode, themeVariant),\n [tokens, mode, themeVariant]\n );\n\n // Build options - hide ECharts title whenever we show custom header (top-left, all themes)\n const hideEChartsTitle = !!(icon || props.title);\n const options = useMemo(\n () => buildEChartsOptions(props, theme, hideEChartsTitle),\n [props, theme, hideEChartsTitle]\n );\n\n // Get chart instance\n const getChart = useCallback((): ECharts | undefined => {\n return chartRef.current?.getEchartsInstance();\n }, []);\n\n // Dynamic export filename from title, series names, chart type\n const getExportFileName = useCallback((extension?: string, includeTimestamp = true) => {\n const context: ExportFileNameContext = {\n title: props.title,\n subtitle: props.subtitle,\n seriesNames: series.map(s => s.name),\n chartType: props.type,\n };\n let base: string;\n if (props.export?.getExportFileName) {\n base = props.export.getExportFileName(context);\n } else if (props.export?.fileName) {\n base = props.export.fileName;\n } else {\n base = derivedExportBaseName(props.title, context.seriesNames, props.type);\n }\n if (includeTimestamp) {\n const d = new Date();\n const ts = d.toISOString().slice(0, 19).replace(/[-T:]/g, '').replace(/(\\d{8})(\\d{6})/, '$1-$2');\n base = `${base}-${ts}`;\n }\n if (extension) base = `${base}.${extension.replace(/^\\./, '')}`;\n return base;\n }, [props.title, props.subtitle, props.type, props.export, series]);\n\n // Expose imperative handle\n useImperativeHandle(ref, () => ({\n getChart,\n resize: () => getChart()?.resize(),\n getExportFileName,\n exportImage: (type = 'png', pixelRatio = 2) => {\n const chart = getChart();\n if (!chart) return undefined;\n const imgType = type === 'jpg' ? 'jpeg' : type;\n return chart.getDataURL({\n type: imgType as 'png' | 'jpeg' | 'svg',\n pixelRatio,\n backgroundColor: 'transparent',\n });\n },\n exportCSV: () => {\n const rows: string[] = [];\n const headers = ['Index', ...series.map(s => s.name)];\n rows.push(headers.join(','));\n \n const maxLen = Math.max(...series.map(s => s.data?.length || 0));\n for (let i = 0; i < maxLen; i++) {\n const row = [i.toString()];\n for (const s of series) {\n const data = s.data as unknown[];\n const value = 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 point = value as DataPoint | TimeSeriesPoint;\n row.push(('value' in point ? point.value : point.y)?.toString() || '');\n } else {\n row.push('');\n }\n }\n rows.push(row.join(','));\n }\n return rows.join('\\n');\n },\n appendData: (seriesIndex: number, data: DataPoint | TimeSeriesPoint) => {\n const chart = getChart();\n if (!chart) return;\n\n // Get current data\n const option = chart.getOption();\n const seriesOpt = (option.series as Array<{ data: unknown[] }>)?.[seriesIndex];\n if (!seriesOpt) return;\n\n const currentData = [...(seriesOpt.data || [])];\n const newPoint = 'time' in data \n ? [data.time, data.value]\n : [data.x, data.y];\n \n currentData.push(newPoint);\n\n // Apply max points limit\n const maxPoints = realTime?.maxPoints || 1000;\n while (currentData.length > maxPoints) {\n currentData.shift();\n }\n\n // Update chart\n chart.setOption({\n series: [{\n data: currentData,\n }],\n }, {\n replaceMerge: ['series'],\n });\n },\n clearData: () => {\n const chart = getChart();\n if (!chart) return;\n \n chart.setOption({\n series: series.map(() => ({ data: [] })),\n });\n },\n dispatchAction: (action: unknown) => {\n getChart()?.dispatchAction(action as Parameters<ECharts['dispatchAction']>[0]);\n },\n }), [getChart, series, realTime]);\n\n // Event handlers\n const handleEvents = useMemo(() => {\n const events: Record<string, (params: unknown) => void> = {};\n \n if (onClick) {\n events.click = (params: unknown) => {\n onClick(params as ChartEventParams);\n };\n }\n \n if (onHover) {\n events.mouseover = (params: unknown) => {\n onHover(params as ChartEventParams);\n };\n }\n \n if (onZoomChange) {\n events.datazoom = (params: unknown) => {\n const p = params as { start?: number; end?: number; batch?: Array<{ start: number; end: number }> };\n onZoomChange({\n start: p.batch?.[0]?.start ?? p.start ?? 0,\n end: p.batch?.[0]?.end ?? p.end ?? 100,\n });\n };\n }\n \n if (onBrushSelect) {\n events.brushselected = (params: unknown) => {\n onBrushSelect(params as Parameters<NonNullable<typeof onBrushSelect>>[0]);\n };\n }\n \n return events;\n }, [onClick, onHover, onZoomChange, onBrushSelect]);\n\n // Chart ready callback\n const handleChartReady = useCallback((chart: unknown) => {\n onChartReady?.(chart);\n }, [onChartReady]);\n\n // Custom export dropdown: always show when export is enabled (for consistent UI)\n const exportFormats = props.export?.formats ?? ['png'];\n const useCustomExportDropdown = props.export?.enabled;\n const [exportMenuOpen, setExportMenuOpen] = useState(false);\n const exportMenuRef = useRef<HTMLDivElement>(null);\n \n // Info tooltip state\n const [infoTooltipOpen, setInfoTooltipOpen] = useState(false);\n const infoTooltipRef = useRef<HTMLDivElement>(null);\n \n // Close info tooltip on outside click\n useEffect(() => {\n if (!infoTooltip || !infoTooltipOpen) return;\n const handleClickOutside = (e: MouseEvent) => {\n if (infoTooltipRef.current && !infoTooltipRef.current.contains(e.target as Node)) {\n setInfoTooltipOpen(false);\n }\n };\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [infoTooltip, infoTooltipOpen]);\n\n useEffect(() => {\n if (!useCustomExportDropdown || !exportMenuOpen) return;\n const handleClickOutside = (e: MouseEvent) => {\n if (exportMenuRef.current && !exportMenuRef.current.contains(e.target as Node)) {\n setExportMenuOpen(false);\n }\n };\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [useCustomExportDropdown, exportMenuOpen]);\n\n const handleExportFormat = useCallback((format: 'png' | 'jpeg' | 'svg' | 'csv') => {\n const chart = getChart();\n if (format === 'csv') {\n const rows: string[] = [];\n const headers = ['Index', ...series.map(s => s.name)];\n rows.push(headers.join(','));\n const maxLen = Math.max(...series.map(s => s.data?.length || 0));\n for (let i = 0; i < maxLen; i++) {\n const row = [i.toString()];\n for (const s of series) {\n const data = s.data as unknown[];\n const value = data?.[i];\n if (typeof value === 'number') row.push(value.toString());\n else if (Array.isArray(value)) row.push(value[1]?.toString() || '');\n else if (value && typeof value === 'object') {\n const point = value as DataPoint | TimeSeriesPoint;\n row.push(('value' in point ? point.value : point.y)?.toString() || '');\n } else row.push('');\n }\n rows.push(row.join(','));\n }\n const csv = rows.join('\\n');\n const filename = getExportFileName('csv', true);\n const blob = new Blob([csv], { type: 'text/csv;charset=utf-8' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n a.click();\n URL.revokeObjectURL(url);\n } else if (chart) {\n const imgType = format === 'jpeg' ? 'jpeg' : format;\n const dataUrl = chart.getDataURL({\n type: imgType as 'png' | 'jpeg' | 'svg',\n pixelRatio: props.export?.pixelRatio || 2,\n backgroundColor: props.export?.backgroundColor || 'transparent',\n });\n if (dataUrl) {\n const ext = format === 'jpeg' ? 'jpg' : format;\n const filename = getExportFileName(ext, true);\n const a = document.createElement('a');\n a.href = dataUrl;\n a.download = filename;\n a.click();\n }\n }\n setExportMenuOpen(false);\n }, [getChart, series, getExportFileName, props.export?.pixelRatio, props.export?.backgroundColor]);\n\n // Resize observer (guard so we never resize after unmount/dispose)\n useEffect(() => {\n const chart = getChart();\n if (!chart) return;\n\n let mounted = true;\n const resizeObserver = new ResizeObserver(() => {\n if (!mounted) return;\n try {\n chart.resize();\n } catch {\n // Chart may be disposed; ignore\n }\n });\n\n const container = chartRef.current?.ele;\n if (container) {\n resizeObserver.observe(container);\n }\n\n return () => {\n mounted = false;\n resizeObserver.disconnect();\n };\n }, [getChart]);\n\n // echarts-gl 3D series require canvas renderer (SVG mode crashes with isSingleCanvas error)\n const needs3DCanvas = useMemo(() => {\n const eo = props.echartsOptions;\n if (!eo) return false;\n if (eo.grid3D || eo.xAxis3D || eo.yAxis3D || eo.zAxis3D || eo.globe || eo.geo3D) return true;\n if (Array.isArray(eo.series)) {\n return eo.series.some((s: any) => {\n const t = s?.type || '';\n return t.includes('3D') || t.includes('3d') || t === 'scatter3D' || t === 'bar3D' || t === 'surface' || t === 'lines3D';\n });\n }\n return false;\n }, [props.echartsOptions]);\n\n // Check if data is empty (consider both series prop and echartsOptions.series)\n const hasSeriesData = series.some(s => s.data && s.data.length > 0);\n const hasEchartsOptionsSeries = props.echartsOptions?.series && \n (Array.isArray(props.echartsOptions.series) \n ? props.echartsOptions.series.length > 0 \n : props.echartsOptions.series !== undefined);\n const hasData = hasSeriesData || hasEchartsOptionsSeries;\n\n // Status color mapping for header icon\n const getStatusColor = (status: ChartStatus | undefined): string => {\n switch (status) {\n case 'critical': return tokens.colors.status?.critical || '#ff3838';\n case 'serious': return tokens.colors.status?.serious || '#ffb302';\n case 'caution': return tokens.colors.status?.caution || '#fce83a';\n case 'normal': return tokens.colors.status?.normal || '#56f000';\n case 'standby': return tokens.colors.status?.standby || '#2dccff';\n case 'off': return tokens.colors.status?.off || '#a4abb6';\n default: return tokens.colors.text.secondary;\n }\n };\n\n // Check if we need to render the header (has icon or title)\n const hasHeader = !!(icon || props.title);\n\n // Container styles - glassmorphic for transparent themes (matching Container component)\n // Bold and Minimal themes get special glass styling\n const useGlassMode = isBoldVariant || isMinimalVariant;\n \n const containerStyle: React.CSSProperties = {\n width: typeof width === 'number' ? `${width}px` : width,\n height: typeof height === 'number' ? `${height}px` : height,\n borderRadius: tokens.borderRadius.lg,\n padding: tokens.spacing.sm,\n position: 'relative',\n overflow: 'hidden',\n // Glass mode styling for bold/minimal (matching Container)\n ...(useGlassMode ? {\n backgroundColor: 'rgba(10, 15, 25, 0.35)',\n backdropFilter: 'blur(12px)',\n WebkitBackdropFilter: 'blur(12px)',\n border: `1px solid ${glassAccentMuted}`,\n borderTop: isBoldVariant ? `2px solid ${glassAccentColor}` : `1px solid ${glassAccentColor}`,\n transition: 'all 0.3s ease-out, box-shadow 0.3s ease-out',\n } : isTransparentTheme ? {\n // Regular transparent (glass) theme — match top cards (ISS): transparent + blur\n backgroundColor: 'transparent',\n backdropFilter: 'blur(12px)',\n WebkitBackdropFilter: 'blur(12px)',\n ...cardBorderStyle,\n } : {\n // Non-transparent themes — use same border as Container (muted) so chart doesn't stand out\n backgroundColor: tokens.colors.background.surface,\n border: `1px solid ${tokens.colors.border.muted}`,\n }),\n ...style,\n };\n \n // Glass gradient for bold/minimal themes\n const glassGradient = useGlassMode \n ? `linear-gradient(135deg, ${glassAccentColor}10 0%, ${glassAccentColor}03 100%)`\n : undefined;\n\n // Empty state\n if (!hasData && !loading) {\n return (\n <div \n className={`astro-chart astro-chart--empty ${className}`}\n style={containerStyle}\n role=\"group\"\n aria-roledescription=\"chart\"\n aria-label={ariaLabel || 'Empty chart'}\n >\n {/* Glass gradient overlay for bold/minimal themes */}\n {useGlassMode && glassGradient && (\n <div\n style={{\n position: 'absolute',\n inset: 0,\n background: glassGradient,\n pointerEvents: 'none',\n zIndex: 0,\n }}\n />\n )}\n <div style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n height: '100%',\n color: tokens.colors.text.secondary,\n fontFamily: tokens.typography.fontFamily.primary,\n fontSize: tokens.typography.fontSize.sm,\n position: 'relative',\n zIndex: 1,\n }}>\n {emptyMessage}\n </div>\n </div>\n );\n }\n\n const exportImageFormats = exportFormats.filter(f => ['png', 'jpeg', 'jpg', 'svg'].includes(f));\n const hasCsv = exportFormats.includes('csv');\n\n // Calculate header height for chart area adjustment\n const _headerHeight = (icon && iconStatus) ? 32 : 0;\n\n return (\n <div \n className={`astro-chart ${className}`}\n style={containerStyle}\n role=\"group\"\n aria-roledescription=\"chart\"\n aria-label={ariaLabel || props.title || 'Chart'}\n >\n {/* Glass gradient overlay for bold/minimal themes (matching Container) */}\n {useGlassMode && glassGradient && (\n <div\n style={{\n position: 'absolute',\n inset: 0,\n background: glassGradient,\n pointerEvents: 'none',\n zIndex: 0,\n }}\n />\n )}\n \n {/* Header - BOLD variant (matching Container) */}\n {hasHeader && isBoldVariant && (\n <div style={{ position: 'relative', zIndex: 1 }}>\n <div style={{ \n display: 'flex', \n alignItems: 'center', \n justifyContent: 'space-between',\n padding: `12px ${tokens.spacing.sm} 0`,\n }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: headingConfig.gap }}>\n {/* Icon with status badge - card heading system */}\n {icon && iconStatus && (\n <HeaderIconWithStatus \n icon={icon as AstroIconName}\n size={headingConfig.iconSize}\n status={iconStatus}\n statusColor={getStatusColor(iconStatus)}\n />\n )}\n {icon && !iconStatus && (\n <AstroIcon \n name={icon as AstroIconName} \n size={headingConfig.iconSize} \n color={glassAccentColor}\n />\n )}\n {props.title && (\n <h3 style={{\n margin: 0,\n fontSize: chartTitleFontSize,\n fontWeight: headingConfig.titleFontWeight,\n color: glassAccentColor,\n letterSpacing: '0.5px',\n textShadow: `0 0 20px ${glassAccentMuted}`,\n }}>\n {props.title}\n </h3>\n )}\n </div>\n </div>\n {/* Accent decorative line with status badge */}\n <div style={{\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n padding: `10px ${tokens.spacing.sm} 0`,\n marginBottom: tokens.spacing.xs,\n }}>\n <div style={{\n flex: 1,\n height: '2px',\n background: `linear-gradient(90deg, ${glassAccentColor} 0%, ${glassAccentMuted} 50%, transparent 100%)`,\n boxShadow: `0 0 8px ${glassAccentMuted}`,\n }} />\n {/* Status badge at end of line (optional) */}\n {showStatusBadge && iconStatus && (\n <span style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: '4px',\n padding: '2px 8px',\n fontSize: '0.625rem', // 10px in rem\n fontWeight: 500, // AstroUXDS medium (not 600)\n letterSpacing: '0.05em',\n color: getStatusColor(iconStatus),\n backgroundColor: `${getStatusColor(iconStatus)}20`,\n border: `1px solid ${getStatusColor(iconStatus)}40`,\n borderRadius: '3px',\n whiteSpace: 'nowrap',\n }}>\n {STATUS_SHAPES[iconStatus](6, getStatusColor(iconStatus))}\n {STATUS_LABELS[iconStatus]}\n </span>\n )}\n </div>\n </div>\n )}\n \n {/* Header - MINIMAL variant (inline thin line, matching Container) */}\n {hasHeader && isMinimalVariant && (\n <div style={{\n display: 'flex',\n alignItems: 'center',\n padding: `${tokens.spacing.xs} ${tokens.spacing.sm} 0`,\n marginBottom: tokens.spacing.xs,\n position: 'relative',\n zIndex: 1,\n }}>\n {icon && iconStatus && (\n <HeaderIconWithStatus \n icon={icon as AstroIconName}\n size={headingConfig.iconSizeCompact}\n status={iconStatus}\n statusColor={getStatusColor(iconStatus)}\n style={{ marginRight: tokens.spacing.sm }}\n />\n )}\n {icon && !iconStatus && (\n <AstroIcon \n name={icon as AstroIconName} \n size={headingConfig.iconSizeCompact} \n color={glassAccentColor}\n style={{ marginRight: tokens.spacing.sm }}\n />\n )}\n {props.title && (\n <h3 style={{\n margin: 0,\n fontSize: chartTitleFontSize,\n fontWeight: headingConfig.titleFontWeight,\n color: glassAccentColor,\n textShadow: `0 0 16px ${glassAccentMuted}`,\n letterSpacing: '0.02em',\n whiteSpace: 'nowrap',\n marginRight: '12px',\n }}>\n {props.title}\n </h3>\n )}\n {/* Accent line with status badge */}\n <div style={{\n flex: 1,\n display: 'flex',\n alignItems: 'center',\n gap: headingConfig.gap,\n minWidth: 40,\n }}>\n <div style={{\n flex: 1,\n height: '1px',\n background: `linear-gradient(90deg, ${glassAccentColor} 0%, ${glassAccentMuted} 60%, transparent 100%)`,\n }} />\n {/* Status badge at end of line (optional) */}\n {showStatusBadge && iconStatus && (\n <span style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: '3px',\n padding: '1px 6px',\n fontSize: '0.5625rem', // 9px in rem (micro)\n fontWeight: 500, // AstroUXDS medium (not 600)\n letterSpacing: '0.05em',\n color: getStatusColor(iconStatus),\n backgroundColor: `${getStatusColor(iconStatus)}15`,\n border: `1px solid ${getStatusColor(iconStatus)}30`,\n borderRadius: '2px',\n whiteSpace: 'nowrap',\n }}>\n {STATUS_SHAPES[iconStatus](5, getStatusColor(iconStatus))}\n {STATUS_LABELS[iconStatus]}\n </span>\n )}\n </div>\n </div>\n )}\n \n {/* Header - Regular glass theme (no box/border) */}\n {hasHeader && isTransparentTheme && !useGlassMode && (\n <div \n title={statusMessage}\n style={{\n position: 'absolute',\n top: 6,\n left: 8,\n display: 'flex',\n alignItems: 'center',\n gap: headingConfig.gap,\n zIndex: 10,\n }}\n >\n {icon && iconStatus && (\n <HeaderIconWithStatus \n icon={icon as AstroIconName}\n size={headingConfig.iconSizeCompact}\n status={iconStatus}\n statusColor={getStatusColor(iconStatus)}\n />\n )}\n {icon && !iconStatus && (\n <AstroIcon \n name={icon as AstroIconName} \n size={headingConfig.iconSizeCompact} \n color={tokens.colors.text.tertiary}\n />\n )}\n {props.title && (\n <span style={{\n fontSize: chartTitleFontSize,\n fontWeight: headingConfig.titleFontWeight,\n color: tokens.colors.text.primary,\n }}>\n {props.title}\n </span>\n )}\n </div>\n )}\n \n {/* Header - Non-transparent themes (Zen/Astro): same top-left layout, no box/border */}\n {hasHeader && !isTransparentTheme && (\n <div \n title={statusMessage}\n style={{\n position: 'absolute',\n top: 6,\n left: 8,\n display: 'flex',\n alignItems: 'center',\n gap: headingConfig.gap,\n zIndex: 10,\n }}\n >\n {icon && iconStatus && (\n <HeaderIconWithStatus \n icon={icon as AstroIconName}\n size={headingConfig.iconSizeCompact}\n status={iconStatus}\n statusColor={getStatusColor(iconStatus)}\n />\n )}\n {icon && !iconStatus && (\n <AstroIcon \n name={icon as AstroIconName} \n size={headingConfig.iconSizeCompact} \n color={tokens.colors.text.tertiary}\n />\n )}\n {props.title && (\n <span style={{\n fontSize: chartTitleFontSize,\n fontWeight: headingConfig.titleFontWeight,\n color: tokens.colors.text.primary,\n }}>\n {props.title}\n </span>\n )}\n </div>\n )}\n {/* SVG renderer by default for sharp text; canvas is forced when echarts-gl 3D series are present (gl requires canvas) */}\n <ReactEChartsCore\n ref={chartRef}\n echarts={echarts}\n option={options}\n opts={{\n renderer: props.renderer ?? (needs3DCanvas ? 'canvas' : 'svg'),\n ...((props.renderer === 'canvas' || needs3DCanvas) && typeof window !== 'undefined' && { devicePixelRatio: window.devicePixelRatio || 1 }),\n }}\n style={{ width: '100%', height: '100%' }}\n notMerge={true}\n lazyUpdate={true}\n showLoading={loading}\n loadingOption={{\n text: 'Loading...',\n color: tokens.colors.accent.primary,\n textColor: tokens.colors.text.primary,\n maskColor: isTransparentTheme ? 'rgba(10, 15, 25, 0.6)' : `${tokens.colors.background.surface}80`,\n }}\n onEvents={handleEvents}\n onChartReady={handleChartReady}\n />\n {/* Chart toolbar - compact, positioned top right */}\n <div style={{ \n position: 'absolute', \n right: 8, \n top: 6, \n zIndex: 10,\n display: 'flex',\n alignItems: 'center',\n gap: 4,\n }}>\n {/* Info tooltip button */}\n {infoTooltip && (\n <div ref={infoTooltipRef} style={{ position: 'relative' }}>\n <button\n type=\"button\"\n onClick={() => setInfoTooltipOpen(v => !v)}\n aria-label=\"Chart information\"\n aria-expanded={infoTooltipOpen}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 20,\n height: 20,\n padding: 4,\n border: `1px solid ${tokens.colors.border.default}`,\n borderRadius: '50%',\n background: infoTooltipOpen ? tokens.colors.accent.primary : (isTransparentTheme ? 'rgba(10, 15, 25, 0.5)' : tokens.colors.background.surface),\n color: infoTooltipOpen ? tokens.colors.background.base : tokens.colors.text.secondary,\n cursor: 'pointer',\n transition: 'all 0.15s ease',\n }}\n >\n {infoTooltip.icon || (\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\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-6h2v6zm0-8h-2V7h2v2z\"/>\n </svg>\n )}\n </button>\n {infoTooltipOpen && (\n <div\n role=\"tooltip\"\n style={{\n position: 'absolute',\n right: 0,\n top: '100%',\n marginTop: 8,\n minWidth: 200,\n maxWidth: infoTooltip.maxWidth || 300,\n padding: '12px 16px',\n background: isTransparentTheme ? 'rgba(10, 15, 25, 0.85)' : tokens.colors.background.surface,\n backdropFilter: isTransparentTheme ? 'blur(12px)' : undefined,\n border: `1px solid ${tokens.colors.border.default}`,\n borderRadius: tokens.borderRadius.md,\n boxShadow: '0 4px 16px rgba(0,0,0,0.25)',\n color: tokens.colors.text.primary,\n fontFamily: tokens.typography.fontFamily.primary,\n fontSize: tokens.typography.fontSize.sm,\n lineHeight: 1.5,\n zIndex: 20,\n }}\n >\n {infoTooltip.content}\n </div>\n )}\n </div>\n )}\n \n {/* Export dropdown - compact icon only */}\n {useCustomExportDropdown && (\n <div ref={exportMenuRef} style={{ position: 'relative' }}>\n <button\n type=\"button\"\n onClick={() => setExportMenuOpen(v => !v)}\n aria-haspopup=\"true\"\n aria-expanded={exportMenuOpen}\n aria-label=\"Save chart as\"\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 20,\n height: 20,\n padding: 4,\n border: `1px solid ${tokens.colors.border.default}`,\n borderRadius: '50%',\n background: isTransparentTheme ? 'rgba(10, 15, 25, 0.5)' : tokens.colors.background.surface,\n color: tokens.colors.text.secondary,\n cursor: 'pointer',\n transition: 'all 0.15s ease',\n }}\n >\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" />\n <polyline points=\"7 10 12 15 17 10\" />\n <line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"3\" />\n </svg>\n </button>\n {exportMenuOpen && (\n <div\n role=\"menu\"\n style={{\n position: 'absolute',\n right: 0,\n top: '100%',\n marginTop: 4,\n minWidth: 120,\n padding: 4,\n background: tokens.colors.background.surface,\n border: `1px solid ${tokens.colors.border.default}`,\n borderRadius: tokens.borderRadius.md,\n boxShadow: '0 4px 12px rgba(0,0,0,0.2)',\n }}\n >\n {exportImageFormats.map(f => (\n <button\n key={f}\n type=\"button\"\n role=\"menuitem\"\n onClick={() => handleExportFormat(f === 'jpg' ? 'jpeg' : f as 'png' | 'jpeg' | 'svg')}\n style={{\n display: 'block',\n width: '100%',\n padding: '8px 12px',\n border: 'none',\n borderRadius: tokens.borderRadius.sm,\n background: 'transparent',\n color: tokens.colors.text.primary,\n fontFamily: tokens.typography.fontFamily.primary,\n fontSize: tokens.typography.fontSize.sm,\n textAlign: 'left',\n cursor: 'pointer',\n }}\n >\n {f.toUpperCase()}\n </button>\n ))}\n {hasCsv && (\n <button\n type=\"button\"\n role=\"menuitem\"\n onClick={() => handleExportFormat('csv')}\n style={{\n display: 'block',\n width: '100%',\n padding: '8px 12px',\n border: 'none',\n borderRadius: tokens.borderRadius.sm,\n background: 'transparent',\n color: tokens.colors.text.primary,\n fontFamily: tokens.typography.fontFamily.primary,\n fontSize: tokens.typography.fontSize.sm,\n textAlign: 'left',\n cursor: 'pointer',\n }}\n >\n CSV\n </button>\n )}\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n );\n }\n));\n\nexport default AstroChart;\n"],"names":["EChartsParallelChart","_a","_b","AstroChart","_d","_c","_e","_f"],"mappings":";;;;;;;;;;;;AAuFA,MAAM,gBAAuF;AAAA,EAC3F,KAAK,CAAC,MAAM,8BACT,OAAA,EAAI,SAAQ,aAAY,OAAO,MAAM,QAAQ,MAC5C,UAAA,oBAAC,UAAA,EAAO,IAAG,KAAI,IAAG,KAAI,GAAE,KAAI,MAAM,MAAA,CAAO,EAAA,CAC3C;AAAA,EAEF,SAAS,CAAC,MAAM,8BACb,OAAA,EAAI,SAAQ,aAAY,OAAO,MAAM,QAAQ,MAC5C,UAAA,oBAAC,UAAA,EAAO,IAAG,KAAI,IAAG,KAAI,GAAE,KAAI,MAAM,MAAA,CAAO,EAAA,CAC3C;AAAA,EAEF,QAAQ,CAAC,MAAM,8BACZ,OAAA,EAAI,SAAQ,aAAY,OAAO,MAAM,QAAQ,MAC5C,UAAA,oBAAC,UAAA,EAAO,IAAG,KAAI,IAAG,KAAI,GAAE,KAAI,MAAM,MAAA,CAAO,EAAA,CAC3C;AAAA,EAEF,SAAS,CAAC,MAAM,UACd,oBAAC,SAAI,SAAQ,aAAY,OAAO,MAAM,QAAQ,MAC5C,8BAAC,QAAA,EAAK,GAAE,KAAI,GAAE,KAAI,OAAM,MAAK,QAAO,MAAK,MAAM,MAAA,CAAO,EAAA,CACxD;AAAA,EAEF,SAAS,CAAC,MAAM,UACd,oBAAC,OAAA,EAAI,SAAQ,aAAY,OAAO,MAAM,QAAQ,MAC5C,UAAA,oBAAC,WAAA,EAAQ,QAAO,qBAAoB,MAAM,OAAO,GACnD;AAAA,EAEF,UAAU,CAAC,MAAM,UACf,oBAAC,OAAA,EAAI,SAAQ,aAAY,OAAO,MAAM,QAAQ,MAC5C,UAAA,oBAAC,WAAA,EAAQ,QAAO,iBAAgB,MAAM,OAAO,EAAA,CAC/C;AAEJ;AAOA,MAAM,gBAA6C;AAAA,EACjD,KAAK;AAAA,EACL,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,SAAS;AAAA,EACT,UAAU;AACZ;AAGA,SAAS,KAAK,KAAqB;AACjC,SAAO,IACJ,cACA,QAAQ,eAAe,GAAG,EAC1B,QAAQ,UAAU,EAAE;AACzB;AAGA,SAAS,sBACP,OACA,aACA,WACQ;AACR,QAAM,QAAkB,CAAC,QAAQ;AACjC,MAAI,MAAO,OAAM,KAAK,KAAK,KAAK,CAAC;AAAA,MAC5B,OAAM,KAAK,OAAO;AACvB,QAAM,aAAa,YAAY,MAAM,GAAG,CAAC,EAAE,IAAI,IAAI,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAC7E,MAAI,WAAY,OAAM,KAAK,UAAU;AACrC,QAAM,KAAK,KAAK,SAAS,CAAC;AAC1B,SAAO,MAAM,KAAK,GAAG,KAAK;AAC5B;AAGA,QAAQ,IAAI;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACAA;AAAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AA6BD,SAAS,yBACP,QACA,WACA,OACyB;AACzB,SAAO,OAAO,IAAI,CAAC,GAAG,UAAU;;AAC9B,UAAM,aAAa,EAAE,QAAQ;AAC7B,UAAM,QAAQ,EAAE,SAAS,eAAe,KAAK;AAG7C,UAAM,aAAsC;AAAA,MAC1C,IAAI,EAAE;AAAA,MACN,MAAM,EAAE;AAAA,MACR,MAAM,aAAa,UAAU;AAAA,MAC7B,MAAM,cAAc,EAAE,MAAM,UAAU;AAAA,MACtC,YAAY,EAAE,cAAc;AAAA,MAC5B,YAAY,eAAe,eAAc,OAAE,WAAF,mBAAU,UAAS;AAAA,MAC5D,QAAQ,EAAE,WAAW,eAAe,UAAU,eAAe;AAAA,IAAA;AAI/D,QAAI,eAAe,UAAU,eAAe,QAAQ;AAClD,iBAAW,YAAY;AAAA,QACrB,SAAO,OAAE,cAAF,mBAAa,UAAS;AAAA,QAC7B,QAAM,OAAE,cAAF,mBAAa,SAAQ;AAAA,QAC3B,WAAS,OAAE,cAAF,mBAAa,YAAW;AAAA,MAAA;AAEnC,iBAAW,YAAY,EAAE,MAAA;AAEzB,UAAI,eAAe,QAAQ;AACzB,mBAAW,YAAY,EAAE,aAAa;AAAA,UACpC,SAAS;AAAA,UACT,OAAO,mBAAmB,KAAK;AAAA,QAAA;AAAA,MAEnC;AAEA,UAAI,EAAE,QAAQ;AACZ,mBAAW,SAAS,EAAE,OAAO,QAAQ;AACrC,mBAAW,aAAa,EAAE,OAAO,QAAQ;AAAA,MAC3C;AAAA,IACF;AAGA,QAAI,eAAe,OAAO;AACxB,iBAAW,YAAY;AAAA,QACrB;AAAA,QACA,cAAc,CAAC,GAAG,GAAG,GAAG,CAAC;AAAA,MAAA;AAE3B,UAAI,EAAE,OAAO;AACX,mBAAW,QAAQ,EAAE;AAAA,MACvB;AAAA,IACF;AAGA,QAAI,eAAe,SAAS,eAAe,SAAS;AAClD,iBAAW,SAAS,eAAe,UAAU,CAAC,OAAO,KAAK,IAAI;AAC9D,iBAAW,QAAQ;AAAA,QACjB,MAAM;AAAA,QACN,WAAW;AAAA,QACX,OAAO,MAAM,UAAU;AAAA,QACvB,iBAAiB;AAAA,QACjB,iBAAiB;AAAA,MAAA;AAEnB,iBAAW,WAAW;AAAA,QACpB,WAAW;AAAA,UACT,YAAY;AAAA,UACZ,eAAe;AAAA,UACf,aAAa;AAAA,QAAA;AAAA,MACf;AAAA,IAEJ;AAGA,QAAI,eAAe,WAAW;AAC5B,iBAAW,eAAa,OAAE,WAAF,mBAAU,SAAQ;AAC1C,iBAAW,YAAY,EAAE,MAAA;AAAA,IAC3B;AAGA,QAAI,eAAe,SAAS;AAC1B,iBAAW,SAAS;AAAA,QAClB,WAAW;AAAA,QACX,UAAU;AAAA,QACV,OAAO,MAAM,UAAU;AAAA,MAAA;AAEzB,iBAAW,WAAW;AAAA,QACpB,WAAW;AAAA,UACT,OAAO;AAAA,UACP,OAAO;AAAA,YACL,CAAC,KAAK,MAAM,MAAM,CAAC,CAAC;AAAA;AAAA,YACpB,CAAC,KAAK,MAAM,MAAM,CAAC,CAAC;AAAA;AAAA,YACpB,CAAC,GAAG,MAAM,MAAM,CAAC,CAAC;AAAA;AAAA,UAAA;AAAA,QACpB;AAAA,MACF;AAAA,IAEJ;AAEA,WAAO;AAAA,EACT,CAAC;AACH;AAEA,SAAS,aAAa,MAAyB;AAC7C,UAAQ,MAAA;AAAA,IACN,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EAAA;AAEb;AAEA,SAAS,cACP,MACA,MACW;AACX,MAAI,CAAC,QAAQ,KAAK,WAAW,UAAU,CAAA;AAGvC,MAAI,OAAO,KAAK,CAAC,MAAM,UAAU;AAC/B,WAAO;AAAA,EACT;AAGA,MAAI,MAAM,QAAQ,KAAK,CAAC,CAAC,GAAG;AAC1B,WAAO;AAAA,EACT;AAGA,QAAM,YAAY,KAAK,CAAC;AAExB,MAAI,UAAU,WAAW;AAEvB,WAAQ,KAA2B,IAAI,CAAA,MAAK,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC;AAAA,EAC/D;AAGA,MAAI,SAAS,SAAS,SAAS,SAAS;AACtC,WAAQ,KAAqB,IAAI,CAAA,OAAM;AAAA,MACrC,MAAM,OAAO,EAAE,CAAC;AAAA,MAChB,OAAO,EAAE;AAAA;AAAA,MAET,GAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,MAAA,EAAM,IAAM,CAAA;AAAA;AAAA,MAElD,GAAI,EAAE,QAAQ,CAAA;AAAA,IAAC,EACf;AAAA,EACJ;AAGA,MAAI,SAAS,WAAW;AACtB,WAAQ,KAAqB,IAAI,CAAA,OAAM;AAAA,MACrC,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC;AAAA,MAChB,GAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,MAAA,EAAM,IAAM,CAAA;AAAA,MAClD,GAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAA,IAAU,CAAA;AAAA,IAAC,EACnC;AAAA,EACJ;AAGA,SAAQ,KAAqB,IAAI,CAAA,MAAK,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;AAClD;AAMA,SAAS,oBACP,OACA,OACA,YAAY,OACG;;AACf,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc;AAAA;AAAA,EAAA,IACZ;AAGJ,QAAM,mBAAmB,SAAS,CAAC;AAKnC,QAAM,UAAU,SAAS;AACzB,QAAM,QAAQ,SAAS,SAAS,SAAS;AACzC,QAAM,UAAU,SAAS;AACzB,QAAM,WAAW,SAAS;AAC1B,QAAM,YAAY,SAAS,aAAa,SAAS;AACjD,QAAM,YAAU,WAAM,mBAAN,mBAAsB,WACpC,MAAM,QAAQ,MAAM,eAAe,MAAM,KACzC,MAAM,eAAe,OAAO,KAAK,CAAC,OAAgB,uBAAyB,UAAS,OAAO;AAG7F,QAAM,OAAO,CAAC,IAAE,WAAM,mBAAN,mBAAsB,aAAU,WAAM,mBAAN,mBAAsB,cACpE,WAAM,mBAAN,mBAAsB,YACrB,WAAM,mBAAN,mBAAsB,WAAU,MAAM,QAAQ,MAAM,eAAe,MAAM,KACxE,MAAM,eAAe,OAAO,KAAK,CAAC,MAAe;AAC/C,UAAM,cAAc,uBAAyB,SAAQ;AACrD,WAAO,WAAW,SAAS,IAAI,KAAK,WAAW,SAAS,IAAI;AAAA,EAC9D,CAAC;AAGL,QAAM,YAAY,CAAC,WAAW,CAAC,SAAS,CAAC,WAAW,CAAC,YAAY,CAAC,aAAa,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM;AAK3G,QAAM,WAAW,YAAY,OAAO,CAAC,CAAC;AACtC,QAAM,cAAc,YAAY,QAAQ,CAAC,CAAC;AAC1C,QAAM,kBAAiB,iCAAQ,aAAY;AAC3C,QAAM,cAAc,mBAAmB;AACvC,QAAM,iBAAiB,mBAAmB;AAC1C,QAAM,cAAa,iCAAQ,UAAS;AAGpC,QAAM,UAAyB;AAAA;AAAA,IAE7B,OAAO,mBAAmB;AAAA,MACxB,MAAM;AAAA,MACN,SAAS;AAAA,MACT,MAAM;AAAA,MACN,KAAK,eAAe,aAAa,KAAK;AAAA,MACtC,WAAW,EAAE,GAAG,MAAM,MAAM,WAAW,YAAa,MAAM,MAAM,UAAU,cAAoC,SAAA;AAAA,MAC9G,cAAc,MAAM,MAAM;AAAA,IAAA,IACxB;AAAA;AAAA;AAAA,IAIJ,UAAS,mCAAS,aAAY,QAAS;AAAA,MACrC,UAAS,mCAAS,aAAY,QAAQ,SAAS;AAAA,MAC/C,aAAa;AAAA,QACX,OAAM,mCAAS,eAAc,SAAQ,mCAAS,eAAc,SAAS,UAAU;AAAA,QAC/E,WAAW,MAAM,YAAY;AAAA,QAC7B,YAAY,MAAM,YAAY;AAAA;AAAA,QAE9B,OAAO,cAAc;AAAA,UACnB,MAAM;AAAA,UACN,iBAAiB,MAAM,QAAQ;AAAA,UAC/B,aAAa,MAAM,QAAQ;AAAA,UAC3B,OAAO,MAAM,QAAQ,UAAU;AAAA,UAC/B,UAAU;AAAA,UACV,SAAS,CAAC,GAAG,CAAC;AAAA;AAAA,UAEd,WAAW,CAAC,WAAiF;;AAC3F,kBAAM,WAAW,OAAO,kBAAkB,MACtC,+BAAO,OACN,MAAM,QAAQ,KAAK,KAAIC,MAAA,MAAM,OAAO,SAAS,MAAtB,gBAAAA,IAAyB,OAAO,+BAAO;AACnE,kBAAM,QAAQ,OAAO,OAAO,UAAU,WAClC,OAAO,MAAM,mBACb,OAAO;AACX,mBAAO,WAAW,GAAG,QAAQ,KAAK,KAAK,KAAK,OAAO,KAAK;AAAA,UAC1D;AAAA,QAAA,IACE;AAAA,MAAA;AAAA,MAEN,iBAAiB,MAAM,QAAQ;AAAA,MAC/B,aAAa,MAAM,QAAQ;AAAA,MAC3B,aAAa,MAAM,QAAQ;AAAA,MAC3B,WAAW;AAAA,QACT,GAAG,MAAM,QAAQ;AAAA,QACjB,UAAU;AAAA;AAAA,MAAA;AAAA,MAEZ,cAAc,MAAM,QAAQ;AAAA,MAC5B,UAAS,mCAAS,YAAW;AAAA,MAC7B,WAAW,mCAAS;AAAA,IAAA,IACV;AAAA;AAAA,IAGZ,QAAQ,aAAa;AAAA,MACnB,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAQ,iCAAQ,WAAU;AAAA,MAC1B,OAAM,iCAAQ,cAAa,SAAS,UAC9B,iCAAQ,cAAa,UAAU,UAAU;AAAA,MAC/C,KAAK,cAAc,IAAI;AAAA,MACvB,QAAQ,iBAAiB,IAAI;AAAA,MAC7B,SAAS,CAAC,GAAG,CAAC;AAAA,MACd,SAAS;AAAA,MACT,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,WAAW;AAAA,QACT,GAAG,MAAM,OAAO;AAAA,QAChB,UAAU;AAAA;AAAA,MAAA;AAAA,MAEZ,eAAe,MAAM,OAAO;AAAA,MAC5B,eAAc,iCAAQ,iBAAgB;AAAA,IAAA,IACpC,EAAE,MAAM,MAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMZ,MAAM,YAAY;AAAA,MAChB,MAAM,cAAc,IAAI;AAAA,MACxB,OAAO,MAAM,QAAQ,KAAK,KAAK,MAAM,SAAS,IAAK,cAAc,IAAI,KAAM;AAAA,MAC3E,KAAK,WAAY,cAAc,KAAK,KAAO,eAAe,aAAa,KAAK;AAAA,MAC5E,SAAS,kBAAkB,aAAa,KAAK,QAAQ,6BAAM,UAAS,aAAY,6BAAM,UAAS,SAAU,KAAK;AAAA,MAC9G,cAAc;AAAA,IAAA,IACZ;AAAA;AAAA;AAAA,IAIJ,OAAO,YAAY;AAAA,MACjB,OAAO,+BAAO,SAAQ;AAAA,MACtB,MAAM,cAAc,SAAY,+BAAO;AAAA,MACvC,eAAc,+BAAO,iBAAgB;AAAA,MACrC,SAAS;AAAA,MACT,eAAe;AAAA,QACb,GAAG,MAAM,MAAM;AAAA,QACf,UAAU;AAAA;AAAA,QACV,YAAY;AAAA,MAAA;AAAA,MAEd,KAAK,+BAAO;AAAA,MACZ,KAAK,+BAAO;AAAA,MACZ,UAAU;AAAA,QACR,OAAM,+BAAO,cAAa;AAAA,QAC1B,WAAW,MAAM,MAAM,SAAS;AAAA,MAAA;AAAA,MAElC,UAAU;AAAA,QACR,WAAW,MAAM,MAAM,SAAS;AAAA,MAAA;AAAA,MAElC,WAAW;AAAA,QACT,GAAG,MAAM,MAAM;AAAA,QACf,UAAU;AAAA;AAAA,QACV,WAAW,+BAAO;AAAA;AAAA,QAElB,aAAa;AAAA;AAAA,QAEb,QAAQ;AAAA;AAAA,QAER,UAAU;AAAA,MAAA;AAAA,MAEZ,WAAW;AAAA,QACT,OAAM,+BAAO,cAAa;AAAA,QAC1B,WAAW,EAAE,GAAG,MAAM,MAAM,UAAU,WAAW,MAAO,MAAM,MAAM,UAAU,UAAU,QAA0C,QAAA;AAAA,MAAQ;AAAA,MAE5I,SAAS,+BAAO;AAAA,IAAA,IACd;AAAA;AAAA;AAAA,IAIJ,OAAQ,aAAa,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,SAAS,CAAA,CAAE,GAAG,IAAI,CAAC,MAAM,OAAO;AAAA,MACnF,OAAO,6BAAM,SAAQ;AAAA,MACrB,MAAM,cAAc,SAAY,6BAAM;AAAA,MACtC,eAAc,6BAAM,iBAAgB;AAAA,MACpC,SAAS;AAAA,MACT,eAAe;AAAA,QACb,GAAG,MAAM,MAAM;AAAA,QACf,UAAU;AAAA;AAAA,QACV,YAAY;AAAA,MAAA;AAAA,MAEd,WAAU,6BAAM,cAAa,MAAM,IAAI,SAAS;AAAA,MAChD,KAAK,6BAAM;AAAA,MACX,KAAK,6BAAM;AAAA,MACX,aAAa,6BAAM;AAAA,MACnB,UAAU;AAAA,QACR,OAAM,6BAAM,cAAa;AAAA,QACzB,WAAW,MAAM,MAAM,SAAS;AAAA,MAAA;AAAA,MAElC,UAAU;AAAA,QACR,WAAW,MAAM,MAAM,SAAS;AAAA,MAAA;AAAA,MAElC,WAAW;AAAA,QACT,GAAG,MAAM,MAAM;AAAA,QACf,UAAU;AAAA;AAAA,QACV,YAAW,6BAAM,kBACb,KAAK,kBACL,6BAAM,QACJ,CAAC,MAAc,GAAG,CAAC,GAAG,KAAK,IAAI,KAC/B;AAAA,MAAA;AAAA,MAER,WAAW;AAAA,QACT,OAAM,6BAAM,cAAa;AAAA,QACzB,WAAW,MAAM,MAAM,UAAU;AAAA,MAAA;AAAA,MAEnC,SAAS,6BAAM;AAAA,IAAA,EACf,IAAI;AAAA;AAAA,IAGN,OAAO,UAAU;AAAA,MACf,aAAW,kBAAO,CAAC,MAAR,mBAAW,SAAX,mBAAiB,IAAI,CAAC,MAAe;AAC9C,cAAM,QAAQ;AACd,eAAO;AAAA,UACL,MAAM,MAAM,SAAS,MAAM,YAAY,OAAO,MAAM,CAAC;AAAA,UACrD,KAAK;AAAA,QAAA;AAAA,MAET,OAAM,CAAA;AAAA,MACN,WAAW;AAAA,QACT,MAAM;AAAA,QACN,WAAW;AAAA,UACT,OAAO,CAAC,eAAe,eAAe,eAAe,eAAe,aAAa;AAAA,QAAA;AAAA,MACnF;AAAA,MAEF,WAAW;AAAA,QACT,WAAW;AAAA,UACT,OAAO,MAAM,MAAM,UAAU,UAAU;AAAA,UACvC,SAAS;AAAA,QAAA;AAAA,MACX;AAAA,MAEF,UAAU;AAAA,QACR,WAAW;AAAA,UACT,OAAO,MAAM,MAAM,SAAS,UAAU;AAAA,UACtC,SAAS;AAAA,QAAA;AAAA,MACX;AAAA,MAEF,UAAU;AAAA,QACR,OAAO,MAAM,MAAM,UAAU;AAAA,QAC7B,UAAU;AAAA,MAAA;AAAA,IACZ,IACE;AAAA;AAAA;AAAA,IAIJ,WAAU,6BAAM,aAAY,QAAQ,SAAY;AAAA;AAAA,MAE9C,IAAK,6BAAM,UAAS,aAAY,6BAAM,UAAS,UAAU,EAAC,6BAAM,QAAQ,CAAC;AAAA,QACvE,MAAM;AAAA,QACN,aAAa,6BAAM,UAAS,QAAO,6BAAM,UAAS,UAAU,EAAC,6BAAM,QAAQ,IAAI;AAAA,QAC/E,aAAY,6BAAM,UAAS,QAAO,6BAAM,UAAS,SAAS,IAAI;AAAA,QAC9D,QAAO,6BAAM,UAAS;AAAA,QACtB,MAAK,6BAAM,QAAO;AAAA,QAClB,SAAS,6BAAM;AAAA,QACf,SAAS,6BAAM;AAAA;AAAA,QAEf,UAAU;AAAA,MAAA,CACX,IAAI,CAAA;AAAA;AAAA,MAEL,IAAI,6BAAM,UAAS,aAAY,6BAAM,UAAS,SAAS,CAAC;AAAA,QACtD,MAAM;AAAA,QACN,MAAM;AAAA,QACN,aAAY,6BAAM,UAAS,QAAO,6BAAM,UAAS,SAAS,IAAI;AAAA,QAC9D,aAAY,6BAAM,UAAS,QAAO,6BAAM,UAAS,SAAS,IAAI;AAAA,QAC9D,QAAO,6BAAM,UAAS;AAAA,QACtB,MAAK,6BAAM,QAAO;AAAA,QAClB,SAAS,6BAAM;AAAA,QACf,SAAS,6BAAM;AAAA,QACf,iBAAiB,MAAM,SAAS;AAAA,QAChC,aAAa,MAAM,SAAS;AAAA,QAC5B,aAAa,MAAM,SAAS;AAAA,QAC5B,aAAa,EAAE,OAAO,MAAM,SAAS,YAAA;AAAA,QACrC,WAAW,MAAM,SAAS;AAAA,QAC1B,QAAQ;AAAA,QACR,QAAQ;AAAA,MAAA,CACT,IAAI,CAAA;AAAA,IAAC;AAAA;AAAA,IAIR,WAAS,WAAM,WAAN,mBAAc,YAAW,MAAM;;AACtC,aAAO;AAAA,QACL,MAAM;AAAA;AAAA,QACN,OAAO;AAAA,QACP,KAAK;AAAA,QACL,SAAS;AAAA,UACP,YAAUA,MAAA,MAAM,OAAO,YAAb,gBAAAA,IAAsB,SAAS,WAAU;AAAA,YACjD,MAAM;AAAA,YACN,UAAU;AAAA,UAAA,IACR;AAAA,QAAA;AAAA,QAEN,WAAW;AAAA,UACT,aAAa,MAAM,UAAU;AAAA,QAAA;AAAA,MAC/B;AAAA,IAEJ,OAAO;AAAA;AAAA,IAGP,QAAQ,yBAAyB,QAAQ,MAAM,KAAK;AAAA;AAAA,IAGpD,WAAW,CAAC;AAAA,IACZ,mBAAmB;AAAA,IACnB,iBAAiB;AAAA,EAAA;AAInB,OAAI,2CAAa,cAAa,QAAQ,QAAQ;AAC5C,UAAM,cAAc,QAAQ;AAC5B,QAAI,YAAY,SAAS,GAAG;AAC1B,kBAAY,CAAC,EAAE,WAAW;AAAA,QACxB,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,MAAM,YAAY,UAAU,KAAK,IAAI,CAAA,SAAA;;AAAS;AAAA,YAC5C,GAAG;AAAA,YACH,WAAW;AAAA,cACT,OAAO,KAAK,SAAS,MAAM,MAAM,CAAC;AAAA,cAClC,QAAMA,MAAA,KAAK,cAAL,gBAAAA,IAAgB,SAAQ;AAAA,cAC9B,SAAOC,MAAA,KAAK,cAAL,gBAAAA,IAAgB,UAAS;AAAA,YAAA;AAAA,YAElC,OAAO;AAAA,cACL,MAAM,CAAC,CAAC,KAAK;AAAA,cACb,WAAW,KAAK;AAAA,cAChB,UAAU;AAAA;AAAA,cACV,UAAU;AAAA,cACV,OAAO,MAAM,UAAU;AAAA,cACvB,YAAY;AAAA,cACZ,UAAU;AAAA,cACV,iBAAiB;AAAA,cACjB,iBAAiB;AAAA,cACjB,iBAAiB,MAAM,QAAQ;AAAA,cAC/B,aAAa,KAAK,SAAS,MAAM,MAAM,CAAC;AAAA,cACxC,aAAa;AAAA,cACb,cAAc;AAAA,cACd,SAAS,CAAC,GAAG,CAAC;AAAA,YAAA;AAAA,UAChB;AAAA,SACA;AAAA,MAAA;AAAA,IAEN;AAAA,EACF;AAGA,OAAI,2CAAa,cAAa,QAAQ,QAAQ;AAC5C,UAAM,cAAc,QAAQ;AAC5B,UAAM,mBAAkB,iBAAM,UAAN,mBAAoD,cAApD,mBAA+D,YAAS,WAAM,cAAN,mBAAiB,UAAS;AAC1H,UAAM,aAAa,eAAe,WAAW,MAAM,IAAI,iBAAiB,GAAG,cAAc;AACzF,UAAM,oBAAoB;AAAA,MACxB,MAAM;AAAA,MACN,OAAO;AAAA,MACP,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,iBAAiB;AAAA,MACjB,iBAAiB;AAAA,MACjB,WAAW,CAAC,WAA+C;AACzD,cAAM,SAAQ,iCAAQ,SAAQ,QAAQ,QAAO,iCAAQ,WAAU,WAAW,OAAO,QAAQ;AACzF,YAAI,CAAC,KAAM,QAAO;AAClB,cAAM,OAAO,KAAK,YAAA,EAAc,SAAS,SAAS,IAAI,OAAY;AAClE,eAAO,OAAO,GAAG,IAAI,GAAG,IAAI,KAAK;AAAA,MACnC;AAAA,IAAA;AAEF,QAAI,YAAY,SAAS,GAAG;AAC1B,kBAAY,CAAC,EAAE,WAAW;AAAA,QACxB,QAAQ;AAAA,QACR,MAAM,YAAY,UAAU,KAAK,IAAI,CAAC,SAAoH;AACxJ,gBAAM,CAAC,OAAO,GAAG,IAAI;AACrB,iBAAO;AAAA,YACL,EAAE,GAAG,OAAO,OAAO,EAAE,GAAG,mBAAmB,WAAW,kBAAkB,YAAU;AAAA,YAClF;AAAA,UAAA;AAAA,QAEJ,CAAC;AAAA,QACD,WAAW,YAAY,UAAU;AAAA,MAAA;AAAA,IAErC;AAAA,EACF;AAGA,MAAI,MAAM,gBAAgB;AACxB,WAAO,aAAa,SAAS,MAAM,cAAc;AAAA,EACnD;AAEA,SAAO;AACT;AAEA,SAAS,aAAa,MAAqB,QAA+C;AAExF,MAAI,eAAe,KAAK;AAExB,MAAI,OAAO,QAAQ;AACjB,UAAM,aAAa,KAAK,UAAwD,CAAA;AAChF,UAAM,eAAe,OAAO;AAG5B,UAAM,qBAAqB,WAAW,WAAW,KAAK,WAAW,MAAM,CAAA,MAAK;AAC1E,UAAI,CAAC,EAAG,QAAO;AACf,UAAI,CAAC,EAAE,KAAM,QAAO;AACpB,UAAI,MAAM,QAAQ,EAAE,IAAI,KAAK,EAAE,KAAK,WAAW,EAAG,QAAO;AACzD,aAAO;AAAA,IACT,CAAC;AAGD,UAAM,UAAU,WAAW;AAC3B,UAAM,YAAY,aAAa;AAC/B,QAAI,YAAY,KAAK,cAAc,GAAG;AACpC,YAAM,IAAI,WAAW,CAAC;AACtB,YAAM,IAAI,aAAa,CAAC;AACxB,WAAI,uBAAG,UAAS,YAAW,uBAAG,UAAS,SAAS;AAC9C,uBAAe;AAAA,MACjB,WAAW,oBAAoB;AAC7B,uBAAe;AAAA,MACjB,OAAO;AACL,uBAAe,CAAC,GAAG,YAAY,GAAG,YAAY;AAAA,MAChD;AAAA,IACF,WAAW,oBAAoB;AAC7B,qBAAe;AAAA,IACjB,OAAO;AACL,qBAAe,CAAC,GAAG,YAAY,GAAG,YAAY;AAAA,IAChD;AAAA,EACF;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAG;AAAA,IACH,QAAQ;AAAA,EAAA;AAEZ;AAMO,MAAM,aAAa,KAAK;AAAA,EAC7B,SAASC,YAAW,OAAO,KAAK;;AAC9B,UAAM;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,UAAU;AAAA,MACV,eAAe;AAAA,MACf,YAAY;AAAA,MACZ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS,CAAA;AAAA,MACT;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA,kBAAkB;AAAA,IAAA,IAChB;AAEJ,UAAM,WAAW,OAAyB,IAAI;AAC9C,UAAM,EAAE,QAAQ,MAAM,OAAO,aAAA,IAAiB,SAAA;AAG9C,UAAM,qBAAqB,iBAAiB,iBAAiB,iBAAiB,sBAAsB,iBAAiB;AACrH,UAAM,gBAAgB,iBAAiB;AACvC,UAAM,mBAAmB,iBAAiB;AAG1C,UAAM,kBAAkB,mBAAmB,QAAQ,kBAAkB;AAGrE,UAAM,mBAAmB,OAAO,OAAO,OAAO;AAC9C,UAAM,mBAAmB,GAAG,gBAAgB;AAE5C,UAAM,kBAAgB,kBAAO,WAAP,mBAAe,SAAf,mBAAqB,YAAW;AAAA,MACpD,UAAU;AAAA,MACV,iBAAiB;AAAA,MACjB,eAAe;AAAA,MACf,oBAAoB;AAAA,MACpB,iBAAiB;AAAA,MACjB,KAAK;AAAA,IAAA;AAEP,UAAM,qBAAqB,cAAc,sBAAsB,cAAc;AAG7E,UAAM,QAAQ;AAAA,MACZ,MAAM,wBAAwB,QAAQ,MAAM,YAAY;AAAA,MACxD,CAAC,QAAQ,MAAM,YAAY;AAAA,IAAA;AAI7B,UAAM,mBAAmB,CAAC,EAAE,QAAQ,MAAM;AAC1C,UAAM,UAAU;AAAA,MACd,MAAM,oBAAoB,OAAO,OAAO,gBAAgB;AAAA,MACxD,CAAC,OAAO,OAAO,gBAAgB;AAAA,IAAA;AAIjC,UAAM,WAAW,YAAY,MAA2B;;AACtD,cAAOF,MAAA,SAAS,YAAT,gBAAAA,IAAkB;AAAA,IAC3B,GAAG,CAAA,CAAE;AAGL,UAAM,oBAAoB,YAAY,CAAC,WAAoB,mBAAmB,SAAS;;AACrF,YAAM,UAAiC;AAAA,QACrC,OAAO,MAAM;AAAA,QACb,UAAU,MAAM;AAAA,QAChB,aAAa,OAAO,IAAI,CAAA,MAAK,EAAE,IAAI;AAAA,QACnC,WAAW,MAAM;AAAA,MAAA;AAEnB,UAAI;AACJ,WAAIA,MAAA,MAAM,WAAN,gBAAAA,IAAc,mBAAmB;AACnC,eAAO,MAAM,OAAO,kBAAkB,OAAO;AAAA,MAC/C,YAAWC,MAAA,MAAM,WAAN,gBAAAA,IAAc,UAAU;AACjC,eAAO,MAAM,OAAO;AAAA,MACtB,OAAO;AACL,eAAO,sBAAsB,MAAM,OAAO,QAAQ,aAAa,MAAM,IAAI;AAAA,MAC3E;AACA,UAAI,kBAAkB;AACpB,cAAM,wBAAQ,KAAA;AACd,cAAM,KAAK,EAAE,YAAA,EAAc,MAAM,GAAG,EAAE,EAAE,QAAQ,UAAU,EAAE,EAAE,QAAQ,kBAAkB,OAAO;AAC/F,eAAO,GAAG,IAAI,IAAI,EAAE;AAAA,MACtB;AACA,UAAI,kBAAkB,GAAG,IAAI,IAAI,UAAU,QAAQ,OAAO,EAAE,CAAC;AAC7D,aAAO;AAAA,IACT,GAAG,CAAC,MAAM,OAAO,MAAM,UAAU,MAAM,MAAM,MAAM,QAAQ,MAAM,CAAC;AAGlE,wBAAoB,KAAK,OAAO;AAAA,MAC9B;AAAA,MACA,QAAQ,MAAA;;AAAM,gBAAAD,MAAA,SAAA,MAAA,gBAAAA,IAAY;AAAA;AAAA,MAC1B;AAAA,MACA,aAAa,CAAC,OAAO,OAAO,aAAa,MAAM;AAC7C,cAAM,QAAQ,SAAA;AACd,YAAI,CAAC,MAAO,QAAO;AACnB,cAAM,UAAU,SAAS,QAAQ,SAAS;AAC1C,eAAO,MAAM,WAAW;AAAA,UACtB,MAAM;AAAA,UACN;AAAA,UACA,iBAAiB;AAAA,QAAA,CAClB;AAAA,MACH;AAAA,MACA,WAAW,MAAM;;AACf,cAAM,OAAiB,CAAA;AACvB,cAAM,UAAU,CAAC,SAAS,GAAG,OAAO,IAAI,CAAA,MAAK,EAAE,IAAI,CAAC;AACpD,aAAK,KAAK,QAAQ,KAAK,GAAG,CAAC;AAE3B,cAAM,SAAS,KAAK,IAAI,GAAG,OAAO,IAAI,CAAA,MAAA;;AAAK,mBAAAA,MAAA,EAAE,SAAF,gBAAAA,IAAQ,WAAU;AAAA,SAAC,CAAC;AAC/D,iBAAS,IAAI,GAAG,IAAI,QAAQ,KAAK;AAC/B,gBAAM,MAAM,CAAC,EAAE,UAAU;AACzB,qBAAW,KAAK,QAAQ;AACtB,kBAAM,OAAO,EAAE;AACf,kBAAM,QAAQ,6BAAO;AACrB,gBAAI,OAAO,UAAU,UAAU;AAC7B,kBAAI,KAAK,MAAM,UAAU;AAAA,YAC3B,WAAW,MAAM,QAAQ,KAAK,GAAG;AAC/B,kBAAI,OAAKA,MAAA,MAAM,CAAC,MAAP,gBAAAA,IAAU,eAAc,EAAE;AAAA,YACrC,WAAW,SAAS,OAAO,UAAU,UAAU;AAC7C,oBAAM,QAAQ;AACd,kBAAI,OAAMC,MAAA,WAAW,QAAQ,MAAM,QAAQ,MAAM,MAAvC,gBAAAA,IAA2C,eAAc,EAAE;AAAA,YACvE,OAAO;AACL,kBAAI,KAAK,EAAE;AAAA,YACb;AAAA,UACF;AACA,eAAK,KAAK,IAAI,KAAK,GAAG,CAAC;AAAA,QACzB;AACA,eAAO,KAAK,KAAK,IAAI;AAAA,MACvB;AAAA,MACA,YAAY,CAAC,aAAqB,SAAsC;;AACtE,cAAM,QAAQ,SAAA;AACd,YAAI,CAAC,MAAO;AAGZ,cAAM,SAAS,MAAM,UAAA;AACrB,cAAM,aAAaD,MAAA,OAAO,WAAP,gBAAAA,IAA+C;AAClE,YAAI,CAAC,UAAW;AAEhB,cAAM,cAAc,CAAC,GAAI,UAAU,QAAQ,CAAA,CAAG;AAC9C,cAAM,WAAW,UAAU,OACvB,CAAC,KAAK,MAAM,KAAK,KAAK,IACtB,CAAC,KAAK,GAAG,KAAK,CAAC;AAEnB,oBAAY,KAAK,QAAQ;AAGzB,cAAM,aAAY,qCAAU,cAAa;AACzC,eAAO,YAAY,SAAS,WAAW;AACrC,sBAAY,MAAA;AAAA,QACd;AAGA,cAAM,UAAU;AAAA,UACd,QAAQ,CAAC;AAAA,YACP,MAAM;AAAA,UAAA,CACP;AAAA,QAAA,GACA;AAAA,UACD,cAAc,CAAC,QAAQ;AAAA,QAAA,CACxB;AAAA,MACH;AAAA,MACA,WAAW,MAAM;AACf,cAAM,QAAQ,SAAA;AACd,YAAI,CAAC,MAAO;AAEZ,cAAM,UAAU;AAAA,UACd,QAAQ,OAAO,IAAI,OAAO,EAAE,MAAM,CAAA,IAAK;AAAA,QAAA,CACxC;AAAA,MACH;AAAA,MACA,gBAAgB,CAAC,WAAoB;;AACnC,SAAAA,MAAA,SAAA,MAAA,gBAAAA,IAAY,eAAe;AAAA,MAC7B;AAAA,IAAA,IACE,CAAC,UAAU,QAAQ,QAAQ,CAAC;AAGhC,UAAM,eAAe,QAAQ,MAAM;AACjC,YAAM,SAAoD,CAAA;AAE1D,UAAI,SAAS;AACX,eAAO,QAAQ,CAAC,WAAoB;AAClC,kBAAQ,MAA0B;AAAA,QACpC;AAAA,MACF;AAEA,UAAI,SAAS;AACX,eAAO,YAAY,CAAC,WAAoB;AACtC,kBAAQ,MAA0B;AAAA,QACpC;AAAA,MACF;AAEA,UAAI,cAAc;AAChB,eAAO,WAAW,CAAC,WAAoB;;AACrC,gBAAM,IAAI;AACV,uBAAa;AAAA,YACX,SAAOC,OAAAD,MAAA,EAAE,UAAF,gBAAAA,IAAU,OAAV,gBAAAC,IAAc,UAAS,EAAE,SAAS;AAAA,YACzC,OAAKE,OAAAC,MAAA,EAAE,UAAF,gBAAAA,IAAU,OAAV,gBAAAD,IAAc,QAAO,EAAE,OAAO;AAAA,UAAA,CACpC;AAAA,QACH;AAAA,MACF;AAEA,UAAI,eAAe;AACjB,eAAO,gBAAgB,CAAC,WAAoB;AAC1C,wBAAc,MAA0D;AAAA,QAC1E;AAAA,MACF;AAEA,aAAO;AAAA,IACT,GAAG,CAAC,SAAS,SAAS,cAAc,aAAa,CAAC;AAGlD,UAAM,mBAAmB,YAAY,CAAC,UAAmB;AACvD,mDAAe;AAAA,IACjB,GAAG,CAAC,YAAY,CAAC;AAGjB,UAAM,kBAAgB,WAAM,WAAN,mBAAc,YAAW,CAAC,KAAK;AACrD,UAAM,2BAA0B,WAAM,WAAN,mBAAc;AAC9C,UAAM,CAAC,gBAAgB,iBAAiB,IAAI,SAAS,KAAK;AAC1D,UAAM,gBAAgB,OAAuB,IAAI;AAGjD,UAAM,CAAC,iBAAiB,kBAAkB,IAAI,SAAS,KAAK;AAC5D,UAAM,iBAAiB,OAAuB,IAAI;AAGlD,cAAU,MAAM;AACd,UAAI,CAAC,eAAe,CAAC,gBAAiB;AACtC,YAAM,qBAAqB,CAAC,MAAkB;AAC5C,YAAI,eAAe,WAAW,CAAC,eAAe,QAAQ,SAAS,EAAE,MAAc,GAAG;AAChF,6BAAmB,KAAK;AAAA,QAC1B;AAAA,MACF;AACA,eAAS,iBAAiB,aAAa,kBAAkB;AACzD,aAAO,MAAM,SAAS,oBAAoB,aAAa,kBAAkB;AAAA,IAC3E,GAAG,CAAC,aAAa,eAAe,CAAC;AAEjC,cAAU,MAAM;AACd,UAAI,CAAC,2BAA2B,CAAC,eAAgB;AACjD,YAAM,qBAAqB,CAAC,MAAkB;AAC5C,YAAI,cAAc,WAAW,CAAC,cAAc,QAAQ,SAAS,EAAE,MAAc,GAAG;AAC9E,4BAAkB,KAAK;AAAA,QACzB;AAAA,MACF;AACA,eAAS,iBAAiB,aAAa,kBAAkB;AACzD,aAAO,MAAM,SAAS,oBAAoB,aAAa,kBAAkB;AAAA,IAC3E,GAAG,CAAC,yBAAyB,cAAc,CAAC;AAE5C,UAAM,qBAAqB,YAAY,CAAC,WAA2C;;AACjF,YAAM,QAAQ,SAAA;AACd,UAAI,WAAW,OAAO;AACpB,cAAM,OAAiB,CAAA;AACvB,cAAM,UAAU,CAAC,SAAS,GAAG,OAAO,IAAI,CAAA,MAAK,EAAE,IAAI,CAAC;AACpD,aAAK,KAAK,QAAQ,KAAK,GAAG,CAAC;AAC3B,cAAM,SAAS,KAAK,IAAI,GAAG,OAAO,IAAI,CAAA,MAAA;;AAAK,mBAAAH,MAAA,EAAE,SAAF,gBAAAA,IAAQ,WAAU;AAAA,SAAC,CAAC;AAC/D,iBAAS,IAAI,GAAG,IAAI,QAAQ,KAAK;AAC/B,gBAAM,MAAM,CAAC,EAAE,UAAU;AACzB,qBAAW,KAAK,QAAQ;AACtB,kBAAM,OAAO,EAAE;AACf,kBAAM,QAAQ,6BAAO;AACrB,gBAAI,OAAO,UAAU,cAAc,KAAK,MAAM,UAAU;AAAA,qBAC/C,MAAM,QAAQ,KAAK,EAAG,KAAI,OAAKA,MAAA,MAAM,CAAC,MAAP,gBAAAA,IAAU,eAAc,EAAE;AAAA,qBACzD,SAAS,OAAO,UAAU,UAAU;AAC3C,oBAAM,QAAQ;AACd,kBAAI,OAAMC,MAAA,WAAW,QAAQ,MAAM,QAAQ,MAAM,MAAvC,gBAAAA,IAA2C,eAAc,EAAE;AAAA,YACvE,MAAO,KAAI,KAAK,EAAE;AAAA,UACpB;AACA,eAAK,KAAK,IAAI,KAAK,GAAG,CAAC;AAAA,QACzB;AACA,cAAM,MAAM,KAAK,KAAK,IAAI;AAC1B,cAAM,WAAW,kBAAkB,OAAO,IAAI;AAC9C,cAAM,OAAO,IAAI,KAAK,CAAC,GAAG,GAAG,EAAE,MAAM,0BAA0B;AAC/D,cAAM,MAAM,IAAI,gBAAgB,IAAI;AACpC,cAAM,IAAI,SAAS,cAAc,GAAG;AACpC,UAAE,OAAO;AACT,UAAE,WAAW;AACb,UAAE,MAAA;AACF,YAAI,gBAAgB,GAAG;AAAA,MACzB,WAAW,OAAO;AAChB,cAAM,UAAU,WAAW,SAAS,SAAS;AAC7C,cAAM,UAAU,MAAM,WAAW;AAAA,UAC/B,MAAM;AAAA,UACN,cAAYG,MAAA,MAAM,WAAN,gBAAAA,IAAc,eAAc;AAAA,UACxC,mBAAiBD,MAAA,MAAM,WAAN,gBAAAA,IAAc,oBAAmB;AAAA,QAAA,CACnD;AACD,YAAI,SAAS;AACX,gBAAM,MAAM,WAAW,SAAS,QAAQ;AACxC,gBAAM,WAAW,kBAAkB,KAAK,IAAI;AAC5C,gBAAM,IAAI,SAAS,cAAc,GAAG;AACpC,YAAE,OAAO;AACT,YAAE,WAAW;AACb,YAAE,MAAA;AAAA,QACJ;AAAA,MACF;AACA,wBAAkB,KAAK;AAAA,IACzB,GAAG,CAAC,UAAU,QAAQ,oBAAmB,WAAM,WAAN,mBAAc,aAAY,WAAM,WAAN,mBAAc,eAAe,CAAC;AAGjG,cAAU,MAAM;;AACd,YAAM,QAAQ,SAAA;AACd,UAAI,CAAC,MAAO;AAEZ,UAAI,UAAU;AACd,YAAM,iBAAiB,IAAI,eAAe,MAAM;AAC9C,YAAI,CAAC,QAAS;AACd,YAAI;AACF,gBAAM,OAAA;AAAA,QACR,QAAQ;AAAA,QAER;AAAA,MACF,CAAC;AAED,YAAM,aAAYH,MAAA,SAAS,YAAT,gBAAAA,IAAkB;AACpC,UAAI,WAAW;AACb,uBAAe,QAAQ,SAAS;AAAA,MAClC;AAEA,aAAO,MAAM;AACX,kBAAU;AACV,uBAAe,WAAA;AAAA,MACjB;AAAA,IACF,GAAG,CAAC,QAAQ,CAAC;AAGb,UAAM,gBAAgB,QAAQ,MAAM;AAClC,YAAM,KAAK,MAAM;AACjB,UAAI,CAAC,GAAI,QAAO;AAChB,UAAI,GAAG,UAAU,GAAG,WAAW,GAAG,WAAW,GAAG,WAAW,GAAG,SAAS,GAAG,MAAO,QAAO;AACxF,UAAI,MAAM,QAAQ,GAAG,MAAM,GAAG;AAC5B,eAAO,GAAG,OAAO,KAAK,CAAC,MAAW;AAChC,gBAAM,KAAI,uBAAG,SAAQ;AACrB,iBAAO,EAAE,SAAS,IAAI,KAAK,EAAE,SAAS,IAAI,KAAK,MAAM,eAAe,MAAM,WAAW,MAAM,aAAa,MAAM;AAAA,QAChH,CAAC;AAAA,MACH;AACA,aAAO;AAAA,IACT,GAAG,CAAC,MAAM,cAAc,CAAC;AAGzB,UAAM,gBAAgB,OAAO,KAAK,CAAA,MAAK,EAAE,QAAQ,EAAE,KAAK,SAAS,CAAC;AAClE,UAAM,4BAA0B,WAAM,mBAAN,mBAAsB,YACnD,MAAM,QAAQ,MAAM,eAAe,MAAM,IACtC,MAAM,eAAe,OAAO,SAAS,IACrC,MAAM,eAAe,WAAW;AACtC,UAAM,UAAU,iBAAiB;AAGjC,UAAM,iBAAiB,CAAC,WAA4C;;AAClE,cAAQ,QAAA;AAAA,QACN,KAAK;AAAY,mBAAOA,MAAA,OAAO,OAAO,WAAd,gBAAAA,IAAsB,aAAY;AAAA,QAC1D,KAAK;AAAW,mBAAOC,MAAA,OAAO,OAAO,WAAd,gBAAAA,IAAsB,YAAW;AAAA,QACxD,KAAK;AAAW,mBAAOG,MAAA,OAAO,OAAO,WAAd,gBAAAA,IAAsB,YAAW;AAAA,QACxD,KAAK;AAAU,mBAAOD,MAAA,OAAO,OAAO,WAAd,gBAAAA,IAAsB,WAAU;AAAA,QACtD,KAAK;AAAW,mBAAOE,MAAA,OAAO,OAAO,WAAd,gBAAAA,IAAsB,YAAW;AAAA,QACxD,KAAK;AAAO,mBAAOC,MAAA,OAAO,OAAO,WAAd,gBAAAA,IAAsB,QAAO;AAAA,QAChD;AAAS,iBAAO,OAAO,OAAO,KAAK;AAAA,MAAA;AAAA,IAEvC;AAGA,UAAM,YAAY,CAAC,EAAE,QAAQ,MAAM;AAInC,UAAM,eAAe,iBAAiB;AAEtC,UAAM,iBAAsC;AAAA,MAC1C,OAAO,OAAO,UAAU,WAAW,GAAG,KAAK,OAAO;AAAA,MAClD,QAAQ,OAAO,WAAW,WAAW,GAAG,MAAM,OAAO;AAAA,MACrD,cAAc,OAAO,aAAa;AAAA,MAClC,SAAS,OAAO,QAAQ;AAAA,MACxB,UAAU;AAAA,MACV,UAAU;AAAA;AAAA,MAEV,GAAI,eAAe;AAAA,QACjB,iBAAiB;AAAA,QACjB,gBAAgB;AAAA,QAChB,sBAAsB;AAAA,QACtB,QAAQ,aAAa,gBAAgB;AAAA,QACrC,WAAW,gBAAgB,aAAa,gBAAgB,KAAK,aAAa,gBAAgB;AAAA,QAC1F,YAAY;AAAA,MAAA,IACV,qBAAqB;AAAA;AAAA,QAEvB,iBAAiB;AAAA,QACjB,gBAAgB;AAAA,QAChB,sBAAsB;AAAA,QACtB,GAAG;AAAA,MAAA,IACD;AAAA;AAAA,QAEF,iBAAiB,OAAO,OAAO,WAAW;AAAA,QAC1C,QAAQ,aAAa,OAAO,OAAO,OAAO,KAAK;AAAA,MAAA;AAAA,MAEjD,GAAG;AAAA,IAAA;AAIL,UAAM,gBAAgB,eAClB,2BAA2B,gBAAgB,UAAU,gBAAgB,aACrE;AAGJ,QAAI,CAAC,WAAW,CAAC,SAAS;AACxB,aACE;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAW,kCAAkC,SAAS;AAAA,UACtD,OAAO;AAAA,UACP,MAAK;AAAA,UACL,wBAAqB;AAAA,UACrB,cAAY,aAAa;AAAA,UAGxB,UAAA;AAAA,YAAA,gBAAgB,iBACf;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,OAAO;AAAA,kBACL,UAAU;AAAA,kBACV,OAAO;AAAA,kBACP,YAAY;AAAA,kBACZ,eAAe;AAAA,kBACf,QAAQ;AAAA,gBAAA;AAAA,cACV;AAAA,YAAA;AAAA,YAGJ,oBAAC,SAAI,OAAO;AAAA,cACV,SAAS;AAAA,cACT,YAAY;AAAA,cACZ,gBAAgB;AAAA,cAChB,QAAQ;AAAA,cACR,OAAO,OAAO,OAAO,KAAK;AAAA,cAC1B,YAAY,OAAO,WAAW,WAAW;AAAA,cACzC,UAAU,OAAO,WAAW,SAAS;AAAA,cACrC,UAAU;AAAA,cACV,QAAQ;AAAA,YAAA,GAEP,UAAA,aAAA,CACH;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IAGN;AAEA,UAAM,qBAAqB,cAAc,OAAO,CAAA,MAAK,CAAC,OAAO,QAAQ,OAAO,KAAK,EAAE,SAAS,CAAC,CAAC;AAC9F,UAAM,SAAS,cAAc,SAAS,KAAK;AAK3C,WACE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAW,eAAe,SAAS;AAAA,QACnC,OAAO;AAAA,QACP,MAAK;AAAA,QACL,wBAAqB;AAAA,QACrB,cAAY,aAAa,MAAM,SAAS;AAAA,QAGvC,UAAA;AAAA,UAAA,gBAAgB,iBACf;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,OAAO;AAAA,gBACL,UAAU;AAAA,gBACV,OAAO;AAAA,gBACP,YAAY;AAAA,gBACZ,eAAe;AAAA,gBACf,QAAQ;AAAA,cAAA;AAAA,YACV;AAAA,UAAA;AAAA,UAKH,aAAa,iBACZ,qBAAC,OAAA,EAAI,OAAO,EAAE,UAAU,YAAY,QAAQ,EAAA,GAC1C,UAAA;AAAA,YAAA,oBAAC,SAAI,OAAO;AAAA,cACV,SAAS;AAAA,cACT,YAAY;AAAA,cACZ,gBAAgB;AAAA,cAChB,SAAS,QAAQ,OAAO,QAAQ,EAAE;AAAA,YAAA,GAElC,UAAA,qBAAC,OAAA,EAAI,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,cAAc,IAAA,GAErE,UAAA;AAAA,cAAA,QAAQ,cACP;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC;AAAA,kBACA,MAAM,cAAc;AAAA,kBACpB,QAAQ;AAAA,kBACR,aAAa,eAAe,UAAU;AAAA,gBAAA;AAAA,cAAA;AAAA,cAGzC,QAAQ,CAAC,cACR;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,MAAM;AAAA,kBACN,MAAM,cAAc;AAAA,kBACpB,OAAO;AAAA,gBAAA;AAAA,cAAA;AAAA,cAGV,MAAM,SACL,oBAAC,MAAA,EAAG,OAAO;AAAA,gBACT,QAAQ;AAAA,gBACR,UAAU;AAAA,gBACV,YAAY,cAAc;AAAA,gBAC1B,OAAO;AAAA,gBACP,eAAe;AAAA,gBACf,YAAY,YAAY,gBAAgB;AAAA,cAAA,GAEvC,gBAAM,MAAA,CACT;AAAA,YAAA,EAAA,CAEJ,EAAA,CACF;AAAA,YAEA,qBAAC,SAAI,OAAO;AAAA,cACV,SAAS;AAAA,cACT,YAAY;AAAA,cACZ,KAAK;AAAA,cACL,SAAS,QAAQ,OAAO,QAAQ,EAAE;AAAA,cAClC,cAAc,OAAO,QAAQ;AAAA,YAAA,GAE7B,UAAA;AAAA,cAAA,oBAAC,SAAI,OAAO;AAAA,gBACV,MAAM;AAAA,gBACN,QAAQ;AAAA,gBACR,YAAY,0BAA0B,gBAAgB,QAAQ,gBAAgB;AAAA,gBAC9E,WAAW,WAAW,gBAAgB;AAAA,cAAA,GACrC;AAAA,cAEF,mBAAmB,cAClB,qBAAC,QAAA,EAAK,OAAO;AAAA,gBACX,SAAS;AAAA,gBACT,YAAY;AAAA,gBACZ,KAAK;AAAA,gBACL,SAAS;AAAA,gBACT,UAAU;AAAA;AAAA,gBACV,YAAY;AAAA;AAAA,gBACZ,eAAe;AAAA,gBACf,OAAO,eAAe,UAAU;AAAA,gBAChC,iBAAiB,GAAG,eAAe,UAAU,CAAC;AAAA,gBAC9C,QAAQ,aAAa,eAAe,UAAU,CAAC;AAAA,gBAC/C,cAAc;AAAA,gBACd,YAAY;AAAA,cAAA,GAEX,UAAA;AAAA,gBAAA,cAAc,UAAU,EAAE,GAAG,eAAe,UAAU,CAAC;AAAA,gBACvD,cAAc,UAAU;AAAA,cAAA,EAAA,CAC3B;AAAA,YAAA,EAAA,CAEJ;AAAA,UAAA,GACF;AAAA,UAID,aAAa,oBACZ,qBAAC,OAAA,EAAI,OAAO;AAAA,YACV,SAAS;AAAA,YACT,YAAY;AAAA,YACZ,SAAS,GAAG,OAAO,QAAQ,EAAE,IAAI,OAAO,QAAQ,EAAE;AAAA,YAClD,cAAc,OAAO,QAAQ;AAAA,YAC7B,UAAU;AAAA,YACV,QAAQ;AAAA,UAAA,GAEP,UAAA;AAAA,YAAA,QAAQ,cACP;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC;AAAA,gBACA,MAAM,cAAc;AAAA,gBACpB,QAAQ;AAAA,gBACR,aAAa,eAAe,UAAU;AAAA,gBACtC,OAAO,EAAE,aAAa,OAAO,QAAQ,GAAA;AAAA,cAAG;AAAA,YAAA;AAAA,YAG3C,QAAQ,CAAC,cACR;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,MAAM;AAAA,gBACN,MAAM,cAAc;AAAA,gBACpB,OAAO;AAAA,gBACP,OAAO,EAAE,aAAa,OAAO,QAAQ,GAAA;AAAA,cAAG;AAAA,YAAA;AAAA,YAG3C,MAAM,SACL,oBAAC,MAAA,EAAG,OAAO;AAAA,cACT,QAAQ;AAAA,cACR,UAAU;AAAA,cACV,YAAY,cAAc;AAAA,cAC1B,OAAO;AAAA,cACP,YAAY,YAAY,gBAAgB;AAAA,cACxC,eAAe;AAAA,cACf,YAAY;AAAA,cACZ,aAAa;AAAA,YAAA,GAEZ,gBAAM,OACT;AAAA,YAGF,qBAAC,SAAI,OAAO;AAAA,cACV,MAAM;AAAA,cACN,SAAS;AAAA,cACT,YAAY;AAAA,cACZ,KAAK,cAAc;AAAA,cACnB,UAAU;AAAA,YAAA,GAEV,UAAA;AAAA,cAAA,oBAAC,SAAI,OAAO;AAAA,gBACV,MAAM;AAAA,gBACN,QAAQ;AAAA,gBACR,YAAY,0BAA0B,gBAAgB,QAAQ,gBAAgB;AAAA,cAAA,GAC7E;AAAA,cAEF,mBAAmB,cAClB,qBAAC,QAAA,EAAK,OAAO;AAAA,gBACX,SAAS;AAAA,gBACT,YAAY;AAAA,gBACZ,KAAK;AAAA,gBACL,SAAS;AAAA,gBACT,UAAU;AAAA;AAAA,gBACV,YAAY;AAAA;AAAA,gBACZ,eAAe;AAAA,gBACf,OAAO,eAAe,UAAU;AAAA,gBAChC,iBAAiB,GAAG,eAAe,UAAU,CAAC;AAAA,gBAC9C,QAAQ,aAAa,eAAe,UAAU,CAAC;AAAA,gBAC/C,cAAc;AAAA,gBACd,YAAY;AAAA,cAAA,GAEX,UAAA;AAAA,gBAAA,cAAc,UAAU,EAAE,GAAG,eAAe,UAAU,CAAC;AAAA,gBACvD,cAAc,UAAU;AAAA,cAAA,EAAA,CAC3B;AAAA,YAAA,EAAA,CAEJ;AAAA,UAAA,GACF;AAAA,UAID,aAAa,sBAAsB,CAAC,gBACnC;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,OAAO;AAAA,cACP,OAAO;AAAA,gBACL,UAAU;AAAA,gBACV,KAAK;AAAA,gBACL,MAAM;AAAA,gBACN,SAAS;AAAA,gBACT,YAAY;AAAA,gBACZ,KAAK,cAAc;AAAA,gBACnB,QAAQ;AAAA,cAAA;AAAA,cAGT,UAAA;AAAA,gBAAA,QAAQ,cACP;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC;AAAA,oBACA,MAAM,cAAc;AAAA,oBACpB,QAAQ;AAAA,oBACR,aAAa,eAAe,UAAU;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAGzC,QAAQ,CAAC,cACR;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,MAAM;AAAA,oBACN,MAAM,cAAc;AAAA,oBACpB,OAAO,OAAO,OAAO,KAAK;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAG7B,MAAM,SACL,oBAAC,QAAA,EAAK,OAAO;AAAA,kBACX,UAAU;AAAA,kBACV,YAAY,cAAc;AAAA,kBAC1B,OAAO,OAAO,OAAO,KAAK;AAAA,gBAAA,GAEzB,gBAAM,MAAA,CACT;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA;AAAA,UAML,aAAa,CAAC,sBACb;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,OAAO;AAAA,cACP,OAAO;AAAA,gBACL,UAAU;AAAA,gBACV,KAAK;AAAA,gBACL,MAAM;AAAA,gBACN,SAAS;AAAA,gBACT,YAAY;AAAA,gBACZ,KAAK,cAAc;AAAA,gBACnB,QAAQ;AAAA,cAAA;AAAA,cAGT,UAAA;AAAA,gBAAA,QAAQ,cACP;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC;AAAA,oBACA,MAAM,cAAc;AAAA,oBACpB,QAAQ;AAAA,oBACR,aAAa,eAAe,UAAU;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAGzC,QAAQ,CAAC,cACR;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,MAAM;AAAA,oBACN,MAAM,cAAc;AAAA,oBACpB,OAAO,OAAO,OAAO,KAAK;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAG7B,MAAM,SACL,oBAAC,QAAA,EAAK,OAAO;AAAA,kBACX,UAAU;AAAA,kBACV,YAAY,cAAc;AAAA,kBAC1B,OAAO,OAAO,OAAO,KAAK;AAAA,gBAAA,GAEzB,gBAAM,MAAA,CACT;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA;AAAA,UAKN;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,KAAK;AAAA,cACL;AAAA,cACA,QAAQ;AAAA,cACR,MAAM;AAAA,gBACJ,UAAU,MAAM,aAAa,gBAAgB,WAAW;AAAA,gBACxD,IAAK,MAAM,aAAa,YAAY,kBAAkB,OAAO,WAAW,eAAe,EAAE,kBAAkB,OAAO,oBAAoB,EAAA;AAAA,cAAE;AAAA,cAE1I,OAAO,EAAE,OAAO,QAAQ,QAAQ,OAAA;AAAA,cAChC,UAAU;AAAA,cACV,YAAY;AAAA,cACZ,aAAa;AAAA,cACb,eAAe;AAAA,gBACb,MAAM;AAAA,gBACN,OAAO,OAAO,OAAO,OAAO;AAAA,gBAC5B,WAAW,OAAO,OAAO,KAAK;AAAA,gBAC9B,WAAW,qBAAqB,0BAA0B,GAAG,OAAO,OAAO,WAAW,OAAO;AAAA,cAAA;AAAA,cAE/F,UAAU;AAAA,cACV,cAAc;AAAA,YAAA;AAAA,UAAA;AAAA,UAGhB,qBAAC,SAAI,OAAO;AAAA,YACV,UAAU;AAAA,YACV,OAAO;AAAA,YACP,KAAK;AAAA,YACL,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,YAAY;AAAA,YACZ,KAAK;AAAA,UAAA,GAGJ,UAAA;AAAA,YAAA,eACC,qBAAC,SAAI,KAAK,gBAAgB,OAAO,EAAE,UAAU,cAC3C,UAAA;AAAA,cAAA;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,MAAK;AAAA,kBACL,SAAS,MAAM,mBAAmB,CAAA,MAAK,CAAC,CAAC;AAAA,kBACzC,cAAW;AAAA,kBACX,iBAAe;AAAA,kBACf,OAAO;AAAA,oBACL,SAAS;AAAA,oBACT,YAAY;AAAA,oBACZ,gBAAgB;AAAA,oBAChB,OAAO;AAAA,oBACP,QAAQ;AAAA,oBACR,SAAS;AAAA,oBACT,QAAQ,aAAa,OAAO,OAAO,OAAO,OAAO;AAAA,oBACjD,cAAc;AAAA,oBACd,YAAY,kBAAkB,OAAO,OAAO,OAAO,UAAW,qBAAqB,0BAA0B,OAAO,OAAO,WAAW;AAAA,oBACtI,OAAO,kBAAkB,OAAO,OAAO,WAAW,OAAO,OAAO,OAAO,KAAK;AAAA,oBAC5E,QAAQ;AAAA,oBACR,YAAY;AAAA,kBAAA;AAAA,kBAGb,sBAAY,QACX,oBAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,gBAAe,eAAY,QAC9E,8BAAC,QAAA,EAAK,GAAE,oGAAkG,EAAA,CAC5G;AAAA,gBAAA;AAAA,cAAA;AAAA,cAGH,mBACC;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,MAAK;AAAA,kBACL,OAAO;AAAA,oBACL,UAAU;AAAA,oBACV,OAAO;AAAA,oBACP,KAAK;AAAA,oBACL,WAAW;AAAA,oBACX,UAAU;AAAA,oBACV,UAAU,YAAY,YAAY;AAAA,oBAClC,SAAS;AAAA,oBACT,YAAY,qBAAqB,2BAA2B,OAAO,OAAO,WAAW;AAAA,oBACrF,gBAAgB,qBAAqB,eAAe;AAAA,oBACpD,QAAQ,aAAa,OAAO,OAAO,OAAO,OAAO;AAAA,oBACjD,cAAc,OAAO,aAAa;AAAA,oBAClC,WAAW;AAAA,oBACX,OAAO,OAAO,OAAO,KAAK;AAAA,oBAC1B,YAAY,OAAO,WAAW,WAAW;AAAA,oBACzC,UAAU,OAAO,WAAW,SAAS;AAAA,oBACrC,YAAY;AAAA,oBACZ,QAAQ;AAAA,kBAAA;AAAA,kBAGT,UAAA,YAAY;AAAA,gBAAA;AAAA,cAAA;AAAA,YACf,GAEJ;AAAA,YAID,gDACE,OAAA,EAAI,KAAK,eAAe,OAAO,EAAE,UAAU,WAAA,GAC1C,UAAA;AAAA,cAAA;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,MAAK;AAAA,kBACL,SAAS,MAAM,kBAAkB,CAAA,MAAK,CAAC,CAAC;AAAA,kBACxC,iBAAc;AAAA,kBACd,iBAAe;AAAA,kBACf,cAAW;AAAA,kBACX,OAAO;AAAA,oBACL,SAAS;AAAA,oBACT,YAAY;AAAA,oBACZ,gBAAgB;AAAA,oBAChB,OAAO;AAAA,oBACP,QAAQ;AAAA,oBACR,SAAS;AAAA,oBACT,QAAQ,aAAa,OAAO,OAAO,OAAO,OAAO;AAAA,oBACjD,cAAc;AAAA,oBACd,YAAY,qBAAqB,0BAA0B,OAAO,OAAO,WAAW;AAAA,oBACpF,OAAO,OAAO,OAAO,KAAK;AAAA,oBAC1B,QAAQ;AAAA,oBACR,YAAY;AAAA,kBAAA;AAAA,kBAGd,+BAAC,OAAA,EAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAY,KAAI,eAAc,SAAQ,gBAAe,SAAQ,eAAY,QACzJ,UAAA;AAAA,oBAAA,oBAAC,QAAA,EAAK,GAAE,4CAAA,CAA4C;AAAA,oBACpD,oBAAC,YAAA,EAAS,QAAO,mBAAA,CAAmB;AAAA,oBACpC,oBAAC,UAAK,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,IAAA,CAAI;AAAA,kBAAA,EAAA,CACvC;AAAA,gBAAA;AAAA,cAAA;AAAA,cAED,kBACC;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,MAAK;AAAA,kBACL,OAAO;AAAA,oBACL,UAAU;AAAA,oBACV,OAAO;AAAA,oBACP,KAAK;AAAA,oBACL,WAAW;AAAA,oBACX,UAAU;AAAA,oBACV,SAAS;AAAA,oBACT,YAAY,OAAO,OAAO,WAAW;AAAA,oBACrC,QAAQ,aAAa,OAAO,OAAO,OAAO,OAAO;AAAA,oBACjD,cAAc,OAAO,aAAa;AAAA,oBAClC,WAAW;AAAA,kBAAA;AAAA,kBAGZ,UAAA;AAAA,oBAAA,mBAAmB,IAAI,CAAA,MACtB;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBAEC,MAAK;AAAA,wBACL,MAAK;AAAA,wBACL,SAAS,MAAM,mBAAmB,MAAM,QAAQ,SAAS,CAA2B;AAAA,wBACpF,OAAO;AAAA,0BACL,SAAS;AAAA,0BACT,OAAO;AAAA,0BACP,SAAS;AAAA,0BACT,QAAQ;AAAA,0BACR,cAAc,OAAO,aAAa;AAAA,0BAClC,YAAY;AAAA,0BACZ,OAAO,OAAO,OAAO,KAAK;AAAA,0BAC1B,YAAY,OAAO,WAAW,WAAW;AAAA,0BACzC,UAAU,OAAO,WAAW,SAAS;AAAA,0BACrC,WAAW;AAAA,0BACX,QAAQ;AAAA,wBAAA;AAAA,wBAGT,YAAE,YAAA;AAAA,sBAAY;AAAA,sBAlBV;AAAA,oBAAA,CAoBR;AAAA,oBACA,UACC;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBACC,MAAK;AAAA,wBACL,MAAK;AAAA,wBACL,SAAS,MAAM,mBAAmB,KAAK;AAAA,wBACvC,OAAO;AAAA,0BACL,SAAS;AAAA,0BACT,OAAO;AAAA,0BACP,SAAS;AAAA,0BACT,QAAQ;AAAA,0BACR,cAAc,OAAO,aAAa;AAAA,0BAClC,YAAY;AAAA,0BACZ,OAAO,OAAO,OAAO,KAAK;AAAA,0BAC1B,YAAY,OAAO,WAAW,WAAW;AAAA,0BACzC,UAAU,OAAO,WAAW,SAAS;AAAA,0BACrC,WAAW;AAAA,0BACX,QAAQ;AAAA,wBAAA;AAAA,wBAEX,UAAA;AAAA,sBAAA;AAAA,oBAAA;AAAA,kBAED;AAAA,gBAAA;AAAA,cAAA;AAAA,YAEJ,EAAA,CAEJ;AAAA,UAAA,EAAA,CAEJ;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAGN;AACF,CAAC;"}
1
+ {"version":3,"file":"AstroChart.js","sources":["../../../../src/react/charts/unified/AstroChart.tsx"],"sourcesContent":["/**\n * @zendir/ui - AstroChart Component\n * \n * Enterprise-grade unified charting component built on ECharts.\n * Follows AstroUXD design patterns with full theme integration.\n * \n * Features:\n * - 15+ chart types\n * - Real-time streaming support\n * - Zoom, pan, brush selection\n * - Annotations (thresholds, regions)\n * - Export (PNG, SVG, CSV)\n * - Crosshair sync across charts\n * - Full accessibility support\n * - Dark/light theme support\n */\n\nimport React, { \n useRef, \n useEffect, \n useMemo, \n useCallback, \n useState,\n forwardRef,\n useImperativeHandle,\n memo,\n} from 'react';\nimport ReactEChartsCore from 'echarts-for-react/lib/core';\nimport * as echarts from 'echarts/core';\nimport {\n LineChart,\n BarChart,\n PieChart,\n ScatterChart,\n RadarChart,\n GaugeChart,\n HeatmapChart,\n CandlestickChart,\n BoxplotChart,\n TreemapChart,\n SunburstChart,\n FunnelChart,\n SankeyChart,\n CustomChart,\n GraphChart,\n ParallelChart as EChartsParallelChart,\n} from 'echarts/charts';\nimport {\n GridComponent,\n TooltipComponent,\n TitleComponent,\n LegendComponent,\n DataZoomComponent,\n ToolboxComponent,\n MarkLineComponent,\n MarkAreaComponent,\n MarkPointComponent,\n VisualMapComponent,\n BrushComponent,\n PolarComponent,\n RadarComponent,\n GeoComponent,\n ParallelComponent,\n} from 'echarts/components';\nimport { CanvasRenderer, SVGRenderer } from 'echarts/renderers';\nimport type { EChartsOption, ECharts } from 'echarts';\n\nimport { useTheme } from '../../theme';\nimport { AstroIcon, type AstroIconName } from '../../core/display/AstroIcon';\nimport { HeaderIconWithStatus } from '../../core/display/HeaderIconWithStatus';\nimport { useCardBorderStyle } from '../../context/DisplaySettingsContext';\nimport { createAstroEChartsTheme, createAreaGradient, getSeriesColor } from './theme';\nimport type {\n AstroChartProps,\n SeriesData,\n ChartType,\n ChartEventParams,\n DataPoint,\n TimeSeriesPoint,\n ExportFileNameContext,\n ChartStatus,\n} from './types';\n\n// =============================================================================\n// Status Shape SVGs (matching DataValue component for consistency)\n// =============================================================================\n\nconst STATUS_SHAPES: Record<ChartStatus, (size: number, color: string) => React.ReactNode> = {\n off: (size, color) => (\n <svg viewBox=\"0 0 12 12\" width={size} height={size}>\n <circle cx=\"6\" cy=\"6\" r=\"5\" fill={color} />\n </svg>\n ),\n standby: (size, color) => (\n <svg viewBox=\"0 0 12 12\" width={size} height={size}>\n <circle cx=\"6\" cy=\"6\" r=\"5\" fill={color} />\n </svg>\n ),\n normal: (size, color) => (\n <svg viewBox=\"0 0 12 12\" width={size} height={size}>\n <circle cx=\"6\" cy=\"6\" r=\"5\" fill={color} />\n </svg>\n ),\n caution: (size, color) => (\n <svg viewBox=\"0 0 12 12\" width={size} height={size}>\n <rect x=\"1\" y=\"1\" width=\"10\" height=\"10\" fill={color} />\n </svg>\n ),\n serious: (size, color) => (\n <svg viewBox=\"0 0 12 12\" width={size} height={size}>\n <polygon points=\"6,1 11,6 6,11 1,6\" fill={color} />\n </svg>\n ),\n critical: (size, color) => (\n <svg viewBox=\"0 0 12 12\" width={size} height={size}>\n <polygon points=\"6,11 1,2 11,2\" fill={color} />\n </svg>\n ),\n};\n\n/**\n * Astro UX Status Labels\n * Follows Astro UXDS naming conventions\n * https://www.astrouxds.com/patterns/status-system/\n */\nconst STATUS_LABELS: Record<ChartStatus, string> = {\n off: 'Off',\n standby: 'Standby',\n normal: 'Normal',\n caution: 'Caution',\n serious: 'Serious',\n critical: 'Critical',\n};\n\n/** Slug for safe filenames: lowercase, alphanumeric and hyphens only */\nfunction slug(str: string): string {\n return str\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-|-$/g, '');\n}\n\n/** Build base export name from title, series names, and chart type */\nfunction derivedExportBaseName(\n title: string | undefined,\n seriesNames: string[],\n chartType: string\n): string {\n const parts: string[] = ['zendir'];\n if (title) parts.push(slug(title));\n else parts.push('chart');\n const seriesSlug = seriesNames.slice(0, 4).map(slug).filter(Boolean).join('-');\n if (seriesSlug) parts.push(seriesSlug);\n parts.push(slug(chartType));\n return parts.join('-') || 'zendir-chart';\n}\n\n// Register ECharts components\necharts.use([\n LineChart,\n BarChart,\n PieChart,\n ScatterChart,\n RadarChart,\n GaugeChart,\n HeatmapChart,\n CandlestickChart,\n BoxplotChart,\n TreemapChart,\n SunburstChart,\n FunnelChart,\n SankeyChart,\n CustomChart,\n GraphChart,\n EChartsParallelChart,\n GridComponent,\n TooltipComponent,\n TitleComponent,\n LegendComponent,\n DataZoomComponent,\n ToolboxComponent,\n MarkLineComponent,\n MarkAreaComponent,\n MarkPointComponent,\n VisualMapComponent,\n BrushComponent,\n PolarComponent,\n RadarComponent,\n GeoComponent,\n ParallelComponent,\n CanvasRenderer,\n SVGRenderer,\n]);\n\n// =============================================================================\n// Chart Instance Handle\n// =============================================================================\n\nexport interface AstroChartHandle {\n /** Get ECharts instance */\n getChart: () => ECharts | undefined;\n /** Resize chart */\n resize: () => void;\n /** Export as image (png, jpeg, svg) */\n exportImage: (type?: 'png' | 'jpeg' | 'jpg' | 'svg', pixelRatio?: number) => string | undefined;\n /** Export data as CSV */\n exportCSV: () => string;\n /** Suggested export filename from title, series names, and chart type (with optional extension and timestamp) */\n getExportFileName: (extension?: string, includeTimestamp?: boolean) => string;\n /** Append data for real-time updates */\n appendData: (seriesIndex: number, data: DataPoint | TimeSeriesPoint) => void;\n /** Clear all data */\n clearData: () => void;\n /** Dispatch action */\n dispatchAction: (action: unknown) => void;\n}\n\n// =============================================================================\n// Series Transformer\n// =============================================================================\n\nfunction transformSeriesToECharts(\n series: SeriesData[],\n chartType: ChartType,\n theme: ReturnType<typeof createAstroEChartsTheme>\n): EChartsOption['series'] {\n return series.map((s, index) => {\n const seriesType = s.type || chartType;\n const color = s.color || getSeriesColor(index);\n \n // Base series config\n const baseSeries: Record<string, unknown> = {\n id: s.id,\n name: s.name,\n type: mapChartType(seriesType),\n data: transformData(s.data, seriesType),\n yAxisIndex: s.yAxisIndex || 0,\n showSymbol: seriesType === 'scatter' || (s.symbol?.type !== 'none'),\n smooth: s.smooth ?? (seriesType === 'line' || seriesType === 'area'),\n };\n\n // Line/Area specific\n if (seriesType === 'line' || seriesType === 'area') {\n baseSeries.lineStyle = {\n width: s.lineStyle?.width ?? 2,\n type: s.lineStyle?.type ?? 'solid',\n opacity: s.lineStyle?.opacity ?? 1,\n };\n baseSeries.itemStyle = { color };\n \n if (seriesType === 'area') {\n baseSeries.areaStyle = s.areaStyle || {\n opacity: 0.3,\n color: createAreaGradient(color),\n };\n }\n \n if (s.symbol) {\n baseSeries.symbol = s.symbol.type || 'circle';\n baseSeries.symbolSize = s.symbol.size || 6;\n }\n }\n\n // Bar specific\n if (seriesType === 'bar') {\n baseSeries.itemStyle = {\n color,\n borderRadius: [4, 4, 0, 0],\n };\n if (s.stack) {\n baseSeries.stack = s.stack;\n }\n }\n\n // Pie/Donut specific — theme color, no white border on labels\n if (seriesType === 'pie' || seriesType === 'donut') {\n baseSeries.radius = seriesType === 'donut' ? ['40%', '70%'] : '70%';\n baseSeries.label = {\n show: true,\n formatter: '{b}: {d}%',\n color: theme.textStyle.color,\n textBorderWidth: 0,\n textBorderColor: 'transparent',\n };\n baseSeries.emphasis = {\n itemStyle: {\n shadowBlur: 10,\n shadowOffsetX: 0,\n shadowColor: 'rgba(0, 0, 0, 0.5)',\n },\n };\n }\n\n // Scatter specific\n if (seriesType === 'scatter') {\n baseSeries.symbolSize = s.symbol?.size || 10;\n baseSeries.itemStyle = { color };\n }\n\n // Gauge specific\n if (seriesType === 'gauge') {\n baseSeries.detail = {\n formatter: '{value}%',\n fontSize: 20,\n color: theme.textStyle.color,\n };\n baseSeries.axisLine = {\n lineStyle: {\n width: 10,\n color: [\n [0.3, theme.color[1]], // Green\n [0.7, theme.color[3]], // Yellow\n [1, theme.color[2]], // Red\n ],\n },\n };\n }\n\n return baseSeries;\n });\n}\n\nfunction mapChartType(type: ChartType): string {\n switch (type) {\n case 'area':\n return 'line';\n case 'donut':\n return 'pie';\n default:\n return type;\n }\n}\n\nfunction transformData(\n data: SeriesData['data'],\n type: ChartType\n): unknown[] {\n if (!data || data.length === 0) return [];\n \n // Handle array of numbers\n if (typeof data[0] === 'number') {\n return data as number[];\n }\n \n // Handle [x, y] tuples\n if (Array.isArray(data[0])) {\n return data;\n }\n \n // Handle DataPoint or TimeSeriesPoint\n const firstItem = data[0] as DataPoint | TimeSeriesPoint;\n \n if ('time' in firstItem) {\n // TimeSeriesPoint\n return (data as TimeSeriesPoint[]).map(d => [d.time, d.value]);\n }\n \n // For pie/donut charts, ECharts expects { name, value } format\n if (type === 'pie' || type === 'donut') {\n return (data as DataPoint[]).map(d => ({ \n name: String(d.x), \n value: d.y,\n // Apply color via itemStyle if specified\n ...(d.color ? { itemStyle: { color: d.color } } : {}),\n // Preserve any additional metadata\n ...(d.meta || {}),\n }));\n }\n \n // For scatter charts, preserve per-point color as itemStyle\n if (type === 'scatter') {\n return (data as DataPoint[]).map(d => ({\n value: [d.x, d.y],\n ...(d.color ? { itemStyle: { color: d.color } } : {}),\n ...(d.label ? { name: d.label } : {}),\n }));\n }\n\n // DataPoint for other chart types\n return (data as DataPoint[]).map(d => [d.x, d.y]);\n}\n\n// =============================================================================\n// Options Builder\n// =============================================================================\n\nfunction buildEChartsOptions(\n props: AstroChartProps,\n theme: ReturnType<typeof createAstroEChartsTheme>,\n hideTitle = false\n): EChartsOption {\n const {\n type,\n series,\n title,\n subtitle,\n xAxis,\n yAxis,\n tooltip,\n legend,\n zoom,\n annotations,\n loading,\n compactAxes = true, // Default: hide axis names for more chart space\n } = props;\n \n // Hide title when using custom header (transparent theme with icon)\n const showEChartsTitle = title && !hideTitle;\n \n // Note: When compactAxes is true, axis names are hidden from the chart\n // but developers can access xAxis.name and yAxis.name via props for custom tooltips\n\n const isPolar = type === 'radar';\n const isPie = type === 'pie' || type === 'donut';\n const isGauge = type === 'gauge';\n const isSankey = type === 'sankey';\n const isTreemap = type === 'treemap' || type === 'sunburst';\n const isGraph = props.echartsOptions?.series && \n Array.isArray(props.echartsOptions.series) && \n props.echartsOptions.series.some((s: unknown) => (s as { type?: string })?.type === 'graph');\n \n // Detect 3D charts (they use grid3D, xAxis3D, etc. - should NOT have 2D axes)\n const is3D = !!(props.echartsOptions?.grid3D || props.echartsOptions?.xAxis3D || \n props.echartsOptions?.globe || \n (props.echartsOptions?.series && Array.isArray(props.echartsOptions.series) && \n props.echartsOptions.series.some((s: unknown) => {\n const seriesType = (s as { type?: string })?.type || '';\n return seriesType.includes('3D') || seriesType.includes('3d');\n })));\n \n // Charts that don't need cartesian grid/axes\n const needsGrid = !isPolar && !isPie && !isGauge && !isSankey && !isTreemap && !isGraph && !is3D && !props.hideAxes;\n \n // Calculate layout based on title and legend position\n // Default legend to bottom for better chart space utilization\n // When using custom header (hideTitle=true), we still need top spacing for the header\n const hasTitle = hideTitle ? true : !!title;\n const hasSubtitle = hideTitle ? false : !!subtitle;\n const legendPosition = legend?.position ?? 'bottom'; // Default to bottom\n const legendAtTop = legendPosition === 'top';\n const legendAtBottom = legendPosition === 'bottom';\n const showLegend = legend?.show !== false;\n\n // Build options\n const options: EChartsOption = {\n // Title - positioned to avoid legend overlap (hidden when using custom header)\n title: showEChartsTitle ? {\n text: title,\n subtext: subtitle,\n left: 'center',\n top: legendAtTop && showLegend ? 35 : 10,\n textStyle: { ...theme.title.textStyle, fontWeight: (theme.title.textStyle.fontWeight as 'normal' | 'bold') ?? 'normal' },\n subtextStyle: theme.title.subtextStyle,\n } : undefined,\n\n // Tooltip with improved contrast\n // When compactAxes is true, axis names are shown in the axisPointer label on hover\n tooltip: tooltip?.enabled !== false ? ({\n trigger: tooltip?.trigger || (isPie ? 'item' : 'axis'),\n axisPointer: {\n type: tooltip?.crosshair === true || tooltip?.crosshair === 'both' ? 'cross' : 'line',\n lineStyle: theme.axisPointer.lineStyle,\n crossStyle: theme.axisPointer.crossStyle,\n // Show axis value labels on hover (includes axis name context)\n label: compactAxes ? {\n show: true,\n backgroundColor: theme.tooltip.backgroundColor,\n borderColor: theme.tooltip.borderColor,\n color: theme.tooltip.textStyle.color,\n fontSize: 11,\n padding: [4, 8],\n // Add axis name prefix to the label when in compact mode\n formatter: (params: { axisDimension: string; axisIndex: number; value: number | string }) => {\n const axisName = params.axisDimension === 'x' \n ? xAxis?.name \n : (Array.isArray(yAxis) ? yAxis[params.axisIndex]?.name : yAxis?.name);\n const value = typeof params.value === 'number' \n ? params.value.toLocaleString() \n : params.value;\n return axisName ? `${axisName}: ${value}` : String(value);\n },\n } : undefined,\n },\n backgroundColor: theme.tooltip.backgroundColor,\n borderColor: theme.tooltip.borderColor,\n borderWidth: theme.tooltip.borderWidth,\n textStyle: {\n ...theme.tooltip.textStyle,\n fontSize: 14, // AstroUXDS minimum 14pt\n },\n extraCssText: theme.tooltip.extraCssText,\n confine: tooltip?.confine ?? true,\n formatter: tooltip?.formatter as unknown as undefined,\n } as any) : undefined,\n\n // Legend - ultra-compact styling for maximum chart space\n legend: showLegend ? {\n show: true,\n type: 'scroll',\n orient: legend?.orient || 'horizontal',\n left: legend?.position === 'left' ? 'left' : \n legend?.position === 'right' ? 'right' : 'center',\n top: legendAtTop ? 4 : undefined,\n bottom: legendAtBottom ? 2 : undefined,\n padding: [2, 6],\n itemGap: 8,\n itemWidth: 12,\n itemHeight: 6,\n textStyle: {\n ...theme.legend.textStyle,\n fontSize: 10, // Ultra-compact for maximum chart space\n },\n inactiveColor: theme.legend.inactiveColor,\n selectedMode: legend?.interactive !== false,\n } : { show: false },\n\n // Grid - minimal spacing for maximum chart plotting area\n // When compactAxes is true, axis names are hidden so we need minimal padding\n // containLabel: true ensures axis tick labels don't get cut off\n // Extra space only needed for slider zoom (inside zoom is invisible)\n grid: needsGrid ? {\n left: compactAxes ? 8 : 40,\n right: Array.isArray(yAxis) && yAxis.length > 1 ? (compactAxes ? 8 : 40) : 8,\n top: hasTitle ? (hasSubtitle ? 50 : 36) : (legendAtTop && showLegend ? 26 : 4),\n bottom: (legendAtBottom && showLegend ? 26 : 16) + ((zoom?.type === 'slider' || zoom?.type === 'both') ? 26 : 0),\n containLabel: true,\n } : undefined,\n\n // X Axis - compact font sizes for more chart space\n // In compact mode, hide axis name (shown in tooltip instead)\n xAxis: needsGrid ? {\n type: (xAxis?.type || 'time') as 'value' | 'category' | 'time' | 'log',\n name: compactAxes ? undefined : xAxis?.name,\n nameLocation: xAxis?.nameLocation || 'middle',\n nameGap: 18,\n nameTextStyle: {\n ...theme.xAxis.nameTextStyle,\n fontSize: 10, // Ultra-compact for maximum chart space\n fontWeight: 500,\n },\n min: xAxis?.min,\n max: xAxis?.max,\n axisLine: {\n show: xAxis?.showLine !== false,\n lineStyle: theme.xAxis.axisLine.lineStyle,\n },\n axisTick: {\n lineStyle: theme.xAxis.axisTick.lineStyle,\n },\n axisLabel: {\n ...theme.xAxis.axisLabel,\n fontSize: 10, // Ultra-compact for maximum chart space\n formatter: xAxis?.labelFormatter as unknown as undefined,\n // Prevent label overlap - auto-hide overlapping labels\n hideOverlap: true,\n // Rotate labels slightly if needed for better fit\n rotate: 0,\n // Show fewer labels when space is tight\n interval: 'auto',\n },\n splitLine: {\n show: xAxis?.showGrid !== false,\n lineStyle: { ...theme.xAxis.splitLine.lineStyle, type: (theme.xAxis.splitLine.lineStyle.type as 'solid' | 'dashed' | 'dotted') ?? 'solid' },\n },\n inverse: xAxis?.inverse,\n } : undefined,\n\n // Y Axis - ultra-compact font sizes for maximum chart space\n // In compact mode, hide axis name (shown in tooltip instead)\n yAxis: (needsGrid ? (Array.isArray(yAxis) ? yAxis : [yAxis || {}]).map((axis, i) => ({\n type: (axis?.type || 'value') as 'value' | 'category' | 'time' | 'log',\n name: compactAxes ? undefined : axis?.name,\n nameLocation: axis?.nameLocation || 'middle',\n nameGap: 28,\n nameTextStyle: {\n ...theme.yAxis.nameTextStyle,\n fontSize: 10, // Ultra-compact for maximum chart space\n fontWeight: 500,\n },\n position: axis?.position || (i === 0 ? 'left' : 'right'),\n min: axis?.min,\n max: axis?.max,\n splitNumber: axis?.splitNumber,\n axisLine: {\n show: axis?.showLine !== false,\n lineStyle: theme.yAxis.axisLine.lineStyle,\n },\n axisTick: {\n lineStyle: theme.yAxis.axisTick.lineStyle,\n },\n axisLabel: {\n ...theme.yAxis.axisLabel,\n fontSize: 10, // Ultra-compact for maximum chart space\n formatter: axis?.labelFormatter \n ? axis.labelFormatter as unknown as undefined\n : axis?.unit \n ? (v: number) => `${v}${axis.unit}`\n : undefined,\n },\n splitLine: {\n show: axis?.showGrid !== false,\n lineStyle: theme.yAxis.splitLine.lineStyle,\n },\n inverse: axis?.inverse,\n })) : undefined) as EChartsOption['yAxis'],\n\n // Radar (for radar charts) - transparent background for glassmorphic look\n radar: isPolar ? {\n indicator: series[0]?.data?.map((d: unknown) => {\n const point = d as DataPoint;\n return {\n name: point.label || point.category || String(point.x),\n max: 100,\n };\n }) || [],\n splitArea: {\n show: true,\n areaStyle: {\n color: ['transparent', 'transparent', 'transparent', 'transparent', 'transparent'],\n },\n },\n splitLine: {\n lineStyle: {\n color: theme.xAxis.splitLine.lineStyle.color,\n opacity: 0.4,\n },\n },\n axisLine: {\n lineStyle: {\n color: theme.xAxis.axisLine.lineStyle.color,\n opacity: 0.4,\n },\n },\n axisName: {\n color: theme.xAxis.axisLabel.color,\n fontSize: 12,\n },\n } : undefined,\n\n // Data Zoom - inside zoom enabled by default for mouse wheel/pinch\n // Use zoom={{ enabled: false }} to disable, or zoom={{ type: 'slider' }} for slider\n dataZoom: zoom?.enabled === false ? undefined : [\n // Inside zoom (mouse wheel / pinch) - ENABLED BY DEFAULT\n ...((zoom?.type === 'inside' || zoom?.type === 'both' || !zoom?.type) ? [{\n type: 'inside' as const,\n xAxisIndex: (zoom?.axis === 'x' || zoom?.axis === 'both' || !zoom?.axis) ? 0 : undefined,\n yAxisIndex: zoom?.axis === 'y' || zoom?.axis === 'both' ? 0 : undefined,\n start: zoom?.start ?? 0,\n end: zoom?.end ?? 100,\n minSpan: zoom?.minSpan,\n maxSpan: zoom?.maxSpan,\n // Smooth zoom animation\n throttle: 50,\n }] : []),\n // Slider zoom (only when explicitly requested)\n ...(zoom?.type === 'slider' || zoom?.type === 'both' ? [{\n type: 'slider' as const,\n show: true,\n xAxisIndex: zoom?.axis === 'x' || zoom?.axis === 'both' ? 0 : undefined,\n yAxisIndex: zoom?.axis === 'y' || zoom?.axis === 'both' ? 0 : undefined,\n start: zoom?.start ?? 0,\n end: zoom?.end ?? 100,\n minSpan: zoom?.minSpan,\n maxSpan: zoom?.maxSpan,\n backgroundColor: theme.dataZoom.backgroundColor,\n borderColor: theme.dataZoom.borderColor,\n fillerColor: theme.dataZoom.fillerColor,\n handleStyle: { color: theme.dataZoom.handleColor },\n textStyle: theme.dataZoom.textStyle,\n height: 25,\n bottom: 10,\n }] : []),\n ],\n\n // Toolbox (export) – always use custom dropdown for consistent UI\n toolbox: props.export?.enabled ? (() => {\n return {\n show: false, // Hide ECharts toolbox, use custom export button instead\n right: 20,\n top: 10,\n feature: {\n dataView: props.export.formats?.includes('json') ? {\n show: true,\n readOnly: true,\n } : undefined,\n },\n iconStyle: {\n borderColor: theme.textStyle.color,\n },\n };\n })() : undefined,\n\n // Series\n series: transformSeriesToECharts(series, type, theme),\n\n // Animation\n animation: !loading,\n animationDuration: 300,\n animationEasing: 'cubicOut',\n };\n\n // Add mark lines (thresholds)\n if (annotations?.markLines && options.series) {\n const seriesArray = options.series as Array<Record<string, unknown>>;\n if (seriesArray.length > 0) {\n seriesArray[0].markLine = {\n silent: true,\n symbol: 'none',\n data: annotations.markLines.data.map(line => ({\n ...line,\n lineStyle: {\n color: line.color || theme.color[2],\n type: line.lineStyle?.type || 'dashed',\n width: line.lineStyle?.width || 1,\n },\n label: {\n show: !!line.label,\n formatter: line.label,\n position: 'middle', // center of line so label doesn't overlap y-axis at bottom\n distance: 8,\n color: theme.textStyle.color,\n fontWeight: 600,\n fontSize: 11,\n textBorderWidth: 0,\n textBorderColor: 'transparent',\n backgroundColor: theme.tooltip.backgroundColor,\n borderColor: line.color || theme.color[2],\n borderWidth: 1,\n borderRadius: 4,\n padding: [2, 6],\n },\n })),\n };\n }\n }\n\n // Add mark areas (regions) — label style: no white border, crisp and slightly faded; optional icon\n if (annotations?.markAreas && options.series) {\n const seriesArray = options.series as Array<Record<string, unknown>>;\n const axisLabelColor = (theme.xAxis as { axisLabel?: { color?: string } })?.axisLabel?.color ?? theme.textStyle?.color ?? '#94a3b8';\n const fadedColor = axisLabelColor.startsWith('rgba') ? axisLabelColor : `${axisLabelColor}cc`;\n const defaultLabelStyle = {\n show: true,\n color: fadedColor,\n fontSize: 11,\n fontWeight: '500' as const,\n textBorderWidth: 0,\n textBorderColor: 'transparent',\n formatter: (params: { name?: string; value?: unknown }) => {\n const name = (params?.name ?? '') || (typeof params?.value === 'string' ? params.value : '');\n if (!name) return '';\n const icon = name.toLowerCase().includes('eclipse') ? '\\u25D0 ' : ''; // ◐ symbol for eclipse\n return icon ? `${icon}${name}` : name;\n },\n };\n if (seriesArray.length > 0) {\n seriesArray[0].markArea = {\n silent: true,\n data: annotations.markAreas.data.map((pair: [{ xAxis?: number | string; yAxis?: number; name?: string }, { xAxis?: number | string; yAxis?: number }]) => {\n const [start, end] = pair;\n return [\n { ...start, label: { ...defaultLabelStyle, formatter: defaultLabelStyle.formatter } },\n end,\n ];\n }),\n itemStyle: annotations.markAreas.itemStyle,\n };\n }\n }\n\n // Merge custom options\n if (props.echartsOptions) {\n return mergeOptions(options, props.echartsOptions);\n }\n\n return options;\n}\n\nfunction mergeOptions(base: EChartsOption, custom: Partial<EChartsOption>): EChartsOption {\n // Smart series merging logic\n let mergedSeries = base.series;\n \n if (custom.series) {\n const baseSeries = base.series as Array<{ type?: string; data?: unknown[] }> || [];\n const customSeries = custom.series as unknown[];\n \n // Check if all base series are empty (no data or empty data array)\n const allBaseSeriesEmpty = baseSeries.length === 0 || baseSeries.every(s => {\n if (!s) return true;\n if (!s.data) return true;\n if (Array.isArray(s.data) && s.data.length === 0) return true;\n return false;\n });\n \n // Single full override: presets (e.g. GaugeChart) pass one full series config; use it only so we don't render two gauges\n const baseLen = baseSeries.length;\n const customLen = customSeries.length;\n if (baseLen === 1 && customLen === 1) {\n const b = baseSeries[0];\n const c = customSeries[0] as { type?: string };\n if (b?.type === 'gauge' && c?.type === 'gauge') {\n mergedSeries = customSeries as EChartsOption['series'];\n } else if (allBaseSeriesEmpty) {\n mergedSeries = customSeries as EChartsOption['series'];\n } else {\n mergedSeries = [...baseSeries, ...customSeries] as EChartsOption['series'];\n }\n } else if (allBaseSeriesEmpty) {\n mergedSeries = customSeries as EChartsOption['series'];\n } else {\n mergedSeries = [...baseSeries, ...customSeries] as EChartsOption['series'];\n }\n }\n \n return {\n ...base,\n ...custom,\n series: mergedSeries,\n };\n}\n\n// =============================================================================\n// Main Component\n// =============================================================================\n\nexport const AstroChart = memo(forwardRef<AstroChartHandle, AstroChartProps>(\n function AstroChart(props, ref) {\n const {\n width = '100%',\n height = 400,\n loading = false,\n emptyMessage = 'No data available',\n className = '',\n style,\n ariaLabel,\n onChartReady,\n onClick,\n onHover,\n onZoomChange,\n onBrushSelect,\n realTime,\n series = [],\n infoTooltip,\n // Header icon/status system\n icon,\n iconStatus,\n statusMessage,\n showStatusBadge = false,\n } = props;\n\n const chartRef = useRef<ReactEChartsCore>(null);\n const { tokens, mode, theme: themeVariant } = useTheme();\n \n // Detect transparent theme for glassmorphic styling\n const isTransparentTheme = themeVariant === 'transparent' || themeVariant === 'transparent-bold' || themeVariant === 'transparent-minimal';\n const isBoldVariant = themeVariant === 'transparent-bold';\n const isMinimalVariant = themeVariant === 'transparent-minimal';\n \n // Get card border style based on accentBorders setting\n const cardBorderStyle = useCardBorderStyle(tokens, isTransparentTheme);\n \n // Glass accent colors for bold/minimal themes (matching Container)\n const glassAccentColor = tokens.colors.accent.primary;\n const glassAccentMuted = `${glassAccentColor}66`;\n\n const headingConfig = tokens.layout?.card?.heading ?? {\n iconSize: 20,\n iconSizeCompact: 16,\n titleFontSize: '1.125rem',\n titleFontSizeChart: '0.875rem',\n titleFontWeight: 500,\n gap: 8,\n };\n const chartTitleFontSize = headingConfig.titleFontSizeChart ?? headingConfig.titleFontSize;\n\n // Generate theme - uses official AstroUXDS colors for 'astro' theme, Zendir colors for others\n const theme = useMemo(\n () => createAstroEChartsTheme(tokens, mode, themeVariant),\n [tokens, mode, themeVariant]\n );\n\n // Build options - hide ECharts title whenever we show custom header (top-left, all themes)\n const hideEChartsTitle = !!(icon || props.title);\n const options = useMemo(\n () => buildEChartsOptions(props, theme, hideEChartsTitle),\n [props, theme, hideEChartsTitle]\n );\n\n // Get chart instance\n const getChart = useCallback((): ECharts | undefined => {\n return chartRef.current?.getEchartsInstance();\n }, []);\n\n // Dynamic export filename from title, series names, chart type\n const getExportFileName = useCallback((extension?: string, includeTimestamp = true) => {\n const context: ExportFileNameContext = {\n title: props.title,\n subtitle: props.subtitle,\n seriesNames: series.map(s => s.name),\n chartType: props.type,\n };\n let base: string;\n if (props.export?.getExportFileName) {\n base = props.export.getExportFileName(context);\n } else if (props.export?.fileName) {\n base = props.export.fileName;\n } else {\n base = derivedExportBaseName(props.title, context.seriesNames, props.type);\n }\n if (includeTimestamp) {\n const d = new Date();\n const ts = d.toISOString().slice(0, 19).replace(/[-T:]/g, '').replace(/(\\d{8})(\\d{6})/, '$1-$2');\n base = `${base}-${ts}`;\n }\n if (extension) base = `${base}.${extension.replace(/^\\./, '')}`;\n return base;\n }, [props.title, props.subtitle, props.type, props.export, series]);\n\n // Expose imperative handle\n useImperativeHandle(ref, () => ({\n getChart,\n resize: () => getChart()?.resize(),\n getExportFileName,\n exportImage: (type = 'png', pixelRatio = 2) => {\n const chart = getChart();\n if (!chart) return undefined;\n const imgType = type === 'jpg' ? 'jpeg' : type;\n return chart.getDataURL({\n type: imgType as 'png' | 'jpeg' | 'svg',\n pixelRatio,\n backgroundColor: 'transparent',\n });\n },\n exportCSV: () => {\n const rows: string[] = [];\n const headers = ['Index', ...series.map(s => s.name)];\n rows.push(headers.join(','));\n \n const maxLen = Math.max(...series.map(s => s.data?.length || 0));\n for (let i = 0; i < maxLen; i++) {\n const row = [i.toString()];\n for (const s of series) {\n const data = s.data as unknown[];\n const value = 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 point = value as DataPoint | TimeSeriesPoint;\n row.push(('value' in point ? point.value : point.y)?.toString() || '');\n } else {\n row.push('');\n }\n }\n rows.push(row.join(','));\n }\n return rows.join('\\n');\n },\n appendData: (seriesIndex: number, data: DataPoint | TimeSeriesPoint) => {\n const chart = getChart();\n if (!chart) return;\n\n // Get current data\n const option = chart.getOption();\n const seriesOpt = (option.series as Array<{ data: unknown[] }>)?.[seriesIndex];\n if (!seriesOpt) return;\n\n const currentData = [...(seriesOpt.data || [])];\n const newPoint = 'time' in data \n ? [data.time, data.value]\n : [data.x, data.y];\n \n currentData.push(newPoint);\n\n // Apply max points limit\n const maxPoints = realTime?.maxPoints || 1000;\n while (currentData.length > maxPoints) {\n currentData.shift();\n }\n\n // Update chart\n chart.setOption({\n series: [{\n data: currentData,\n }],\n }, {\n replaceMerge: ['series'],\n });\n },\n clearData: () => {\n const chart = getChart();\n if (!chart) return;\n \n chart.setOption({\n series: series.map(() => ({ data: [] })),\n });\n },\n dispatchAction: (action: unknown) => {\n getChart()?.dispatchAction(action as Parameters<ECharts['dispatchAction']>[0]);\n },\n }), [getChart, series, realTime]);\n\n // Zoom preservation: ReactEChartsCore re-renders with notMerge=true whenever\n // `options` changes (which happens on every series-data update). Without this,\n // streaming charts snap back to start=0/end=100 each frame, defeating user\n // pan/zoom.\n //\n // We capture user pan/zoom on the `datazoom` event and replay it after every\n // option update. For streaming time-series we MUST use absolute axis values\n // (startValue/endValue) — preserving percent (start/end) would slide the\n // window forward as new data extends the axis, which feels exactly like a\n // zoom reset from the operator's perspective. Percent is saved as a fallback\n // for category/non-numeric axes where absolute values aren't meaningful.\n //\n // `programmaticRef` suppresses the datazoom event we ourselves dispatch so\n // we don't overwrite the saved range with the values just replayed.\n type ZoomState = { start?: number; end?: number; startValue?: number | string; endValue?: number | string };\n const userZoomRef = useRef<ZoomState | null>(null);\n const programmaticRef = useRef(false);\n\n // Event handlers\n const handleEvents = useMemo(() => {\n const events: Record<string, (params: unknown) => void> = {};\n\n if (onClick) {\n events.click = (params: unknown) => {\n onClick(params as ChartEventParams);\n };\n }\n\n if (onHover) {\n events.mouseover = (params: unknown) => {\n onHover(params as ChartEventParams);\n };\n }\n\n // Always wire datazoom so we can persist zoom state across data updates.\n // `onZoomChange` (if provided) is invoked alongside.\n events.datazoom = (params: unknown) => {\n if (programmaticRef.current) {\n // This event fired as a result of our own dispatchAction replay — ignore\n // so we don't keep overwriting the saved range from the user's last gesture.\n programmaticRef.current = false;\n return;\n }\n type DZParams = {\n start?: number; end?: number;\n startValue?: number | string; endValue?: number | string;\n batch?: Array<{ start?: number; end?: number; startValue?: number | string; endValue?: number | string }>;\n };\n const p = params as DZParams;\n const b = p.batch?.[0];\n const start = b?.start ?? p.start ?? 0;\n const end = b?.end ?? p.end ?? 100;\n const startValue = b?.startValue ?? p.startValue;\n const endValue = b?.endValue ?? p.endValue;\n // Only remember user-applied zoom; ignore the no-op full range so a\n // double-click \"reset\" returns to auto-follow behavior on the next update.\n const isFullRange = start <= 0 && end >= 100;\n userZoomRef.current = isFullRange ? null : { start, end, startValue, endValue };\n if (onZoomChange) onZoomChange({ start, end });\n };\n\n if (onBrushSelect) {\n events.brushselected = (params: unknown) => {\n onBrushSelect(params as Parameters<NonNullable<typeof onBrushSelect>>[0]);\n };\n }\n\n return events;\n }, [onClick, onHover, onZoomChange, onBrushSelect]);\n\n // After every options update, replay the user's zoom selection so streaming\n // data doesn't reset their view. Prefer absolute axis values when available\n // so the window stays anchored to the time range the user picked, not a\n // percentage that slides as more data arrives.\n useEffect(() => {\n const saved = userZoomRef.current;\n if (!saved) return;\n const chart = getChart() as (ECharts & { isDisposed?: () => boolean }) | undefined;\n // Guard against firing into a disposed instance — happens when parents\n // toggle the chart in/out (e.g. `series.length > 0 ? <AstroChart/> : ...`)\n // and React's effect runs while the previous instance is being torn down.\n if (!chart || (typeof chart.isDisposed === 'function' && chart.isDisposed())) return;\n const hasAbsolute = saved.startValue !== undefined && saved.endValue !== undefined;\n programmaticRef.current = true;\n try {\n chart.dispatchAction(hasAbsolute\n ? { type: 'dataZoom', startValue: saved.startValue, endValue: saved.endValue }\n : { type: 'dataZoom', start: saved.start, end: saved.end });\n } catch {\n // Instance vanished between the isDisposed check and the call — ignore.\n programmaticRef.current = false;\n }\n }, [options, getChart]);\n\n // Chart ready callback\n const handleChartReady = useCallback((chart: unknown) => {\n onChartReady?.(chart);\n }, [onChartReady]);\n\n // Custom export dropdown: always show when export is enabled (for consistent UI)\n const exportFormats = props.export?.formats ?? ['png'];\n const useCustomExportDropdown = props.export?.enabled;\n const [exportMenuOpen, setExportMenuOpen] = useState(false);\n const exportMenuRef = useRef<HTMLDivElement>(null);\n \n // Info tooltip state\n const [infoTooltipOpen, setInfoTooltipOpen] = useState(false);\n const infoTooltipRef = useRef<HTMLDivElement>(null);\n \n // Close info tooltip on outside click\n useEffect(() => {\n if (!infoTooltip || !infoTooltipOpen) return;\n const handleClickOutside = (e: MouseEvent) => {\n if (infoTooltipRef.current && !infoTooltipRef.current.contains(e.target as Node)) {\n setInfoTooltipOpen(false);\n }\n };\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [infoTooltip, infoTooltipOpen]);\n\n useEffect(() => {\n if (!useCustomExportDropdown || !exportMenuOpen) return;\n const handleClickOutside = (e: MouseEvent) => {\n if (exportMenuRef.current && !exportMenuRef.current.contains(e.target as Node)) {\n setExportMenuOpen(false);\n }\n };\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [useCustomExportDropdown, exportMenuOpen]);\n\n const handleExportFormat = useCallback((format: 'png' | 'jpeg' | 'svg' | 'csv') => {\n const chart = getChart();\n if (format === 'csv') {\n const rows: string[] = [];\n const headers = ['Index', ...series.map(s => s.name)];\n rows.push(headers.join(','));\n const maxLen = Math.max(...series.map(s => s.data?.length || 0));\n for (let i = 0; i < maxLen; i++) {\n const row = [i.toString()];\n for (const s of series) {\n const data = s.data as unknown[];\n const value = data?.[i];\n if (typeof value === 'number') row.push(value.toString());\n else if (Array.isArray(value)) row.push(value[1]?.toString() || '');\n else if (value && typeof value === 'object') {\n const point = value as DataPoint | TimeSeriesPoint;\n row.push(('value' in point ? point.value : point.y)?.toString() || '');\n } else row.push('');\n }\n rows.push(row.join(','));\n }\n const csv = rows.join('\\n');\n const filename = getExportFileName('csv', true);\n const blob = new Blob([csv], { type: 'text/csv;charset=utf-8' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n a.click();\n URL.revokeObjectURL(url);\n } else if (chart) {\n const imgType = format === 'jpeg' ? 'jpeg' : format;\n const dataUrl = chart.getDataURL({\n type: imgType as 'png' | 'jpeg' | 'svg',\n pixelRatio: props.export?.pixelRatio || 2,\n backgroundColor: props.export?.backgroundColor || 'transparent',\n });\n if (dataUrl) {\n const ext = format === 'jpeg' ? 'jpg' : format;\n const filename = getExportFileName(ext, true);\n const a = document.createElement('a');\n a.href = dataUrl;\n a.download = filename;\n a.click();\n }\n }\n setExportMenuOpen(false);\n }, [getChart, series, getExportFileName, props.export?.pixelRatio, props.export?.backgroundColor]);\n\n // Resize observer (guard so we never resize after unmount/dispose)\n useEffect(() => {\n const chart = getChart();\n if (!chart) return;\n\n let mounted = true;\n const resizeObserver = new ResizeObserver(() => {\n if (!mounted) return;\n try {\n chart.resize();\n } catch {\n // Chart may be disposed; ignore\n }\n });\n\n const container = chartRef.current?.ele;\n if (container) {\n resizeObserver.observe(container);\n }\n\n return () => {\n mounted = false;\n resizeObserver.disconnect();\n };\n }, [getChart]);\n\n // echarts-gl 3D series require canvas renderer (SVG mode crashes with isSingleCanvas error)\n const needs3DCanvas = useMemo(() => {\n const eo = props.echartsOptions;\n if (!eo) return false;\n if (eo.grid3D || eo.xAxis3D || eo.yAxis3D || eo.zAxis3D || eo.globe || eo.geo3D) return true;\n if (Array.isArray(eo.series)) {\n return eo.series.some((s: any) => {\n const t = s?.type || '';\n return t.includes('3D') || t.includes('3d') || t === 'scatter3D' || t === 'bar3D' || t === 'surface' || t === 'lines3D';\n });\n }\n return false;\n }, [props.echartsOptions]);\n\n // Check if data is empty (consider both series prop and echartsOptions.series)\n const hasSeriesData = series.some(s => s.data && s.data.length > 0);\n const hasEchartsOptionsSeries = props.echartsOptions?.series && \n (Array.isArray(props.echartsOptions.series) \n ? props.echartsOptions.series.length > 0 \n : props.echartsOptions.series !== undefined);\n const hasData = hasSeriesData || hasEchartsOptionsSeries;\n\n // Status color mapping for header icon\n const getStatusColor = (status: ChartStatus | undefined): string => {\n switch (status) {\n case 'critical': return tokens.colors.status?.critical || '#ff3838';\n case 'serious': return tokens.colors.status?.serious || '#ffb302';\n case 'caution': return tokens.colors.status?.caution || '#fce83a';\n case 'normal': return tokens.colors.status?.normal || '#56f000';\n case 'standby': return tokens.colors.status?.standby || '#2dccff';\n case 'off': return tokens.colors.status?.off || '#a4abb6';\n default: return tokens.colors.text.secondary;\n }\n };\n\n // Check if we need to render the header (has icon or title)\n const hasHeader = !!(icon || props.title);\n\n // Container styles - glassmorphic for transparent themes (matching Container component)\n // Bold and Minimal themes get special glass styling\n const useGlassMode = isBoldVariant || isMinimalVariant;\n \n const containerStyle: React.CSSProperties = {\n width: typeof width === 'number' ? `${width}px` : width,\n height: typeof height === 'number' ? `${height}px` : height,\n borderRadius: tokens.borderRadius.lg,\n padding: tokens.spacing.sm,\n position: 'relative',\n overflow: 'hidden',\n // Glass mode styling for bold/minimal (matching Container)\n ...(useGlassMode ? {\n backgroundColor: 'rgba(10, 15, 25, 0.35)',\n backdropFilter: 'blur(12px)',\n WebkitBackdropFilter: 'blur(12px)',\n border: `1px solid ${glassAccentMuted}`,\n borderTop: isBoldVariant ? `2px solid ${glassAccentColor}` : `1px solid ${glassAccentColor}`,\n transition: 'all 0.3s ease-out, box-shadow 0.3s ease-out',\n } : isTransparentTheme ? {\n // Regular transparent (glass) theme — match top cards (ISS): transparent + blur\n backgroundColor: 'transparent',\n backdropFilter: 'blur(12px)',\n WebkitBackdropFilter: 'blur(12px)',\n ...cardBorderStyle,\n } : {\n // Non-transparent themes — use same border as Container (muted) so chart doesn't stand out\n backgroundColor: tokens.colors.background.surface,\n border: `1px solid ${tokens.colors.border.muted}`,\n }),\n ...style,\n };\n \n // Glass gradient for bold/minimal themes\n const glassGradient = useGlassMode \n ? `linear-gradient(135deg, ${glassAccentColor}10 0%, ${glassAccentColor}03 100%)`\n : undefined;\n\n // Empty state\n if (!hasData && !loading) {\n return (\n <div \n className={`astro-chart astro-chart--empty ${className}`}\n style={containerStyle}\n role=\"group\"\n aria-roledescription=\"chart\"\n aria-label={ariaLabel || 'Empty chart'}\n >\n {/* Glass gradient overlay for bold/minimal themes */}\n {useGlassMode && glassGradient && (\n <div\n style={{\n position: 'absolute',\n inset: 0,\n background: glassGradient,\n pointerEvents: 'none',\n zIndex: 0,\n }}\n />\n )}\n <div style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n height: '100%',\n color: tokens.colors.text.secondary,\n fontFamily: tokens.typography.fontFamily.primary,\n fontSize: tokens.typography.fontSize.sm,\n position: 'relative',\n zIndex: 1,\n }}>\n {emptyMessage}\n </div>\n </div>\n );\n }\n\n const exportImageFormats = exportFormats.filter(f => ['png', 'jpeg', 'jpg', 'svg'].includes(f));\n const hasCsv = exportFormats.includes('csv');\n\n // Calculate header height for chart area adjustment\n const _headerHeight = (icon && iconStatus) ? 32 : 0;\n\n return (\n <div \n className={`astro-chart ${className}`}\n style={containerStyle}\n role=\"group\"\n aria-roledescription=\"chart\"\n aria-label={ariaLabel || props.title || 'Chart'}\n >\n {/* Glass gradient overlay for bold/minimal themes (matching Container) */}\n {useGlassMode && glassGradient && (\n <div\n style={{\n position: 'absolute',\n inset: 0,\n background: glassGradient,\n pointerEvents: 'none',\n zIndex: 0,\n }}\n />\n )}\n \n {/* Header - BOLD variant (matching Container) */}\n {hasHeader && isBoldVariant && (\n <div style={{ position: 'relative', zIndex: 1 }}>\n <div style={{ \n display: 'flex', \n alignItems: 'center', \n justifyContent: 'space-between',\n padding: `12px ${tokens.spacing.sm} 0`,\n }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: headingConfig.gap }}>\n {/* Icon with status badge - card heading system */}\n {icon && iconStatus && (\n <HeaderIconWithStatus \n icon={icon as AstroIconName}\n size={headingConfig.iconSize}\n status={iconStatus}\n statusColor={getStatusColor(iconStatus)}\n />\n )}\n {icon && !iconStatus && (\n <AstroIcon \n name={icon as AstroIconName} \n size={headingConfig.iconSize} \n color={glassAccentColor}\n />\n )}\n {props.title && (\n <h3 style={{\n margin: 0,\n fontSize: chartTitleFontSize,\n fontWeight: headingConfig.titleFontWeight,\n color: glassAccentColor,\n letterSpacing: '0.5px',\n textShadow: `0 0 20px ${glassAccentMuted}`,\n }}>\n {props.title}\n </h3>\n )}\n </div>\n </div>\n {/* Accent decorative line with status badge */}\n <div style={{\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n padding: `10px ${tokens.spacing.sm} 0`,\n marginBottom: tokens.spacing.xs,\n }}>\n <div style={{\n flex: 1,\n height: '2px',\n background: `linear-gradient(90deg, ${glassAccentColor} 0%, ${glassAccentMuted} 50%, transparent 100%)`,\n boxShadow: `0 0 8px ${glassAccentMuted}`,\n }} />\n {/* Status badge at end of line (optional) */}\n {showStatusBadge && iconStatus && (\n <span style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: '4px',\n padding: '2px 8px',\n fontSize: '0.625rem', // 10px in rem\n fontWeight: 500, // AstroUXDS medium (not 600)\n letterSpacing: '0.05em',\n color: getStatusColor(iconStatus),\n backgroundColor: `${getStatusColor(iconStatus)}20`,\n border: `1px solid ${getStatusColor(iconStatus)}40`,\n borderRadius: '3px',\n whiteSpace: 'nowrap',\n }}>\n {STATUS_SHAPES[iconStatus](6, getStatusColor(iconStatus))}\n {STATUS_LABELS[iconStatus]}\n </span>\n )}\n </div>\n </div>\n )}\n \n {/* Header - MINIMAL variant (inline thin line, matching Container) */}\n {hasHeader && isMinimalVariant && (\n <div style={{\n display: 'flex',\n alignItems: 'center',\n padding: `${tokens.spacing.xs} ${tokens.spacing.sm} 0`,\n marginBottom: tokens.spacing.xs,\n position: 'relative',\n zIndex: 1,\n }}>\n {icon && iconStatus && (\n <HeaderIconWithStatus \n icon={icon as AstroIconName}\n size={headingConfig.iconSizeCompact}\n status={iconStatus}\n statusColor={getStatusColor(iconStatus)}\n style={{ marginRight: tokens.spacing.sm }}\n />\n )}\n {icon && !iconStatus && (\n <AstroIcon \n name={icon as AstroIconName} \n size={headingConfig.iconSizeCompact} \n color={glassAccentColor}\n style={{ marginRight: tokens.spacing.sm }}\n />\n )}\n {props.title && (\n <h3 style={{\n margin: 0,\n fontSize: chartTitleFontSize,\n fontWeight: headingConfig.titleFontWeight,\n color: glassAccentColor,\n textShadow: `0 0 16px ${glassAccentMuted}`,\n letterSpacing: '0.02em',\n whiteSpace: 'nowrap',\n marginRight: '12px',\n }}>\n {props.title}\n </h3>\n )}\n {/* Accent line with status badge */}\n <div style={{\n flex: 1,\n display: 'flex',\n alignItems: 'center',\n gap: headingConfig.gap,\n minWidth: 40,\n }}>\n <div style={{\n flex: 1,\n height: '1px',\n background: `linear-gradient(90deg, ${glassAccentColor} 0%, ${glassAccentMuted} 60%, transparent 100%)`,\n }} />\n {/* Status badge at end of line (optional) */}\n {showStatusBadge && iconStatus && (\n <span style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: '3px',\n padding: '1px 6px',\n fontSize: '0.5625rem', // 9px in rem (micro)\n fontWeight: 500, // AstroUXDS medium (not 600)\n letterSpacing: '0.05em',\n color: getStatusColor(iconStatus),\n backgroundColor: `${getStatusColor(iconStatus)}15`,\n border: `1px solid ${getStatusColor(iconStatus)}30`,\n borderRadius: '2px',\n whiteSpace: 'nowrap',\n }}>\n {STATUS_SHAPES[iconStatus](5, getStatusColor(iconStatus))}\n {STATUS_LABELS[iconStatus]}\n </span>\n )}\n </div>\n </div>\n )}\n \n {/* Header - Regular glass theme (no box/border) */}\n {hasHeader && isTransparentTheme && !useGlassMode && (\n <div \n title={statusMessage}\n style={{\n position: 'absolute',\n top: 6,\n left: 8,\n display: 'flex',\n alignItems: 'center',\n gap: headingConfig.gap,\n zIndex: 10,\n }}\n >\n {icon && iconStatus && (\n <HeaderIconWithStatus \n icon={icon as AstroIconName}\n size={headingConfig.iconSizeCompact}\n status={iconStatus}\n statusColor={getStatusColor(iconStatus)}\n />\n )}\n {icon && !iconStatus && (\n <AstroIcon \n name={icon as AstroIconName} \n size={headingConfig.iconSizeCompact} \n color={tokens.colors.text.tertiary}\n />\n )}\n {props.title && (\n <span style={{\n fontSize: chartTitleFontSize,\n fontWeight: headingConfig.titleFontWeight,\n color: tokens.colors.text.primary,\n }}>\n {props.title}\n </span>\n )}\n </div>\n )}\n \n {/* Header - Non-transparent themes (Zen/Astro): same top-left layout, no box/border */}\n {hasHeader && !isTransparentTheme && (\n <div \n title={statusMessage}\n style={{\n position: 'absolute',\n top: 6,\n left: 8,\n display: 'flex',\n alignItems: 'center',\n gap: headingConfig.gap,\n zIndex: 10,\n }}\n >\n {icon && iconStatus && (\n <HeaderIconWithStatus \n icon={icon as AstroIconName}\n size={headingConfig.iconSizeCompact}\n status={iconStatus}\n statusColor={getStatusColor(iconStatus)}\n />\n )}\n {icon && !iconStatus && (\n <AstroIcon \n name={icon as AstroIconName} \n size={headingConfig.iconSizeCompact} \n color={tokens.colors.text.tertiary}\n />\n )}\n {props.title && (\n <span style={{\n fontSize: chartTitleFontSize,\n fontWeight: headingConfig.titleFontWeight,\n color: tokens.colors.text.primary,\n }}>\n {props.title}\n </span>\n )}\n </div>\n )}\n {/* SVG renderer by default for sharp text; canvas is forced when echarts-gl 3D series are present (gl requires canvas) */}\n <ReactEChartsCore\n ref={chartRef}\n echarts={echarts}\n option={options}\n opts={{\n renderer: props.renderer ?? (needs3DCanvas ? 'canvas' : 'svg'),\n ...((props.renderer === 'canvas' || needs3DCanvas) && typeof window !== 'undefined' && { devicePixelRatio: window.devicePixelRatio || 1 }),\n }}\n style={{ width: '100%', height: '100%' }}\n notMerge={true}\n lazyUpdate={true}\n showLoading={loading}\n loadingOption={{\n text: 'Loading...',\n color: tokens.colors.accent.primary,\n textColor: tokens.colors.text.primary,\n maskColor: isTransparentTheme ? 'rgba(10, 15, 25, 0.6)' : `${tokens.colors.background.surface}80`,\n }}\n onEvents={handleEvents}\n onChartReady={handleChartReady}\n />\n {/* Chart toolbar - compact, positioned top right */}\n <div style={{ \n position: 'absolute', \n right: 8, \n top: 6, \n zIndex: 10,\n display: 'flex',\n alignItems: 'center',\n gap: 4,\n }}>\n {/* Info tooltip button */}\n {infoTooltip && (\n <div ref={infoTooltipRef} style={{ position: 'relative' }}>\n <button\n type=\"button\"\n onClick={() => setInfoTooltipOpen(v => !v)}\n aria-label=\"Chart information\"\n aria-expanded={infoTooltipOpen}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 20,\n height: 20,\n padding: 4,\n border: `1px solid ${tokens.colors.border.default}`,\n borderRadius: '50%',\n background: infoTooltipOpen ? tokens.colors.accent.primary : (isTransparentTheme ? 'rgba(10, 15, 25, 0.5)' : tokens.colors.background.surface),\n color: infoTooltipOpen ? tokens.colors.background.base : tokens.colors.text.secondary,\n cursor: 'pointer',\n transition: 'all 0.15s ease',\n }}\n >\n {infoTooltip.icon || (\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\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-6h2v6zm0-8h-2V7h2v2z\"/>\n </svg>\n )}\n </button>\n {infoTooltipOpen && (\n <div\n role=\"tooltip\"\n style={{\n position: 'absolute',\n right: 0,\n top: '100%',\n marginTop: 8,\n minWidth: 200,\n maxWidth: infoTooltip.maxWidth || 300,\n padding: '12px 16px',\n background: isTransparentTheme ? 'rgba(10, 15, 25, 0.85)' : tokens.colors.background.surface,\n backdropFilter: isTransparentTheme ? 'blur(12px)' : undefined,\n border: `1px solid ${tokens.colors.border.default}`,\n borderRadius: tokens.borderRadius.md,\n boxShadow: '0 4px 16px rgba(0,0,0,0.25)',\n color: tokens.colors.text.primary,\n fontFamily: tokens.typography.fontFamily.primary,\n fontSize: tokens.typography.fontSize.sm,\n lineHeight: 1.5,\n zIndex: 20,\n }}\n >\n {infoTooltip.content}\n </div>\n )}\n </div>\n )}\n \n {/* Export dropdown - compact icon only */}\n {useCustomExportDropdown && (\n <div ref={exportMenuRef} style={{ position: 'relative' }}>\n <button\n type=\"button\"\n onClick={() => setExportMenuOpen(v => !v)}\n aria-haspopup=\"true\"\n aria-expanded={exportMenuOpen}\n aria-label=\"Save chart as\"\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 20,\n height: 20,\n padding: 4,\n border: `1px solid ${tokens.colors.border.default}`,\n borderRadius: '50%',\n background: isTransparentTheme ? 'rgba(10, 15, 25, 0.5)' : tokens.colors.background.surface,\n color: tokens.colors.text.secondary,\n cursor: 'pointer',\n transition: 'all 0.15s ease',\n }}\n >\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" />\n <polyline points=\"7 10 12 15 17 10\" />\n <line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"3\" />\n </svg>\n </button>\n {exportMenuOpen && (\n <div\n role=\"menu\"\n style={{\n position: 'absolute',\n right: 0,\n top: '100%',\n marginTop: 4,\n minWidth: 120,\n padding: 4,\n background: tokens.colors.background.surface,\n border: `1px solid ${tokens.colors.border.default}`,\n borderRadius: tokens.borderRadius.md,\n boxShadow: '0 4px 12px rgba(0,0,0,0.2)',\n }}\n >\n {exportImageFormats.map(f => (\n <button\n key={f}\n type=\"button\"\n role=\"menuitem\"\n onClick={() => handleExportFormat(f === 'jpg' ? 'jpeg' : f as 'png' | 'jpeg' | 'svg')}\n style={{\n display: 'block',\n width: '100%',\n padding: '8px 12px',\n border: 'none',\n borderRadius: tokens.borderRadius.sm,\n background: 'transparent',\n color: tokens.colors.text.primary,\n fontFamily: tokens.typography.fontFamily.primary,\n fontSize: tokens.typography.fontSize.sm,\n textAlign: 'left',\n cursor: 'pointer',\n }}\n >\n {f.toUpperCase()}\n </button>\n ))}\n {hasCsv && (\n <button\n type=\"button\"\n role=\"menuitem\"\n onClick={() => handleExportFormat('csv')}\n style={{\n display: 'block',\n width: '100%',\n padding: '8px 12px',\n border: 'none',\n borderRadius: tokens.borderRadius.sm,\n background: 'transparent',\n color: tokens.colors.text.primary,\n fontFamily: tokens.typography.fontFamily.primary,\n fontSize: tokens.typography.fontSize.sm,\n textAlign: 'left',\n cursor: 'pointer',\n }}\n >\n CSV\n </button>\n )}\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n );\n }\n));\n\nexport default AstroChart;\n"],"names":["EChartsParallelChart","_a","_b","AstroChart","_c","_d","_e","_f"],"mappings":"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"}
@@ -52,8 +52,4 @@ export interface AppCardProps {
52
52
  * crash the host application — critical for sandboxed iframes.
53
53
  */
54
54
  export declare const AppCard: React.FC<AppCardProps>;
55
- /** @deprecated Use `AppCard` instead. Alias kept for backward compatibility. */
56
- export declare const ChatGPTCard: React.FC<AppCardProps>;
57
- /** @deprecated Use `AppCardProps` instead. */
58
- export type ChatGPTCardProps = AppCardProps;
59
55
  export default AppCard;
@@ -130,25 +130,6 @@ export declare function useCallTool(): {
130
130
  * Send a follow-up message as if the user asked it
131
131
  */
132
132
  export declare function useSendMessage(): (prompt: string) => Promise<void>;
133
- /**
134
- * DEPRECATED: Do not use notifyIntrinsicHeight!
135
- *
136
- * According to OpenAI Apps SDK examples (via DeepWiki), the correct pattern is:
137
- * - The HOST provides maxHeight via window.openai.maxHeight
138
- * - Widgets READ this and constrain themselves
139
- * - Widgets NEVER report height back to the host
140
- *
141
- * Calling notifyIntrinsicHeight causes infinite resize loops in MCPJam sandbox
142
- * because the sandbox responds by resizing the container, which triggers another
143
- * resize event.
144
- *
145
- * Use useMaxHeight() instead to get the host's height constraint.
146
- *
147
- * @deprecated Use useMaxHeight() instead
148
- */
149
- export declare function useIntrinsicHeight(_ref: {
150
- current: HTMLElement | null;
151
- }): void;
152
133
  /**
153
134
  * Get the maximum height available for the widget from the host environment.
154
135
  * This is the CORRECT pattern per OpenAI Apps SDK examples.