@zendir/ui 0.1.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.
- package/CHANGELOG.md +19 -0
- package/LICENSE +21 -0
- package/README.md +589 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +421 -0
- package/dist/index.js.map +1 -0
- package/dist/react/3d/EarthViewer.d.ts +46 -0
- package/dist/react/3d/EarthViewer.js +836 -0
- package/dist/react/3d/EarthViewer.js.map +1 -0
- package/dist/react/3d/SolarSystemViewer.d.ts +43 -0
- package/dist/react/3d/SolarSystemViewer.js +372 -0
- package/dist/react/3d/SolarSystemViewer.js.map +1 -0
- package/dist/react/3d/ZenSpace3D.d.ts +16 -0
- package/dist/react/3d/ZenSpace3D.js +1253 -0
- package/dist/react/3d/ZenSpace3D.js.map +1 -0
- package/dist/react/3d/ZenSpace3DCesium.d.ts +9 -0
- package/dist/react/3d/ZenSpace3DCesium.js +186 -0
- package/dist/react/3d/ZenSpace3DCesium.js.map +1 -0
- package/dist/react/3d/ZenSpace3DShaders.d.ts +78 -0
- package/dist/react/3d/ZenSpace3DShaders.js +94 -0
- package/dist/react/3d/ZenSpace3DShaders.js.map +1 -0
- package/dist/react/3d/ZenSpace3DTypes.d.ts +614 -0
- package/dist/react/3d/ZenSpace3DUtils.d.ts +183 -0
- package/dist/react/3d/ZenSpace3DUtils.js +213 -0
- package/dist/react/3d/ZenSpace3DUtils.js.map +1 -0
- package/dist/react/3d/index.d.ts +23 -0
- package/dist/react/3d/threeLoader.d.ts +22 -0
- package/dist/react/3d/threeLoader.js +18 -0
- package/dist/react/3d/threeLoader.js.map +1 -0
- package/dist/react/astro/ClassificationBanner.d.ts +25 -0
- package/dist/react/astro/ClassificationBanner.js +83 -0
- package/dist/react/astro/ClassificationBanner.js.map +1 -0
- package/dist/react/astro/GlobalStatusBar.d.ts +42 -0
- package/dist/react/astro/GlobalStatusBar.js +165 -0
- package/dist/react/astro/GlobalStatusBar.js.map +1 -0
- package/dist/react/astro/MissionClock.d.ts +169 -0
- package/dist/react/astro/MissionClock.js +411 -0
- package/dist/react/astro/MissionClock.js.map +1 -0
- package/dist/react/astro/MonitoringIcon.d.ts +60 -0
- package/dist/react/astro/MonitoringIcon.js +369 -0
- package/dist/react/astro/MonitoringIcon.js.map +1 -0
- package/dist/react/astro/Notification.d.ts +42 -0
- package/dist/react/astro/Notification.js +156 -0
- package/dist/react/astro/Notification.js.map +1 -0
- package/dist/react/astro/Progress.d.ts +39 -0
- package/dist/react/astro/Progress.js +149 -0
- package/dist/react/astro/Progress.js.map +1 -0
- package/dist/react/astro/SimulationControls.d.ts +136 -0
- package/dist/react/astro/SimulationControls.js +668 -0
- package/dist/react/astro/SimulationControls.js.map +1 -0
- package/dist/react/astro/StatusIndicator.d.ts +34 -0
- package/dist/react/astro/StatusIndicator.js +189 -0
- package/dist/react/astro/StatusIndicator.js.map +1 -0
- package/dist/react/astro/UnifiedTimeline.d.ts +106 -0
- package/dist/react/astro/UnifiedTimeline.js +1768 -0
- package/dist/react/astro/UnifiedTimeline.js.map +1 -0
- package/dist/react/astro/index.d.ts +63 -0
- package/dist/react/cards/AccessCard.d.ts +37 -0
- package/dist/react/cards/AccessCard.js +410 -0
- package/dist/react/cards/AccessCard.js.map +1 -0
- package/dist/react/cards/OrbitCard.d.ts +31 -0
- package/dist/react/cards/OrbitCard.js +372 -0
- package/dist/react/cards/OrbitCard.js.map +1 -0
- package/dist/react/cards/SpacecraftCard.d.ts +54 -0
- package/dist/react/cards/SpacecraftCard.js +941 -0
- package/dist/react/cards/SpacecraftCard.js.map +1 -0
- package/dist/react/cards/TelemetryCard.d.ts +40 -0
- package/dist/react/cards/TelemetryCard.js +742 -0
- package/dist/react/cards/TelemetryCard.js.map +1 -0
- package/dist/react/cards/TelemetryStreamCard.d.ts +59 -0
- package/dist/react/cards/TelemetryStreamCard.js +309 -0
- package/dist/react/cards/TelemetryStreamCard.js.map +1 -0
- package/dist/react/cards/index.d.ts +13 -0
- package/dist/react/charts/GroundTrackMap.d.ts +112 -0
- package/dist/react/charts/GroundTrackMap.js +1123 -0
- package/dist/react/charts/GroundTrackMap.js.map +1 -0
- package/dist/react/charts/GroundTrackMapLeaflet.d.ts +26 -0
- package/dist/react/charts/GroundTrackMapLeaflet.js +571 -0
- package/dist/react/charts/GroundTrackMapLeaflet.js.map +1 -0
- package/dist/react/charts/groundTrackMapLeafletTiles.d.ts +22 -0
- package/dist/react/charts/groundTrackMapLeafletTiles.js +11 -0
- package/dist/react/charts/groundTrackMapLeafletTiles.js.map +1 -0
- package/dist/react/charts/groundTrackMapLeafletUtils.d.ts +24 -0
- package/dist/react/charts/groundTrackMapLeafletUtils.js +109 -0
- package/dist/react/charts/groundTrackMapLeafletUtils.js.map +1 -0
- package/dist/react/charts/index.d.ts +10 -0
- package/dist/react/charts/unified/AstroChart.d.ts +24 -0
- package/dist/react/charts/unified/AstroChart.js +1405 -0
- package/dist/react/charts/unified/AstroChart.js.map +1 -0
- package/dist/react/charts/unified/PowerOverviewChart.d.ts +73 -0
- package/dist/react/charts/unified/PowerOverviewChart.js +488 -0
- package/dist/react/charts/unified/PowerOverviewChart.js.map +1 -0
- package/dist/react/charts/unified/domain.d.ts +845 -0
- package/dist/react/charts/unified/domain.js +3168 -0
- package/dist/react/charts/unified/domain.js.map +1 -0
- package/dist/react/charts/unified/generators.d.ts +276 -0
- package/dist/react/charts/unified/generators.js +518 -0
- package/dist/react/charts/unified/generators.js.map +1 -0
- package/dist/react/charts/unified/index.d.ts +55 -0
- package/dist/react/charts/unified/presets.d.ts +290 -0
- package/dist/react/charts/unified/presets.js +999 -0
- package/dist/react/charts/unified/presets.js.map +1 -0
- package/dist/react/charts/unified/sync.d.ts +69 -0
- package/dist/react/charts/unified/sync.js +219 -0
- package/dist/react/charts/unified/sync.js.map +1 -0
- package/dist/react/charts/unified/theme.d.ts +447 -0
- package/dist/react/charts/unified/theme.js +562 -0
- package/dist/react/charts/unified/theme.js.map +1 -0
- package/dist/react/charts/unified/types.d.ts +826 -0
- package/dist/react/charts/unified/useChartStream.d.ts +58 -0
- package/dist/react/charts/unified/useChartStream.js +226 -0
- package/dist/react/charts/unified/useChartStream.js.map +1 -0
- package/dist/react/chatgpt/AppCard.d.ts +59 -0
- package/dist/react/chatgpt/AppCard.js +306 -0
- package/dist/react/chatgpt/AppCard.js.map +1 -0
- package/dist/react/chatgpt/ChatGPTCard.d.ts +6 -0
- package/dist/react/chatgpt/index.d.ts +167 -0
- package/dist/react/chatgpt/index.js +166 -0
- package/dist/react/chatgpt/index.js.map +1 -0
- package/dist/react/context/DisplaySettingsContext.d.ts +107 -0
- package/dist/react/context/DisplaySettingsContext.js +169 -0
- package/dist/react/context/DisplaySettingsContext.js.map +1 -0
- package/dist/react/context/index.d.ts +5 -0
- package/dist/react/core/ActivityPlanner.d.ts +45 -0
- package/dist/react/core/ActivityPlanner.js +532 -0
- package/dist/react/core/ActivityPlanner.js.map +1 -0
- package/dist/react/core/AppBar.d.ts +71 -0
- package/dist/react/core/AppBar.js +817 -0
- package/dist/react/core/AppBar.js.map +1 -0
- package/dist/react/core/AstroIcon.d.ts +84 -0
- package/dist/react/core/AstroIcon.js +1243 -0
- package/dist/react/core/AstroIcon.js.map +1 -0
- package/dist/react/core/Badge.d.ts +27 -0
- package/dist/react/core/Badge.js +134 -0
- package/dist/react/core/Badge.js.map +1 -0
- package/dist/react/core/Button.d.ts +26 -0
- package/dist/react/core/Button.js +306 -0
- package/dist/react/core/Button.js.map +1 -0
- package/dist/react/core/CardHeader.d.ts +34 -0
- package/dist/react/core/CardHeader.js +316 -0
- package/dist/react/core/CardHeader.js.map +1 -0
- package/dist/react/core/ChatPanel.d.ts +627 -0
- package/dist/react/core/ChatPanel.js +1144 -0
- package/dist/react/core/ChatPanel.js.map +1 -0
- package/dist/react/core/Checkbox.d.ts +26 -0
- package/dist/react/core/Checkbox.js +130 -0
- package/dist/react/core/Checkbox.js.map +1 -0
- package/dist/react/core/ColorPickerPanel.d.ts +25 -0
- package/dist/react/core/ColorPickerPanel.js +293 -0
- package/dist/react/core/ColorPickerPanel.js.map +1 -0
- package/dist/react/core/CommandBuilder.d.ts +74 -0
- package/dist/react/core/CommandBuilder.js +518 -0
- package/dist/react/core/CommandBuilder.js.map +1 -0
- package/dist/react/core/ConfirmDialog.d.ts +45 -0
- package/dist/react/core/ConfirmDialog.js +315 -0
- package/dist/react/core/ConfirmDialog.js.map +1 -0
- package/dist/react/core/ConnectionForm.d.ts +57 -0
- package/dist/react/core/ConnectionForm.js +496 -0
- package/dist/react/core/ConnectionForm.js.map +1 -0
- package/dist/react/core/Container.d.ts +51 -0
- package/dist/react/core/Container.js +670 -0
- package/dist/react/core/Container.js.map +1 -0
- package/dist/react/core/CopyButton.d.ts +39 -0
- package/dist/react/core/CopyButton.js +105 -0
- package/dist/react/core/CopyButton.js.map +1 -0
- package/dist/react/core/DataTable.d.ts +113 -0
- package/dist/react/core/DataTable.js +446 -0
- package/dist/react/core/DataTable.js.map +1 -0
- package/dist/react/core/DataValue.d.ts +64 -0
- package/dist/react/core/DataValue.js +545 -0
- package/dist/react/core/DataValue.js.map +1 -0
- package/dist/react/core/Dialog.d.ts +32 -0
- package/dist/react/core/Dialog.js +201 -0
- package/dist/react/core/Dialog.js.map +1 -0
- package/dist/react/core/FileExplorer.d.ts +65 -0
- package/dist/react/core/FileExplorer.js +520 -0
- package/dist/react/core/FileExplorer.js.map +1 -0
- package/dist/react/core/GlassCard.d.ts +129 -0
- package/dist/react/core/GlassCard.js +375 -0
- package/dist/react/core/GlassCard.js.map +1 -0
- package/dist/react/core/HeaderIconWithStatus.d.ts +39 -0
- package/dist/react/core/HeaderIconWithStatus.js +157 -0
- package/dist/react/core/HeaderIconWithStatus.js.map +1 -0
- package/dist/react/core/HexViewer.d.ts +143 -0
- package/dist/react/core/HexViewer.js +1106 -0
- package/dist/react/core/HexViewer.js.map +1 -0
- package/dist/react/core/Icon.d.ts +32 -0
- package/dist/react/core/Icon.js +142 -0
- package/dist/react/core/Icon.js.map +1 -0
- package/dist/react/core/ImageGallery.d.ts +41 -0
- package/dist/react/core/ImageGallery.js +320 -0
- package/dist/react/core/ImageGallery.js.map +1 -0
- package/dist/react/core/Input.d.ts +38 -0
- package/dist/react/core/Input.js +288 -0
- package/dist/react/core/Input.js.map +1 -0
- package/dist/react/core/LimitsBar.d.ts +51 -0
- package/dist/react/core/LimitsBar.js +200 -0
- package/dist/react/core/LimitsBar.js.map +1 -0
- package/dist/react/core/LogViewer.d.ts +61 -0
- package/dist/react/core/LogViewer.js +599 -0
- package/dist/react/core/LogViewer.js.map +1 -0
- package/dist/react/core/MessageStream.d.ts +58 -0
- package/dist/react/core/MessageStream.js +455 -0
- package/dist/react/core/MessageStream.js.map +1 -0
- package/dist/react/core/MissionCalendar.d.ts +81 -0
- package/dist/react/core/MissionCalendar.js +1049 -0
- package/dist/react/core/MissionCalendar.js.map +1 -0
- package/dist/react/core/NumberInput.d.ts +85 -0
- package/dist/react/core/NumberInput.js +507 -0
- package/dist/react/core/NumberInput.js.map +1 -0
- package/dist/react/core/PacketViewer.d.ts +73 -0
- package/dist/react/core/PacketViewer.js +431 -0
- package/dist/react/core/PacketViewer.js.map +1 -0
- package/dist/react/core/Pagination.d.ts +30 -0
- package/dist/react/core/Pagination.js +190 -0
- package/dist/react/core/Pagination.js.map +1 -0
- package/dist/react/core/PinInput.d.ts +41 -0
- package/dist/react/core/PinInput.js +210 -0
- package/dist/react/core/PinInput.js.map +1 -0
- package/dist/react/core/Popover.d.ts +55 -0
- package/dist/react/core/Popover.js +288 -0
- package/dist/react/core/Popover.js.map +1 -0
- package/dist/react/core/Select.d.ts +42 -0
- package/dist/react/core/Select.js +303 -0
- package/dist/react/core/Select.js.map +1 -0
- package/dist/react/core/SideNav.d.ts +103 -0
- package/dist/react/core/SideNav.js +551 -0
- package/dist/react/core/SideNav.js.map +1 -0
- package/dist/react/core/SidePanel.d.ts +33 -0
- package/dist/react/core/SidePanel.js +199 -0
- package/dist/react/core/SidePanel.js.map +1 -0
- package/dist/react/core/Tabs.d.ts +47 -0
- package/dist/react/core/Tabs.js +129 -0
- package/dist/react/core/Tabs.js.map +1 -0
- package/dist/react/core/Toast.d.ts +56 -0
- package/dist/react/core/Toast.js +229 -0
- package/dist/react/core/Toast.js.map +1 -0
- package/dist/react/core/Toggle.d.ts +22 -0
- package/dist/react/core/Toggle.js +151 -0
- package/dist/react/core/Toggle.js.map +1 -0
- package/dist/react/core/Tooltip.d.ts +19 -0
- package/dist/react/core/Tooltip.js +179 -0
- package/dist/react/core/Tooltip.js.map +1 -0
- package/dist/react/core/Typography.d.ts +127 -0
- package/dist/react/core/Typography.js +187 -0
- package/dist/react/core/Typography.js.map +1 -0
- package/dist/react/core/index.d.ts +108 -0
- package/dist/react/core/layout/Box.d.ts +77 -0
- package/dist/react/core/layout/Box.js +126 -0
- package/dist/react/core/layout/Box.js.map +1 -0
- package/dist/react/core/layout/Center.d.ts +20 -0
- package/dist/react/core/layout/Center.js +34 -0
- package/dist/react/core/layout/Center.js.map +1 -0
- package/dist/react/core/layout/Divider.d.ts +16 -0
- package/dist/react/core/layout/Divider.js +108 -0
- package/dist/react/core/layout/Divider.js.map +1 -0
- package/dist/react/core/layout/Flex.d.ts +30 -0
- package/dist/react/core/layout/Flex.js +128 -0
- package/dist/react/core/layout/Flex.js.map +1 -0
- package/dist/react/core/layout/Grid.d.ts +36 -0
- package/dist/react/core/layout/Grid.js +142 -0
- package/dist/react/core/layout/Grid.js.map +1 -0
- package/dist/react/core/layout/Spacer.d.ts +8 -0
- package/dist/react/core/layout/Spacer.js +31 -0
- package/dist/react/core/layout/Spacer.js.map +1 -0
- package/dist/react/core/layout/Stack.d.ts +54 -0
- package/dist/react/core/layout/Stack.js +74 -0
- package/dist/react/core/layout/Stack.js.map +1 -0
- package/dist/react/core/layout/index.d.ts +38 -0
- package/dist/react/core/layout/responsive.d.ts +23 -0
- package/dist/react/core/layout/responsive.js +26 -0
- package/dist/react/core/layout/responsive.js.map +1 -0
- package/dist/react/core/layout/useBreakpoint.d.ts +77 -0
- package/dist/react/core/layout/useBreakpoint.js +73 -0
- package/dist/react/core/layout/useBreakpoint.js.map +1 -0
- package/dist/react/core/propertyConfig.d.ts +443 -0
- package/dist/react/core/propertyConfig.js +399 -0
- package/dist/react/core/propertyConfig.js.map +1 -0
- package/dist/react/hooks/index.d.ts +21 -0
- package/dist/react/hooks/useAccessWindows.d.ts +66 -0
- package/dist/react/hooks/useCompactMode.d.ts +82 -0
- package/dist/react/hooks/useCompactMode.js +62 -0
- package/dist/react/hooks/useCompactMode.js.map +1 -0
- package/dist/react/hooks/useLiveSelection.d.ts +57 -0
- package/dist/react/hooks/useSimulationPlayback.d.ts +97 -0
- package/dist/react/hooks/useSimulationTime.d.ts +61 -0
- package/dist/react/hooks/useSpacecraftPosition.d.ts +50 -0
- package/dist/react/hooks/useSpacecraftPosition.js +89 -0
- package/dist/react/hooks/useSpacecraftPosition.js.map +1 -0
- package/dist/react/hooks/useTelemetry.d.ts +55 -0
- package/dist/react/hooks/useTelemetry.js +73 -0
- package/dist/react/hooks/useTelemetry.js.map +1 -0
- package/dist/react/hooks/useZendirSession.d.ts +109 -0
- package/dist/react/hooks/useZendirSession.js +148 -0
- package/dist/react/hooks/useZendirSession.js.map +1 -0
- package/dist/react/index.d.ts +74 -0
- package/dist/react/shared/ErrorBoundary.d.ts +63 -0
- package/dist/react/shared/ErrorBoundary.js +142 -0
- package/dist/react/shared/ErrorBoundary.js.map +1 -0
- package/dist/react/shared/Skeleton.d.ts +110 -0
- package/dist/react/shared/Skeleton.js +324 -0
- package/dist/react/shared/Skeleton.js.map +1 -0
- package/dist/react/shared/index.d.ts +12 -0
- package/dist/react/theme/ThemeProvider.d.ts +385 -0
- package/dist/react/theme/ThemeProvider.js +1096 -0
- package/dist/react/theme/ThemeProvider.js.map +1 -0
- package/dist/react/theme/astro-tokens.d.ts +153 -0
- package/dist/react/theme/cardAccent.d.ts +75 -0
- package/dist/react/theme/cardAccent.js +137 -0
- package/dist/react/theme/cardAccent.js.map +1 -0
- package/dist/react/theme/config.d.ts +39 -0
- package/dist/react/theme/index.d.ts +9 -0
- package/dist/react/types.d.ts +360 -0
- package/dist/react/types.js +58 -0
- package/dist/react/types.js.map +1 -0
- package/dist/react/utils/index.d.ts +247 -0
- package/dist/react/utils/index.js +423 -0
- package/dist/react/utils/index.js.map +1 -0
- package/dist/react/visualizations/EclipseTimerCard.d.ts +17 -0
- package/dist/react/visualizations/EclipseTimerCard.js +250 -0
- package/dist/react/visualizations/EclipseTimerCard.js.map +1 -0
- package/dist/react/visualizations/LinkBudgetCard.d.ts +50 -0
- package/dist/react/visualizations/LinkBudgetCard.js +444 -0
- package/dist/react/visualizations/LinkBudgetCard.js.map +1 -0
- package/dist/react/visualizations/NavBallCard.d.ts +17 -0
- package/dist/react/visualizations/NavBallCard.js +243 -0
- package/dist/react/visualizations/NavBallCard.js.map +1 -0
- package/dist/react/visualizations/PropulsionCard.d.ts +37 -0
- package/dist/react/visualizations/PropulsionCard.js +298 -0
- package/dist/react/visualizations/PropulsionCard.js.map +1 -0
- package/dist/react/visualizations/SensorFootprintCard.d.ts +33 -0
- package/dist/react/visualizations/SensorFootprintCard.js +326 -0
- package/dist/react/visualizations/SensorFootprintCard.js.map +1 -0
- package/dist/react/visualizations/ThermalHeatmapCard.d.ts +38 -0
- package/dist/react/visualizations/ThermalHeatmapCard.js +372 -0
- package/dist/react/visualizations/ThermalHeatmapCard.js.map +1 -0
- package/dist/react/visualizations/index.d.ts +17 -0
- package/dist/react.d.ts +1 -0
- package/dist/react.js +421 -0
- package/dist/react.js.map +1 -0
- package/dist/shaders/atmosphere.frag.js +5 -0
- package/dist/shaders/atmosphere.frag.js.map +1 -0
- package/dist/shaders/atmosphere.vert.js +5 -0
- package/dist/shaders/atmosphere.vert.js.map +1 -0
- package/dist/shaders/stars.frag.js +5 -0
- package/dist/shaders/stars.frag.js.map +1 -0
- package/dist/shaders/stars.vert.js +5 -0
- package/dist/shaders/stars.vert.js.map +1 -0
- package/dist/style.css +143 -0
- package/dist/tokens/index.d.ts +296 -0
- package/dist/tokens/index.js +263 -0
- package/dist/tokens/index.js.map +1 -0
- package/dist/tokens/tokens.css +155 -0
- package/dist/types/index.d.ts +23 -0
- package/dist/types.d.ts +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +220 -0
- package/sdk-stub.js +22 -0
|
@@ -0,0 +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 // 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":"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"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Power Overview Chart - Combined Timeline Visualization
|
|
3
|
+
*
|
|
4
|
+
* Award-winning UX combining:
|
|
5
|
+
* - Power generation timeline
|
|
6
|
+
* - State regions (Running, Safe, Shutdown)
|
|
7
|
+
* - Mode indicators (Inertial, Sun, Nadir, Velocity, Ground)
|
|
8
|
+
* - Eclipse periods
|
|
9
|
+
* - Event markers with dots on timeline
|
|
10
|
+
* - Interactive tooltips
|
|
11
|
+
* - Status indicators
|
|
12
|
+
*
|
|
13
|
+
* @module @zendir/ui/charts/PowerOverviewChart
|
|
14
|
+
*/
|
|
15
|
+
export type PowerState = 'running' | 'safe' | 'shutdown';
|
|
16
|
+
export type OperationalMode = 'none' | 'inertial' | 'sun' | 'nadir' | 'velocity' | 'ground';
|
|
17
|
+
export type EventType = 'scenario' | 'operator' | 'spacecraft' | 'ground';
|
|
18
|
+
export interface PowerTimelinePoint {
|
|
19
|
+
/** Timestamp (Unix ms or Date) */
|
|
20
|
+
time: number | Date;
|
|
21
|
+
/** Power generated (W) */
|
|
22
|
+
power: number;
|
|
23
|
+
/** Battery percentage (0-100) */
|
|
24
|
+
battery?: number;
|
|
25
|
+
/** System state */
|
|
26
|
+
state: PowerState;
|
|
27
|
+
/** Operational mode */
|
|
28
|
+
mode: OperationalMode;
|
|
29
|
+
/** Eclipse flag */
|
|
30
|
+
eclipse?: boolean;
|
|
31
|
+
}
|
|
32
|
+
export interface PowerEvent {
|
|
33
|
+
/** Event timestamp */
|
|
34
|
+
time: number | Date;
|
|
35
|
+
/** Event type */
|
|
36
|
+
type: EventType;
|
|
37
|
+
/** Event label */
|
|
38
|
+
label: string;
|
|
39
|
+
/** Optional metadata */
|
|
40
|
+
meta?: Record<string, unknown>;
|
|
41
|
+
}
|
|
42
|
+
export interface PowerOverviewChartProps {
|
|
43
|
+
/** Timeline data points */
|
|
44
|
+
data: PowerTimelinePoint[];
|
|
45
|
+
/** Event markers */
|
|
46
|
+
events?: PowerEvent[];
|
|
47
|
+
/** Chart title */
|
|
48
|
+
title?: string;
|
|
49
|
+
/** Chart height */
|
|
50
|
+
height?: number | string;
|
|
51
|
+
/** Show battery as secondary series */
|
|
52
|
+
showBattery?: boolean;
|
|
53
|
+
/** Show legend */
|
|
54
|
+
showLegend?: boolean;
|
|
55
|
+
/** Enable export */
|
|
56
|
+
enableExport?: boolean;
|
|
57
|
+
/** Custom class name */
|
|
58
|
+
className?: string;
|
|
59
|
+
/** Compact mode */
|
|
60
|
+
compact?: boolean;
|
|
61
|
+
/** Show event dots on timeline */
|
|
62
|
+
showEventDots?: boolean;
|
|
63
|
+
/** Show status indicator */
|
|
64
|
+
showStatus?: boolean;
|
|
65
|
+
/** Enable zoom controls */
|
|
66
|
+
enableZoom?: boolean;
|
|
67
|
+
}
|
|
68
|
+
export declare function PowerOverviewChart(props: PowerOverviewChartProps): import("react/jsx-runtime").JSX.Element;
|
|
69
|
+
export declare function generateSamplePowerData(durationSeconds?: number): {
|
|
70
|
+
data: PowerTimelinePoint[];
|
|
71
|
+
events: PowerEvent[];
|
|
72
|
+
};
|
|
73
|
+
export default PowerOverviewChart;
|