@zendir/ui 0.1.13 → 0.1.14

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.
@@ -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 // 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":"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"}
@@ -76,22 +76,22 @@ export declare const ASTRO_DATA_VIZ_COLORS: {
76
76
  *
77
77
  * NOTE: Status colors (green, yellow, red) reserved for status indication only
78
78
  */
79
- mixed: ("#3E3CFF" | "#9D70FF" | "#1B2DA0" | "#6B69FF" | "#B48DFF" | "#3548C0" | "#C9A8FF" | "#9997FF" | "#3230CC" | "#7E5ACC" | "#4A5FD6")[];
79
+ mixed: ("#3E3CFF" | "#9D70FF" | "#1B2DA0" | "#6B69FF" | "#B48DFF" | "#9997FF" | "#3230CC" | "#C9A8FF" | "#7E5ACC" | "#4A5FD6" | "#3548C0")[];
80
80
  /**
81
81
  * Zendir Brand palette - Full brand spectrum
82
82
  * Complete set of Zendir brand colors for maximum brand expression
83
83
  */
84
- zendir: ("#3E3CFF" | "#9D70FF" | "#1B2DA0" | "#6B69FF" | "#B48DFF" | "#3548C0" | "#C9A8FF" | "#9997FF")[];
84
+ zendir: ("#3E3CFF" | "#9D70FF" | "#1B2DA0" | "#6B69FF" | "#B48DFF" | "#9997FF" | "#C9A8FF" | "#3548C0")[];
85
85
  /**
86
86
  * Extended Zendir palette - All shades for complex visualizations
87
87
  * Includes dark and light variants for maximum differentiation
88
88
  */
89
- zendirExtended: ("#3E3CFF" | "#9D70FF" | "#1B2DA0" | "#6B69FF" | "#B48DFF" | "#3548C0" | "#C9A8FF" | "#9997FF" | "#3230CC" | "#7E5ACC" | "#142380")[];
89
+ zendirExtended: ("#3E3CFF" | "#9D70FF" | "#1B2DA0" | "#6B69FF" | "#B48DFF" | "#9997FF" | "#3230CC" | "#C9A8FF" | "#7E5ACC" | "#3548C0" | "#142380")[];
90
90
  /**
91
91
  * Cool palette - Blues and purples
92
92
  * Professional Zendir-branded cool tones
93
93
  */
94
- cool: ("#3E3CFF" | "#9D70FF" | "#1B2DA0" | "#6B69FF" | "#B48DFF" | "#3548C0" | "#9997FF" | "#4A5FD6")[];
94
+ cool: ("#3E3CFF" | "#9D70FF" | "#1B2DA0" | "#6B69FF" | "#B48DFF" | "#9997FF" | "#4A5FD6" | "#3548C0")[];
95
95
  /**
96
96
  * Warm accent palette - For charts needing warm tones
97
97
  * Use sparingly - not part of Zendir brand
@@ -106,7 +106,7 @@ export declare const ASTRO_DATA_VIZ_COLORS: {
106
106
  * Prussian-Electric gradient palette
107
107
  * Deep to vibrant brand progression
108
108
  */
109
- prussianElectric: ("#3E3CFF" | "#1B2DA0" | "#6B69FF" | "#3548C0" | "#3230CC" | "#142380")[];
109
+ prussianElectric: ("#3E3CFF" | "#1B2DA0" | "#6B69FF" | "#3230CC" | "#3548C0" | "#142380")[];
110
110
  /**
111
111
  * Full Zendir spectrum gradient
112
112
  * Prussian Blue → Electric → Purple
@@ -384,7 +384,7 @@ export declare function getStatusColor(value: number, thresholds: {
384
384
  * const brandColor = getSeriesColor(0, ASTRO_DATA_VIZ_COLORS.zendir);
385
385
  * ```
386
386
  */
387
- export declare function getSeriesColor(index: number, palette?: ("#3E3CFF" | "#9D70FF" | "#1B2DA0" | "#6B69FF" | "#B48DFF" | "#3548C0" | "#C9A8FF" | "#9997FF" | "#3230CC" | "#7E5ACC" | "#4A5FD6")[]): string;
387
+ export declare function getSeriesColor(index: number, palette?: ("#3E3CFF" | "#9D70FF" | "#1B2DA0" | "#6B69FF" | "#B48DFF" | "#9997FF" | "#3230CC" | "#C9A8FF" | "#7E5ACC" | "#4A5FD6" | "#3548C0")[]): string;
388
388
  /**
389
389
  * Get Zendir brand color by role
390
390
  * Use for consistent branding across the application
@@ -0,0 +1,338 @@
1
+ const ZENDIR_BRAND_COLORS = {
2
+ // === Core Brand Colors ===
3
+ /** Electric - Primary accent (#3E3CFF) */
4
+ electric: "#3E3CFF",
5
+ /** Purple - Secondary accent (#9D70FF) */
6
+ purple: "#9D70FF",
7
+ /** Prussian Blue - Subsections (#1B2DA0) */
8
+ prussianBlue: "#1B2DA0",
9
+ // === Electric Shades (10%, 20%, 35% overlays) ===
10
+ electricLighter: "#9997FF",
11
+ // 35% white overlay
12
+ electricLight: "#6B69FF",
13
+ // 10% black overlay
14
+ electricDarker: "#3230CC",
15
+ // 35% black overlay
16
+ // === Purple Shades ===
17
+ purpleLighter: "#C9A8FF",
18
+ // 35% white overlay
19
+ purpleLight: "#B48DFF",
20
+ // 10% black overlay
21
+ purpleDarker: "#7E5ACC",
22
+ // 35% black overlay
23
+ // === Prussian Blue Shades ===
24
+ prussianBlueLighter: "#4A5FD6",
25
+ // 35% white overlay
26
+ prussianBlueLight: "#3548C0"
27
+ };
28
+ const OFFICIAL_ASTRO_DATA_VIZ_COLORS = {
29
+ /** Extended palette - primary + additional derived colors for 11 max */
30
+ extended: [
31
+ "#00c7cb",
32
+ // Teal 500 - Primary
33
+ "#938bdb",
34
+ // Purple 400 - Secondary
35
+ "#4dacff",
36
+ // Brightblue 500
37
+ "#70dde0",
38
+ // Teal 300
39
+ "#c9c5ed",
40
+ // Purple 200
41
+ "#92cbff",
42
+ // Brightblue 400
43
+ "#a1e9eb",
44
+ // Teal 200
45
+ "#b7dcff",
46
+ // Brightblue 300
47
+ "#009a9d",
48
+ // Teal 600 (darker)
49
+ "#756bb8",
50
+ // Purple 500 (darker)
51
+ "#2b659b"
52
+ // Brightblue 700 (darker)
53
+ ],
54
+ /** Sequential palettes for heatmaps using AstroUXDS colors */
55
+ sequential: {
56
+ /** Teal sequential */
57
+ teal: ["#e5f9f9", "#a1e9eb", "#70dde0", "#00c7cb", "#009a9d", "#006e70"]
58
+ }
59
+ };
60
+ const ASTRO_DATA_VIZ_COLORS = {
61
+ /**
62
+ * Primary data visualization palette - Pure Zendir Brand
63
+ * Uses only Zendir brand colors and their derived shades
64
+ * Max 11 colors per AstroUXDS compliance requirement 3.2.1
65
+ *
66
+ * NOTE: Status colors (green, yellow, red) reserved for status indication only
67
+ */
68
+ mixed: [
69
+ ZENDIR_BRAND_COLORS.electric,
70
+ // #3E3CFF - Primary
71
+ ZENDIR_BRAND_COLORS.purple,
72
+ // #9D70FF - Secondary
73
+ ZENDIR_BRAND_COLORS.electricLight,
74
+ // #6B69FF - Electric 20% lighter
75
+ ZENDIR_BRAND_COLORS.purpleLight,
76
+ // #B48DFF - Purple 20% lighter
77
+ ZENDIR_BRAND_COLORS.prussianBlueLight,
78
+ // #3548C0 - Prussian Blue lighter
79
+ ZENDIR_BRAND_COLORS.electricLighter,
80
+ // #9997FF - Electric 35% lighter
81
+ ZENDIR_BRAND_COLORS.purpleLighter,
82
+ // #C9A8FF - Purple 35% lighter
83
+ ZENDIR_BRAND_COLORS.prussianBlue,
84
+ // #1B2DA0 - Prussian Blue
85
+ ZENDIR_BRAND_COLORS.electricDarker,
86
+ // #3230CC - Electric 20% darker
87
+ ZENDIR_BRAND_COLORS.purpleDarker,
88
+ // #7E5ACC - Purple 20% darker
89
+ ZENDIR_BRAND_COLORS.prussianBlueLighter
90
+ // #4A5FD6 - Prussian Blue lightest
91
+ ],
92
+ /**
93
+ * Sequential palettes for heatmaps and gradual data
94
+ * Zendir brand-forward gradients
95
+ */
96
+ sequential: {
97
+ /** Zendir Electric sequential - Primary brand gradient */
98
+ electric: ["#E8E8FF", "#C9C8FF", "#9997FF", "#6B69FF", "#3E3CFF", "#3230CC", "#262499"]
99
+ }
100
+ };
101
+ function createAstroEChartsTheme(tokens, mode, themeVariant) {
102
+ const isDark = mode === "dark";
103
+ const isAstroTheme = themeVariant === "astro";
104
+ const dataVizColors = isAstroTheme ? [...OFFICIAL_ASTRO_DATA_VIZ_COLORS.extended] : ASTRO_DATA_VIZ_COLORS.mixed;
105
+ return {
106
+ // Data visualization color palette
107
+ // - 'astro' theme: Official AstroUXDS colors (teal, purple, brightblue)
108
+ // - Other themes: Zendir brand colors (electric, purple, prussian blue)
109
+ color: dataVizColors,
110
+ // Background
111
+ backgroundColor: "transparent",
112
+ // Global text style - 14pt minimum per AstroUXDS; no white border on labels
113
+ textStyle: {
114
+ color: tokens.colors.text.primary,
115
+ fontFamily: tokens.typography.fontFamily.primary,
116
+ fontSize: 14,
117
+ // AstroUXD minimum requirement
118
+ textBorderWidth: 0,
119
+ textBorderColor: "transparent"
120
+ },
121
+ // Title - Grey for readability, AstroUXDS compliant
122
+ title: {
123
+ textStyle: {
124
+ color: tokens.colors.text.secondary,
125
+ // Grey for headings
126
+ fontSize: 14,
127
+ fontWeight: "bold",
128
+ textBorderWidth: 0,
129
+ textBorderColor: "transparent"
130
+ },
131
+ subtextStyle: {
132
+ color: tokens.colors.text.tertiary,
133
+ fontSize: 12,
134
+ textBorderWidth: 0,
135
+ textBorderColor: "transparent"
136
+ }
137
+ },
138
+ // Legend
139
+ legend: {
140
+ textStyle: {
141
+ color: tokens.colors.text.secondary,
142
+ fontSize: 12,
143
+ textBorderWidth: 0,
144
+ textBorderColor: "transparent"
145
+ },
146
+ inactiveColor: tokens.colors.text.tertiary
147
+ },
148
+ // Tooltip
149
+ tooltip: {
150
+ backgroundColor: isDark ? "rgba(27, 45, 62, 0.95)" : "rgba(255, 255, 255, 0.95)",
151
+ borderColor: tokens.colors.border.default,
152
+ borderWidth: 1,
153
+ textStyle: {
154
+ color: tokens.colors.text.primary,
155
+ fontSize: 12,
156
+ textBorderWidth: 0,
157
+ textBorderColor: "transparent"
158
+ },
159
+ extraCssText: `
160
+ border-radius: ${tokens.borderRadius.md};
161
+ box-shadow: ${tokens.shadows.lg};
162
+ backdrop-filter: blur(8px);
163
+ `
164
+ },
165
+ // Axis pointer / crosshair - Subtle grey for clarity
166
+ axisPointer: {
167
+ lineStyle: {
168
+ color: tokens.colors.text.tertiary,
169
+ // Subtle grey
170
+ width: 1
171
+ },
172
+ crossStyle: {
173
+ color: tokens.colors.text.tertiary,
174
+ // Subtle grey
175
+ width: 1
176
+ }
177
+ },
178
+ // X Axis
179
+ xAxis: {
180
+ axisLine: {
181
+ lineStyle: {
182
+ color: tokens.colors.border.default
183
+ }
184
+ },
185
+ axisTick: {
186
+ lineStyle: {
187
+ color: tokens.colors.border.muted
188
+ }
189
+ },
190
+ axisLabel: {
191
+ color: tokens.colors.text.secondary,
192
+ fontSize: 12,
193
+ fontFamily: tokens.typography.fontFamily.mono,
194
+ // Tabular numbers
195
+ textBorderWidth: 0,
196
+ textBorderColor: "transparent"
197
+ },
198
+ splitLine: {
199
+ lineStyle: {
200
+ color: tokens.colors.border.muted,
201
+ type: "dashed"
202
+ }
203
+ },
204
+ nameTextStyle: {
205
+ color: tokens.colors.text.secondary,
206
+ fontSize: 12,
207
+ textBorderWidth: 0,
208
+ textBorderColor: "transparent"
209
+ }
210
+ },
211
+ // Y Axis
212
+ yAxis: {
213
+ axisLine: {
214
+ lineStyle: {
215
+ color: tokens.colors.border.default
216
+ }
217
+ },
218
+ axisTick: {
219
+ lineStyle: {
220
+ color: tokens.colors.border.muted
221
+ }
222
+ },
223
+ axisLabel: {
224
+ color: tokens.colors.text.secondary,
225
+ fontSize: 12,
226
+ fontFamily: tokens.typography.fontFamily.mono,
227
+ // Tabular numbers
228
+ textBorderWidth: 0,
229
+ textBorderColor: "transparent"
230
+ },
231
+ splitLine: {
232
+ lineStyle: {
233
+ color: tokens.colors.border.muted,
234
+ type: "dashed"
235
+ }
236
+ },
237
+ nameTextStyle: {
238
+ color: tokens.colors.text.secondary,
239
+ fontSize: 12,
240
+ textBorderWidth: 0,
241
+ textBorderColor: "transparent"
242
+ }
243
+ },
244
+ // Series defaults
245
+ series: {
246
+ line: {
247
+ lineStyle: {
248
+ width: 2
249
+ },
250
+ symbolSize: 6
251
+ },
252
+ bar: {
253
+ barMaxWidth: 40,
254
+ itemStyle: {
255
+ borderRadius: [4, 4, 0, 0]
256
+ }
257
+ },
258
+ pie: {
259
+ itemStyle: {
260
+ borderColor: tokens.colors.background.surface,
261
+ borderWidth: 2
262
+ },
263
+ label: {
264
+ color: tokens.colors.text.primary,
265
+ textBorderWidth: 0,
266
+ textBorderColor: "transparent",
267
+ fontSize: 12
268
+ }
269
+ },
270
+ scatter: {
271
+ symbolSize: 10
272
+ },
273
+ gauge: {
274
+ axisLine: {
275
+ lineStyle: {
276
+ width: 10
277
+ }
278
+ }
279
+ }
280
+ },
281
+ // Data zoom - Theme-aware interactive controls
282
+ dataZoom: {
283
+ backgroundColor: isDark ? "rgba(27, 45, 62, 0.5)" : "rgba(234, 238, 244, 0.5)",
284
+ borderColor: tokens.colors.border.muted,
285
+ // Astro theme uses brightblue, others use Zendir Electric
286
+ fillerColor: isAstroTheme ? "rgba(77, 172, 255, 0.15)" : "rgba(62, 60, 255, 0.15)",
287
+ // Zendir Electric
288
+ handleColor: isAstroTheme ? "#4dacff" : ZENDIR_BRAND_COLORS.electric,
289
+ // Zendir Electric
290
+ textStyle: {
291
+ color: tokens.colors.text.secondary,
292
+ textBorderWidth: 0,
293
+ textBorderColor: "transparent"
294
+ }
295
+ },
296
+ // Visual map (for heatmaps) - Theme-aware sequential palette
297
+ visualMap: {
298
+ textStyle: {
299
+ color: tokens.colors.text.secondary,
300
+ textBorderWidth: 0,
301
+ textBorderColor: "transparent"
302
+ },
303
+ inRange: {
304
+ // Astro theme uses official teal gradient, others use Zendir Electric
305
+ color: isAstroTheme ? [...OFFICIAL_ASTRO_DATA_VIZ_COLORS.sequential.teal] : ASTRO_DATA_VIZ_COLORS.sequential.electric
306
+ }
307
+ },
308
+ // Grid
309
+ grid: {
310
+ borderColor: tokens.colors.border.muted
311
+ }
312
+ };
313
+ }
314
+ function getSeriesColor(index, palette = ASTRO_DATA_VIZ_COLORS.mixed) {
315
+ return palette[index % palette.length];
316
+ }
317
+ function createAreaGradient(color, direction = "vertical") {
318
+ return {
319
+ type: "linear",
320
+ x: 0,
321
+ y: direction === "vertical" ? 0 : 0,
322
+ x2: direction === "horizontal" ? 1 : 0,
323
+ y2: direction === "vertical" ? 1 : 0,
324
+ colorStops: [
325
+ { offset: 0, color: `${color}40` },
326
+ { offset: 1, color: `${color}05` }
327
+ ]
328
+ };
329
+ }
330
+ export {
331
+ ASTRO_DATA_VIZ_COLORS,
332
+ OFFICIAL_ASTRO_DATA_VIZ_COLORS,
333
+ ZENDIR_BRAND_COLORS,
334
+ createAreaGradient,
335
+ createAstroEChartsTheme,
336
+ getSeriesColor
337
+ };
338
+ //# sourceMappingURL=theme.js.map