@zendir/ui 0.6.0 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. package/CHANGELOG.md +419 -406
  2. package/dist/react/3d/CesiumCaptureSource.js.map +1 -1
  3. package/dist/react/3d/ZenSpace3D.js.map +1 -1
  4. package/dist/react/3d/ZenSpace3DCesium.js.map +1 -1
  5. package/dist/react/3d/ZenSpace3DShaders.js.map +1 -1
  6. package/dist/react/3d/ZenSpace3DUtils.js.map +1 -1
  7. package/dist/react/3d/capturePngAnalysis.js.map +1 -1
  8. package/dist/react/3d/threeLoader.js.map +1 -1
  9. package/dist/react/astro/ClassificationBanner.js.map +1 -1
  10. package/dist/react/astro/GlobalStatusBar.js.map +1 -1
  11. package/dist/react/astro/MissionClock.js.map +1 -1
  12. package/dist/react/astro/MonitoringIcon.js.map +1 -1
  13. package/dist/react/astro/Notification.js.map +1 -1
  14. package/dist/react/astro/Progress.js.map +1 -1
  15. package/dist/react/astro/SimulationControls.js.map +1 -1
  16. package/dist/react/astro/StatusIndicator.js.map +1 -1
  17. package/dist/react/astro/UnifiedTimeline.js.map +1 -1
  18. package/dist/react/cards/AccessCard.js.map +1 -1
  19. package/dist/react/cards/OrbitCard.js.map +1 -1
  20. package/dist/react/cards/SpacecraftCard.js.map +1 -1
  21. package/dist/react/cards/TelemetryCard.js.map +1 -1
  22. package/dist/react/cards/TelemetryStreamCard.js.map +1 -1
  23. package/dist/react/charts/GroundTrackMap.js.map +1 -1
  24. package/dist/react/charts/GroundTrackMapLeaflet.js.map +1 -1
  25. package/dist/react/charts/groundTrackMapLeafletTiles.js.map +1 -1
  26. package/dist/react/charts/groundTrackMapLeafletUtils.js.map +1 -1
  27. package/dist/react/charts/unified/AstroChart.js.map +1 -1
  28. package/dist/react/charts/unified/PowerOverviewChart.js.map +1 -1
  29. package/dist/react/charts/unified/domain.js.map +1 -1
  30. package/dist/react/charts/unified/generators.js.map +1 -1
  31. package/dist/react/charts/unified/presets.js.map +1 -1
  32. package/dist/react/charts/unified/sync.js.map +1 -1
  33. package/dist/react/charts/unified/theme.js.map +1 -1
  34. package/dist/react/charts/unified/useChartStream.js.map +1 -1
  35. package/dist/react/chatgpt/index.js.map +1 -1
  36. package/dist/react/context/CategoryContext.js.map +1 -1
  37. package/dist/react/context/DisplaySettingsContext.js.map +1 -1
  38. package/dist/react/context/SpatialSelectionContext.js.map +1 -1
  39. package/dist/react/core/data/DataTable.js.map +1 -1
  40. package/dist/react/core/data/DataValue.js.map +1 -1
  41. package/dist/react/core/data/propertyConfig.js.map +1 -1
  42. package/dist/react/core/display/AstroIcon.js.map +1 -1
  43. package/dist/react/core/display/Badge.js.map +1 -1
  44. package/dist/react/core/display/CardHeader.js.map +1 -1
  45. package/dist/react/core/display/Container.js.map +1 -1
  46. package/dist/react/core/display/CopyButton.js.map +1 -1
  47. package/dist/react/core/display/GlassCard.js.map +1 -1
  48. package/dist/react/core/display/HeaderIconWithStatus.js.map +1 -1
  49. package/dist/react/core/display/Icon.js.map +1 -1
  50. package/dist/react/core/display/Typography.js.map +1 -1
  51. package/dist/react/core/feedback/ConfirmDialog.js.map +1 -1
  52. package/dist/react/core/feedback/Dialog.js.map +1 -1
  53. package/dist/react/core/feedback/Toast.js.map +1 -1
  54. package/dist/react/core/inputs/Button.js.map +1 -1
  55. package/dist/react/core/inputs/Checkbox.js.map +1 -1
  56. package/dist/react/core/inputs/Input.js.map +1 -1
  57. package/dist/react/core/inputs/LimitsBar.js.map +1 -1
  58. package/dist/react/core/inputs/NumberInput.js.map +1 -1
  59. package/dist/react/core/inputs/PinInput.js.map +1 -1
  60. package/dist/react/core/inputs/Select.js.map +1 -1
  61. package/dist/react/core/inputs/Toggle.js.map +1 -1
  62. package/dist/react/core/layout/Box.js.map +1 -1
  63. package/dist/react/core/layout/Center.js.map +1 -1
  64. package/dist/react/core/layout/Divider.js.map +1 -1
  65. package/dist/react/core/layout/Flex.js.map +1 -1
  66. package/dist/react/core/layout/Grid.js.map +1 -1
  67. package/dist/react/core/layout/Spacer.js.map +1 -1
  68. package/dist/react/core/layout/Stack.js.map +1 -1
  69. package/dist/react/core/layout/responsive.js.map +1 -1
  70. package/dist/react/core/layout/useBreakpoint.js.map +1 -1
  71. package/dist/react/core/navigation/AppBar.js.map +1 -1
  72. package/dist/react/core/navigation/Pagination.js.map +1 -1
  73. package/dist/react/core/navigation/SideNav.js.map +1 -1
  74. package/dist/react/core/navigation/Tabs.js.map +1 -1
  75. package/dist/react/core/overlays/Popover.js.map +1 -1
  76. package/dist/react/core/overlays/SidePanel.js.map +1 -1
  77. package/dist/react/core/overlays/Tooltip.js.map +1 -1
  78. package/dist/react/core/widgets/ActivityPlanner.js.map +1 -1
  79. package/dist/react/core/widgets/Capture.js.map +1 -1
  80. package/dist/react/core/widgets/ChatPanel.js.map +1 -1
  81. package/dist/react/core/widgets/ColorPickerPanel.js.map +1 -1
  82. package/dist/react/core/widgets/CommandBuilder.js.map +1 -1
  83. package/dist/react/core/widgets/ConnectionForm.js.map +1 -1
  84. package/dist/react/core/widgets/FileExplorer.js.map +1 -1
  85. package/dist/react/core/widgets/HexViewer.js.map +1 -1
  86. package/dist/react/core/widgets/ImageFrame.js.map +1 -1
  87. package/dist/react/core/widgets/ImageGallery.js.map +1 -1
  88. package/dist/react/core/widgets/ImagePanel.js.map +1 -1
  89. package/dist/react/core/widgets/LogViewer.js.map +1 -1
  90. package/dist/react/core/widgets/MessageStream.js.map +1 -1
  91. package/dist/react/core/widgets/MissionCalendar.js.map +1 -1
  92. package/dist/react/core/widgets/PacketViewer.js.map +1 -1
  93. package/dist/react/hooks/useCompactMode.js.map +1 -1
  94. package/dist/react/hooks/useSimulationScene.js.map +1 -1
  95. package/dist/react/panels/LayerControlPanel.js.map +1 -1
  96. package/dist/react/panels/ObjectInventoryPanel.js.map +1 -1
  97. package/dist/react/shared/ErrorBoundary.js.map +1 -1
  98. package/dist/react/shared/Skeleton.js.map +1 -1
  99. package/dist/react/theme/ThemeProvider.js +2 -1
  100. package/dist/react/theme/ThemeProvider.js.map +1 -1
  101. package/dist/react/theme/cardAccent.js.map +1 -1
  102. package/dist/react/theme/config.js.map +1 -1
  103. package/dist/react/theme/types.js.map +1 -1
  104. package/dist/react/types.js.map +1 -1
  105. package/dist/react/utils/categoryPalette.js.map +1 -1
  106. package/dist/react/utils/index.js.map +1 -1
  107. package/dist/style.css +216 -216
  108. package/dist/tokens/core.js.map +1 -1
  109. package/dist/tokens/index.js.map +1 -1
  110. package/dist/tokens/palettes/astro.js.map +1 -1
  111. package/dist/tokens/palettes/index.js.map +1 -1
  112. package/dist/tokens/palettes/tailwind.js.map +1 -1
  113. package/dist/tokens/palettes/zendir.js.map +1 -1
  114. package/dist/tokens/themes.js.map +1 -1
  115. package/dist/tokens/tokens.css +533 -533
  116. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"PowerOverviewChart.js","names":[],"sources":["../../../../src/react/charts/unified/PowerOverviewChart.tsx"],"sourcesContent":["/**\n * Power Overview Chart - Combined Timeline Visualization\n *\n * Award-winning UX combining:\n * - Power generation timeline\n * - State regions (Running, Safe, Shutdown)\n * - Mode indicators (Inertial, Sun, Nadir, Velocity, Ground)\n * - Eclipse periods\n * - Event markers with dots on timeline\n * - Interactive tooltips\n * - Status indicators\n *\n * @module @zendir/ui/charts/PowerOverviewChart\n */\n\nimport React, { useMemo } from \"react\";\nimport { AstroChart } from \"./AstroChart\";\nimport type { AstroChartProps, ChartStatus } from \"./types\";\nimport { useTheme } from \"../../theme\";\n\n// =============================================================================\n// Status Shape SVGs - Astro UX compliant (color + shape for accessibility)\n// =============================================================================\n\nconst STATUS_BORDER_COLORS: Record<ChartStatus, string> = {\n off: \"#3c3e42\",\n standby: \"#285766\",\n normal: \"#005a00\",\n caution: \"#645600\",\n serious: \"#664618\",\n critical: \"#661102\",\n};\n\ninterface StatusShapeProps {\n status: ChartStatus;\n size: number;\n color: string;\n borderColor?: string;\n glow?: boolean;\n}\n\nconst StatusShape = ({\n status,\n size,\n color,\n borderColor,\n glow = true,\n}: StatusShapeProps): React.ReactElement => {\n const hasBorder = !!borderColor;\n const strokeWidth = hasBorder ? 1 : 0;\n const glowFilter =\n glow && !hasBorder ? `drop-shadow(0 0 4px ${color})` : undefined;\n\n const renderShape = () => {\n switch (status) {\n case \"off\":\n return (\n <circle\n cx=\"6\"\n cy=\"6\"\n r={hasBorder ? 2.5 : 3}\n fill={color}\n stroke={borderColor}\n strokeWidth={strokeWidth}\n />\n );\n case \"standby\":\n return (\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"3.5\"\n fill=\"none\"\n stroke={color}\n strokeWidth=\"2\"\n />\n );\n case \"normal\":\n return (\n <circle\n cx=\"6\"\n cy=\"6\"\n r={hasBorder ? 4.5 : 5}\n fill={color}\n stroke={borderColor}\n strokeWidth={strokeWidth}\n />\n );\n case \"caution\":\n return (\n <rect\n x={hasBorder ? 1.5 : 1}\n y={hasBorder ? 1.5 : 1}\n width={hasBorder ? 9 : 10}\n height={hasBorder ? 9 : 10}\n fill={color}\n stroke={borderColor}\n strokeWidth={strokeWidth}\n />\n );\n case \"serious\":\n return (\n <polygon\n points=\"6,1 11,6 6,11 1,6\"\n fill={color}\n stroke={borderColor}\n strokeWidth={strokeWidth}\n />\n );\n case \"critical\":\n return (\n <polygon\n points=\"6,11 1,2 11,2\"\n fill={color}\n stroke={borderColor}\n strokeWidth={strokeWidth}\n />\n );\n default:\n return null;\n }\n };\n\n return (\n <svg\n viewBox=\"0 0 12 12\"\n width={size}\n height={size}\n style={{ filter: glowFilter }}\n >\n {renderShape()}\n </svg>\n );\n};\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport type PowerState = \"running\" | \"safe\" | \"shutdown\";\nexport type OperationalMode =\n | \"none\"\n | \"inertial\"\n | \"sun\"\n | \"nadir\"\n | \"velocity\"\n | \"ground\";\nexport type EventType = \"scenario\" | \"operator\" | \"spacecraft\" | \"ground\";\n\nexport interface PowerTimelinePoint {\n /** Timestamp (Unix ms or Date) */\n time: number | Date;\n /** Power generated (W) */\n power: number;\n /** Battery percentage (0-100) */\n battery?: number;\n /** System state */\n state: PowerState;\n /** Operational mode */\n mode: OperationalMode;\n /** Eclipse flag */\n eclipse?: boolean;\n}\n\nexport interface PowerEvent {\n /** Event timestamp */\n time: number | Date;\n /** Event type */\n type: EventType;\n /** Event label */\n label: string;\n /** Optional metadata */\n meta?: Record<string, unknown>;\n}\n\nexport interface PowerOverviewChartProps {\n /** Timeline data points */\n data: PowerTimelinePoint[];\n /** Event markers */\n events?: PowerEvent[];\n /** Chart title */\n title?: string;\n /** Chart height */\n height?: number | string;\n /** Show battery as secondary series */\n showBattery?: boolean;\n /** Show legend */\n showLegend?: boolean;\n /** Enable export */\n enableExport?: boolean;\n /** Custom class name */\n className?: string;\n /** Compact mode */\n compact?: boolean;\n /** Show event dots on timeline */\n showEventDots?: boolean;\n /** Show status indicator */\n showStatus?: boolean;\n /** Enable zoom controls */\n enableZoom?: boolean;\n}\n\n// =============================================================================\n// Color Schemes\n// =============================================================================\n\nconst STATE_COLORS: Record<PowerState, string> = {\n running: \"#0d4d4d\", // Deep teal\n safe: \"#8b7355\", // Brown/gold\n shutdown: \"#1a1a1a\", // Near black\n};\n\nconst MODE_COLORS: Record<OperationalMode, string> = {\n none: \"#1a2332\",\n inertial: \"#1e3a5f\",\n sun: \"#8b7355\",\n nadir: \"#2d5a4d\",\n velocity: \"#2e4a7c\",\n ground: \"#4a3d6e\",\n};\n\nconst EVENT_COLORS: Record<EventType, string> = {\n scenario: \"#ffffff\",\n operator: \"#ff6b9d\",\n spacecraft: \"#a78bfa\",\n ground: \"#4ade80\",\n};\n\nconst ECLIPSE_COLOR = \"rgba(10, 10, 15, 0.6)\";\n\n// =============================================================================\n// PowerOverviewChart Component\n// =============================================================================\n\nexport function PowerOverviewChart(props: PowerOverviewChartProps) {\n const {\n data,\n events = [],\n title = \"Power - Power Generated\",\n height = 300,\n showBattery = false,\n showLegend = false,\n enableExport = true,\n className,\n compact = false,\n showEventDots = true,\n showStatus = true,\n enableZoom = true,\n } = props;\n\n const { tokens, mode } = useTheme();\n\n // Calculate current status from latest data\n const currentStatus = useMemo(() => {\n if (!data || data.length === 0) return \"off\";\n const latest = data[data.length - 1];\n if (latest.state === \"shutdown\") return \"critical\";\n if (latest.state === \"safe\") return \"caution\";\n if (latest.eclipse) return \"serious\";\n return \"normal\";\n }, [data]);\n\n const chartConfig = useMemo<AstroChartProps>(() => {\n if (!data || data.length === 0) {\n return {\n type: \"line\",\n series: [],\n height,\n };\n }\n\n // Extract time range\n const times = data.map((d) =>\n typeof d.time === \"number\" ? d.time : d.time.getTime(),\n );\n const minTime = Math.min(...times);\n const maxTime = Math.max(...times);\n\n // Build state regions with proper colors\n const stateRegions: Array<\n [{ xAxis: number; itemStyle?: { color: string } }, { xAxis: number }]\n > = [];\n let currentState = data[0].state;\n let regionStart = minTime;\n\n data.forEach((point, idx) => {\n const pointTime =\n typeof point.time === \"number\" ? point.time : point.time.getTime();\n\n if (point.state !== currentState || idx === data.length - 1) {\n const regionEnd = idx === data.length - 1 ? maxTime : pointTime;\n stateRegions.push([\n {\n xAxis: regionStart,\n itemStyle: { color: STATE_COLORS[currentState] },\n },\n { xAxis: regionEnd },\n ]);\n regionStart = pointTime;\n currentState = point.state;\n }\n });\n\n // Build eclipse regions (overlay on top of state regions)\n const eclipseRegions: Array<\n [{ xAxis: number; itemStyle?: { color: string } }, { xAxis: number }]\n > = [];\n let inEclipse = false;\n let eclipseStart = minTime;\n\n data.forEach((point, _idx) => {\n const pointTime =\n typeof point.time === \"number\" ? point.time : point.time.getTime();\n\n if (point.eclipse && !inEclipse) {\n eclipseStart = pointTime;\n inEclipse = true;\n } else if (!point.eclipse && inEclipse) {\n eclipseRegions.push([\n {\n xAxis: eclipseStart,\n itemStyle: { color: ECLIPSE_COLOR },\n },\n { xAxis: pointTime },\n ]);\n inEclipse = false;\n }\n });\n\n // If still in eclipse at the end\n if (inEclipse) {\n eclipseRegions.push([\n {\n xAxis: eclipseStart,\n itemStyle: { color: ECLIPSE_COLOR },\n },\n { xAxis: maxTime },\n ]);\n }\n\n // Build series\n const series: AstroChartProps[\"series\"] = [\n {\n id: \"power\",\n name: \"Power (W)\",\n data: data.map((d) => ({\n time: typeof d.time === \"number\" ? d.time : d.time.getTime(),\n value: d.power,\n })),\n color: \"#ffffff\",\n lineStyle: { width: 2 },\n areaStyle: { opacity: 0.3, color: \"rgba(255, 255, 255, 0.2)\" },\n smooth: true,\n yAxisIndex: 0,\n },\n ];\n\n if (showBattery) {\n series.push({\n id: \"battery\",\n name: \"Battery %\",\n data: data.map((d) => ({\n time: typeof d.time === \"number\" ? d.time : d.time.getTime(),\n value: d.battery ?? 0,\n })),\n color: \"#4ade80\",\n lineStyle: { width: 2, type: \"dashed\" },\n smooth: true,\n yAxisIndex: 1,\n });\n }\n\n // Event markers - use dots for timeline, diamonds for emphasis\n const maxPower = Math.max(...data.map((d) => d.power), 100);\n\n // Event dots positioned just above the chart area\n const eventDots = showEventDots\n ? events.map((event) => ({\n coord: [\n typeof event.time === \"number\" ? event.time : event.time.getTime(),\n maxPower * 0.95,\n ] as [number, number],\n name: event.label,\n symbol: event.type === \"scenario\" ? \"diamond\" : \"circle\",\n symbolSize: event.type === \"scenario\" ? 10 : 8,\n itemStyle: {\n color: EVENT_COLORS[event.type],\n borderColor: tokens.colors.background.base,\n borderWidth: 2,\n shadowBlur: 4,\n shadowColor: EVENT_COLORS[event.type],\n },\n label: {\n show: false,\n },\n emphasis: {\n scale: true,\n itemStyle: {\n borderWidth: 3,\n shadowBlur: 8,\n },\n label: {\n show: true,\n fontSize: 12,\n color: tokens.colors.text.primary,\n backgroundColor: tokens.colors.background.surface,\n borderColor: EVENT_COLORS[event.type],\n borderWidth: 1,\n padding: [6, 10],\n borderRadius: 6,\n formatter: `{b}`,\n },\n },\n }))\n : [];\n\n // Dual axis config\n const yAxisConfig: AstroChartProps[\"yAxis\"] = showBattery\n ? [\n {\n type: \"value\",\n name: \"Power (W)\",\n position: \"left\",\n min: 0,\n splitLine: { show: true },\n },\n {\n type: \"value\",\n name: \"Battery %\",\n position: \"right\",\n min: 0,\n max: 100,\n splitLine: { show: false },\n },\n ]\n : {\n type: \"value\",\n name: \"Power (W)\",\n min: 0,\n splitLine: { show: true },\n };\n\n return {\n type: \"area\",\n title,\n subtitle: compact\n ? undefined\n : `System states, operational modes, eclipse periods, and events`,\n height,\n series,\n xAxis: {\n type: \"time\",\n showGrid: true,\n splitLine: { show: true },\n },\n yAxis: yAxisConfig,\n tooltip: {\n enabled: true,\n trigger: \"axis\",\n crosshair: \"both\",\n formatter: (params: any) => {\n const param = Array.isArray(params) ? params[0] : params;\n if (!param) return \"\";\n\n const time = new Date(param.data[0]);\n const dataPoint = data.find((d) => {\n const t = typeof d.time === \"number\" ? d.time : d.time.getTime();\n return t === param.data[0];\n });\n\n let html = `<div style=\"font-size: 13px; min-width: 220px; font-family: ${tokens.typography.fontFamily.primary};\">`;\n html += `<div style=\"font-weight: 600; margin-bottom: 10px; color: ${tokens.colors.text.primary}; font-size: 14px;\">${time.toLocaleTimeString()}</div>`;\n\n // Power values\n if (Array.isArray(params)) {\n params.forEach((p: any) => {\n const value = p.data[1];\n const seriesName = p.seriesName;\n const color = p.color;\n html += `<div style=\"display: flex; align-items: center; gap: 8px; margin-bottom: 6px;\">`;\n html += `<span style=\"width: 12px; height: 12px; background: ${color}; border-radius: 3px; box-shadow: 0 0 4px ${color};\"></span>`;\n html += `<span style=\"color: ${tokens.colors.text.secondary};\">${seriesName}: <strong style=\"color: ${tokens.colors.text.primary};\">${value.toFixed(1)}</strong></span>`;\n html += `</div>`;\n });\n } else {\n const value = param.data[1];\n html += `<div style=\"margin-bottom: 6px; color: ${tokens.colors.text.secondary};\">Power: <strong style=\"color: ${tokens.colors.text.primary};\">${value.toFixed(1)} W</strong></div>`;\n }\n\n // System info\n if (dataPoint) {\n html += `<div style=\"margin-top: 10px; padding-top: 10px; border-top: 1px solid ${tokens.colors.border.muted};\">`;\n html += `<div style=\"display: grid; grid-template-columns: auto 1fr; gap: 8px 12px; font-size: 12px;\">`;\n html += `<span style=\"color: ${tokens.colors.text.muted};\">STATE</span>`;\n html += `<span style=\"color: ${STATE_COLORS[dataPoint.state]}; font-weight: 600;\">${dataPoint.state.toUpperCase()}</span>`;\n html += `<span style=\"color: ${tokens.colors.text.muted};\">MODE</span>`;\n html += `<span style=\"color: ${MODE_COLORS[dataPoint.mode]}; font-weight: 600;\">${dataPoint.mode.toUpperCase()}</span>`;\n if (dataPoint.battery !== undefined) {\n html += `<span style=\"color: ${tokens.colors.text.muted};\">BATTERY</span>`;\n html += `<span style=\"color: ${tokens.colors.text.primary}; font-weight: 600;\">${dataPoint.battery.toFixed(1)}%</span>`;\n }\n html += `</div>`;\n if (dataPoint.eclipse) {\n html += `<div style=\"color: ${tokens.colors.status.caution}; font-weight: 600; margin-top: 8px; font-size: 12px; display: flex; align-items: center; gap: 6px;\">`;\n html += `<span style=\"font-weight: 600;\">ECLIPSE</span>`;\n html += `</div>`;\n }\n html += `</div>`;\n }\n\n html += `</div>`;\n return html;\n },\n },\n legend: showLegend\n ? {\n show: true,\n position: \"top\",\n orient: \"horizontal\",\n }\n : { show: false },\n zoom: enableZoom\n ? {\n enabled: true,\n type: \"both\",\n axis: \"x\",\n start: 0,\n end: 100,\n }\n : undefined,\n annotations: {\n markAreas: {\n data: [...stateRegions, ...eclipseRegions],\n itemStyle: {\n opacity: 1,\n },\n },\n markPoints: eventDots,\n },\n export: enableExport\n ? {\n enabled: true,\n formats: [\"png\", \"svg\", \"csv\"],\n getExportFileName: () => `zendir-power-overview-${Date.now()}`,\n }\n : undefined,\n infoTooltip: compact\n ? undefined\n : {\n content: (\n <div style={{ fontSize: \"13px\", lineHeight: \"1.6\" }}>\n <div style={{ marginBottom: \"8px\", fontWeight: 500 }}>\n Interactive Power Timeline\n </div>\n <div style={{ marginBottom: \"4px\" }}>\n • Background colors show system states\n </div>\n <div style={{ marginBottom: \"4px\" }}>\n • Dark overlays indicate eclipse periods\n </div>\n <div style={{ marginBottom: \"4px\" }}>\n • Diamond markers show key events\n </div>\n <div>• Scroll to zoom, drag to pan</div>\n </div>\n ),\n },\n className,\n };\n }, [\n data,\n events,\n title,\n height,\n showBattery,\n showLegend,\n enableExport,\n className,\n compact,\n showEventDots,\n enableZoom,\n tokens,\n ]);\n\n return (\n <div style={{ position: \"relative\", width: \"100%\" }}>\n {showStatus && (\n <div\n style={{\n position: \"absolute\",\n top: 10,\n right: 60,\n zIndex: 10,\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n padding: \"6px 12px\",\n background: tokens.colors.background.surface,\n border: `1px solid ${tokens.colors.border.default}`,\n borderRadius: tokens.borderRadius.md,\n fontSize: tokens.typography.fontSize.xs,\n fontFamily: tokens.typography.fontFamily.primary,\n }}\n >\n <StatusShape\n status={currentStatus}\n size={10}\n color={\n tokens.colors.status[currentStatus] || tokens.colors.status.off\n }\n borderColor={\n mode === \"light\" ? STATUS_BORDER_COLORS[currentStatus] : undefined\n }\n glow={mode !== \"light\"}\n />\n <span\n style={{\n color: tokens.colors.text.primary,\n fontWeight: 500,\n textTransform: \"uppercase\",\n letterSpacing: \"0.5px\",\n }}\n >\n {currentStatus}\n </span>\n </div>\n )}\n <AstroChart {...chartConfig} />\n </div>\n );\n}\n\n// =============================================================================\n// Sample Data Generator\n// =============================================================================\n\nexport function generateSamplePowerData(durationSeconds = 3600): {\n data: PowerTimelinePoint[];\n events: PowerEvent[];\n} {\n const dataPoints: PowerTimelinePoint[] = [];\n const eventList: PowerEvent[] = [];\n\n const startTime = Date.now();\n const interval = 10;\n\n let currentState: PowerState = \"running\";\n let currentMode: OperationalMode = \"inertial\";\n let inEclipse = false;\n\n for (let i = 0; i <= durationSeconds; i += interval) {\n const time = startTime + i * 1000;\n\n // State transitions\n if (i === 300) currentState = \"safe\";\n if (i === 600) currentState = \"running\";\n if (i === 1800) currentState = \"shutdown\";\n if (i === 2100) currentState = \"running\";\n if (i === 2400) currentState = \"safe\";\n if (i === 2700) currentState = \"running\";\n\n // Mode transitions\n if (i === 200) currentMode = \"sun\";\n if (i === 500) currentMode = \"inertial\";\n if (i === 800) currentMode = \"nadir\";\n if (i === 1100) currentMode = \"velocity\";\n if (i === 1400) currentMode = \"ground\";\n if (i === 1700) currentMode = \"sun\";\n if (i === 2000) currentMode = \"inertial\";\n if (i === 2300) currentMode = \"nadir\";\n if (i === 2600) currentMode = \"velocity\";\n if (i === 2900) currentMode = \"ground\";\n if (i === 3200) currentMode = \"sun\";\n\n // Eclipse periods\n if (i >= 1700 && i <= 2100) inEclipse = true;\n else if (i >= 2400 && i <= 2700) inEclipse = true;\n else inEclipse = false;\n\n // Battery\n let battery = 95;\n if (inEclipse) {\n battery = 95 - ((i - 1700) % 400) * 0.1;\n } else if (currentMode === \"sun\") {\n battery = 70 + Math.sin(i * 0.01) * 15;\n } else {\n battery = 90 + Math.sin(i * 0.005) * 5;\n }\n battery = Math.max(10, Math.min(100, battery));\n\n // Power\n let power = 0;\n if (inEclipse) {\n power = 0;\n } else if (currentMode === \"sun\") {\n power = 300 + Math.sin(i * 0.02) * 50;\n } else if (currentMode === \"ground\" || currentMode === \"nadir\") {\n power = 150 + Math.sin(i * 0.03) * 30;\n } else {\n power = 50 + Math.sin(i * 0.01) * 20;\n }\n\n if (currentState === \"safe\") power *= 0.3;\n if (currentState === \"shutdown\") power = 0;\n\n dataPoints.push({\n time,\n power,\n battery,\n state: currentState,\n mode: currentMode,\n eclipse: inEclipse,\n });\n }\n\n // Events\n const eventTimes = [\n 250, 420, 550, 900, 1300, 1650, 1850, 2200, 2500, 2800, 3100, 3400,\n ];\n const eventTypes: EventType[] = [\n \"scenario\",\n \"operator\",\n \"spacecraft\",\n \"ground\",\n ];\n\n eventTimes.forEach((timeOffset, idx) => {\n eventList.push({\n time: startTime + timeOffset * 1000,\n type: eventTypes[idx % eventTypes.length],\n label: `Event ${idx + 1}`,\n });\n });\n\n return { data: dataPoints, events: eventList };\n}\n\nexport default PowerOverviewChart;\n"],"mappings":"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"}
1
+ {"version":3,"file":"PowerOverviewChart.js","names":[],"sources":["../../../../src/react/charts/unified/PowerOverviewChart.tsx"],"sourcesContent":["/**\r\n * Power Overview Chart - Combined Timeline Visualization\r\n *\r\n * Award-winning UX combining:\r\n * - Power generation timeline\r\n * - State regions (Running, Safe, Shutdown)\r\n * - Mode indicators (Inertial, Sun, Nadir, Velocity, Ground)\r\n * - Eclipse periods\r\n * - Event markers with dots on timeline\r\n * - Interactive tooltips\r\n * - Status indicators\r\n *\r\n * @module @zendir/ui/charts/PowerOverviewChart\r\n */\r\n\r\nimport React, { useMemo } from \"react\";\r\nimport { AstroChart } from \"./AstroChart\";\r\nimport type { AstroChartProps, ChartStatus } from \"./types\";\r\nimport { useTheme } from \"../../theme\";\r\n\r\n// =============================================================================\r\n// Status Shape SVGs - Astro UX compliant (color + shape for accessibility)\r\n// =============================================================================\r\n\r\nconst STATUS_BORDER_COLORS: Record<ChartStatus, string> = {\r\n off: \"#3c3e42\",\r\n standby: \"#285766\",\r\n normal: \"#005a00\",\r\n caution: \"#645600\",\r\n serious: \"#664618\",\r\n critical: \"#661102\",\r\n};\r\n\r\ninterface StatusShapeProps {\r\n status: ChartStatus;\r\n size: number;\r\n color: string;\r\n borderColor?: string;\r\n glow?: boolean;\r\n}\r\n\r\nconst StatusShape = ({\r\n status,\r\n size,\r\n color,\r\n borderColor,\r\n glow = true,\r\n}: StatusShapeProps): React.ReactElement => {\r\n const hasBorder = !!borderColor;\r\n const strokeWidth = hasBorder ? 1 : 0;\r\n const glowFilter =\r\n glow && !hasBorder ? `drop-shadow(0 0 4px ${color})` : undefined;\r\n\r\n const renderShape = () => {\r\n switch (status) {\r\n case \"off\":\r\n return (\r\n <circle\r\n cx=\"6\"\r\n cy=\"6\"\r\n r={hasBorder ? 2.5 : 3}\r\n fill={color}\r\n stroke={borderColor}\r\n strokeWidth={strokeWidth}\r\n />\r\n );\r\n case \"standby\":\r\n return (\r\n <circle\r\n cx=\"6\"\r\n cy=\"6\"\r\n r=\"3.5\"\r\n fill=\"none\"\r\n stroke={color}\r\n strokeWidth=\"2\"\r\n />\r\n );\r\n case \"normal\":\r\n return (\r\n <circle\r\n cx=\"6\"\r\n cy=\"6\"\r\n r={hasBorder ? 4.5 : 5}\r\n fill={color}\r\n stroke={borderColor}\r\n strokeWidth={strokeWidth}\r\n />\r\n );\r\n case \"caution\":\r\n return (\r\n <rect\r\n x={hasBorder ? 1.5 : 1}\r\n y={hasBorder ? 1.5 : 1}\r\n width={hasBorder ? 9 : 10}\r\n height={hasBorder ? 9 : 10}\r\n fill={color}\r\n stroke={borderColor}\r\n strokeWidth={strokeWidth}\r\n />\r\n );\r\n case \"serious\":\r\n return (\r\n <polygon\r\n points=\"6,1 11,6 6,11 1,6\"\r\n fill={color}\r\n stroke={borderColor}\r\n strokeWidth={strokeWidth}\r\n />\r\n );\r\n case \"critical\":\r\n return (\r\n <polygon\r\n points=\"6,11 1,2 11,2\"\r\n fill={color}\r\n stroke={borderColor}\r\n strokeWidth={strokeWidth}\r\n />\r\n );\r\n default:\r\n return null;\r\n }\r\n };\r\n\r\n return (\r\n <svg\r\n viewBox=\"0 0 12 12\"\r\n width={size}\r\n height={size}\r\n style={{ filter: glowFilter }}\r\n >\r\n {renderShape()}\r\n </svg>\r\n );\r\n};\r\n\r\n// =============================================================================\r\n// Types\r\n// =============================================================================\r\n\r\nexport type PowerState = \"running\" | \"safe\" | \"shutdown\";\r\nexport type OperationalMode =\r\n | \"none\"\r\n | \"inertial\"\r\n | \"sun\"\r\n | \"nadir\"\r\n | \"velocity\"\r\n | \"ground\";\r\nexport type EventType = \"scenario\" | \"operator\" | \"spacecraft\" | \"ground\";\r\n\r\nexport interface PowerTimelinePoint {\r\n /** Timestamp (Unix ms or Date) */\r\n time: number | Date;\r\n /** Power generated (W) */\r\n power: number;\r\n /** Battery percentage (0-100) */\r\n battery?: number;\r\n /** System state */\r\n state: PowerState;\r\n /** Operational mode */\r\n mode: OperationalMode;\r\n /** Eclipse flag */\r\n eclipse?: boolean;\r\n}\r\n\r\nexport interface PowerEvent {\r\n /** Event timestamp */\r\n time: number | Date;\r\n /** Event type */\r\n type: EventType;\r\n /** Event label */\r\n label: string;\r\n /** Optional metadata */\r\n meta?: Record<string, unknown>;\r\n}\r\n\r\nexport interface PowerOverviewChartProps {\r\n /** Timeline data points */\r\n data: PowerTimelinePoint[];\r\n /** Event markers */\r\n events?: PowerEvent[];\r\n /** Chart title */\r\n title?: string;\r\n /** Chart height */\r\n height?: number | string;\r\n /** Show battery as secondary series */\r\n showBattery?: boolean;\r\n /** Show legend */\r\n showLegend?: boolean;\r\n /** Enable export */\r\n enableExport?: boolean;\r\n /** Custom class name */\r\n className?: string;\r\n /** Compact mode */\r\n compact?: boolean;\r\n /** Show event dots on timeline */\r\n showEventDots?: boolean;\r\n /** Show status indicator */\r\n showStatus?: boolean;\r\n /** Enable zoom controls */\r\n enableZoom?: boolean;\r\n}\r\n\r\n// =============================================================================\r\n// Color Schemes\r\n// =============================================================================\r\n\r\nconst STATE_COLORS: Record<PowerState, string> = {\r\n running: \"#0d4d4d\", // Deep teal\r\n safe: \"#8b7355\", // Brown/gold\r\n shutdown: \"#1a1a1a\", // Near black\r\n};\r\n\r\nconst MODE_COLORS: Record<OperationalMode, string> = {\r\n none: \"#1a2332\",\r\n inertial: \"#1e3a5f\",\r\n sun: \"#8b7355\",\r\n nadir: \"#2d5a4d\",\r\n velocity: \"#2e4a7c\",\r\n ground: \"#4a3d6e\",\r\n};\r\n\r\nconst EVENT_COLORS: Record<EventType, string> = {\r\n scenario: \"#ffffff\",\r\n operator: \"#ff6b9d\",\r\n spacecraft: \"#a78bfa\",\r\n ground: \"#4ade80\",\r\n};\r\n\r\nconst ECLIPSE_COLOR = \"rgba(10, 10, 15, 0.6)\";\r\n\r\n// =============================================================================\r\n// PowerOverviewChart Component\r\n// =============================================================================\r\n\r\nexport function PowerOverviewChart(props: PowerOverviewChartProps) {\r\n const {\r\n data,\r\n events = [],\r\n title = \"Power - Power Generated\",\r\n height = 300,\r\n showBattery = false,\r\n showLegend = false,\r\n enableExport = true,\r\n className,\r\n compact = false,\r\n showEventDots = true,\r\n showStatus = true,\r\n enableZoom = true,\r\n } = props;\r\n\r\n const { tokens, mode } = useTheme();\r\n\r\n // Calculate current status from latest data\r\n const currentStatus = useMemo(() => {\r\n if (!data || data.length === 0) return \"off\";\r\n const latest = data[data.length - 1];\r\n if (latest.state === \"shutdown\") return \"critical\";\r\n if (latest.state === \"safe\") return \"caution\";\r\n if (latest.eclipse) return \"serious\";\r\n return \"normal\";\r\n }, [data]);\r\n\r\n const chartConfig = useMemo<AstroChartProps>(() => {\r\n if (!data || data.length === 0) {\r\n return {\r\n type: \"line\",\r\n series: [],\r\n height,\r\n };\r\n }\r\n\r\n // Extract time range\r\n const times = data.map((d) =>\r\n typeof d.time === \"number\" ? d.time : d.time.getTime(),\r\n );\r\n const minTime = Math.min(...times);\r\n const maxTime = Math.max(...times);\r\n\r\n // Build state regions with proper colors\r\n const stateRegions: Array<\r\n [{ xAxis: number; itemStyle?: { color: string } }, { xAxis: number }]\r\n > = [];\r\n let currentState = data[0].state;\r\n let regionStart = minTime;\r\n\r\n data.forEach((point, idx) => {\r\n const pointTime =\r\n typeof point.time === \"number\" ? point.time : point.time.getTime();\r\n\r\n if (point.state !== currentState || idx === data.length - 1) {\r\n const regionEnd = idx === data.length - 1 ? maxTime : pointTime;\r\n stateRegions.push([\r\n {\r\n xAxis: regionStart,\r\n itemStyle: { color: STATE_COLORS[currentState] },\r\n },\r\n { xAxis: regionEnd },\r\n ]);\r\n regionStart = pointTime;\r\n currentState = point.state;\r\n }\r\n });\r\n\r\n // Build eclipse regions (overlay on top of state regions)\r\n const eclipseRegions: Array<\r\n [{ xAxis: number; itemStyle?: { color: string } }, { xAxis: number }]\r\n > = [];\r\n let inEclipse = false;\r\n let eclipseStart = minTime;\r\n\r\n data.forEach((point, _idx) => {\r\n const pointTime =\r\n typeof point.time === \"number\" ? point.time : point.time.getTime();\r\n\r\n if (point.eclipse && !inEclipse) {\r\n eclipseStart = pointTime;\r\n inEclipse = true;\r\n } else if (!point.eclipse && inEclipse) {\r\n eclipseRegions.push([\r\n {\r\n xAxis: eclipseStart,\r\n itemStyle: { color: ECLIPSE_COLOR },\r\n },\r\n { xAxis: pointTime },\r\n ]);\r\n inEclipse = false;\r\n }\r\n });\r\n\r\n // If still in eclipse at the end\r\n if (inEclipse) {\r\n eclipseRegions.push([\r\n {\r\n xAxis: eclipseStart,\r\n itemStyle: { color: ECLIPSE_COLOR },\r\n },\r\n { xAxis: maxTime },\r\n ]);\r\n }\r\n\r\n // Build series\r\n const series: AstroChartProps[\"series\"] = [\r\n {\r\n id: \"power\",\r\n name: \"Power (W)\",\r\n data: data.map((d) => ({\r\n time: typeof d.time === \"number\" ? d.time : d.time.getTime(),\r\n value: d.power,\r\n })),\r\n color: \"#ffffff\",\r\n lineStyle: { width: 2 },\r\n areaStyle: { opacity: 0.3, color: \"rgba(255, 255, 255, 0.2)\" },\r\n smooth: true,\r\n yAxisIndex: 0,\r\n },\r\n ];\r\n\r\n if (showBattery) {\r\n series.push({\r\n id: \"battery\",\r\n name: \"Battery %\",\r\n data: data.map((d) => ({\r\n time: typeof d.time === \"number\" ? d.time : d.time.getTime(),\r\n value: d.battery ?? 0,\r\n })),\r\n color: \"#4ade80\",\r\n lineStyle: { width: 2, type: \"dashed\" },\r\n smooth: true,\r\n yAxisIndex: 1,\r\n });\r\n }\r\n\r\n // Event markers - use dots for timeline, diamonds for emphasis\r\n const maxPower = Math.max(...data.map((d) => d.power), 100);\r\n\r\n // Event dots positioned just above the chart area\r\n const eventDots = showEventDots\r\n ? events.map((event) => ({\r\n coord: [\r\n typeof event.time === \"number\" ? event.time : event.time.getTime(),\r\n maxPower * 0.95,\r\n ] as [number, number],\r\n name: event.label,\r\n symbol: event.type === \"scenario\" ? \"diamond\" : \"circle\",\r\n symbolSize: event.type === \"scenario\" ? 10 : 8,\r\n itemStyle: {\r\n color: EVENT_COLORS[event.type],\r\n borderColor: tokens.colors.background.base,\r\n borderWidth: 2,\r\n shadowBlur: 4,\r\n shadowColor: EVENT_COLORS[event.type],\r\n },\r\n label: {\r\n show: false,\r\n },\r\n emphasis: {\r\n scale: true,\r\n itemStyle: {\r\n borderWidth: 3,\r\n shadowBlur: 8,\r\n },\r\n label: {\r\n show: true,\r\n fontSize: 12,\r\n color: tokens.colors.text.primary,\r\n backgroundColor: tokens.colors.background.surface,\r\n borderColor: EVENT_COLORS[event.type],\r\n borderWidth: 1,\r\n padding: [6, 10],\r\n borderRadius: 6,\r\n formatter: `{b}`,\r\n },\r\n },\r\n }))\r\n : [];\r\n\r\n // Dual axis config\r\n const yAxisConfig: AstroChartProps[\"yAxis\"] = showBattery\r\n ? [\r\n {\r\n type: \"value\",\r\n name: \"Power (W)\",\r\n position: \"left\",\r\n min: 0,\r\n splitLine: { show: true },\r\n },\r\n {\r\n type: \"value\",\r\n name: \"Battery %\",\r\n position: \"right\",\r\n min: 0,\r\n max: 100,\r\n splitLine: { show: false },\r\n },\r\n ]\r\n : {\r\n type: \"value\",\r\n name: \"Power (W)\",\r\n min: 0,\r\n splitLine: { show: true },\r\n };\r\n\r\n return {\r\n type: \"area\",\r\n title,\r\n subtitle: compact\r\n ? undefined\r\n : `System states, operational modes, eclipse periods, and events`,\r\n height,\r\n series,\r\n xAxis: {\r\n type: \"time\",\r\n showGrid: true,\r\n splitLine: { show: true },\r\n },\r\n yAxis: yAxisConfig,\r\n tooltip: {\r\n enabled: true,\r\n trigger: \"axis\",\r\n crosshair: \"both\",\r\n formatter: (params: any) => {\r\n const param = Array.isArray(params) ? params[0] : params;\r\n if (!param) return \"\";\r\n\r\n const time = new Date(param.data[0]);\r\n const dataPoint = data.find((d) => {\r\n const t = typeof d.time === \"number\" ? d.time : d.time.getTime();\r\n return t === param.data[0];\r\n });\r\n\r\n let html = `<div style=\"font-size: 13px; min-width: 220px; font-family: ${tokens.typography.fontFamily.primary};\">`;\r\n html += `<div style=\"font-weight: 600; margin-bottom: 10px; color: ${tokens.colors.text.primary}; font-size: 14px;\">${time.toLocaleTimeString()}</div>`;\r\n\r\n // Power values\r\n if (Array.isArray(params)) {\r\n params.forEach((p: any) => {\r\n const value = p.data[1];\r\n const seriesName = p.seriesName;\r\n const color = p.color;\r\n html += `<div style=\"display: flex; align-items: center; gap: 8px; margin-bottom: 6px;\">`;\r\n html += `<span style=\"width: 12px; height: 12px; background: ${color}; border-radius: 3px; box-shadow: 0 0 4px ${color};\"></span>`;\r\n html += `<span style=\"color: ${tokens.colors.text.secondary};\">${seriesName}: <strong style=\"color: ${tokens.colors.text.primary};\">${value.toFixed(1)}</strong></span>`;\r\n html += `</div>`;\r\n });\r\n } else {\r\n const value = param.data[1];\r\n html += `<div style=\"margin-bottom: 6px; color: ${tokens.colors.text.secondary};\">Power: <strong style=\"color: ${tokens.colors.text.primary};\">${value.toFixed(1)} W</strong></div>`;\r\n }\r\n\r\n // System info\r\n if (dataPoint) {\r\n html += `<div style=\"margin-top: 10px; padding-top: 10px; border-top: 1px solid ${tokens.colors.border.muted};\">`;\r\n html += `<div style=\"display: grid; grid-template-columns: auto 1fr; gap: 8px 12px; font-size: 12px;\">`;\r\n html += `<span style=\"color: ${tokens.colors.text.muted};\">STATE</span>`;\r\n html += `<span style=\"color: ${STATE_COLORS[dataPoint.state]}; font-weight: 600;\">${dataPoint.state.toUpperCase()}</span>`;\r\n html += `<span style=\"color: ${tokens.colors.text.muted};\">MODE</span>`;\r\n html += `<span style=\"color: ${MODE_COLORS[dataPoint.mode]}; font-weight: 600;\">${dataPoint.mode.toUpperCase()}</span>`;\r\n if (dataPoint.battery !== undefined) {\r\n html += `<span style=\"color: ${tokens.colors.text.muted};\">BATTERY</span>`;\r\n html += `<span style=\"color: ${tokens.colors.text.primary}; font-weight: 600;\">${dataPoint.battery.toFixed(1)}%</span>`;\r\n }\r\n html += `</div>`;\r\n if (dataPoint.eclipse) {\r\n html += `<div style=\"color: ${tokens.colors.status.caution}; font-weight: 600; margin-top: 8px; font-size: 12px; display: flex; align-items: center; gap: 6px;\">`;\r\n html += `<span style=\"font-weight: 600;\">ECLIPSE</span>`;\r\n html += `</div>`;\r\n }\r\n html += `</div>`;\r\n }\r\n\r\n html += `</div>`;\r\n return html;\r\n },\r\n },\r\n legend: showLegend\r\n ? {\r\n show: true,\r\n position: \"top\",\r\n orient: \"horizontal\",\r\n }\r\n : { show: false },\r\n zoom: enableZoom\r\n ? {\r\n enabled: true,\r\n type: \"both\",\r\n axis: \"x\",\r\n start: 0,\r\n end: 100,\r\n }\r\n : undefined,\r\n annotations: {\r\n markAreas: {\r\n data: [...stateRegions, ...eclipseRegions],\r\n itemStyle: {\r\n opacity: 1,\r\n },\r\n },\r\n markPoints: eventDots,\r\n },\r\n export: enableExport\r\n ? {\r\n enabled: true,\r\n formats: [\"png\", \"svg\", \"csv\"],\r\n getExportFileName: () => `zendir-power-overview-${Date.now()}`,\r\n }\r\n : undefined,\r\n infoTooltip: compact\r\n ? undefined\r\n : {\r\n content: (\r\n <div style={{ fontSize: \"13px\", lineHeight: \"1.6\" }}>\r\n <div style={{ marginBottom: \"8px\", fontWeight: 500 }}>\r\n Interactive Power Timeline\r\n </div>\r\n <div style={{ marginBottom: \"4px\" }}>\r\n • Background colors show system states\r\n </div>\r\n <div style={{ marginBottom: \"4px\" }}>\r\n • Dark overlays indicate eclipse periods\r\n </div>\r\n <div style={{ marginBottom: \"4px\" }}>\r\n • Diamond markers show key events\r\n </div>\r\n <div>• Scroll to zoom, drag to pan</div>\r\n </div>\r\n ),\r\n },\r\n className,\r\n };\r\n }, [\r\n data,\r\n events,\r\n title,\r\n height,\r\n showBattery,\r\n showLegend,\r\n enableExport,\r\n className,\r\n compact,\r\n showEventDots,\r\n enableZoom,\r\n tokens,\r\n ]);\r\n\r\n return (\r\n <div style={{ position: \"relative\", width: \"100%\" }}>\r\n {showStatus && (\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n top: 10,\r\n right: 60,\r\n zIndex: 10,\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: 8,\r\n padding: \"6px 12px\",\r\n background: tokens.colors.background.surface,\r\n border: `1px solid ${tokens.colors.border.default}`,\r\n borderRadius: tokens.borderRadius.md,\r\n fontSize: tokens.typography.fontSize.xs,\r\n fontFamily: tokens.typography.fontFamily.primary,\r\n }}\r\n >\r\n <StatusShape\r\n status={currentStatus}\r\n size={10}\r\n color={\r\n tokens.colors.status[currentStatus] || tokens.colors.status.off\r\n }\r\n borderColor={\r\n mode === \"light\" ? STATUS_BORDER_COLORS[currentStatus] : undefined\r\n }\r\n glow={mode !== \"light\"}\r\n />\r\n <span\r\n style={{\r\n color: tokens.colors.text.primary,\r\n fontWeight: 500,\r\n textTransform: \"uppercase\",\r\n letterSpacing: \"0.5px\",\r\n }}\r\n >\r\n {currentStatus}\r\n </span>\r\n </div>\r\n )}\r\n <AstroChart {...chartConfig} />\r\n </div>\r\n );\r\n}\r\n\r\n// =============================================================================\r\n// Sample Data Generator\r\n// =============================================================================\r\n\r\nexport function generateSamplePowerData(durationSeconds = 3600): {\r\n data: PowerTimelinePoint[];\r\n events: PowerEvent[];\r\n} {\r\n const dataPoints: PowerTimelinePoint[] = [];\r\n const eventList: PowerEvent[] = [];\r\n\r\n const startTime = Date.now();\r\n const interval = 10;\r\n\r\n let currentState: PowerState = \"running\";\r\n let currentMode: OperationalMode = \"inertial\";\r\n let inEclipse = false;\r\n\r\n for (let i = 0; i <= durationSeconds; i += interval) {\r\n const time = startTime + i * 1000;\r\n\r\n // State transitions\r\n if (i === 300) currentState = \"safe\";\r\n if (i === 600) currentState = \"running\";\r\n if (i === 1800) currentState = \"shutdown\";\r\n if (i === 2100) currentState = \"running\";\r\n if (i === 2400) currentState = \"safe\";\r\n if (i === 2700) currentState = \"running\";\r\n\r\n // Mode transitions\r\n if (i === 200) currentMode = \"sun\";\r\n if (i === 500) currentMode = \"inertial\";\r\n if (i === 800) currentMode = \"nadir\";\r\n if (i === 1100) currentMode = \"velocity\";\r\n if (i === 1400) currentMode = \"ground\";\r\n if (i === 1700) currentMode = \"sun\";\r\n if (i === 2000) currentMode = \"inertial\";\r\n if (i === 2300) currentMode = \"nadir\";\r\n if (i === 2600) currentMode = \"velocity\";\r\n if (i === 2900) currentMode = \"ground\";\r\n if (i === 3200) currentMode = \"sun\";\r\n\r\n // Eclipse periods\r\n if (i >= 1700 && i <= 2100) inEclipse = true;\r\n else if (i >= 2400 && i <= 2700) inEclipse = true;\r\n else inEclipse = false;\r\n\r\n // Battery\r\n let battery = 95;\r\n if (inEclipse) {\r\n battery = 95 - ((i - 1700) % 400) * 0.1;\r\n } else if (currentMode === \"sun\") {\r\n battery = 70 + Math.sin(i * 0.01) * 15;\r\n } else {\r\n battery = 90 + Math.sin(i * 0.005) * 5;\r\n }\r\n battery = Math.max(10, Math.min(100, battery));\r\n\r\n // Power\r\n let power = 0;\r\n if (inEclipse) {\r\n power = 0;\r\n } else if (currentMode === \"sun\") {\r\n power = 300 + Math.sin(i * 0.02) * 50;\r\n } else if (currentMode === \"ground\" || currentMode === \"nadir\") {\r\n power = 150 + Math.sin(i * 0.03) * 30;\r\n } else {\r\n power = 50 + Math.sin(i * 0.01) * 20;\r\n }\r\n\r\n if (currentState === \"safe\") power *= 0.3;\r\n if (currentState === \"shutdown\") power = 0;\r\n\r\n dataPoints.push({\r\n time,\r\n power,\r\n battery,\r\n state: currentState,\r\n mode: currentMode,\r\n eclipse: inEclipse,\r\n });\r\n }\r\n\r\n // Events\r\n const eventTimes = [\r\n 250, 420, 550, 900, 1300, 1650, 1850, 2200, 2500, 2800, 3100, 3400,\r\n ];\r\n const eventTypes: EventType[] = [\r\n \"scenario\",\r\n \"operator\",\r\n \"spacecraft\",\r\n \"ground\",\r\n ];\r\n\r\n eventTimes.forEach((timeOffset, idx) => {\r\n eventList.push({\r\n time: startTime + timeOffset * 1000,\r\n type: eventTypes[idx % eventTypes.length],\r\n label: `Event ${idx + 1}`,\r\n });\r\n });\r\n\r\n return { data: dataPoints, events: eventList };\r\n}\r\n\r\nexport default PowerOverviewChart;\r\n"],"mappings":"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"}