@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":"generators.js","names":[],"sources":["../../../../src/react/charts/unified/generators.ts"],"sourcesContent":["/**\n * @zendir/ui - Realistic Space Data Generators\n *\n * Generate realistic demo data for space-specific charts.\n * All generators produce physically accurate data following orbital mechanics\n * and RF/signal propagation principles.\n */\n\nimport type {\n PowerChartData,\n AttitudeChartData,\n WaterfallDataPoint,\n DopplerTrackPoint,\n SatellitePassInfo,\n SpectrumDataPoint,\n ContactWindowData,\n EclipseTimelineData,\n HeliocentricOrbitData,\n} from \"./types\";\nimport type { ConjunctionEvent as _ConjunctionEvent } from \"./domain\";\n\n// =============================================================================\n// Constants\n// =============================================================================\n\nconst SPEED_OF_LIGHT = 299792458; // m/s\nconst EARTH_RADIUS = 6371; // km\nconst MU_EARTH = 398600.4418; // km³/s² (Earth gravitational parameter)\n\n// =============================================================================\n// Power System Generator\n// =============================================================================\n\nexport interface PowerGeneratorConfig {\n /** Orbit period in seconds (default: 5400 = 90 min LEO) */\n orbitPeriod?: number;\n /** Eclipse duration in seconds (default: 2100 = 35 min) */\n eclipseDuration?: number;\n /** Solar array power output at optimal pointing (W) */\n solarArrayPower?: number;\n /** Average load power (W) */\n loadPower?: number;\n /** Battery capacity (Wh) */\n batteryCapacity?: number;\n /** Initial state of charge (%) */\n initialSoC?: number;\n /** Load reduction factor during eclipse (0-1) */\n eclipseLoadReduction?: number;\n /** Simulation duration in orbits */\n orbits?: number;\n /** Time resolution in seconds */\n resolution?: number;\n}\n\n/**\n * Generate realistic LEO satellite power system telemetry\n *\n * Models:\n * - Solar array power variation with orbit phase (cosine pointing loss)\n * - Eclipse periods with zero solar input\n * - Battery charge/discharge with 90% round-trip efficiency\n * - Load shedding during eclipse\n */\nexport function generatePowerData(\n config: PowerGeneratorConfig = {},\n): PowerChartData[] {\n const {\n orbitPeriod = 5400,\n eclipseDuration = 2100,\n solarArrayPower = 85,\n loadPower = 45,\n batteryCapacity = 300,\n initialSoC = 80,\n eclipseLoadReduction = 0.7,\n orbits = 2,\n resolution = 60,\n } = config;\n\n const data: PowerChartData[] = [];\n const totalDuration = orbitPeriod * orbits;\n let batterySoC = initialSoC;\n const batteryEfficiency = 0.9;\n\n // Eclipse starts at 40% of orbit, ends at 78% (typical LEO)\n const eclipseStart = 0.4;\n const eclipseEnd = eclipseStart + eclipseDuration / orbitPeriod;\n\n for (let t = 0; t < totalDuration; t += resolution) {\n const orbitPhase = (t % orbitPeriod) / orbitPeriod;\n const inEclipse = orbitPhase >= eclipseStart && orbitPhase < eclipseEnd;\n\n // Solar power with pointing variation (±10% sinusoidal)\n const pointingFactor = 0.9 + 0.1 * Math.sin(orbitPhase * Math.PI * 2);\n const solarPower = inEclipse ? 0 : solarArrayPower * pointingFactor;\n\n // Load power (reduced during eclipse for power conservation)\n const consumption = inEclipse\n ? loadPower * eclipseLoadReduction\n : loadPower;\n\n // Net power (positive = charging, negative = discharging)\n const netPower = solarPower - consumption;\n\n // Battery state of charge update\n const energyDelta = (netPower * resolution) / 3600; // Wh\n const efficiencyFactor =\n netPower > 0 ? batteryEfficiency : 1 / batteryEfficiency;\n batterySoC += ((energyDelta * efficiencyFactor) / batteryCapacity) * 100;\n batterySoC = Math.max(0, Math.min(100, batterySoC));\n\n data.push({\n time: Date.now() + t * 1000,\n solarPower: Math.round(solarPower * 10) / 10,\n consumption: Math.round(consumption * 10) / 10,\n netPower: Math.round(netPower * 10) / 10,\n batteryPercent: Math.round(batterySoC * 10) / 10,\n eclipse: inEclipse,\n });\n }\n\n return data;\n}\n\n// =============================================================================\n// Attitude Generator\n// =============================================================================\n\nexport interface AttitudeGeneratorConfig {\n /** Initial attitude [roll, pitch, yaw] in degrees */\n initialAttitude?: [number, number, number];\n /** Target attitude [roll, pitch, yaw] in degrees */\n targetAttitude?: [number, number, number];\n /** Slew rate in deg/s */\n slewRate?: number;\n /** Settling time in seconds */\n settleTime?: number;\n /** Pointing jitter RMS in degrees */\n jitter?: number;\n /** Sampling rate in Hz */\n samplingRate?: number;\n /** Duration in seconds */\n duration?: number;\n}\n\n/**\n * Generate realistic spacecraft attitude telemetry\n *\n * Models:\n * - Slew maneuver with trapezoidal velocity profile\n * - Fine pointing settling with exponential decay\n * - Random jitter (Gaussian distribution)\n * - Angular velocity from finite differences\n */\nexport function generateAttitudeData(\n config: AttitudeGeneratorConfig = {},\n): AttitudeChartData[] {\n const {\n initialAttitude = [0, -45, 90],\n targetAttitude = [0, 30, 180],\n slewRate = 0.5,\n settleTime = 30,\n jitter = 0.02,\n samplingRate = 1,\n duration = 300,\n } = config;\n\n const data: AttitudeChartData[] = [];\n const dt = 1 / samplingRate;\n\n // Calculate slew geometry\n const deltaAttitude = targetAttitude.map((t, i) => t - initialAttitude[i]);\n const totalAngle = Math.sqrt(\n deltaAttitude.reduce((sum, d) => sum + d * d, 0),\n );\n const slewDuration = totalAngle / slewRate;\n const _unitVector = deltaAttitude.map((d) => d / totalAngle);\n\n // Gaussian random for jitter\n const gaussRandom = () => {\n const u1 = Math.random();\n const u2 = Math.random();\n return Math.sqrt(-2 * Math.log(u1)) * Math.cos(2 * Math.PI * u2);\n };\n\n let prevRoll = initialAttitude[0];\n let prevPitch = initialAttitude[1];\n let prevYaw = initialAttitude[2];\n\n for (let t = 0; t < duration; t += dt) {\n let roll: number, pitch: number, yaw: number;\n let pointingError: number;\n\n if (t < slewDuration) {\n // During slew\n const progress = t / slewDuration;\n const smoothProgress = 0.5 - 0.5 * Math.cos(progress * Math.PI); // Smooth ease\n roll = initialAttitude[0] + deltaAttitude[0] * smoothProgress;\n pitch = initialAttitude[1] + deltaAttitude[1] * smoothProgress;\n yaw = initialAttitude[2] + deltaAttitude[2] * smoothProgress;\n pointingError = totalAngle * (1 - progress);\n } else if (t < slewDuration + settleTime) {\n // Settling phase\n const settleProgress = (t - slewDuration) / settleTime;\n const decayFactor = Math.exp(-3 * settleProgress);\n const overshoot =\n 0.05 * Math.sin(settleProgress * Math.PI * 4) * decayFactor;\n\n roll = targetAttitude[0] + overshoot + jitter * gaussRandom();\n pitch = targetAttitude[1] + overshoot + jitter * gaussRandom();\n yaw = targetAttitude[2] + overshoot + jitter * gaussRandom();\n pointingError = Math.abs(overshoot) + jitter * Math.abs(gaussRandom());\n } else {\n // Fine pointing\n roll = targetAttitude[0] + jitter * gaussRandom();\n pitch = targetAttitude[1] + jitter * gaussRandom();\n yaw = targetAttitude[2] + jitter * gaussRandom();\n pointingError =\n jitter *\n Math.sqrt(\n Math.pow(gaussRandom(), 2) +\n Math.pow(gaussRandom(), 2) +\n Math.pow(gaussRandom(), 2),\n );\n }\n\n // Angular velocity from finite differences\n const angularVelocity = Math.sqrt(\n Math.pow((roll - prevRoll) / dt, 2) +\n Math.pow((pitch - prevPitch) / dt, 2) +\n Math.pow((yaw - prevYaw) / dt, 2),\n );\n\n data.push({\n time: Date.now() + t * 1000,\n roll: Math.round(roll * 100) / 100,\n pitch: Math.round(pitch * 100) / 100,\n yaw: Math.round(yaw * 100) / 100,\n pointingError: Math.round(pointingError * 1000) / 1000,\n angularVelocity: Math.round(angularVelocity * 1000) / 1000,\n });\n\n prevRoll = roll;\n prevPitch = pitch;\n prevYaw = yaw;\n }\n\n return data;\n}\n\n// =============================================================================\n// Doppler Track Generator\n// =============================================================================\n\nexport interface DopplerGeneratorConfig {\n /** Carrier frequency in Hz */\n carrierFrequency?: number;\n /** Satellite altitude in km */\n altitude?: number;\n /** Maximum elevation angle in degrees */\n maxElevation?: number;\n /** Pass duration in seconds */\n passDuration?: number;\n /** Time resolution in seconds */\n resolution?: number;\n /** Add measurement noise (Hz RMS) */\n measurementNoise?: number;\n /** Satellite name */\n satelliteName?: string;\n /** Ground station name */\n groundStation?: string;\n}\n\n/**\n * Generate realistic Doppler tracking data for a satellite pass\n *\n * Uses simplified orbital mechanics:\n * - Circular orbit at specified altitude\n * - Pass geometry from maximum elevation\n * - Doppler shift from velocity projection\n */\nexport function generateDopplerData(config: DopplerGeneratorConfig = {}): {\n predicted: DopplerTrackPoint[];\n measured: DopplerTrackPoint[];\n passInfo: SatellitePassInfo;\n} {\n const {\n carrierFrequency = 437e6, // 437 MHz (UHF amateur)\n altitude = 400, // km (ISS altitude)\n maxElevation = 75,\n passDuration = 600, // 10 minutes\n resolution = 1,\n measurementNoise = 50, // Hz\n satelliteName = \"ISS\",\n groundStation: _groundStation = \"Home Station\",\n } = config;\n\n const predicted: DopplerTrackPoint[] = [];\n const measured: DopplerTrackPoint[] = [];\n\n // Orbital velocity\n const orbitRadius = EARTH_RADIUS + altitude;\n const orbitalVelocity = Math.sqrt(MU_EARTH / orbitRadius); // km/s\n\n // Maximum Doppler shift\n const maxDoppler =\n carrierFrequency * ((orbitalVelocity * 1000) / SPEED_OF_LIGHT);\n\n // Calculate pass geometry\n const elevationRad = (maxElevation * Math.PI) / 180;\n const passHalfAngle = Math.PI / 2 - elevationRad;\n\n const now = Date.now();\n const aos = now;\n const los = now + passDuration * 1000;\n const tca = now + (passDuration / 2) * 1000;\n\n // Gaussian random for noise\n const gaussRandom = () => {\n const u1 = Math.random();\n const u2 = Math.random();\n return Math.sqrt(-2 * Math.log(u1)) * Math.cos(2 * Math.PI * u2);\n };\n\n for (let t = 0; t <= passDuration; t += resolution) {\n const time = now + t * 1000;\n const passPhase = t / passDuration; // 0 to 1\n const angle = (passPhase - 0.5) * 2 * passHalfAngle; // -halfAngle to +halfAngle\n\n // Doppler shift (maximum at edges, zero at TCA)\n const dopplerShift = maxDoppler * Math.sin(angle);\n\n // Elevation angle (maximum at TCA)\n const elevation = maxElevation * Math.cos(angle);\n\n predicted.push({\n time,\n dopplerShift: Math.round(dopplerShift),\n elevation: Math.round(elevation * 10) / 10,\n });\n\n // Simulated measured data with noise and bias\n const measuredShift = dopplerShift + measurementNoise * gaussRandom();\n measured.push({\n time,\n dopplerShift: Math.round(measuredShift),\n elevation: Math.round(elevation * 10) / 10,\n });\n }\n\n const passInfo: SatellitePassInfo = {\n name: satelliteName,\n aos: new Date(aos),\n los: new Date(los),\n tca: new Date(tca),\n maxElevation,\n };\n\n return { predicted, measured, passInfo };\n}\n\n// =============================================================================\n// Waterfall/Spectrum Generator\n// =============================================================================\n\nexport interface WaterfallGeneratorConfig {\n /** Center frequency in Hz */\n centerFrequency?: number;\n /** Bandwidth in Hz */\n bandwidth?: number;\n /** Number of FFT bins */\n fftBins?: number;\n /** Noise floor in dBm */\n noiseFloor?: number;\n /** Number of time samples */\n timeSamples?: number;\n /** Signals to include */\n signals?: Array<{\n /** Offset from center frequency (Hz) */\n offset: number;\n /** Signal power (dBm) */\n power: number;\n /** Signal bandwidth (Hz) */\n bandwidth: number;\n /** Signal type */\n type: \"cw\" | \"ssb\" | \"digital\" | \"beacon\";\n /** Doppler drift (Hz/s) - for moving signals */\n dopplerDrift?: number;\n }>;\n}\n\n/**\n * Generate realistic RF waterfall data\n *\n * Models:\n * - Gaussian noise floor\n * - CW signals (narrow spikes)\n * - SSB signals (offset sideband with modulation)\n * - Digital signals (wider, flatter spectrum)\n * - Time-varying Doppler drift\n */\nexport function generateWaterfallData(\n config: WaterfallGeneratorConfig = {},\n): WaterfallDataPoint[] {\n const {\n centerFrequency = 437e6,\n bandwidth = 100e3,\n fftBins = 512,\n noiseFloor = -120,\n timeSamples = 100,\n signals = [\n { offset: -30e3, power: -80, bandwidth: 500, type: \"cw\" as const },\n { offset: 0, power: -75, bandwidth: 20e3, type: \"digital\" as const },\n { offset: 25e3, power: -90, bandwidth: 3e3, type: \"ssb\" as const },\n ],\n } = config;\n\n const data: WaterfallDataPoint[] = [];\n const freqStep = bandwidth / fftBins;\n const noiseStdDev = 3; // dB variation\n\n // Gaussian random\n const gaussRandom = () => {\n const u1 = Math.random();\n const u2 = Math.random();\n return Math.sqrt(-2 * Math.log(u1)) * Math.cos(2 * Math.PI * u2);\n };\n\n // Pre-compute frequency bins (constant for all time slices)\n const frequencies: number[] = [];\n for (let f = 0; f < fftBins; f++) {\n frequencies.push(centerFrequency + (f - fftBins / 2) * freqStep);\n }\n\n for (let t = 0; t < timeSamples; t++) {\n const powers: number[] = [];\n const time = Date.now() - (timeSamples - t) * 100; // 100ms between samples\n\n for (let f = 0; f < fftBins; f++) {\n const freqOffset = (f - fftBins / 2) * freqStep;\n let power = noiseFloor + noiseStdDev * gaussRandom();\n\n // Add signals\n for (const signal of signals) {\n const signalOffset =\n signal.offset + (signal.dopplerDrift || 0) * (t / 10);\n const distance = Math.abs(freqOffset - signalOffset);\n\n if (signal.type === \"cw\") {\n // Narrow CW signal (sinc-like)\n if (distance < signal.bandwidth * 2) {\n const shape = Math.pow(\n Math.sin((Math.PI * distance) / signal.bandwidth) /\n ((Math.PI * distance) / signal.bandwidth + 0.001),\n 2,\n );\n power = Math.max(\n power,\n signal.power + 10 * Math.log10(shape + 0.001) + gaussRandom(),\n );\n }\n } else if (signal.type === \"ssb\") {\n // SSB with voice-like modulation\n if (\n freqOffset >= signalOffset &&\n freqOffset <= signalOffset + signal.bandwidth\n ) {\n const modulation = 0.5 + 0.5 * Math.sin(t * 0.3 + f * 0.1);\n power = Math.max(\n power,\n signal.power - 3 + 6 * modulation + 2 * gaussRandom(),\n );\n }\n } else if (signal.type === \"digital\") {\n // Digital signal (flat-topped with rolloff)\n if (distance < signal.bandwidth / 2) {\n power = Math.max(power, signal.power + gaussRandom());\n } else if (distance < signal.bandwidth) {\n const rolloff =\n 1 - (distance - signal.bandwidth / 2) / (signal.bandwidth / 2);\n power = Math.max(\n power,\n signal.power - 20 * (1 - rolloff) + gaussRandom(),\n );\n }\n } else if (signal.type === \"beacon\") {\n // Beacon (stable CW)\n if (distance < signal.bandwidth) {\n power = Math.max(power, signal.power);\n }\n }\n }\n\n powers.push(Math.round(power * 10) / 10);\n }\n\n data.push({ time, frequencies: [...frequencies], powers });\n }\n\n return data;\n}\n\n// =============================================================================\n// Contact Window Generator\n// =============================================================================\n\nexport interface ContactGeneratorConfig {\n /** Ground stations */\n groundStations?: Array<{\n name: string;\n latitude: number;\n longitude: number;\n }>;\n /** Satellite altitude (km) */\n altitude?: number;\n /** Orbit inclination (degrees) */\n inclination?: number;\n /** Simulation duration (hours) */\n duration?: number;\n /** Minimum elevation (degrees) */\n minElevation?: number;\n}\n\n/**\n * Generate realistic ground station contact windows\n *\n * Uses simplified visibility calculation based on:\n * - Orbital period from altitude\n * - Swath width from elevation angle\n * - Ground track precession\n */\nexport function generateContactWindows(\n config: ContactGeneratorConfig = {},\n): ContactWindowData[] {\n const {\n groundStations = [\n { name: \"Svalbard (SG)\", latitude: 78.2, longitude: 15.4 },\n { name: \"McMurdo (MCM)\", latitude: -77.8, longitude: 166.7 },\n { name: \"Hawaii (HBK)\", latitude: 21.5, longitude: -158.0 },\n { name: \"Kiruna (KIR)\", latitude: 67.9, longitude: 20.9 },\n ],\n altitude = 400,\n inclination = 51.6,\n duration = 24,\n minElevation = 5,\n } = config;\n\n const result: ContactWindowData[] = [];\n const now = Date.now();\n const orbitPeriod =\n 2 * Math.PI * Math.sqrt(Math.pow(EARTH_RADIUS + altitude, 3) / MU_EARTH);\n const passesPerDay = Math.floor((duration * 3600) / orbitPeriod);\n\n for (const gs of groundStations) {\n const windows: ContactWindowData[\"windows\"] = [];\n\n // Determine visibility based on latitude and inclination\n const isVisible = Math.abs(gs.latitude) <= inclination + 15;\n if (!isVisible) continue;\n\n // Generate passes based on ground station latitude\n const passesForStation = Math.floor(\n passesPerDay * (0.3 + 0.7 * Math.cos((gs.latitude * Math.PI) / 180)),\n );\n\n for (let i = 0; i < passesForStation; i++) {\n const passStart = now + (i * duration * 3600 * 1000) / passesForStation;\n const passStart2 = passStart + (Math.random() - 0.5) * orbitPeriod * 500; // Jitter\n\n // Pass duration depends on elevation (higher el = shorter duration but better signal)\n const maxEl = minElevation + Math.random() * (85 - minElevation);\n const passDuration = 10 * 60 * 1000 * (1 - maxEl / 180); // 5-10 minutes\n\n const signalQuality =\n maxEl > 45 ? \"good\" : maxEl > 20 ? \"marginal\" : \"poor\";\n\n windows.push({\n start: passStart2,\n end: passStart2 + passDuration,\n label: `Pass ${i + 1}`,\n signalQuality: signalQuality as \"good\" | \"marginal\" | \"poor\",\n elevation: Math.round(maxEl),\n });\n }\n\n result.push({ id: gs.name, name: gs.name, windows });\n }\n\n return result;\n}\n\n// =============================================================================\n// Heliocentric Orbit Generator\n// =============================================================================\n\nexport interface HeliocentricGeneratorConfig {\n /** Bodies to include */\n bodies?: Array<{\n name: string;\n type: \"planet\" | \"spacecraft\" | \"asteroid\" | \"comet\";\n semiMajorAxis: number; // AU\n eccentricity: number;\n inclination: number; // degrees\n argumentOfPerihelion: number; // degrees\n trueAnomaly: number; // degrees (current position)\n color?: string;\n }>;\n /** Number of points per orbit */\n orbitPoints?: number;\n}\n\n/**\n * Generate heliocentric orbit visualization data\n */\nexport function generateHeliocentricOrbits(\n config: HeliocentricGeneratorConfig = {},\n): HeliocentricOrbitData[] {\n const {\n bodies = [\n {\n name: \"Earth\",\n type: \"planet\" as const,\n semiMajorAxis: 1.0,\n eccentricity: 0.017,\n inclination: 0,\n argumentOfPerihelion: 102,\n trueAnomaly: 0,\n color: \"#3498db\",\n },\n {\n name: \"Mars\",\n type: \"planet\" as const,\n semiMajorAxis: 1.52,\n eccentricity: 0.093,\n inclination: 1.85,\n argumentOfPerihelion: 286,\n trueAnomaly: 45,\n color: \"#e74c3c\",\n },\n {\n name: \"Voyager 1\",\n type: \"spacecraft\" as const,\n semiMajorAxis: 40,\n eccentricity: 0.99,\n inclination: 35,\n argumentOfPerihelion: 0,\n trueAnomaly: 170,\n color: \"#3E3CFF\",\n },\n ],\n orbitPoints = 72,\n } = config;\n\n return bodies.map((body) => {\n const {\n semiMajorAxis: a,\n eccentricity: e,\n inclination: i,\n argumentOfPerihelion: omega,\n trueAnomaly: nu,\n } = body;\n\n // Generate orbit path\n const orbitPath: { x: number; y: number; z: number }[] = [];\n for (let j = 0; j <= orbitPoints; j++) {\n const angle = (j / orbitPoints) * 2 * Math.PI;\n const r = (a * (1 - e * e)) / (1 + e * Math.cos(angle));\n\n // Rotate by argument of perihelion and inclination\n const xOrbit = r * Math.cos(angle);\n const yOrbit = r * Math.sin(angle);\n\n const omegaRad = (omega * Math.PI) / 180;\n const iRad = (i * Math.PI) / 180;\n\n const x =\n xOrbit * Math.cos(omegaRad) -\n yOrbit * Math.cos(iRad) * Math.sin(omegaRad);\n const y =\n xOrbit * Math.sin(omegaRad) +\n yOrbit * Math.cos(iRad) * Math.cos(omegaRad);\n const z = yOrbit * Math.sin(iRad);\n\n orbitPath.push({ x, y, z });\n }\n\n // Current position\n const nuRad = (nu * Math.PI) / 180;\n const r = (a * (1 - e * e)) / (1 + e * Math.cos(nuRad));\n const xOrbit = r * Math.cos(nuRad);\n const yOrbit = r * Math.sin(nuRad);\n\n const omegaRad = (omega * Math.PI) / 180;\n const iRad = (i * Math.PI) / 180;\n\n const x =\n xOrbit * Math.cos(omegaRad) -\n yOrbit * Math.cos(iRad) * Math.sin(omegaRad);\n const y =\n xOrbit * Math.sin(omegaRad) +\n yOrbit * Math.cos(iRad) * Math.cos(omegaRad);\n const z = yOrbit * Math.sin(iRad);\n\n // Orbital period in days\n const period = 365.25 * Math.pow(a, 1.5);\n\n return {\n name: body.name,\n type: body.type,\n x,\n y,\n z,\n orbitPath,\n color: body.color,\n semiMajorAxis: a,\n period,\n inclination: i,\n size: body.type === \"planet\" ? 20 : 12,\n };\n });\n}\n\n// =============================================================================\n// Spectrum Generator (single FFT snapshot)\n// =============================================================================\n\nexport interface SpectrumGeneratorConfig {\n /** Center frequency (Hz) */\n centerFrequency?: number;\n /** Bandwidth (Hz) */\n bandwidth?: number;\n /** Number of points */\n points?: number;\n /** Noise floor (dBm) */\n noiseFloor?: number;\n /** Signals */\n signals?: Array<{\n frequency: number;\n power: number;\n bandwidth: number;\n }>;\n}\n\n/**\n * Generate a single RF spectrum snapshot\n */\nexport function generateSpectrum(\n config: SpectrumGeneratorConfig = {},\n): SpectrumDataPoint[] {\n const {\n centerFrequency = 2200e6,\n bandwidth = 10e6,\n points = 256,\n noiseFloor = -120,\n signals = [\n { frequency: 2200e6, power: -75, bandwidth: 100e3 },\n { frequency: 2197.5e6, power: -80, bandwidth: 10e3 },\n { frequency: 2202.5e6, power: -95, bandwidth: 50e3 },\n ],\n } = config;\n\n const data: SpectrumDataPoint[] = [];\n const freqMin = centerFrequency - bandwidth / 2;\n const freqStep = bandwidth / points;\n\n for (let i = 0; i < points; i++) {\n const freq = freqMin + i * freqStep;\n let power = noiseFloor + 3 * (Math.random() - 0.5);\n\n for (const signal of signals) {\n const distance = Math.abs(freq - signal.frequency);\n if (distance < signal.bandwidth * 2) {\n const attenuation =\n 20 * Math.log10(1 + distance / (signal.bandwidth / 2));\n power = Math.max(power, signal.power - attenuation);\n }\n }\n\n data.push({ frequency: freq, power: Math.round(power * 10) / 10 });\n }\n\n return data;\n}\n\n// =============================================================================\n// Eclipse Timeline Generator\n// =============================================================================\n\nexport interface EclipseGeneratorConfig {\n /** Orbit period (seconds) */\n orbitPeriod?: number;\n /** Eclipse fraction (0-1) */\n eclipseFraction?: number;\n /** Number of orbits */\n orbits?: number;\n /** Include penumbra */\n includePenumbra?: boolean;\n}\n\n/**\n * Generate eclipse timeline data\n */\nexport function generateEclipseTimeline(\n config: EclipseGeneratorConfig = {},\n): EclipseTimelineData[] {\n const {\n orbitPeriod = 5400,\n eclipseFraction = 0.38,\n orbits = 5,\n includePenumbra = true,\n } = config;\n\n const data: EclipseTimelineData[] = [];\n const now = Date.now();\n const penumbraDuration = includePenumbra ? 60 : 0; // 1 minute penumbra\n\n for (let orbit = 0; orbit < orbits; orbit++) {\n const orbitStart = now + orbit * orbitPeriod * 1000;\n const eclipseStart = orbitStart + orbitPeriod * 0.4 * 1000;\n const eclipseEnd = eclipseStart + orbitPeriod * eclipseFraction * 1000;\n\n // Sunlight before eclipse\n data.push({\n start: orbitStart,\n end: eclipseStart - penumbraDuration * 1000,\n type: \"sunlight\",\n orbitNumber: orbit + 1,\n });\n\n // Penumbra entry\n if (includePenumbra) {\n data.push({\n start: eclipseStart - penumbraDuration * 1000,\n end: eclipseStart,\n type: \"penumbra\",\n orbitNumber: orbit + 1,\n });\n }\n\n // Umbra\n data.push({\n start: eclipseStart,\n end: eclipseEnd,\n type: \"umbra\",\n orbitNumber: orbit + 1,\n });\n\n // Penumbra exit\n if (includePenumbra) {\n data.push({\n start: eclipseEnd,\n end: eclipseEnd + penumbraDuration * 1000,\n type: \"penumbra\",\n orbitNumber: orbit + 1,\n });\n }\n\n // Sunlight after eclipse\n data.push({\n start: eclipseEnd + penumbraDuration * 1000,\n end: orbitStart + orbitPeriod * 1000,\n type: \"sunlight\",\n orbitNumber: orbit + 1,\n });\n }\n\n return data;\n}\n\n// =============================================================================\n// Constellation Coverage Generator\n// =============================================================================\n\nexport interface CoverageGeneratorConfig {\n /** Latitude resolution (degrees) */\n latResolution?: number;\n /** Longitude resolution (degrees) */\n lonResolution?: number;\n /** Number of orbital planes */\n planes?: number;\n /** Satellites per plane */\n satsPerPlane?: number;\n /** Orbit altitude (km) */\n altitude?: number;\n /** Orbit inclination (degrees) */\n inclination?: number;\n /** Metric to compute: 'visibility' | 'revisitTime' | 'latency' */\n metric?: \"visibility\" | \"revisitTime\" | \"latency\";\n}\n\n/**\n * Generate constellation coverage grid data\n *\n * Models simplified visibility based on satellite altitude\n * and ground footprint overlap from Walker constellation geometry.\n */\nexport function generateConstellationCoverage(\n config: CoverageGeneratorConfig = {},\n): {\n latitudes: number[];\n longitudes: number[];\n coverage: number[][];\n unit: string;\n} {\n const {\n latResolution = 5,\n lonResolution = 5,\n planes = 6,\n satsPerPlane = 22,\n altitude = 550,\n inclination = 53,\n metric = \"visibility\",\n } = config;\n\n const latitudes: number[] = [];\n const longitudes: number[] = [];\n const coverage: number[][] = [];\n\n for (let lat = -90; lat <= 90; lat += latResolution) latitudes.push(lat);\n for (let lon = -180; lon < 180; lon += lonResolution) longitudes.push(lon);\n\n // Footprint half-angle from altitude\n const earthRadius = 6371;\n const footprintAngle =\n Math.acos(earthRadius / (earthRadius + altitude)) * (180 / Math.PI);\n const totalSats = planes * satsPerPlane;\n\n for (let li = 0; li < latitudes.length; li++) {\n const row: number[] = [];\n const lat = latitudes[li];\n const _latRad = (lat * Math.PI) / 180;\n\n for (let lj = 0; lj < longitudes.length; lj++) {\n let value: number;\n\n // Coverage depends on latitude vs inclination\n const latFactor =\n Math.abs(lat) <= inclination\n ? 1.0\n : Math.max(0, 1.0 - (Math.abs(lat) - inclination) / 20);\n\n // Base coverage from constellation density\n const densityFactor = totalSats / 100;\n const footprintOverlap = Math.min(\n 1,\n densityFactor * (footprintAngle / 30),\n );\n\n if (metric === \"visibility\") {\n // Percentage of time with at least 1 satellite visible\n value = Math.min(100, footprintOverlap * latFactor * 100);\n // Add polar convergence bonus\n if (Math.abs(lat) > 60) value = Math.min(100, value * 1.2);\n // Add noise\n value += (Math.random() - 0.5) * 5;\n value = Math.max(0, Math.min(100, value));\n } else if (metric === \"revisitTime\") {\n // Minutes between passes (lower is better)\n const baseRevisit = 90 / (footprintOverlap * latFactor + 0.01);\n value = Math.max(\n 1,\n Math.min(120, baseRevisit + (Math.random() - 0.5) * 10),\n );\n } else {\n // Latency in ms (one-way)\n const slantRange =\n altitude / Math.sin(Math.max(0.1, (latFactor * Math.PI) / 4));\n value = slantRange / 300 + 2 + Math.random() * 2; // ms\n }\n\n row.push(Math.round(value * 10) / 10);\n }\n coverage.push(row);\n }\n\n const units: Record<string, string> = {\n visibility: \"%\",\n revisitTime: \"min\",\n latency: \"ms\",\n };\n return { latitudes, longitudes, coverage, unit: units[metric] || \"%\" };\n}\n\n// =============================================================================\n// Conjunction Event Generator\n// =============================================================================\n\nexport interface ConjunctionGeneratorConfig {\n /** Primary object name */\n primaryName?: string;\n /** Number of events to generate */\n eventCount?: number;\n /** Time range in hours */\n timeRangeHours?: number;\n /** Include high-risk events */\n includeHighRisk?: boolean;\n}\n\n/**\n * Generate realistic conjunction/close approach events\n */\nexport function generateConjunctionEvents(\n config: ConjunctionGeneratorConfig = {},\n): Array<{\n id: string;\n primary: string;\n secondary: string;\n tca: number;\n missDistance: number;\n probability: number;\n relativeVelocity: number;\n position: { x: number; y: number; z: number };\n uncertainty?: { rx: number; ry: number; rz: number };\n}> {\n const {\n primaryName = \"SAT-ALPHA\",\n eventCount = 12,\n timeRangeHours = 72,\n includeHighRisk = true,\n } = config;\n\n const secondaries = [\n \"COSMOS-2251 DEB\",\n \"FENGYUN-1C DEB\",\n \"SL-16 R/B\",\n \"IRIDIUM 33 DEB\",\n \"NOAA 17 DEB\",\n \"ATLAS 5 CENTAUR R/B\",\n \"BREEZE-M DEB\",\n \"CZ-3B R/B\",\n \"UNKNOWN DEB\",\n \"MICROSAT-R DEB\",\n \"DELTA 2 R/B\",\n \"H-2A R/B\",\n ];\n\n const now = Date.now();\n const events = [];\n\n for (let i = 0; i < eventCount; i++) {\n const tca = now + Math.random() * timeRangeHours * 3600000;\n let missDistance: number;\n\n if (includeHighRisk && i < 2) {\n missDistance = 0.1 + Math.random() * 0.9; // Critical: < 1 km\n } else if (i < 5) {\n missDistance = 1 + Math.random() * 4; // Warning: 1-5 km\n } else {\n missDistance = 5 + Math.random() * 15; // Safe: > 5 km\n }\n\n const probability = Math.pow(10, -3 - missDistance * 1.5 + Math.random());\n const relativeVelocity = 5 + Math.random() * 12;\n\n const angle = Math.random() * 2 * Math.PI;\n const incAngle = (Math.random() - 0.5) * Math.PI;\n const radius = 6800 + Math.random() * 600;\n\n events.push({\n id: `CDM-${String(i + 1).padStart(3, \"0\")}`,\n primary: primaryName,\n secondary: secondaries[i % secondaries.length],\n tca,\n missDistance: Math.round(missDistance * 1000) / 1000,\n probability: Math.max(1e-10, probability),\n relativeVelocity: Math.round(relativeVelocity * 100) / 100,\n position: {\n x: Math.round(radius * Math.cos(angle) * Math.cos(incAngle)),\n y: Math.round(radius * Math.sin(angle) * Math.cos(incAngle)),\n z: Math.round(radius * Math.sin(incAngle)),\n },\n uncertainty: {\n rx: 20 + Math.random() * 100,\n ry: 50 + Math.random() * 300,\n rz: 10 + Math.random() * 60,\n },\n });\n }\n\n return events.sort((a, b) => a.tca - b.tca);\n}\n\nexport default {\n generatePowerData,\n generateAttitudeData,\n generateDopplerData,\n generateWaterfallData,\n generateContactWindows,\n generateHeliocentricOrbits,\n generateSpectrum,\n generateEclipseTimeline,\n generateConstellationCoverage,\n generateConjunctionEvents,\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"generators.js","names":[],"sources":["../../../../src/react/charts/unified/generators.ts"],"sourcesContent":["/**\r\n * @zendir/ui - Realistic Space Data Generators\r\n *\r\n * Generate realistic demo data for space-specific charts.\r\n * All generators produce physically accurate data following orbital mechanics\r\n * and RF/signal propagation principles.\r\n */\r\n\r\nimport type {\r\n PowerChartData,\r\n AttitudeChartData,\r\n WaterfallDataPoint,\r\n DopplerTrackPoint,\r\n SatellitePassInfo,\r\n SpectrumDataPoint,\r\n ContactWindowData,\r\n EclipseTimelineData,\r\n HeliocentricOrbitData,\r\n} from \"./types\";\r\nimport type { ConjunctionEvent as _ConjunctionEvent } from \"./domain\";\r\n\r\n// =============================================================================\r\n// Constants\r\n// =============================================================================\r\n\r\nconst SPEED_OF_LIGHT = 299792458; // m/s\r\nconst EARTH_RADIUS = 6371; // km\r\nconst MU_EARTH = 398600.4418; // km³/s² (Earth gravitational parameter)\r\n\r\n// =============================================================================\r\n// Power System Generator\r\n// =============================================================================\r\n\r\nexport interface PowerGeneratorConfig {\r\n /** Orbit period in seconds (default: 5400 = 90 min LEO) */\r\n orbitPeriod?: number;\r\n /** Eclipse duration in seconds (default: 2100 = 35 min) */\r\n eclipseDuration?: number;\r\n /** Solar array power output at optimal pointing (W) */\r\n solarArrayPower?: number;\r\n /** Average load power (W) */\r\n loadPower?: number;\r\n /** Battery capacity (Wh) */\r\n batteryCapacity?: number;\r\n /** Initial state of charge (%) */\r\n initialSoC?: number;\r\n /** Load reduction factor during eclipse (0-1) */\r\n eclipseLoadReduction?: number;\r\n /** Simulation duration in orbits */\r\n orbits?: number;\r\n /** Time resolution in seconds */\r\n resolution?: number;\r\n}\r\n\r\n/**\r\n * Generate realistic LEO satellite power system telemetry\r\n *\r\n * Models:\r\n * - Solar array power variation with orbit phase (cosine pointing loss)\r\n * - Eclipse periods with zero solar input\r\n * - Battery charge/discharge with 90% round-trip efficiency\r\n * - Load shedding during eclipse\r\n */\r\nexport function generatePowerData(\r\n config: PowerGeneratorConfig = {},\r\n): PowerChartData[] {\r\n const {\r\n orbitPeriod = 5400,\r\n eclipseDuration = 2100,\r\n solarArrayPower = 85,\r\n loadPower = 45,\r\n batteryCapacity = 300,\r\n initialSoC = 80,\r\n eclipseLoadReduction = 0.7,\r\n orbits = 2,\r\n resolution = 60,\r\n } = config;\r\n\r\n const data: PowerChartData[] = [];\r\n const totalDuration = orbitPeriod * orbits;\r\n let batterySoC = initialSoC;\r\n const batteryEfficiency = 0.9;\r\n\r\n // Eclipse starts at 40% of orbit, ends at 78% (typical LEO)\r\n const eclipseStart = 0.4;\r\n const eclipseEnd = eclipseStart + eclipseDuration / orbitPeriod;\r\n\r\n for (let t = 0; t < totalDuration; t += resolution) {\r\n const orbitPhase = (t % orbitPeriod) / orbitPeriod;\r\n const inEclipse = orbitPhase >= eclipseStart && orbitPhase < eclipseEnd;\r\n\r\n // Solar power with pointing variation (±10% sinusoidal)\r\n const pointingFactor = 0.9 + 0.1 * Math.sin(orbitPhase * Math.PI * 2);\r\n const solarPower = inEclipse ? 0 : solarArrayPower * pointingFactor;\r\n\r\n // Load power (reduced during eclipse for power conservation)\r\n const consumption = inEclipse\r\n ? loadPower * eclipseLoadReduction\r\n : loadPower;\r\n\r\n // Net power (positive = charging, negative = discharging)\r\n const netPower = solarPower - consumption;\r\n\r\n // Battery state of charge update\r\n const energyDelta = (netPower * resolution) / 3600; // Wh\r\n const efficiencyFactor =\r\n netPower > 0 ? batteryEfficiency : 1 / batteryEfficiency;\r\n batterySoC += ((energyDelta * efficiencyFactor) / batteryCapacity) * 100;\r\n batterySoC = Math.max(0, Math.min(100, batterySoC));\r\n\r\n data.push({\r\n time: Date.now() + t * 1000,\r\n solarPower: Math.round(solarPower * 10) / 10,\r\n consumption: Math.round(consumption * 10) / 10,\r\n netPower: Math.round(netPower * 10) / 10,\r\n batteryPercent: Math.round(batterySoC * 10) / 10,\r\n eclipse: inEclipse,\r\n });\r\n }\r\n\r\n return data;\r\n}\r\n\r\n// =============================================================================\r\n// Attitude Generator\r\n// =============================================================================\r\n\r\nexport interface AttitudeGeneratorConfig {\r\n /** Initial attitude [roll, pitch, yaw] in degrees */\r\n initialAttitude?: [number, number, number];\r\n /** Target attitude [roll, pitch, yaw] in degrees */\r\n targetAttitude?: [number, number, number];\r\n /** Slew rate in deg/s */\r\n slewRate?: number;\r\n /** Settling time in seconds */\r\n settleTime?: number;\r\n /** Pointing jitter RMS in degrees */\r\n jitter?: number;\r\n /** Sampling rate in Hz */\r\n samplingRate?: number;\r\n /** Duration in seconds */\r\n duration?: number;\r\n}\r\n\r\n/**\r\n * Generate realistic spacecraft attitude telemetry\r\n *\r\n * Models:\r\n * - Slew maneuver with trapezoidal velocity profile\r\n * - Fine pointing settling with exponential decay\r\n * - Random jitter (Gaussian distribution)\r\n * - Angular velocity from finite differences\r\n */\r\nexport function generateAttitudeData(\r\n config: AttitudeGeneratorConfig = {},\r\n): AttitudeChartData[] {\r\n const {\r\n initialAttitude = [0, -45, 90],\r\n targetAttitude = [0, 30, 180],\r\n slewRate = 0.5,\r\n settleTime = 30,\r\n jitter = 0.02,\r\n samplingRate = 1,\r\n duration = 300,\r\n } = config;\r\n\r\n const data: AttitudeChartData[] = [];\r\n const dt = 1 / samplingRate;\r\n\r\n // Calculate slew geometry\r\n const deltaAttitude = targetAttitude.map((t, i) => t - initialAttitude[i]);\r\n const totalAngle = Math.sqrt(\r\n deltaAttitude.reduce((sum, d) => sum + d * d, 0),\r\n );\r\n const slewDuration = totalAngle / slewRate;\r\n const _unitVector = deltaAttitude.map((d) => d / totalAngle);\r\n\r\n // Gaussian random for jitter\r\n const gaussRandom = () => {\r\n const u1 = Math.random();\r\n const u2 = Math.random();\r\n return Math.sqrt(-2 * Math.log(u1)) * Math.cos(2 * Math.PI * u2);\r\n };\r\n\r\n let prevRoll = initialAttitude[0];\r\n let prevPitch = initialAttitude[1];\r\n let prevYaw = initialAttitude[2];\r\n\r\n for (let t = 0; t < duration; t += dt) {\r\n let roll: number, pitch: number, yaw: number;\r\n let pointingError: number;\r\n\r\n if (t < slewDuration) {\r\n // During slew\r\n const progress = t / slewDuration;\r\n const smoothProgress = 0.5 - 0.5 * Math.cos(progress * Math.PI); // Smooth ease\r\n roll = initialAttitude[0] + deltaAttitude[0] * smoothProgress;\r\n pitch = initialAttitude[1] + deltaAttitude[1] * smoothProgress;\r\n yaw = initialAttitude[2] + deltaAttitude[2] * smoothProgress;\r\n pointingError = totalAngle * (1 - progress);\r\n } else if (t < slewDuration + settleTime) {\r\n // Settling phase\r\n const settleProgress = (t - slewDuration) / settleTime;\r\n const decayFactor = Math.exp(-3 * settleProgress);\r\n const overshoot =\r\n 0.05 * Math.sin(settleProgress * Math.PI * 4) * decayFactor;\r\n\r\n roll = targetAttitude[0] + overshoot + jitter * gaussRandom();\r\n pitch = targetAttitude[1] + overshoot + jitter * gaussRandom();\r\n yaw = targetAttitude[2] + overshoot + jitter * gaussRandom();\r\n pointingError = Math.abs(overshoot) + jitter * Math.abs(gaussRandom());\r\n } else {\r\n // Fine pointing\r\n roll = targetAttitude[0] + jitter * gaussRandom();\r\n pitch = targetAttitude[1] + jitter * gaussRandom();\r\n yaw = targetAttitude[2] + jitter * gaussRandom();\r\n pointingError =\r\n jitter *\r\n Math.sqrt(\r\n Math.pow(gaussRandom(), 2) +\r\n Math.pow(gaussRandom(), 2) +\r\n Math.pow(gaussRandom(), 2),\r\n );\r\n }\r\n\r\n // Angular velocity from finite differences\r\n const angularVelocity = Math.sqrt(\r\n Math.pow((roll - prevRoll) / dt, 2) +\r\n Math.pow((pitch - prevPitch) / dt, 2) +\r\n Math.pow((yaw - prevYaw) / dt, 2),\r\n );\r\n\r\n data.push({\r\n time: Date.now() + t * 1000,\r\n roll: Math.round(roll * 100) / 100,\r\n pitch: Math.round(pitch * 100) / 100,\r\n yaw: Math.round(yaw * 100) / 100,\r\n pointingError: Math.round(pointingError * 1000) / 1000,\r\n angularVelocity: Math.round(angularVelocity * 1000) / 1000,\r\n });\r\n\r\n prevRoll = roll;\r\n prevPitch = pitch;\r\n prevYaw = yaw;\r\n }\r\n\r\n return data;\r\n}\r\n\r\n// =============================================================================\r\n// Doppler Track Generator\r\n// =============================================================================\r\n\r\nexport interface DopplerGeneratorConfig {\r\n /** Carrier frequency in Hz */\r\n carrierFrequency?: number;\r\n /** Satellite altitude in km */\r\n altitude?: number;\r\n /** Maximum elevation angle in degrees */\r\n maxElevation?: number;\r\n /** Pass duration in seconds */\r\n passDuration?: number;\r\n /** Time resolution in seconds */\r\n resolution?: number;\r\n /** Add measurement noise (Hz RMS) */\r\n measurementNoise?: number;\r\n /** Satellite name */\r\n satelliteName?: string;\r\n /** Ground station name */\r\n groundStation?: string;\r\n}\r\n\r\n/**\r\n * Generate realistic Doppler tracking data for a satellite pass\r\n *\r\n * Uses simplified orbital mechanics:\r\n * - Circular orbit at specified altitude\r\n * - Pass geometry from maximum elevation\r\n * - Doppler shift from velocity projection\r\n */\r\nexport function generateDopplerData(config: DopplerGeneratorConfig = {}): {\r\n predicted: DopplerTrackPoint[];\r\n measured: DopplerTrackPoint[];\r\n passInfo: SatellitePassInfo;\r\n} {\r\n const {\r\n carrierFrequency = 437e6, // 437 MHz (UHF amateur)\r\n altitude = 400, // km (ISS altitude)\r\n maxElevation = 75,\r\n passDuration = 600, // 10 minutes\r\n resolution = 1,\r\n measurementNoise = 50, // Hz\r\n satelliteName = \"ISS\",\r\n groundStation: _groundStation = \"Home Station\",\r\n } = config;\r\n\r\n const predicted: DopplerTrackPoint[] = [];\r\n const measured: DopplerTrackPoint[] = [];\r\n\r\n // Orbital velocity\r\n const orbitRadius = EARTH_RADIUS + altitude;\r\n const orbitalVelocity = Math.sqrt(MU_EARTH / orbitRadius); // km/s\r\n\r\n // Maximum Doppler shift\r\n const maxDoppler =\r\n carrierFrequency * ((orbitalVelocity * 1000) / SPEED_OF_LIGHT);\r\n\r\n // Calculate pass geometry\r\n const elevationRad = (maxElevation * Math.PI) / 180;\r\n const passHalfAngle = Math.PI / 2 - elevationRad;\r\n\r\n const now = Date.now();\r\n const aos = now;\r\n const los = now + passDuration * 1000;\r\n const tca = now + (passDuration / 2) * 1000;\r\n\r\n // Gaussian random for noise\r\n const gaussRandom = () => {\r\n const u1 = Math.random();\r\n const u2 = Math.random();\r\n return Math.sqrt(-2 * Math.log(u1)) * Math.cos(2 * Math.PI * u2);\r\n };\r\n\r\n for (let t = 0; t <= passDuration; t += resolution) {\r\n const time = now + t * 1000;\r\n const passPhase = t / passDuration; // 0 to 1\r\n const angle = (passPhase - 0.5) * 2 * passHalfAngle; // -halfAngle to +halfAngle\r\n\r\n // Doppler shift (maximum at edges, zero at TCA)\r\n const dopplerShift = maxDoppler * Math.sin(angle);\r\n\r\n // Elevation angle (maximum at TCA)\r\n const elevation = maxElevation * Math.cos(angle);\r\n\r\n predicted.push({\r\n time,\r\n dopplerShift: Math.round(dopplerShift),\r\n elevation: Math.round(elevation * 10) / 10,\r\n });\r\n\r\n // Simulated measured data with noise and bias\r\n const measuredShift = dopplerShift + measurementNoise * gaussRandom();\r\n measured.push({\r\n time,\r\n dopplerShift: Math.round(measuredShift),\r\n elevation: Math.round(elevation * 10) / 10,\r\n });\r\n }\r\n\r\n const passInfo: SatellitePassInfo = {\r\n name: satelliteName,\r\n aos: new Date(aos),\r\n los: new Date(los),\r\n tca: new Date(tca),\r\n maxElevation,\r\n };\r\n\r\n return { predicted, measured, passInfo };\r\n}\r\n\r\n// =============================================================================\r\n// Waterfall/Spectrum Generator\r\n// =============================================================================\r\n\r\nexport interface WaterfallGeneratorConfig {\r\n /** Center frequency in Hz */\r\n centerFrequency?: number;\r\n /** Bandwidth in Hz */\r\n bandwidth?: number;\r\n /** Number of FFT bins */\r\n fftBins?: number;\r\n /** Noise floor in dBm */\r\n noiseFloor?: number;\r\n /** Number of time samples */\r\n timeSamples?: number;\r\n /** Signals to include */\r\n signals?: Array<{\r\n /** Offset from center frequency (Hz) */\r\n offset: number;\r\n /** Signal power (dBm) */\r\n power: number;\r\n /** Signal bandwidth (Hz) */\r\n bandwidth: number;\r\n /** Signal type */\r\n type: \"cw\" | \"ssb\" | \"digital\" | \"beacon\";\r\n /** Doppler drift (Hz/s) - for moving signals */\r\n dopplerDrift?: number;\r\n }>;\r\n}\r\n\r\n/**\r\n * Generate realistic RF waterfall data\r\n *\r\n * Models:\r\n * - Gaussian noise floor\r\n * - CW signals (narrow spikes)\r\n * - SSB signals (offset sideband with modulation)\r\n * - Digital signals (wider, flatter spectrum)\r\n * - Time-varying Doppler drift\r\n */\r\nexport function generateWaterfallData(\r\n config: WaterfallGeneratorConfig = {},\r\n): WaterfallDataPoint[] {\r\n const {\r\n centerFrequency = 437e6,\r\n bandwidth = 100e3,\r\n fftBins = 512,\r\n noiseFloor = -120,\r\n timeSamples = 100,\r\n signals = [\r\n { offset: -30e3, power: -80, bandwidth: 500, type: \"cw\" as const },\r\n { offset: 0, power: -75, bandwidth: 20e3, type: \"digital\" as const },\r\n { offset: 25e3, power: -90, bandwidth: 3e3, type: \"ssb\" as const },\r\n ],\r\n } = config;\r\n\r\n const data: WaterfallDataPoint[] = [];\r\n const freqStep = bandwidth / fftBins;\r\n const noiseStdDev = 3; // dB variation\r\n\r\n // Gaussian random\r\n const gaussRandom = () => {\r\n const u1 = Math.random();\r\n const u2 = Math.random();\r\n return Math.sqrt(-2 * Math.log(u1)) * Math.cos(2 * Math.PI * u2);\r\n };\r\n\r\n // Pre-compute frequency bins (constant for all time slices)\r\n const frequencies: number[] = [];\r\n for (let f = 0; f < fftBins; f++) {\r\n frequencies.push(centerFrequency + (f - fftBins / 2) * freqStep);\r\n }\r\n\r\n for (let t = 0; t < timeSamples; t++) {\r\n const powers: number[] = [];\r\n const time = Date.now() - (timeSamples - t) * 100; // 100ms between samples\r\n\r\n for (let f = 0; f < fftBins; f++) {\r\n const freqOffset = (f - fftBins / 2) * freqStep;\r\n let power = noiseFloor + noiseStdDev * gaussRandom();\r\n\r\n // Add signals\r\n for (const signal of signals) {\r\n const signalOffset =\r\n signal.offset + (signal.dopplerDrift || 0) * (t / 10);\r\n const distance = Math.abs(freqOffset - signalOffset);\r\n\r\n if (signal.type === \"cw\") {\r\n // Narrow CW signal (sinc-like)\r\n if (distance < signal.bandwidth * 2) {\r\n const shape = Math.pow(\r\n Math.sin((Math.PI * distance) / signal.bandwidth) /\r\n ((Math.PI * distance) / signal.bandwidth + 0.001),\r\n 2,\r\n );\r\n power = Math.max(\r\n power,\r\n signal.power + 10 * Math.log10(shape + 0.001) + gaussRandom(),\r\n );\r\n }\r\n } else if (signal.type === \"ssb\") {\r\n // SSB with voice-like modulation\r\n if (\r\n freqOffset >= signalOffset &&\r\n freqOffset <= signalOffset + signal.bandwidth\r\n ) {\r\n const modulation = 0.5 + 0.5 * Math.sin(t * 0.3 + f * 0.1);\r\n power = Math.max(\r\n power,\r\n signal.power - 3 + 6 * modulation + 2 * gaussRandom(),\r\n );\r\n }\r\n } else if (signal.type === \"digital\") {\r\n // Digital signal (flat-topped with rolloff)\r\n if (distance < signal.bandwidth / 2) {\r\n power = Math.max(power, signal.power + gaussRandom());\r\n } else if (distance < signal.bandwidth) {\r\n const rolloff =\r\n 1 - (distance - signal.bandwidth / 2) / (signal.bandwidth / 2);\r\n power = Math.max(\r\n power,\r\n signal.power - 20 * (1 - rolloff) + gaussRandom(),\r\n );\r\n }\r\n } else if (signal.type === \"beacon\") {\r\n // Beacon (stable CW)\r\n if (distance < signal.bandwidth) {\r\n power = Math.max(power, signal.power);\r\n }\r\n }\r\n }\r\n\r\n powers.push(Math.round(power * 10) / 10);\r\n }\r\n\r\n data.push({ time, frequencies: [...frequencies], powers });\r\n }\r\n\r\n return data;\r\n}\r\n\r\n// =============================================================================\r\n// Contact Window Generator\r\n// =============================================================================\r\n\r\nexport interface ContactGeneratorConfig {\r\n /** Ground stations */\r\n groundStations?: Array<{\r\n name: string;\r\n latitude: number;\r\n longitude: number;\r\n }>;\r\n /** Satellite altitude (km) */\r\n altitude?: number;\r\n /** Orbit inclination (degrees) */\r\n inclination?: number;\r\n /** Simulation duration (hours) */\r\n duration?: number;\r\n /** Minimum elevation (degrees) */\r\n minElevation?: number;\r\n}\r\n\r\n/**\r\n * Generate realistic ground station contact windows\r\n *\r\n * Uses simplified visibility calculation based on:\r\n * - Orbital period from altitude\r\n * - Swath width from elevation angle\r\n * - Ground track precession\r\n */\r\nexport function generateContactWindows(\r\n config: ContactGeneratorConfig = {},\r\n): ContactWindowData[] {\r\n const {\r\n groundStations = [\r\n { name: \"Svalbard (SG)\", latitude: 78.2, longitude: 15.4 },\r\n { name: \"McMurdo (MCM)\", latitude: -77.8, longitude: 166.7 },\r\n { name: \"Hawaii (HBK)\", latitude: 21.5, longitude: -158.0 },\r\n { name: \"Kiruna (KIR)\", latitude: 67.9, longitude: 20.9 },\r\n ],\r\n altitude = 400,\r\n inclination = 51.6,\r\n duration = 24,\r\n minElevation = 5,\r\n } = config;\r\n\r\n const result: ContactWindowData[] = [];\r\n const now = Date.now();\r\n const orbitPeriod =\r\n 2 * Math.PI * Math.sqrt(Math.pow(EARTH_RADIUS + altitude, 3) / MU_EARTH);\r\n const passesPerDay = Math.floor((duration * 3600) / orbitPeriod);\r\n\r\n for (const gs of groundStations) {\r\n const windows: ContactWindowData[\"windows\"] = [];\r\n\r\n // Determine visibility based on latitude and inclination\r\n const isVisible = Math.abs(gs.latitude) <= inclination + 15;\r\n if (!isVisible) continue;\r\n\r\n // Generate passes based on ground station latitude\r\n const passesForStation = Math.floor(\r\n passesPerDay * (0.3 + 0.7 * Math.cos((gs.latitude * Math.PI) / 180)),\r\n );\r\n\r\n for (let i = 0; i < passesForStation; i++) {\r\n const passStart = now + (i * duration * 3600 * 1000) / passesForStation;\r\n const passStart2 = passStart + (Math.random() - 0.5) * orbitPeriod * 500; // Jitter\r\n\r\n // Pass duration depends on elevation (higher el = shorter duration but better signal)\r\n const maxEl = minElevation + Math.random() * (85 - minElevation);\r\n const passDuration = 10 * 60 * 1000 * (1 - maxEl / 180); // 5-10 minutes\r\n\r\n const signalQuality =\r\n maxEl > 45 ? \"good\" : maxEl > 20 ? \"marginal\" : \"poor\";\r\n\r\n windows.push({\r\n start: passStart2,\r\n end: passStart2 + passDuration,\r\n label: `Pass ${i + 1}`,\r\n signalQuality: signalQuality as \"good\" | \"marginal\" | \"poor\",\r\n elevation: Math.round(maxEl),\r\n });\r\n }\r\n\r\n result.push({ id: gs.name, name: gs.name, windows });\r\n }\r\n\r\n return result;\r\n}\r\n\r\n// =============================================================================\r\n// Heliocentric Orbit Generator\r\n// =============================================================================\r\n\r\nexport interface HeliocentricGeneratorConfig {\r\n /** Bodies to include */\r\n bodies?: Array<{\r\n name: string;\r\n type: \"planet\" | \"spacecraft\" | \"asteroid\" | \"comet\";\r\n semiMajorAxis: number; // AU\r\n eccentricity: number;\r\n inclination: number; // degrees\r\n argumentOfPerihelion: number; // degrees\r\n trueAnomaly: number; // degrees (current position)\r\n color?: string;\r\n }>;\r\n /** Number of points per orbit */\r\n orbitPoints?: number;\r\n}\r\n\r\n/**\r\n * Generate heliocentric orbit visualization data\r\n */\r\nexport function generateHeliocentricOrbits(\r\n config: HeliocentricGeneratorConfig = {},\r\n): HeliocentricOrbitData[] {\r\n const {\r\n bodies = [\r\n {\r\n name: \"Earth\",\r\n type: \"planet\" as const,\r\n semiMajorAxis: 1.0,\r\n eccentricity: 0.017,\r\n inclination: 0,\r\n argumentOfPerihelion: 102,\r\n trueAnomaly: 0,\r\n color: \"#3498db\",\r\n },\r\n {\r\n name: \"Mars\",\r\n type: \"planet\" as const,\r\n semiMajorAxis: 1.52,\r\n eccentricity: 0.093,\r\n inclination: 1.85,\r\n argumentOfPerihelion: 286,\r\n trueAnomaly: 45,\r\n color: \"#e74c3c\",\r\n },\r\n {\r\n name: \"Voyager 1\",\r\n type: \"spacecraft\" as const,\r\n semiMajorAxis: 40,\r\n eccentricity: 0.99,\r\n inclination: 35,\r\n argumentOfPerihelion: 0,\r\n trueAnomaly: 170,\r\n color: \"#3E3CFF\",\r\n },\r\n ],\r\n orbitPoints = 72,\r\n } = config;\r\n\r\n return bodies.map((body) => {\r\n const {\r\n semiMajorAxis: a,\r\n eccentricity: e,\r\n inclination: i,\r\n argumentOfPerihelion: omega,\r\n trueAnomaly: nu,\r\n } = body;\r\n\r\n // Generate orbit path\r\n const orbitPath: { x: number; y: number; z: number }[] = [];\r\n for (let j = 0; j <= orbitPoints; j++) {\r\n const angle = (j / orbitPoints) * 2 * Math.PI;\r\n const r = (a * (1 - e * e)) / (1 + e * Math.cos(angle));\r\n\r\n // Rotate by argument of perihelion and inclination\r\n const xOrbit = r * Math.cos(angle);\r\n const yOrbit = r * Math.sin(angle);\r\n\r\n const omegaRad = (omega * Math.PI) / 180;\r\n const iRad = (i * Math.PI) / 180;\r\n\r\n const x =\r\n xOrbit * Math.cos(omegaRad) -\r\n yOrbit * Math.cos(iRad) * Math.sin(omegaRad);\r\n const y =\r\n xOrbit * Math.sin(omegaRad) +\r\n yOrbit * Math.cos(iRad) * Math.cos(omegaRad);\r\n const z = yOrbit * Math.sin(iRad);\r\n\r\n orbitPath.push({ x, y, z });\r\n }\r\n\r\n // Current position\r\n const nuRad = (nu * Math.PI) / 180;\r\n const r = (a * (1 - e * e)) / (1 + e * Math.cos(nuRad));\r\n const xOrbit = r * Math.cos(nuRad);\r\n const yOrbit = r * Math.sin(nuRad);\r\n\r\n const omegaRad = (omega * Math.PI) / 180;\r\n const iRad = (i * Math.PI) / 180;\r\n\r\n const x =\r\n xOrbit * Math.cos(omegaRad) -\r\n yOrbit * Math.cos(iRad) * Math.sin(omegaRad);\r\n const y =\r\n xOrbit * Math.sin(omegaRad) +\r\n yOrbit * Math.cos(iRad) * Math.cos(omegaRad);\r\n const z = yOrbit * Math.sin(iRad);\r\n\r\n // Orbital period in days\r\n const period = 365.25 * Math.pow(a, 1.5);\r\n\r\n return {\r\n name: body.name,\r\n type: body.type,\r\n x,\r\n y,\r\n z,\r\n orbitPath,\r\n color: body.color,\r\n semiMajorAxis: a,\r\n period,\r\n inclination: i,\r\n size: body.type === \"planet\" ? 20 : 12,\r\n };\r\n });\r\n}\r\n\r\n// =============================================================================\r\n// Spectrum Generator (single FFT snapshot)\r\n// =============================================================================\r\n\r\nexport interface SpectrumGeneratorConfig {\r\n /** Center frequency (Hz) */\r\n centerFrequency?: number;\r\n /** Bandwidth (Hz) */\r\n bandwidth?: number;\r\n /** Number of points */\r\n points?: number;\r\n /** Noise floor (dBm) */\r\n noiseFloor?: number;\r\n /** Signals */\r\n signals?: Array<{\r\n frequency: number;\r\n power: number;\r\n bandwidth: number;\r\n }>;\r\n}\r\n\r\n/**\r\n * Generate a single RF spectrum snapshot\r\n */\r\nexport function generateSpectrum(\r\n config: SpectrumGeneratorConfig = {},\r\n): SpectrumDataPoint[] {\r\n const {\r\n centerFrequency = 2200e6,\r\n bandwidth = 10e6,\r\n points = 256,\r\n noiseFloor = -120,\r\n signals = [\r\n { frequency: 2200e6, power: -75, bandwidth: 100e3 },\r\n { frequency: 2197.5e6, power: -80, bandwidth: 10e3 },\r\n { frequency: 2202.5e6, power: -95, bandwidth: 50e3 },\r\n ],\r\n } = config;\r\n\r\n const data: SpectrumDataPoint[] = [];\r\n const freqMin = centerFrequency - bandwidth / 2;\r\n const freqStep = bandwidth / points;\r\n\r\n for (let i = 0; i < points; i++) {\r\n const freq = freqMin + i * freqStep;\r\n let power = noiseFloor + 3 * (Math.random() - 0.5);\r\n\r\n for (const signal of signals) {\r\n const distance = Math.abs(freq - signal.frequency);\r\n if (distance < signal.bandwidth * 2) {\r\n const attenuation =\r\n 20 * Math.log10(1 + distance / (signal.bandwidth / 2));\r\n power = Math.max(power, signal.power - attenuation);\r\n }\r\n }\r\n\r\n data.push({ frequency: freq, power: Math.round(power * 10) / 10 });\r\n }\r\n\r\n return data;\r\n}\r\n\r\n// =============================================================================\r\n// Eclipse Timeline Generator\r\n// =============================================================================\r\n\r\nexport interface EclipseGeneratorConfig {\r\n /** Orbit period (seconds) */\r\n orbitPeriod?: number;\r\n /** Eclipse fraction (0-1) */\r\n eclipseFraction?: number;\r\n /** Number of orbits */\r\n orbits?: number;\r\n /** Include penumbra */\r\n includePenumbra?: boolean;\r\n}\r\n\r\n/**\r\n * Generate eclipse timeline data\r\n */\r\nexport function generateEclipseTimeline(\r\n config: EclipseGeneratorConfig = {},\r\n): EclipseTimelineData[] {\r\n const {\r\n orbitPeriod = 5400,\r\n eclipseFraction = 0.38,\r\n orbits = 5,\r\n includePenumbra = true,\r\n } = config;\r\n\r\n const data: EclipseTimelineData[] = [];\r\n const now = Date.now();\r\n const penumbraDuration = includePenumbra ? 60 : 0; // 1 minute penumbra\r\n\r\n for (let orbit = 0; orbit < orbits; orbit++) {\r\n const orbitStart = now + orbit * orbitPeriod * 1000;\r\n const eclipseStart = orbitStart + orbitPeriod * 0.4 * 1000;\r\n const eclipseEnd = eclipseStart + orbitPeriod * eclipseFraction * 1000;\r\n\r\n // Sunlight before eclipse\r\n data.push({\r\n start: orbitStart,\r\n end: eclipseStart - penumbraDuration * 1000,\r\n type: \"sunlight\",\r\n orbitNumber: orbit + 1,\r\n });\r\n\r\n // Penumbra entry\r\n if (includePenumbra) {\r\n data.push({\r\n start: eclipseStart - penumbraDuration * 1000,\r\n end: eclipseStart,\r\n type: \"penumbra\",\r\n orbitNumber: orbit + 1,\r\n });\r\n }\r\n\r\n // Umbra\r\n data.push({\r\n start: eclipseStart,\r\n end: eclipseEnd,\r\n type: \"umbra\",\r\n orbitNumber: orbit + 1,\r\n });\r\n\r\n // Penumbra exit\r\n if (includePenumbra) {\r\n data.push({\r\n start: eclipseEnd,\r\n end: eclipseEnd + penumbraDuration * 1000,\r\n type: \"penumbra\",\r\n orbitNumber: orbit + 1,\r\n });\r\n }\r\n\r\n // Sunlight after eclipse\r\n data.push({\r\n start: eclipseEnd + penumbraDuration * 1000,\r\n end: orbitStart + orbitPeriod * 1000,\r\n type: \"sunlight\",\r\n orbitNumber: orbit + 1,\r\n });\r\n }\r\n\r\n return data;\r\n}\r\n\r\n// =============================================================================\r\n// Constellation Coverage Generator\r\n// =============================================================================\r\n\r\nexport interface CoverageGeneratorConfig {\r\n /** Latitude resolution (degrees) */\r\n latResolution?: number;\r\n /** Longitude resolution (degrees) */\r\n lonResolution?: number;\r\n /** Number of orbital planes */\r\n planes?: number;\r\n /** Satellites per plane */\r\n satsPerPlane?: number;\r\n /** Orbit altitude (km) */\r\n altitude?: number;\r\n /** Orbit inclination (degrees) */\r\n inclination?: number;\r\n /** Metric to compute: 'visibility' | 'revisitTime' | 'latency' */\r\n metric?: \"visibility\" | \"revisitTime\" | \"latency\";\r\n}\r\n\r\n/**\r\n * Generate constellation coverage grid data\r\n *\r\n * Models simplified visibility based on satellite altitude\r\n * and ground footprint overlap from Walker constellation geometry.\r\n */\r\nexport function generateConstellationCoverage(\r\n config: CoverageGeneratorConfig = {},\r\n): {\r\n latitudes: number[];\r\n longitudes: number[];\r\n coverage: number[][];\r\n unit: string;\r\n} {\r\n const {\r\n latResolution = 5,\r\n lonResolution = 5,\r\n planes = 6,\r\n satsPerPlane = 22,\r\n altitude = 550,\r\n inclination = 53,\r\n metric = \"visibility\",\r\n } = config;\r\n\r\n const latitudes: number[] = [];\r\n const longitudes: number[] = [];\r\n const coverage: number[][] = [];\r\n\r\n for (let lat = -90; lat <= 90; lat += latResolution) latitudes.push(lat);\r\n for (let lon = -180; lon < 180; lon += lonResolution) longitudes.push(lon);\r\n\r\n // Footprint half-angle from altitude\r\n const earthRadius = 6371;\r\n const footprintAngle =\r\n Math.acos(earthRadius / (earthRadius + altitude)) * (180 / Math.PI);\r\n const totalSats = planes * satsPerPlane;\r\n\r\n for (let li = 0; li < latitudes.length; li++) {\r\n const row: number[] = [];\r\n const lat = latitudes[li];\r\n const _latRad = (lat * Math.PI) / 180;\r\n\r\n for (let lj = 0; lj < longitudes.length; lj++) {\r\n let value: number;\r\n\r\n // Coverage depends on latitude vs inclination\r\n const latFactor =\r\n Math.abs(lat) <= inclination\r\n ? 1.0\r\n : Math.max(0, 1.0 - (Math.abs(lat) - inclination) / 20);\r\n\r\n // Base coverage from constellation density\r\n const densityFactor = totalSats / 100;\r\n const footprintOverlap = Math.min(\r\n 1,\r\n densityFactor * (footprintAngle / 30),\r\n );\r\n\r\n if (metric === \"visibility\") {\r\n // Percentage of time with at least 1 satellite visible\r\n value = Math.min(100, footprintOverlap * latFactor * 100);\r\n // Add polar convergence bonus\r\n if (Math.abs(lat) > 60) value = Math.min(100, value * 1.2);\r\n // Add noise\r\n value += (Math.random() - 0.5) * 5;\r\n value = Math.max(0, Math.min(100, value));\r\n } else if (metric === \"revisitTime\") {\r\n // Minutes between passes (lower is better)\r\n const baseRevisit = 90 / (footprintOverlap * latFactor + 0.01);\r\n value = Math.max(\r\n 1,\r\n Math.min(120, baseRevisit + (Math.random() - 0.5) * 10),\r\n );\r\n } else {\r\n // Latency in ms (one-way)\r\n const slantRange =\r\n altitude / Math.sin(Math.max(0.1, (latFactor * Math.PI) / 4));\r\n value = slantRange / 300 + 2 + Math.random() * 2; // ms\r\n }\r\n\r\n row.push(Math.round(value * 10) / 10);\r\n }\r\n coverage.push(row);\r\n }\r\n\r\n const units: Record<string, string> = {\r\n visibility: \"%\",\r\n revisitTime: \"min\",\r\n latency: \"ms\",\r\n };\r\n return { latitudes, longitudes, coverage, unit: units[metric] || \"%\" };\r\n}\r\n\r\n// =============================================================================\r\n// Conjunction Event Generator\r\n// =============================================================================\r\n\r\nexport interface ConjunctionGeneratorConfig {\r\n /** Primary object name */\r\n primaryName?: string;\r\n /** Number of events to generate */\r\n eventCount?: number;\r\n /** Time range in hours */\r\n timeRangeHours?: number;\r\n /** Include high-risk events */\r\n includeHighRisk?: boolean;\r\n}\r\n\r\n/**\r\n * Generate realistic conjunction/close approach events\r\n */\r\nexport function generateConjunctionEvents(\r\n config: ConjunctionGeneratorConfig = {},\r\n): Array<{\r\n id: string;\r\n primary: string;\r\n secondary: string;\r\n tca: number;\r\n missDistance: number;\r\n probability: number;\r\n relativeVelocity: number;\r\n position: { x: number; y: number; z: number };\r\n uncertainty?: { rx: number; ry: number; rz: number };\r\n}> {\r\n const {\r\n primaryName = \"SAT-ALPHA\",\r\n eventCount = 12,\r\n timeRangeHours = 72,\r\n includeHighRisk = true,\r\n } = config;\r\n\r\n const secondaries = [\r\n \"COSMOS-2251 DEB\",\r\n \"FENGYUN-1C DEB\",\r\n \"SL-16 R/B\",\r\n \"IRIDIUM 33 DEB\",\r\n \"NOAA 17 DEB\",\r\n \"ATLAS 5 CENTAUR R/B\",\r\n \"BREEZE-M DEB\",\r\n \"CZ-3B R/B\",\r\n \"UNKNOWN DEB\",\r\n \"MICROSAT-R DEB\",\r\n \"DELTA 2 R/B\",\r\n \"H-2A R/B\",\r\n ];\r\n\r\n const now = Date.now();\r\n const events = [];\r\n\r\n for (let i = 0; i < eventCount; i++) {\r\n const tca = now + Math.random() * timeRangeHours * 3600000;\r\n let missDistance: number;\r\n\r\n if (includeHighRisk && i < 2) {\r\n missDistance = 0.1 + Math.random() * 0.9; // Critical: < 1 km\r\n } else if (i < 5) {\r\n missDistance = 1 + Math.random() * 4; // Warning: 1-5 km\r\n } else {\r\n missDistance = 5 + Math.random() * 15; // Safe: > 5 km\r\n }\r\n\r\n const probability = Math.pow(10, -3 - missDistance * 1.5 + Math.random());\r\n const relativeVelocity = 5 + Math.random() * 12;\r\n\r\n const angle = Math.random() * 2 * Math.PI;\r\n const incAngle = (Math.random() - 0.5) * Math.PI;\r\n const radius = 6800 + Math.random() * 600;\r\n\r\n events.push({\r\n id: `CDM-${String(i + 1).padStart(3, \"0\")}`,\r\n primary: primaryName,\r\n secondary: secondaries[i % secondaries.length],\r\n tca,\r\n missDistance: Math.round(missDistance * 1000) / 1000,\r\n probability: Math.max(1e-10, probability),\r\n relativeVelocity: Math.round(relativeVelocity * 100) / 100,\r\n position: {\r\n x: Math.round(radius * Math.cos(angle) * Math.cos(incAngle)),\r\n y: Math.round(radius * Math.sin(angle) * Math.cos(incAngle)),\r\n z: Math.round(radius * Math.sin(incAngle)),\r\n },\r\n uncertainty: {\r\n rx: 20 + Math.random() * 100,\r\n ry: 50 + Math.random() * 300,\r\n rz: 10 + Math.random() * 60,\r\n },\r\n });\r\n }\r\n\r\n return events.sort((a, b) => a.tca - b.tca);\r\n}\r\n\r\nexport default {\r\n generatePowerData,\r\n generateAttitudeData,\r\n generateDopplerData,\r\n generateWaterfallData,\r\n generateContactWindows,\r\n generateHeliocentricOrbits,\r\n generateSpectrum,\r\n generateEclipseTimeline,\r\n generateConstellationCoverage,\r\n generateConjunctionEvents,\r\n};\r\n"],"mappings":";AAyBA,IAAM,iBAAiB;AACvB,IAAM,eAAe;AACrB,IAAM,WAAW;;;;;;;;;;AAoCjB,SAAgB,kBACd,SAA+B,CAAC,GACd;CAClB,MAAM,EACJ,cAAc,MACd,kBAAkB,MAClB,kBAAkB,IAClB,YAAY,IACZ,kBAAkB,KAClB,aAAa,IACb,uBAAuB,IACvB,SAAS,GACT,aAAa,OACX;CAEJ,MAAM,OAAyB,CAAC;CAChC,MAAM,gBAAgB,cAAc;CACpC,IAAI,aAAa;CACjB,MAAM,oBAAoB;CAG1B,MAAM,eAAe;CACrB,MAAM,aAAa,eAAe,kBAAkB;CAEpD,KAAK,IAAI,IAAI,GAAG,IAAI,eAAe,KAAK,YAAY;EAClD,MAAM,aAAc,IAAI,cAAe;EACvC,MAAM,YAAY,cAAc,gBAAgB,aAAa;EAG7D,MAAM,iBAAiB,KAAM,KAAM,KAAK,IAAI,aAAa,KAAK,KAAK,CAAC;EACpE,MAAM,aAAa,YAAY,IAAI,kBAAkB;EAGrD,MAAM,cAAc,YAChB,YAAY,uBACZ;EAGJ,MAAM,WAAW,aAAa;EAG9B,MAAM,cAAe,WAAW,aAAc;EAG9C,cAAgB,eADd,WAAW,IAAI,oBAAoB,IAAI,qBACS,kBAAmB;EACrE,aAAa,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,UAAU,CAAC;EAElD,KAAK,KAAK;GACR,MAAM,KAAK,IAAI,IAAI,IAAI;GACvB,YAAY,KAAK,MAAM,aAAa,EAAE,IAAI;GAC1C,aAAa,KAAK,MAAM,cAAc,EAAE,IAAI;GAC5C,UAAU,KAAK,MAAM,WAAW,EAAE,IAAI;GACtC,gBAAgB,KAAK,MAAM,aAAa,EAAE,IAAI;GAC9C,SAAS;EACX,CAAC;CACH;CAEA,OAAO;AACT;;;;;;;;;;AAgCA,SAAgB,qBACd,SAAkC,CAAC,GACd;CACrB,MAAM,EACJ,kBAAkB;EAAC;EAAG;EAAK;CAAE,GAC7B,iBAAiB;EAAC;EAAG;EAAI;CAAG,GAC5B,WAAW,IACX,aAAa,IACb,SAAS,KACT,eAAe,GACf,WAAW,QACT;CAEJ,MAAM,OAA4B,CAAC;CACnC,MAAM,KAAK,IAAI;CAGf,MAAM,gBAAgB,eAAe,KAAK,GAAG,MAAM,IAAI,gBAAgB,EAAE;CACzE,MAAM,aAAa,KAAK,KACtB,cAAc,QAAQ,KAAK,MAAM,MAAM,IAAI,GAAG,CAAC,CACjD;CACA,MAAM,eAAe,aAAa;CACd,cAAc,KAAK,MAAM,IAAI,UAAU;CAG3D,MAAM,oBAAoB;EACxB,MAAM,KAAK,KAAK,OAAO;EACvB,MAAM,KAAK,KAAK,OAAO;EACvB,OAAO,KAAK,KAAK,KAAK,KAAK,IAAI,EAAE,CAAC,IAAI,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE;CACjE;CAEA,IAAI,WAAW,gBAAgB;CAC/B,IAAI,YAAY,gBAAgB;CAChC,IAAI,UAAU,gBAAgB;CAE9B,KAAK,IAAI,IAAI,GAAG,IAAI,UAAU,KAAK,IAAI;EACrC,IAAI,MAAc,OAAe;EACjC,IAAI;EAEJ,IAAI,IAAI,cAAc;GAEpB,MAAM,WAAW,IAAI;GACrB,MAAM,iBAAiB,KAAM,KAAM,KAAK,IAAI,WAAW,KAAK,EAAE;GAC9D,OAAO,gBAAgB,KAAK,cAAc,KAAK;GAC/C,QAAQ,gBAAgB,KAAK,cAAc,KAAK;GAChD,MAAM,gBAAgB,KAAK,cAAc,KAAK;GAC9C,gBAAgB,cAAc,IAAI;EACpC,OAAO,IAAI,IAAI,eAAe,YAAY;GAExC,MAAM,kBAAkB,IAAI,gBAAgB;GAC5C,MAAM,cAAc,KAAK,IAAI,KAAK,cAAc;GAChD,MAAM,YACJ,MAAO,KAAK,IAAI,iBAAiB,KAAK,KAAK,CAAC,IAAI;GAElD,OAAO,eAAe,KAAK,YAAY,SAAS,YAAY;GAC5D,QAAQ,eAAe,KAAK,YAAY,SAAS,YAAY;GAC7D,MAAM,eAAe,KAAK,YAAY,SAAS,YAAY;GAC3D,gBAAgB,KAAK,IAAI,SAAS,IAAI,SAAS,KAAK,IAAI,YAAY,CAAC;EACvE,OAAO;GAEL,OAAO,eAAe,KAAK,SAAS,YAAY;GAChD,QAAQ,eAAe,KAAK,SAAS,YAAY;GACjD,MAAM,eAAe,KAAK,SAAS,YAAY;GAC/C,gBACE,SACA,KAAK,KACH,KAAK,IAAI,YAAY,GAAG,CAAC,IACvB,KAAK,IAAI,YAAY,GAAG,CAAC,IACzB,KAAK,IAAI,YAAY,GAAG,CAAC,CAC7B;EACJ;EAGA,MAAM,kBAAkB,KAAK,KAC3B,KAAK,KAAK,OAAO,YAAY,IAAI,CAAC,IAChC,KAAK,KAAK,QAAQ,aAAa,IAAI,CAAC,IACpC,KAAK,KAAK,MAAM,WAAW,IAAI,CAAC,CACpC;EAEA,KAAK,KAAK;GACR,MAAM,KAAK,IAAI,IAAI,IAAI;GACvB,MAAM,KAAK,MAAM,OAAO,GAAG,IAAI;GAC/B,OAAO,KAAK,MAAM,QAAQ,GAAG,IAAI;GACjC,KAAK,KAAK,MAAM,MAAM,GAAG,IAAI;GAC7B,eAAe,KAAK,MAAM,gBAAgB,GAAI,IAAI;GAClD,iBAAiB,KAAK,MAAM,kBAAkB,GAAI,IAAI;EACxD,CAAC;EAED,WAAW;EACX,YAAY;EACZ,UAAU;CACZ;CAEA,OAAO;AACT;;;;;;;;;AAiCA,SAAgB,oBAAoB,SAAiC,CAAC,GAIpE;CACA,MAAM,EACJ,mBAAmB,OACnB,WAAW,KACX,eAAe,IACf,eAAe,KACf,aAAa,GACb,mBAAmB,IACnB,gBAAgB,OAChB,eAAe,iBAAiB,mBAC9B;CAEJ,MAAM,YAAiC,CAAC;CACxC,MAAM,WAAgC,CAAC;CAGvC,MAAM,cAAc,eAAe;CAInC,MAAM,aACJ,oBAJsB,KAAK,KAAK,WAAW,WAItB,IAAkB,MAAQ;CAGjD,MAAM,eAAgB,eAAe,KAAK,KAAM;CAChD,MAAM,gBAAgB,KAAK,KAAK,IAAI;CAEpC,MAAM,MAAM,KAAK,IAAI;CACrB,MAAM,MAAM;CACZ,MAAM,MAAM,MAAM,eAAe;CACjC,MAAM,MAAM,MAAO,eAAe,IAAK;CAGvC,MAAM,oBAAoB;EACxB,MAAM,KAAK,KAAK,OAAO;EACvB,MAAM,KAAK,KAAK,OAAO;EACvB,OAAO,KAAK,KAAK,KAAK,KAAK,IAAI,EAAE,CAAC,IAAI,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE;CACjE;CAEA,KAAK,IAAI,IAAI,GAAG,KAAK,cAAc,KAAK,YAAY;EAClD,MAAM,OAAO,MAAM,IAAI;EAEvB,MAAM,SADY,IAAI,eACK,MAAO,IAAI;EAGtC,MAAM,eAAe,aAAa,KAAK,IAAI,KAAK;EAGhD,MAAM,YAAY,eAAe,KAAK,IAAI,KAAK;EAE/C,UAAU,KAAK;GACb;GACA,cAAc,KAAK,MAAM,YAAY;GACrC,WAAW,KAAK,MAAM,YAAY,EAAE,IAAI;EAC1C,CAAC;EAGD,MAAM,gBAAgB,eAAe,mBAAmB,YAAY;EACpE,SAAS,KAAK;GACZ;GACA,cAAc,KAAK,MAAM,aAAa;GACtC,WAAW,KAAK,MAAM,YAAY,EAAE,IAAI;EAC1C,CAAC;CACH;CAUA,OAAO;EAAE;EAAW;EAAU,UAAA;GAP5B,MAAM;GACN,KAAK,IAAI,KAAK,GAAG;GACjB,KAAK,IAAI,KAAK,GAAG;GACjB,KAAK,IAAI,KAAK,GAAG;GACjB;EAG4B;CAAS;AACzC;;;;;;;;;;;AA0CA,SAAgB,sBACd,SAAmC,CAAC,GACd;CACtB,MAAM,EACJ,kBAAkB,OAClB,YAAY,KACZ,UAAU,KACV,aAAa,MACb,cAAc,KACd,UAAU;EACR;GAAE,QAAQ;GAAO,OAAO;GAAK,WAAW;GAAK,MAAM;EAAc;EACjE;GAAE,QAAQ;GAAG,OAAO;GAAK,WAAW;GAAM,MAAM;EAAmB;EACnE;GAAE,QAAQ;GAAM,OAAO;GAAK,WAAW;GAAK,MAAM;EAAe;CACnE,MACE;CAEJ,MAAM,OAA6B,CAAC;CACpC,MAAM,WAAW,YAAY;CAC7B,MAAM,cAAc;CAGpB,MAAM,oBAAoB;EACxB,MAAM,KAAK,KAAK,OAAO;EACvB,MAAM,KAAK,KAAK,OAAO;EACvB,OAAO,KAAK,KAAK,KAAK,KAAK,IAAI,EAAE,CAAC,IAAI,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE;CACjE;CAGA,MAAM,cAAwB,CAAC;CAC/B,KAAK,IAAI,IAAI,GAAG,IAAI,SAAS,KAC3B,YAAY,KAAK,mBAAmB,IAAI,UAAU,KAAK,QAAQ;CAGjE,KAAK,IAAI,IAAI,GAAG,IAAI,aAAa,KAAK;EACpC,MAAM,SAAmB,CAAC;EAC1B,MAAM,OAAO,KAAK,IAAI,KAAK,cAAc,KAAK;EAE9C,KAAK,IAAI,IAAI,GAAG,IAAI,SAAS,KAAK;GAChC,MAAM,cAAc,IAAI,UAAU,KAAK;GACvC,IAAI,QAAQ,aAAa,cAAc,YAAY;GAGnD,KAAK,MAAM,UAAU,SAAS;IAC5B,MAAM,eACJ,OAAO,UAAU,OAAO,gBAAgB,MAAM,IAAI;IACpD,MAAM,WAAW,KAAK,IAAI,aAAa,YAAY;IAEnD,IAAI,OAAO,SAAS;SAEd,WAAW,OAAO,YAAY,GAAG;MACnC,MAAM,QAAQ,KAAK,IACjB,KAAK,IAAK,KAAK,KAAK,WAAY,OAAO,SAAS,KAC5C,KAAK,KAAK,WAAY,OAAO,YAAY,OAC7C,CACF;MACA,QAAQ,KAAK,IACX,OACA,OAAO,QAAQ,KAAK,KAAK,MAAM,QAAQ,IAAK,IAAI,YAAY,CAC9D;KACF;WACK,IAAI,OAAO,SAAS;SAGvB,cAAc,gBACd,cAAc,eAAe,OAAO,WACpC;MACA,MAAM,aAAa,KAAM,KAAM,KAAK,IAAI,IAAI,KAAM,IAAI,EAAG;MACzD,QAAQ,KAAK,IACX,OACA,OAAO,QAAQ,IAAI,IAAI,aAAa,IAAI,YAAY,CACtD;KACF;WACK,IAAI,OAAO,SAAS;SAErB,WAAW,OAAO,YAAY,GAChC,QAAQ,KAAK,IAAI,OAAO,OAAO,QAAQ,YAAY,CAAC;UAC/C,IAAI,WAAW,OAAO,WAAW;MACtC,MAAM,UACJ,KAAK,WAAW,OAAO,YAAY,MAAM,OAAO,YAAY;MAC9D,QAAQ,KAAK,IACX,OACA,OAAO,QAAQ,MAAM,IAAI,WAAW,YAAY,CAClD;KACF;WACK,IAAI,OAAO,SAAS;SAErB,WAAW,OAAO,WACpB,QAAQ,KAAK,IAAI,OAAO,OAAO,KAAK;IAAA;GAG1C;GAEA,OAAO,KAAK,KAAK,MAAM,QAAQ,EAAE,IAAI,EAAE;EACzC;EAEA,KAAK,KAAK;GAAE;GAAM,aAAa,CAAC,GAAG,WAAW;GAAG;EAAO,CAAC;CAC3D;CAEA,OAAO;AACT;;;;;;;;;AA+BA,SAAgB,uBACd,SAAiC,CAAC,GACb;CACrB,MAAM,EACJ,iBAAiB;EACf;GAAE,MAAM;GAAiB,UAAU;GAAM,WAAW;EAAK;EACzD;GAAE,MAAM;GAAiB,UAAU;GAAO,WAAW;EAAM;EAC3D;GAAE,MAAM;GAAgB,UAAU;GAAM,WAAW;EAAO;EAC1D;GAAE,MAAM;GAAgB,UAAU;GAAM,WAAW;EAAK;CAC1D,GACA,WAAW,KACX,cAAc,MACd,WAAW,IACX,eAAe,MACb;CAEJ,MAAM,SAA8B,CAAC;CACrC,MAAM,MAAM,KAAK,IAAI;CACrB,MAAM,cACJ,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,eAAe,UAAU,CAAC,IAAI,QAAQ;CACzE,MAAM,eAAe,KAAK,MAAO,WAAW,OAAQ,WAAW;CAE/D,KAAK,MAAM,MAAM,gBAAgB;EAC/B,MAAM,UAAwC,CAAC;EAI/C,IAAI,EADc,KAAK,IAAI,GAAG,QAAQ,KAAK,cAAc,KACzC;EAGhB,MAAM,mBAAmB,KAAK,MAC5B,gBAAgB,KAAM,KAAM,KAAK,IAAK,GAAG,WAAW,KAAK,KAAM,GAAG,EACpE;EAEA,KAAK,IAAI,IAAI,GAAG,IAAI,kBAAkB,KAAK;GAEzC,MAAM,aADY,MAAO,IAAI,WAAW,OAAO,MAAQ,oBACvB,KAAK,OAAO,IAAI,MAAO,cAAc;GAGrE,MAAM,QAAQ,eAAe,KAAK,OAAO,KAAK,KAAK;GACnD,MAAM,eAAe,MAAU,OAAQ,IAAI,QAAQ;GAEnD,MAAM,gBACJ,QAAQ,KAAK,SAAS,QAAQ,KAAK,aAAa;GAElD,QAAQ,KAAK;IACX,OAAO;IACP,KAAK,aAAa;IAClB,OAAO,QAAQ,IAAI;IACJ;IACf,WAAW,KAAK,MAAM,KAAK;GAC7B,CAAC;EACH;EAEA,OAAO,KAAK;GAAE,IAAI,GAAG;GAAM,MAAM,GAAG;GAAM;EAAQ,CAAC;CACrD;CAEA,OAAO;AACT;;;;AAyBA,SAAgB,2BACd,SAAsC,CAAC,GACd;CACzB,MAAM,EACJ,SAAS;EACP;GACE,MAAM;GACN,MAAM;GACN,eAAe;GACf,cAAc;GACd,aAAa;GACb,sBAAsB;GACtB,aAAa;GACb,OAAO;EACT;EACA;GACE,MAAM;GACN,MAAM;GACN,eAAe;GACf,cAAc;GACd,aAAa;GACb,sBAAsB;GACtB,aAAa;GACb,OAAO;EACT;EACA;GACE,MAAM;GACN,MAAM;GACN,eAAe;GACf,cAAc;GACd,aAAa;GACb,sBAAsB;GACtB,aAAa;GACb,OAAO;EACT;CACF,GACA,cAAc,OACZ;CAEJ,OAAO,OAAO,KAAK,SAAS;EAC1B,MAAM,EACJ,eAAe,GACf,cAAc,GACd,aAAa,GACb,sBAAsB,OACtB,aAAa,OACX;EAGJ,MAAM,YAAmD,CAAC;EAC1D,KAAK,IAAI,IAAI,GAAG,KAAK,aAAa,KAAK;GACrC,MAAM,QAAS,IAAI,cAAe,IAAI,KAAK;GAC3C,MAAM,IAAK,KAAK,IAAI,IAAI,MAAO,IAAI,IAAI,KAAK,IAAI,KAAK;GAGrD,MAAM,SAAS,IAAI,KAAK,IAAI,KAAK;GACjC,MAAM,SAAS,IAAI,KAAK,IAAI,KAAK;GAEjC,MAAM,WAAY,QAAQ,KAAK,KAAM;GACrC,MAAM,OAAQ,IAAI,KAAK,KAAM;GAE7B,MAAM,IACJ,SAAS,KAAK,IAAI,QAAQ,IAC1B,SAAS,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,QAAQ;GAC7C,MAAM,IACJ,SAAS,KAAK,IAAI,QAAQ,IAC1B,SAAS,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,QAAQ;GAC7C,MAAM,IAAI,SAAS,KAAK,IAAI,IAAI;GAEhC,UAAU,KAAK;IAAE;IAAG;IAAG;GAAE,CAAC;EAC5B;EAGA,MAAM,QAAS,KAAK,KAAK,KAAM;EAC/B,MAAM,IAAK,KAAK,IAAI,IAAI,MAAO,IAAI,IAAI,KAAK,IAAI,KAAK;EACrD,MAAM,SAAS,IAAI,KAAK,IAAI,KAAK;EACjC,MAAM,SAAS,IAAI,KAAK,IAAI,KAAK;EAEjC,MAAM,WAAY,QAAQ,KAAK,KAAM;EACrC,MAAM,OAAQ,IAAI,KAAK,KAAM;EAE7B,MAAM,IACJ,SAAS,KAAK,IAAI,QAAQ,IAC1B,SAAS,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,QAAQ;EAC7C,MAAM,IACJ,SAAS,KAAK,IAAI,QAAQ,IAC1B,SAAS,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,QAAQ;EAC7C,MAAM,IAAI,SAAS,KAAK,IAAI,IAAI;EAGhC,MAAM,SAAS,SAAS,KAAK,IAAI,GAAG,GAAG;EAEvC,OAAO;GACL,MAAM,KAAK;GACX,MAAM,KAAK;GACX;GACA;GACA;GACA;GACA,OAAO,KAAK;GACZ,eAAe;GACf;GACA,aAAa;GACb,MAAM,KAAK,SAAS,WAAW,KAAK;EACtC;CACF,CAAC;AACH;;;;AA0BA,SAAgB,iBACd,SAAkC,CAAC,GACd;CACrB,MAAM,EACJ,kBAAkB,MAClB,YAAY,KACZ,SAAS,KACT,aAAa,MACb,UAAU;EACR;GAAE,WAAW;GAAQ,OAAO;GAAK,WAAW;EAAM;EAClD;GAAE,WAAW;GAAU,OAAO;GAAK,WAAW;EAAK;EACnD;GAAE,WAAW;GAAU,OAAO;GAAK,WAAW;EAAK;CACrD,MACE;CAEJ,MAAM,OAA4B,CAAC;CACnC,MAAM,UAAU,kBAAkB,YAAY;CAC9C,MAAM,WAAW,YAAY;CAE7B,KAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,KAAK;EAC/B,MAAM,OAAO,UAAU,IAAI;EAC3B,IAAI,QAAQ,aAAa,KAAK,KAAK,OAAO,IAAI;EAE9C,KAAK,MAAM,UAAU,SAAS;GAC5B,MAAM,WAAW,KAAK,IAAI,OAAO,OAAO,SAAS;GACjD,IAAI,WAAW,OAAO,YAAY,GAAG;IACnC,MAAM,cACJ,KAAK,KAAK,MAAM,IAAI,YAAY,OAAO,YAAY,EAAE;IACvD,QAAQ,KAAK,IAAI,OAAO,OAAO,QAAQ,WAAW;GACpD;EACF;EAEA,KAAK,KAAK;GAAE,WAAW;GAAM,OAAO,KAAK,MAAM,QAAQ,EAAE,IAAI;EAAG,CAAC;CACnE;CAEA,OAAO;AACT;;;;AAoBA,SAAgB,wBACd,SAAiC,CAAC,GACX;CACvB,MAAM,EACJ,cAAc,MACd,kBAAkB,KAClB,SAAS,GACT,kBAAkB,SAChB;CAEJ,MAAM,OAA8B,CAAC;CACrC,MAAM,MAAM,KAAK,IAAI;CACrB,MAAM,mBAAmB,kBAAkB,KAAK;CAEhD,KAAK,IAAI,QAAQ,GAAG,QAAQ,QAAQ,SAAS;EAC3C,MAAM,aAAa,MAAM,QAAQ,cAAc;EAC/C,MAAM,eAAe,aAAa,cAAc,KAAM;EACtD,MAAM,aAAa,eAAe,cAAc,kBAAkB;EAGlE,KAAK,KAAK;GACR,OAAO;GACP,KAAK,eAAe,mBAAmB;GACvC,MAAM;GACN,aAAa,QAAQ;EACvB,CAAC;EAGD,IAAI,iBACF,KAAK,KAAK;GACR,OAAO,eAAe,mBAAmB;GACzC,KAAK;GACL,MAAM;GACN,aAAa,QAAQ;EACvB,CAAC;EAIH,KAAK,KAAK;GACR,OAAO;GACP,KAAK;GACL,MAAM;GACN,aAAa,QAAQ;EACvB,CAAC;EAGD,IAAI,iBACF,KAAK,KAAK;GACR,OAAO;GACP,KAAK,aAAa,mBAAmB;GACrC,MAAM;GACN,aAAa,QAAQ;EACvB,CAAC;EAIH,KAAK,KAAK;GACR,OAAO,aAAa,mBAAmB;GACvC,KAAK,aAAa,cAAc;GAChC,MAAM;GACN,aAAa,QAAQ;EACvB,CAAC;CACH;CAEA,OAAO;AACT;;;;;;;AA6BA,SAAgB,8BACd,SAAkC,CAAC,GAMnC;CACA,MAAM,EACJ,gBAAgB,GAChB,gBAAgB,GAChB,SAAS,GACT,eAAe,IACf,WAAW,KACX,cAAc,IACd,SAAS,iBACP;CAEJ,MAAM,YAAsB,CAAC;CAC7B,MAAM,aAAuB,CAAC;CAC9B,MAAM,WAAuB,CAAC;CAE9B,KAAK,IAAI,MAAM,KAAK,OAAO,IAAI,OAAO,eAAe,UAAU,KAAK,GAAG;CACvE,KAAK,IAAI,MAAM,MAAM,MAAM,KAAK,OAAO,eAAe,WAAW,KAAK,GAAG;CAGzE,MAAM,cAAc;CACpB,MAAM,iBACJ,KAAK,KAAK,eAAe,cAAc,SAAS,KAAK,MAAM,KAAK;CAClE,MAAM,YAAY,SAAS;CAE3B,KAAK,IAAI,KAAK,GAAG,KAAK,UAAU,QAAQ,MAAM;EAC5C,MAAM,MAAgB,CAAC;EACvB,MAAM,MAAM,UAAU;EACL,MAAM,KAAK,KAAM;EAElC,KAAK,IAAI,KAAK,GAAG,KAAK,WAAW,QAAQ,MAAM;GAC7C,IAAI;GAGJ,MAAM,YACJ,KAAK,IAAI,GAAG,KAAK,cACb,IACA,KAAK,IAAI,GAAG,KAAO,KAAK,IAAI,GAAG,IAAI,eAAe,EAAE;GAG1D,MAAM,gBAAgB,YAAY;GAClC,MAAM,mBAAmB,KAAK,IAC5B,GACA,iBAAiB,iBAAiB,GACpC;GAEA,IAAI,WAAW,cAAc;IAE3B,QAAQ,KAAK,IAAI,KAAK,mBAAmB,YAAY,GAAG;IAExD,IAAI,KAAK,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK,IAAI,KAAK,QAAQ,GAAG;IAEzD,UAAU,KAAK,OAAO,IAAI,MAAO;IACjC,QAAQ,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,KAAK,CAAC;GAC1C,OAAO,IAAI,WAAW,eAAe;IAEnC,MAAM,cAAc,MAAM,mBAAmB,YAAY;IACzD,QAAQ,KAAK,IACX,GACA,KAAK,IAAI,KAAK,eAAe,KAAK,OAAO,IAAI,MAAO,EAAE,CACxD;GACF,OAIE,QADE,WAAW,KAAK,IAAI,KAAK,IAAI,IAAM,YAAY,KAAK,KAAM,CAAC,CAAC,IACzC,MAAM,IAAI,KAAK,OAAO,IAAI;GAGjD,IAAI,KAAK,KAAK,MAAM,QAAQ,EAAE,IAAI,EAAE;EACtC;EACA,SAAS,KAAK,GAAG;CACnB;CAOA,OAAO;EAAE;EAAW;EAAY;EAAU,MAAM;GAJ9C,YAAY;GACZ,aAAa;GACb,SAAS;EAEqC,EAAM,WAAW;CAAI;AACvE;;;;AAoBA,SAAgB,0BACd,SAAqC,CAAC,GAWrC;CACD,MAAM,EACJ,cAAc,aACd,aAAa,IACb,iBAAiB,IACjB,kBAAkB,SAChB;CAEJ,MAAM,cAAc;EAClB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CAEA,MAAM,MAAM,KAAK,IAAI;CACrB,MAAM,SAAS,CAAC;CAEhB,KAAK,IAAI,IAAI,GAAG,IAAI,YAAY,KAAK;EACnC,MAAM,MAAM,MAAM,KAAK,OAAO,IAAI,iBAAiB;EACnD,IAAI;EAEJ,IAAI,mBAAmB,IAAI,GACzB,eAAe,KAAM,KAAK,OAAO,IAAI;OAChC,IAAI,IAAI,GACb,eAAe,IAAI,KAAK,OAAO,IAAI;OAEnC,eAAe,IAAI,KAAK,OAAO,IAAI;EAGrC,MAAM,cAAc,KAAK,IAAI,IAAI,KAAK,eAAe,MAAM,KAAK,OAAO,CAAC;EACxE,MAAM,mBAAmB,IAAI,KAAK,OAAO,IAAI;EAE7C,MAAM,QAAQ,KAAK,OAAO,IAAI,IAAI,KAAK;EACvC,MAAM,YAAY,KAAK,OAAO,IAAI,MAAO,KAAK;EAC9C,MAAM,SAAS,OAAO,KAAK,OAAO,IAAI;EAEtC,OAAO,KAAK;GACV,IAAI,OAAO,OAAO,IAAI,CAAC,CAAC,CAAC,SAAS,GAAG,GAAG;GACxC,SAAS;GACT,WAAW,YAAY,IAAI,YAAY;GACvC;GACA,cAAc,KAAK,MAAM,eAAe,GAAI,IAAI;GAChD,aAAa,KAAK,IAAI,OAAO,WAAW;GACxC,kBAAkB,KAAK,MAAM,mBAAmB,GAAG,IAAI;GACvD,UAAU;IACR,GAAG,KAAK,MAAM,SAAS,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,QAAQ,CAAC;IAC3D,GAAG,KAAK,MAAM,SAAS,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,QAAQ,CAAC;IAC3D,GAAG,KAAK,MAAM,SAAS,KAAK,IAAI,QAAQ,CAAC;GAC3C;GACA,aAAa;IACX,IAAI,KAAK,KAAK,OAAO,IAAI;IACzB,IAAI,KAAK,KAAK,OAAO,IAAI;IACzB,IAAI,KAAK,KAAK,OAAO,IAAI;GAC3B;EACF,CAAC;CACH;CAEA,OAAO,OAAO,MAAM,GAAG,MAAM,EAAE,MAAM,EAAE,GAAG;AAC5C"}
@@ -1 +1 @@
1
- {"version":3,"file":"presets.js","names":[],"sources":["../../../../src/react/charts/unified/presets.tsx"],"sourcesContent":["/**\n * @zendir/ui - Chart Presets\n *\n * Pre-configured chart components for common use cases.\n * Each preset wraps AstroChart with sensible defaults.\n */\n\nimport React, { forwardRef, memo } from \"react\";\nimport { AstroChart, AstroChartHandle } from \"./AstroChart\";\nimport type { AstroChartProps, SeriesData, AxisOptions } from \"./types\";\nimport { STATUS_COLORS, ASTRO_DATA_VIZ_COLORS } from \"./theme\";\nimport { useTheme } from \"../../theme\";\n\n// Medium-soft status colors (readable, not too pale)\nconst SOFT_STATUS_COLORS = {\n normal: \"#6ed86e\",\n caution: \"#ffd54f\",\n serious: \"#ffa726\",\n critical: \"#e57373\",\n off: \"#90a4ae\",\n standby: \"#4fc3f7\",\n};\n\n// =============================================================================\n// Shared Types\n// =============================================================================\n\ntype PresetProps = Omit<AstroChartProps, \"type\">;\n\n// =============================================================================\n// Line Chart\n// =============================================================================\n\nexport interface LineChartProps extends PresetProps {\n /** Enable smooth curves */\n smooth?: boolean;\n /** Show data points */\n showPoints?: boolean;\n /** Enable area fill */\n showArea?: boolean;\n}\n\nexport const LineChart = memo(\n forwardRef<AstroChartHandle, LineChartProps>(function LineChart(\n {\n smooth = true,\n showPoints = false,\n showArea = false,\n series = [],\n ...props\n },\n ref,\n ) {\n const transformedSeries: SeriesData[] = series.map((s) => ({\n ...s,\n type: showArea ? \"area\" : \"line\",\n smooth,\n symbol: showPoints ? { type: \"circle\", size: 6 } : { type: \"none\" },\n }));\n\n return (\n <AstroChart\n ref={ref}\n type={showArea ? \"area\" : \"line\"}\n series={transformedSeries}\n tooltip={{ trigger: \"axis\", crosshair: \"x\" }}\n {...props}\n />\n );\n }),\n);\n\n// =============================================================================\n// Area Chart\n// =============================================================================\n\nexport interface AreaChartProps extends PresetProps {\n /** Stack areas */\n stacked?: boolean;\n /** Smooth curves */\n smooth?: boolean;\n}\n\nexport const AreaChart = memo(\n forwardRef<AstroChartHandle, AreaChartProps>(function AreaChart(\n { stacked = false, smooth = true, series = [], ...props },\n ref,\n ) {\n const transformedSeries: SeriesData[] = series.map((s, _i) => ({\n ...s,\n type: \"area\",\n smooth,\n stack: stacked ? \"total\" : undefined,\n areaStyle: { opacity: stacked ? 0.8 : 0.3 },\n }));\n\n return (\n <AstroChart\n ref={ref}\n type=\"area\"\n series={transformedSeries}\n tooltip={{ trigger: \"axis\", crosshair: \"x\" }}\n {...props}\n />\n );\n }),\n);\n\n// =============================================================================\n// Bar Chart\n// =============================================================================\n\nexport interface BarChartProps extends PresetProps {\n /** Stack bars */\n stacked?: boolean;\n /** Horizontal orientation */\n horizontal?: boolean;\n /** Bar category gap */\n categoryGap?: string;\n}\n\nexport const BarChart = memo(\n forwardRef<AstroChartHandle, BarChartProps>(function BarChart(\n {\n stacked = false,\n horizontal = false,\n series = [],\n xAxis,\n yAxis,\n ...props\n },\n ref,\n ) {\n const transformedSeries: SeriesData[] = series.map((s) => ({\n ...s,\n type: \"bar\",\n stack: stacked ? \"total\" : undefined,\n }));\n\n // Swap axes for horizontal\n const finalXAxis: AxisOptions = horizontal\n ? { type: \"value\", ...(yAxis as AxisOptions) }\n : { type: \"category\", ...xAxis };\n\n const finalYAxis: AxisOptions = horizontal\n ? { type: \"category\", ...xAxis }\n : { type: \"value\", ...(yAxis as AxisOptions) };\n\n return (\n <AstroChart\n ref={ref}\n type=\"bar\"\n series={transformedSeries}\n xAxis={finalXAxis}\n yAxis={finalYAxis}\n tooltip={{ trigger: \"axis\" }}\n {...props}\n />\n );\n }),\n);\n\n// =============================================================================\n// Scatter Chart\n// =============================================================================\n\nexport interface ScatterChartProps extends PresetProps {\n /** Symbol size */\n symbolSize?: number | ((value: number[]) => number);\n /** Show regression line */\n showRegression?: boolean;\n}\n\nexport const ScatterChart = memo(\n forwardRef<AstroChartHandle, ScatterChartProps>(function ScatterChart(\n { symbolSize = 10, series = [], ...props },\n ref,\n ) {\n const transformedSeries: SeriesData[] = series.map((s) => ({\n ...s,\n type: \"scatter\",\n symbol: {\n type: \"circle\",\n size: typeof symbolSize === \"number\" ? symbolSize : 10,\n },\n }));\n\n return (\n <AstroChart\n ref={ref}\n type=\"scatter\"\n series={transformedSeries}\n tooltip={{ trigger: \"item\" }}\n xAxis={{ type: \"value\" }}\n yAxis={{ type: \"value\" }}\n {...props}\n />\n );\n }),\n);\n\n// =============================================================================\n// Pie Chart\n// =============================================================================\n\nexport interface PieChartProps extends Omit<\n PresetProps,\n \"xAxis\" | \"yAxis\" | \"zoom\"\n> {\n /** Show as donut */\n donut?: boolean;\n /** Inner radius for donut (percentage) */\n innerRadius?: string;\n /** Outer radius (percentage) */\n outerRadius?: string;\n /** Show labels */\n showLabels?: boolean;\n /** Center content (for donut) */\n centerContent?: React.ReactNode;\n}\n\nexport const PieChart = memo(\n forwardRef<AstroChartHandle, PieChartProps>(function PieChart(\n {\n donut = false,\n innerRadius = \"40%\",\n outerRadius = \"70%\",\n showLabels = true,\n series = [],\n ...props\n },\n ref,\n ) {\n const transformedSeries: SeriesData[] = series.map((s) => ({\n ...s,\n type: donut ? \"donut\" : \"pie\",\n }));\n\n return (\n <AstroChart\n ref={ref}\n type={donut ? \"donut\" : \"pie\"}\n series={transformedSeries}\n tooltip={{ trigger: \"item\" }}\n echartsOptions={{\n series: [\n {\n radius: donut ? [innerRadius, outerRadius] : outerRadius,\n label: {\n show: showLabels,\n formatter: \"{b}: {d}%\",\n },\n },\n ],\n }}\n {...props}\n />\n );\n }),\n);\n\n// =============================================================================\n// Donut Chart\n// =============================================================================\n\nexport const DonutChart = memo(\n forwardRef<AstroChartHandle, PieChartProps>(function DonutChart(props, ref) {\n return <PieChart ref={ref} donut {...props} />;\n }),\n);\n\n// =============================================================================\n// Gauge Chart\n// =============================================================================\n\nexport interface GaugeChartProps extends Omit<\n PresetProps,\n \"xAxis\" | \"yAxis\" | \"zoom\" | \"series\"\n> {\n /** Current value */\n value: number;\n /** Minimum value */\n min?: number;\n /** Maximum value */\n max?: number;\n /** Unit label */\n unit?: string;\n /** Title label */\n label?: string;\n /** Threshold colors */\n thresholds?: {\n value: number;\n color: string;\n }[];\n /** Show progress arc */\n progress?: boolean;\n /** Show clock-style pointer (needle). Set false for arc + value only. */\n showPointer?: boolean;\n}\n\nexport const GaugeChart = memo(\n forwardRef<AstroChartHandle, GaugeChartProps>(function GaugeChart(\n {\n value,\n min = 0,\n max = 100,\n unit = \"%\",\n label,\n thresholds,\n progress = true,\n showPointer = true,\n width = 220,\n height = 220,\n ...props\n },\n ref,\n ) {\n const { tokens } = useTheme();\n const range = max - min;\n const safeRange = range === 0 ? 1 : range;\n const clampedValue = Math.max(min, Math.min(max, value));\n const widthPx =\n typeof width === \"number\"\n ? width\n : typeof height === \"number\"\n ? height\n : 220;\n const heightPx = typeof height === \"number\" ? height : 220;\n const gaugeSize = Math.max(120, Math.min(widthPx, heightPx));\n const compactGauge = gaugeSize < 170;\n const arcWidth = Math.max(8, Math.round(gaugeSize * 0.07));\n const valueFontSize = Math.max(16, Math.round(gaugeSize * 0.15));\n const labelFontSize = Math.max(10, Math.round(gaugeSize * 0.07));\n const unitSuffix = unit?.trim() ?? \"\";\n const longUnit = unitSuffix.length > 4;\n\n const series: SeriesData[] = [\n {\n id: \"gauge\",\n name: label || \"Value\",\n type: \"gauge\",\n data: [{ x: 0, y: clampedValue }],\n },\n ];\n\n // Build color stops from thresholds\n const normalizedThresholds = [...(thresholds ?? [])]\n .filter((t) => Number.isFinite(t.value))\n .sort((a, b) => a.value - b.value);\n\n const colorStops = normalizedThresholds.map(\n (t) =>\n [Math.max(0, Math.min(1, (t.value - min) / safeRange)), t.color] as [\n number,\n string,\n ],\n );\n\n if (colorStops.length === 0) {\n colorStops.push(\n [0.3, SOFT_STATUS_COLORS.normal],\n [0.7, SOFT_STATUS_COLORS.caution],\n [1, SOFT_STATUS_COLORS.critical],\n );\n } else if (colorStops[colorStops.length - 1][0] < 1) {\n colorStops.push([1, colorStops[colorStops.length - 1][1]]);\n }\n\n const activeColor =\n [...colorStops]\n .reverse()\n .find(([stop]) => stop <= (clampedValue - min) / safeRange)?.[1] ??\n SOFT_STATUS_COLORS.normal;\n\n return (\n <AstroChart\n ref={ref}\n type=\"gauge\"\n series={series}\n width={width}\n height={height}\n echartsOptions={{\n series: [\n {\n type: \"gauge\",\n min,\n max,\n progress: {\n show: progress,\n width: arcWidth,\n roundCap: true,\n },\n axisLine: {\n lineStyle: {\n width: arcWidth,\n color: colorStops,\n },\n },\n axisTick: { show: false },\n splitLine: { show: false },\n axisLabel: { show: false },\n pointer: {\n show: showPointer,\n length: compactGauge ? \"56%\" : \"60%\",\n width: Math.max(3, Math.round(arcWidth * 0.38)),\n },\n title: {\n show: !!label,\n offsetCenter: [0, compactGauge ? \"73%\" : \"78%\"],\n fontSize: labelFontSize,\n color: tokens.colors.text.secondary,\n },\n detail: {\n valueAnimation: true,\n formatter: (currentValue: number) => {\n const rounded = Math.round(currentValue);\n if (!unitSuffix) return `${rounded}`;\n if (longUnit) return `${rounded}\\n{unit|${unitSuffix}}`;\n return `${rounded}${unitSuffix}`;\n },\n rich: {\n unit: {\n color: tokens.colors.text.secondary,\n fontSize: Math.max(10, Math.round(valueFontSize * 0.48)),\n fontWeight: 500,\n lineHeight: Math.round(valueFontSize * 0.78),\n },\n },\n lineHeight: Math.round(valueFontSize * 1.05),\n fontSize: valueFontSize,\n fontWeight: 700,\n offsetCenter: [0, compactGauge ? \"10%\" : \"14%\"],\n color: activeColor,\n },\n data: [{ value: clampedValue, name: label }],\n },\n ],\n }}\n {...props}\n />\n );\n }),\n);\n\n// =============================================================================\n// Radar Chart\n// =============================================================================\n\nexport interface RadarChartProps extends Omit<\n PresetProps,\n \"xAxis\" | \"yAxis\" | \"zoom\"\n> {\n /** Indicator definitions */\n indicators: {\n name: string;\n max: number;\n min?: number;\n }[];\n /** Fill area */\n areaStyle?: boolean;\n}\n\nexport const RadarChart = memo(\n forwardRef<AstroChartHandle, RadarChartProps>(function RadarChart(\n { indicators, areaStyle = true, series = [], ...props },\n ref,\n ) {\n // Extract values from data - support both [{x,y}] and [number] formats\n const extractValues = (data: unknown[]): number[] => {\n if (!data || data.length === 0) return [];\n const first = data[0];\n if (typeof first === \"number\") return data as number[];\n if (typeof first === \"object\" && first !== null && \"y\" in first) {\n return (data as Array<{ y: number }>).map((d) => d.y);\n }\n return [];\n };\n\n return (\n <AstroChart\n ref={ref}\n type=\"radar\"\n series={[]} // Empty - we provide series via echartsOptions\n tooltip={{ trigger: \"item\" }}\n echartsOptions={{\n radar: {\n indicator: indicators,\n shape: \"polygon\",\n },\n series: series.map((s) => ({\n type: \"radar\",\n name: s.name,\n data: [\n {\n value: extractValues(s.data as unknown[]),\n name: s.name,\n },\n ],\n areaStyle: areaStyle ? { opacity: 0.3 } : undefined,\n })),\n }}\n {...props}\n />\n );\n }),\n);\n\n// =============================================================================\n// Heatmap Chart\n// =============================================================================\n\nexport interface HeatmapChartProps extends PresetProps {\n /** X-axis categories */\n xCategories: string[];\n /** Y-axis categories */\n yCategories: string[];\n /** Value range */\n valueRange?: [number, number];\n /** Show value labels */\n showLabels?: boolean;\n}\n\nexport const HeatmapChart = memo(\n forwardRef<AstroChartHandle, HeatmapChartProps>(function HeatmapChart(\n {\n xCategories,\n yCategories,\n valueRange = [0, 100],\n showLabels = true,\n series = [],\n ...props\n },\n ref,\n ) {\n // Transform data to heatmap format if needed\n const heatmapData = series[0]?.data as unknown[];\n\n return (\n <AstroChart\n ref={ref}\n type=\"heatmap\"\n series={series}\n xAxis={{ type: \"category\" }}\n yAxis={{ type: \"category\" }}\n tooltip={{ trigger: \"item\" }}\n echartsOptions={{\n xAxis: { data: xCategories },\n yAxis: { data: yCategories },\n visualMap: {\n min: valueRange[0],\n max: valueRange[1],\n calculable: true,\n orient: \"horizontal\",\n left: \"center\",\n bottom: \"5%\",\n },\n series: [\n {\n type: \"heatmap\",\n data: heatmapData as [number, number, number][],\n label: {\n show: showLabels,\n },\n emphasis: {\n itemStyle: {\n shadowBlur: 10,\n shadowColor: \"rgba(0, 0, 0, 0.5)\",\n },\n },\n },\n ],\n }}\n {...props}\n />\n );\n }),\n);\n\n// =============================================================================\n// Time Series Chart (optimized for streaming data)\n// =============================================================================\n\nexport interface TimeSeriesChartProps extends PresetProps {\n /** Time window in milliseconds */\n timeWindow?: number;\n /** Maximum data points */\n maxPoints?: number;\n /** Auto-scroll to latest data */\n autoScroll?: boolean;\n /** Show current values */\n showCurrentValues?: boolean;\n}\n\nexport const TimeSeriesChart = memo(\n forwardRef<AstroChartHandle, TimeSeriesChartProps>(function TimeSeriesChart(\n {\n timeWindow,\n maxPoints = 1000,\n autoScroll = true,\n showCurrentValues: _showCurrentValues = true,\n series = [],\n ...props\n },\n ref,\n ) {\n const xAxis: AxisOptions = {\n type: \"time\",\n ...(timeWindow\n ? {\n min: \"dataMin\",\n max: \"dataMax\",\n }\n : {}),\n };\n\n return (\n <AstroChart\n ref={ref}\n type=\"line\"\n series={series.map((s) => ({\n ...s,\n smooth: true,\n symbol: { type: \"none\" },\n }))}\n xAxis={xAxis}\n tooltip={{\n trigger: \"axis\",\n crosshair: \"x\",\n }}\n zoom={\n autoScroll\n ? undefined\n : {\n enabled: true,\n type: \"both\",\n axis: \"x\",\n }\n }\n realTime={{\n enabled: true,\n maxPoints,\n timeWindow,\n shift: autoScroll,\n }}\n {...props}\n />\n );\n }),\n);\n\n// =============================================================================\n// Dual Axis Chart\n// =============================================================================\n\nexport interface DualAxisChartProps extends PresetProps {\n /** Left Y-axis options */\n leftAxis?: AxisOptions;\n /** Right Y-axis options */\n rightAxis?: AxisOptions;\n}\n\nexport const DualAxisChart = memo(\n forwardRef<AstroChartHandle, DualAxisChartProps>(function DualAxisChart(\n { leftAxis, rightAxis, series = [], ...props },\n ref,\n ) {\n // Assign series to axes based on yAxisIndex\n const transformedSeries: SeriesData[] = series.map((s, i) => ({\n ...s,\n yAxisIndex: s.yAxisIndex ?? i % 2, // Alternate by default\n }));\n\n return (\n <AstroChart\n ref={ref}\n type=\"line\"\n series={transformedSeries}\n yAxis={[\n { position: \"left\", ...leftAxis },\n { position: \"right\", ...rightAxis },\n ]}\n tooltip={{ trigger: \"axis\", crosshair: \"x\" }}\n {...props}\n />\n );\n }),\n);\n\n// =============================================================================\n// Stacked Area Chart\n// =============================================================================\n\nexport const StackedAreaChart = memo(\n forwardRef<AstroChartHandle, AreaChartProps>(\n function StackedAreaChart(props, ref) {\n return <AreaChart ref={ref} stacked {...props} />;\n },\n ),\n);\n\n// =============================================================================\n// Stacked Bar Chart\n// =============================================================================\n\nexport const StackedBarChart = memo(\n forwardRef<AstroChartHandle, BarChartProps>(\n function StackedBarChart(props, ref) {\n return <BarChart ref={ref} stacked {...props} />;\n },\n ),\n);\n\n// =============================================================================\n// Bubble Chart (AstroUXD compliant)\n// =============================================================================\n\nexport interface BubbleChartProps extends PresetProps {\n /** Min bubble size (px) */\n minSize?: number;\n /** Max bubble size (px) */\n maxSize?: number;\n /** Show size legend */\n showSizeLegend?: boolean;\n}\n\nexport const BubbleChart = memo(\n forwardRef<AstroChartHandle, BubbleChartProps>(function BubbleChart(\n {\n minSize = 10,\n maxSize = 60,\n showSizeLegend = true,\n series = [],\n ...props\n },\n ref,\n ) {\n // Transform series for bubble (scatter with symbolSize)\n const transformedSeries: SeriesData[] = series.map((s) => ({\n ...s,\n type: \"scatter\" as const,\n }));\n\n return (\n <AstroChart\n ref={ref}\n type=\"scatter\"\n series={transformedSeries}\n tooltip={{ trigger: \"item\" }}\n echartsOptions={{\n series: series.map((s, _idx) => {\n const data = s.data as Array<\n | { x: number; y: number; size?: number; label?: string }\n | [number, number, number]\n >;\n return {\n type: \"scatter\",\n name: s.name,\n data: data.map((d) => {\n if (Array.isArray(d)) return d;\n return [d.x, d.y, (d as { size?: number }).size ?? 10];\n }),\n symbolSize: (val: number[]) => {\n const size = val[2] ?? minSize;\n return Math.max(minSize, Math.min(maxSize, size));\n },\n };\n }),\n visualMap: showSizeLegend\n ? {\n show: true,\n dimension: 2,\n min: 0,\n max: 100,\n inRange: { symbolSize: [minSize, maxSize] },\n right: 10,\n top: \"center\",\n }\n : undefined,\n }}\n {...props}\n />\n );\n }),\n);\n\n// =============================================================================\n// Histogram Chart (AstroUXD compliant)\n// =============================================================================\n\nexport interface HistogramChartProps extends PresetProps {\n /** Number of bins (auto if not specified) */\n bins?: number;\n /** Show distribution curve overlay */\n showCurve?: boolean;\n}\n\nexport const HistogramChart = memo(\n forwardRef<AstroChartHandle, HistogramChartProps>(function HistogramChart(\n {\n bins: _bins = 20,\n showCurve: _showCurve = false,\n series = [],\n xAxis,\n ...props\n },\n ref,\n ) {\n // Transform data into histogram bins\n const transformedSeries: SeriesData[] = series.map((s) => ({\n ...s,\n type: \"bar\" as const,\n }));\n\n return (\n <AstroChart\n ref={ref}\n type=\"bar\"\n series={transformedSeries}\n xAxis={{ type: \"category\", ...xAxis }}\n yAxis={{ type: \"value\", name: \"Frequency\" }}\n tooltip={{ trigger: \"axis\" }}\n echartsOptions={{\n series: series.map((s) => ({\n type: \"bar\",\n name: s.name,\n data: s.data,\n barWidth: \"90%\",\n itemStyle: { borderRadius: [2, 2, 0, 0] },\n })) as import(\"echarts\").SeriesOption[],\n }}\n {...props}\n />\n );\n }),\n);\n\n// =============================================================================\n// Sankey Diagram (Power/Data Flow)\n// =============================================================================\n\nexport interface SankeyChartProps extends Omit<PresetProps, \"series\"> {\n /** Node definitions */\n nodes: { name: string; itemStyle?: { color?: string } }[];\n /** Link definitions */\n links: { source: string; target: string; value: number }[];\n /** Orient vertical or horizontal */\n orient?: \"horizontal\" | \"vertical\";\n}\n\nexport const SankeyChart = memo(\n forwardRef<AstroChartHandle, SankeyChartProps>(function SankeyChart(\n { nodes = [], links = [], orient = \"horizontal\", ...props },\n ref,\n ) {\n const { tokens } = useTheme();\n\n return (\n <AstroChart\n ref={ref}\n type=\"sankey\"\n series={[]}\n echartsOptions={{\n tooltip: {\n trigger: \"item\",\n triggerOn: \"mousemove\",\n },\n series: [\n {\n type: \"sankey\",\n orient,\n layoutIterations: 32,\n emphasis: { focus: \"adjacency\" },\n nodeAlign: \"justify\",\n lineStyle: { color: \"gradient\", curveness: 0.5 },\n data: nodes,\n links,\n label: {\n color: tokens.colors.text.primary,\n fontSize: 12,\n },\n },\n ],\n }}\n {...props}\n />\n );\n }),\n);\n\n// =============================================================================\n// Treemap (Storage/Allocation Visualization)\n// AstroUXDS compliant hierarchical visualization\n// =============================================================================\n\nexport interface TreemapDataNode {\n name: string;\n value?: number;\n children?: TreemapDataNode[];\n itemStyle?: { color?: string };\n}\n\nexport interface TreemapChartProps extends Omit<PresetProps, \"series\"> {\n /** Hierarchical data */\n data: TreemapDataNode[];\n /** Show breadcrumb navigation */\n showBreadcrumb?: boolean;\n /** Leaf depth to show */\n leafDepth?: number;\n}\n\nexport const TreemapChart = memo(\n forwardRef<AstroChartHandle, TreemapChartProps>(function TreemapChart(\n { data = [], showBreadcrumb = true, leafDepth = 2, ...props },\n ref,\n ) {\n const { tokens } = useTheme();\n\n return (\n <AstroChart\n ref={ref}\n type=\"treemap\"\n series={[]}\n echartsOptions={{\n tooltip: {\n formatter: ((info: any) => {\n const value = info.value;\n const name = info.name;\n return `${name}: ${typeof value === \"number\" ? value.toLocaleString() : value}`;\n }) as unknown as string,\n },\n series: [\n {\n type: \"treemap\",\n data,\n leafDepth,\n roam: false,\n // AstroUXDS compliant breadcrumb navigation\n breadcrumb: {\n show: showBreadcrumb,\n bottom: 10,\n itemStyle: { color: \"rgba(100, 116, 139, 0.6)\" }, // Subtle grey\n },\n label: {\n show: true,\n formatter: \"{b}\",\n color: tokens.colors.text.primary,\n fontSize: 12,\n },\n upperLabel: {\n show: true,\n height: 30,\n color: tokens.colors.text.secondary,\n },\n // AstroUXDS compliant borders - subtle grey\n itemStyle: {\n borderColor: \"rgba(100, 116, 139, 0.2)\",\n borderWidth: 2,\n gapWidth: 2,\n },\n levels: [\n {\n itemStyle: {\n borderColor: \"rgba(100, 116, 139, 0.3)\",\n borderWidth: 4,\n gapWidth: 4,\n },\n upperLabel: { show: false },\n },\n {\n itemStyle: {\n borderColor: \"rgba(100, 116, 139, 0.25)\",\n borderWidth: 2,\n gapWidth: 2,\n },\n emphasis: {\n itemStyle: { borderColor: ASTRO_DATA_VIZ_COLORS.mixed[0] },\n }, // Zendir Electric on hover\n },\n {\n colorSaturation: [0.35, 0.5],\n itemStyle: {\n borderColor: \"rgba(62, 60, 255, 0.3)\",\n borderWidth: 1,\n }, // Zendir Electric subtle\n },\n ],\n },\n ],\n }}\n {...props}\n />\n );\n }),\n);\n\n// =============================================================================\n// Sunburst Chart (Hierarchical Status)\n// =============================================================================\n\nexport interface SunburstDataNode {\n name: string;\n value?: number;\n children?: SunburstDataNode[];\n itemStyle?: { color?: string };\n}\n\nexport interface SunburstChartProps extends Omit<PresetProps, \"series\"> {\n /** Hierarchical data */\n data: SunburstDataNode[];\n /** Inner radius (percentage or pixels) */\n innerRadius?: string | number;\n /** Outer radius (percentage or pixels) */\n outerRadius?: string | number;\n}\n\nexport const SunburstChart = memo(\n forwardRef<AstroChartHandle, SunburstChartProps>(function SunburstChart(\n { data = [], innerRadius = \"15%\", outerRadius = \"80%\", ...props },\n ref,\n ) {\n const { tokens } = useTheme();\n\n return (\n <AstroChart\n ref={ref}\n type=\"sunburst\"\n series={[]}\n echartsOptions={{\n tooltip: {\n trigger: \"item\",\n },\n // Zendir-branded sunburst visualization\n series: [\n {\n type: \"sunburst\",\n data,\n radius: [innerRadius, outerRadius],\n emphasis: { focus: \"ancestor\" },\n label: {\n rotate: \"radial\",\n color: tokens.colors.text.secondary,\n fontSize: 11,\n },\n itemStyle: {\n borderRadius: 4,\n borderWidth: 2,\n borderColor: \"rgba(62, 60, 255, 0.25)\", // Zendir Electric subtle border\n },\n levels: [\n {},\n { r0: \"15%\", r: \"40%\", label: { rotate: \"tangential\" } },\n { r0: \"40%\", r: \"65%\" },\n {\n r0: \"65%\",\n r: \"80%\",\n label: { position: \"outside\", fontSize: 10 },\n },\n ],\n },\n ],\n }}\n {...props}\n />\n );\n }),\n);\n\n// =============================================================================\n// Parallel Coordinates (Multi-Parameter Analysis)\n// =============================================================================\n\nexport interface ParallelAxisDef {\n dim: number;\n name: string;\n min?: number;\n max?: number;\n type?: \"value\" | \"category\";\n data?: string[];\n}\n\nexport interface ParallelChartProps extends Omit<PresetProps, \"series\"> {\n /** Axis definitions */\n axes: ParallelAxisDef[];\n /** Data rows (each row is values for each axis) */\n data: (number | string)[][];\n /** Line style */\n lineStyle?: { opacity?: number; width?: number };\n}\n\nexport const ParallelChart = memo(\n forwardRef<AstroChartHandle, ParallelChartProps>(function ParallelChart(\n {\n axes = [],\n data = [],\n lineStyle = { opacity: 0.5, width: 1.5 },\n ...props\n },\n ref,\n ) {\n const { tokens } = useTheme();\n\n return (\n <AstroChart\n ref={ref}\n type=\"line\"\n series={[]}\n // AstroUXDS compliant parallel coordinates\n echartsOptions={{\n parallelAxis: axes.map((axis) => ({\n dim: axis.dim,\n name: axis.name,\n min: axis.min,\n max: axis.max,\n type: axis.type || \"value\",\n data: axis.data,\n nameTextStyle: { color: tokens.colors.text.secondary },\n axisLine: { lineStyle: { color: \"rgba(100, 116, 139, 0.3)\" } },\n axisTick: { lineStyle: { color: \"rgba(100, 116, 139, 0.3)\" } },\n axisLabel: { color: tokens.colors.text.tertiary },\n })),\n parallel: {\n left: 60,\n right: 60,\n bottom: 60,\n top: 60,\n parallelAxisDefault: {\n type: \"value\",\n nameLocation: \"end\",\n nameGap: 20,\n axisLine: { lineStyle: { color: \"rgba(100, 116, 139, 0.3)\" } },\n axisTick: { lineStyle: { color: \"rgba(100, 116, 139, 0.3)\" } },\n splitLine: { show: false },\n axisLabel: { color: tokens.colors.text.tertiary },\n },\n },\n series: [\n {\n type: \"parallel\",\n lineStyle: {\n ...lineStyle,\n color: ASTRO_DATA_VIZ_COLORS.mixed[0], // Zendir Electric\n },\n data: data.map((row) => ({ value: row })),\n emphasis: {\n lineStyle: { width: 3, opacity: 1 },\n },\n },\n ],\n }}\n {...props}\n />\n );\n }),\n);\n\n// =============================================================================\n// Candlestick Chart (Financial/Orbital Maneuver Windows)\n// =============================================================================\n\nexport interface CandlestickDataPoint {\n time: number | string;\n open: number;\n close: number;\n low: number;\n high: number;\n}\n\nexport interface CandlestickChartProps extends Omit<PresetProps, \"series\"> {\n /** OHLC data */\n data: CandlestickDataPoint[];\n /** Show volume bars */\n showVolume?: boolean;\n}\n\nexport const CandlestickChart = memo(\n forwardRef<AstroChartHandle, CandlestickChartProps>(function CandlestickChart(\n { data = [], showVolume: _showVolume = false, ...props },\n ref,\n ) {\n const { tokens } = useTheme();\n const categoryData = data.map((d) => d.time);\n const ohlcData = data.map((d) => [d.open, d.close, d.low, d.high]);\n\n return (\n <AstroChart\n ref={ref}\n type=\"candlestick\"\n series={[]}\n // Candlestick uses AstroUXDS status colors for semantic meaning\n // Green (normal) = bullish/up, Red (critical) = bearish/down\n echartsOptions={{\n tooltip: {\n trigger: \"axis\",\n axisPointer: { type: \"cross\" },\n },\n xAxis: {\n type: \"category\",\n data: categoryData,\n axisLine: { lineStyle: { color: \"rgba(100, 116, 139, 0.3)\" } },\n axisLabel: { color: tokens.colors.text.secondary },\n },\n yAxis: {\n type: \"value\",\n scale: true,\n splitLine: { lineStyle: { color: \"rgba(100, 116, 139, 0.15)\" } },\n axisLine: { lineStyle: { color: \"rgba(100, 116, 139, 0.3)\" } },\n axisLabel: { color: tokens.colors.text.secondary },\n },\n series: [\n {\n type: \"candlestick\",\n data: ohlcData,\n itemStyle: {\n color: SOFT_STATUS_COLORS.normal, // AstroUXDS green (up/bullish)\n color0: SOFT_STATUS_COLORS.critical, // AstroUXDS red (down/bearish)\n borderColor: SOFT_STATUS_COLORS.normal,\n borderColor0: SOFT_STATUS_COLORS.critical,\n },\n },\n ],\n dataZoom: [\n { type: \"inside\", start: 0, end: 100 },\n { show: true, type: \"slider\", bottom: 10 },\n ],\n }}\n {...props}\n />\n );\n }),\n);\n\n// =============================================================================\n// Graph/Network Chart (Subsystem Dependencies)\n// =============================================================================\n\nexport interface GraphNode {\n id: string;\n name: string;\n value?: number;\n category?: number;\n symbolSize?: number;\n x?: number;\n y?: number;\n itemStyle?: { color?: string };\n}\n\nexport interface GraphLink {\n source: string;\n target: string;\n value?: number;\n lineStyle?: { width?: number; color?: string };\n}\n\nexport interface GraphCategory {\n name: string;\n itemStyle?: { color?: string };\n}\n\nexport interface GraphChartProps extends Omit<PresetProps, \"series\"> {\n /** Node definitions */\n nodes: GraphNode[];\n /** Link definitions */\n links: GraphLink[];\n /** Category definitions */\n categories?: GraphCategory[];\n /** Layout type */\n layout?: \"force\" | \"circular\" | \"none\";\n}\n\nexport const GraphChart = memo(\n forwardRef<AstroChartHandle, GraphChartProps>(function GraphChart(\n { nodes = [], links = [], categories = [], layout = \"force\", ...props },\n ref,\n ) {\n const { tokens } = useTheme();\n\n return (\n <AstroChart\n ref={ref}\n type=\"scatter\"\n series={[]}\n // Zendir-branded network/graph visualization\n echartsOptions={{\n tooltip: {},\n legend:\n categories.length > 0\n ? {\n data: categories.map((c) => c.name),\n textStyle: { color: tokens.colors.text.primary },\n }\n : undefined,\n series: [\n {\n type: \"graph\",\n layout,\n data: nodes.map((n) => ({\n ...n,\n symbolSize: n.symbolSize || 30,\n })),\n links,\n categories,\n roam: true,\n label: {\n show: true,\n position: \"right\",\n formatter: \"{b}\",\n color: tokens.colors.text.primary,\n fontSize: 11,\n },\n lineStyle: {\n color: \"source\",\n curveness: 0.3,\n opacity: 0.6,\n },\n emphasis: {\n focus: \"adjacency\",\n lineStyle: { width: 3 },\n },\n force:\n layout === \"force\"\n ? {\n repulsion: 200,\n edgeLength: [50, 150],\n gravity: 0.1,\n }\n : undefined,\n },\n ],\n }}\n {...props}\n />\n );\n }),\n);\n\n// =============================================================================\n// Box Plot Chart\n// =============================================================================\n\nexport interface BoxPlotDataPoint {\n /** Category name (x-axis label) */\n name: string;\n /** Raw data values for computing boxplot statistics */\n values: number[];\n}\n\nexport interface BoxPlotChartProps extends Omit<PresetProps, \"series\"> {\n /** Box plot data - each item contains a category name and array of values */\n data: BoxPlotDataPoint[];\n /** Show outliers as scatter points */\n showOutliers?: boolean;\n /** Custom colors for each box (uses theme palette if not provided) */\n colors?: string[];\n /** Horizontal orientation (default is vertical) */\n horizontal?: boolean;\n}\n\n/**\n * Calculate boxplot statistics from raw values\n */\nfunction calculateBoxplotStats(\n values: number[],\n): [number, number, number, number, number] {\n const sorted = [...values].sort((a, b) => a - b);\n const n = sorted.length;\n\n const min = sorted[0];\n const max = sorted[n - 1];\n const median =\n n % 2 === 0\n ? (sorted[n / 2 - 1] + sorted[n / 2]) / 2\n : sorted[Math.floor(n / 2)];\n\n const q1Index = Math.floor(n * 0.25);\n const q3Index = Math.floor(n * 0.75);\n const q1 = sorted[q1Index];\n const q3 = sorted[q3Index];\n\n // IQR-based whiskers\n const iqr = q3 - q1;\n const lowerWhisker = Math.max(min, q1 - 1.5 * iqr);\n const upperWhisker = Math.min(max, q3 + 1.5 * iqr);\n\n return [lowerWhisker, q1, median, q3, upperWhisker];\n}\n\n/**\n * BoxPlotChart - Statistical distribution visualization\n *\n * Shows distribution of data through quartiles (box) and whiskers (range).\n * Uses theme-aware colors from the data visualization palette.\n *\n * @example\n * ```tsx\n * <BoxPlotChart\n * title=\"Score Distribution\"\n * data={[\n * { name: 'Team A', values: [65, 72, 84, 91, 55, 88, 76] },\n * { name: 'Team B', values: [78, 82, 95, 88, 70, 92, 85] },\n * ]}\n * />\n * ```\n */\nexport const BoxPlotChart = memo(\n forwardRef<AstroChartHandle, BoxPlotChartProps>(function BoxPlotChart(\n { data = [], showOutliers = true, colors, horizontal = false, ...props },\n ref,\n ) {\n const { tokens } = useTheme();\n\n // Calculate boxplot statistics for each category\n const categories = data.map((d) => d.name);\n const boxplotData = data.map((d, index) => {\n const stats = calculateBoxplotStats(d.values);\n return {\n value: stats,\n itemStyle: colors?.[index]\n ? {\n color: colors[index],\n borderColor: colors[index],\n }\n : undefined,\n };\n });\n\n // Find outliers for each category\n const outliers: Array<[number, number]> = [];\n if (showOutliers) {\n data.forEach((d, catIndex) => {\n const sorted = [...d.values].sort((a, b) => a - b);\n const n = sorted.length;\n const q1Index = Math.floor(n * 0.25);\n const q3Index = Math.floor(n * 0.75);\n const q1 = sorted[q1Index];\n const q3 = sorted[q3Index];\n const iqr = q3 - q1;\n const lowerBound = q1 - 1.5 * iqr;\n const upperBound = q3 + 1.5 * iqr;\n\n d.values.forEach((v) => {\n if (v < lowerBound || v > upperBound) {\n outliers.push([catIndex, v]);\n }\n });\n });\n }\n\n const categoryAxis = {\n type: \"category\" as const,\n data: categories,\n boundaryGap: true,\n axisLine: { lineStyle: { color: \"rgba(100, 116, 139, 0.3)\" } },\n axisLabel: { color: tokens.colors.text.secondary, fontSize: 12 },\n splitArea: { show: false },\n };\n\n const valueAxis = {\n type: \"value\" as const,\n splitLine: { lineStyle: { color: \"rgba(100, 116, 139, 0.15)\" } },\n axisLine: { lineStyle: { color: \"rgba(100, 116, 139, 0.3)\" } },\n axisLabel: { color: tokens.colors.text.secondary },\n };\n\n return (\n <AstroChart\n ref={ref}\n type=\"boxplot\"\n series={[]}\n echartsOptions={{\n tooltip: {\n trigger: \"item\",\n axisPointer: { type: \"shadow\" },\n formatter: (params: any) => {\n if (params.seriesType === \"boxplot\") {\n const value = params.value;\n return `\n <div style=\"font-weight: 600; margin-bottom: 4px;\">${params.name}</div>\n <div>Upper: ${value[5]?.toFixed(1) ?? value[4]?.toFixed(1)}</div>\n <div>Q3: ${value[4]?.toFixed(1) ?? value[3]?.toFixed(1)}</div>\n <div>Median: ${value[3]?.toFixed(1) ?? value[2]?.toFixed(1)}</div>\n <div>Q1: ${value[2]?.toFixed(1) ?? value[1]?.toFixed(1)}</div>\n <div>Lower: ${value[1]?.toFixed(1) ?? value[0]?.toFixed(1)}</div>\n `;\n }\n return `Outlier: ${params.value[1]}`;\n },\n },\n grid: {\n left: \"10%\",\n right: \"10%\",\n bottom: \"15%\",\n top: \"15%\",\n },\n xAxis: horizontal ? valueAxis : categoryAxis,\n yAxis: horizontal ? categoryAxis : valueAxis,\n series: [\n {\n name: \"boxplot\",\n type: \"boxplot\" as const,\n data: boxplotData,\n itemStyle: {\n borderWidth: 2,\n },\n emphasis: {\n itemStyle: {\n borderWidth: 3,\n },\n },\n },\n ...(showOutliers && outliers.length > 0\n ? [\n {\n name: \"outlier\",\n type: \"scatter\" as const,\n data: outliers,\n symbolSize: 8,\n itemStyle: {\n color: SOFT_STATUS_COLORS.caution,\n },\n },\n ]\n : []),\n ],\n }}\n {...props}\n />\n );\n }),\n);\n"],"mappings":"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"}
1
+ {"version":3,"file":"presets.js","names":[],"sources":["../../../../src/react/charts/unified/presets.tsx"],"sourcesContent":["/**\r\n * @zendir/ui - Chart Presets\r\n *\r\n * Pre-configured chart components for common use cases.\r\n * Each preset wraps AstroChart with sensible defaults.\r\n */\r\n\r\nimport React, { forwardRef, memo } from \"react\";\r\nimport { AstroChart, AstroChartHandle } from \"./AstroChart\";\r\nimport type { AstroChartProps, SeriesData, AxisOptions } from \"./types\";\r\nimport { STATUS_COLORS, ASTRO_DATA_VIZ_COLORS } from \"./theme\";\r\nimport { useTheme } from \"../../theme\";\r\n\r\n// Medium-soft status colors (readable, not too pale)\r\nconst SOFT_STATUS_COLORS = {\r\n normal: \"#6ed86e\",\r\n caution: \"#ffd54f\",\r\n serious: \"#ffa726\",\r\n critical: \"#e57373\",\r\n off: \"#90a4ae\",\r\n standby: \"#4fc3f7\",\r\n};\r\n\r\n// =============================================================================\r\n// Shared Types\r\n// =============================================================================\r\n\r\ntype PresetProps = Omit<AstroChartProps, \"type\">;\r\n\r\n// =============================================================================\r\n// Line Chart\r\n// =============================================================================\r\n\r\nexport interface LineChartProps extends PresetProps {\r\n /** Enable smooth curves */\r\n smooth?: boolean;\r\n /** Show data points */\r\n showPoints?: boolean;\r\n /** Enable area fill */\r\n showArea?: boolean;\r\n}\r\n\r\nexport const LineChart = memo(\r\n forwardRef<AstroChartHandle, LineChartProps>(function LineChart(\r\n {\r\n smooth = true,\r\n showPoints = false,\r\n showArea = false,\r\n series = [],\r\n ...props\r\n },\r\n ref,\r\n ) {\r\n const transformedSeries: SeriesData[] = series.map((s) => ({\r\n ...s,\r\n type: showArea ? \"area\" : \"line\",\r\n smooth,\r\n symbol: showPoints ? { type: \"circle\", size: 6 } : { type: \"none\" },\r\n }));\r\n\r\n return (\r\n <AstroChart\r\n ref={ref}\r\n type={showArea ? \"area\" : \"line\"}\r\n series={transformedSeries}\r\n tooltip={{ trigger: \"axis\", crosshair: \"x\" }}\r\n {...props}\r\n />\r\n );\r\n }),\r\n);\r\n\r\n// =============================================================================\r\n// Area Chart\r\n// =============================================================================\r\n\r\nexport interface AreaChartProps extends PresetProps {\r\n /** Stack areas */\r\n stacked?: boolean;\r\n /** Smooth curves */\r\n smooth?: boolean;\r\n}\r\n\r\nexport const AreaChart = memo(\r\n forwardRef<AstroChartHandle, AreaChartProps>(function AreaChart(\r\n { stacked = false, smooth = true, series = [], ...props },\r\n ref,\r\n ) {\r\n const transformedSeries: SeriesData[] = series.map((s, _i) => ({\r\n ...s,\r\n type: \"area\",\r\n smooth,\r\n stack: stacked ? \"total\" : undefined,\r\n areaStyle: { opacity: stacked ? 0.8 : 0.3 },\r\n }));\r\n\r\n return (\r\n <AstroChart\r\n ref={ref}\r\n type=\"area\"\r\n series={transformedSeries}\r\n tooltip={{ trigger: \"axis\", crosshair: \"x\" }}\r\n {...props}\r\n />\r\n );\r\n }),\r\n);\r\n\r\n// =============================================================================\r\n// Bar Chart\r\n// =============================================================================\r\n\r\nexport interface BarChartProps extends PresetProps {\r\n /** Stack bars */\r\n stacked?: boolean;\r\n /** Horizontal orientation */\r\n horizontal?: boolean;\r\n /** Bar category gap */\r\n categoryGap?: string;\r\n}\r\n\r\nexport const BarChart = memo(\r\n forwardRef<AstroChartHandle, BarChartProps>(function BarChart(\r\n {\r\n stacked = false,\r\n horizontal = false,\r\n series = [],\r\n xAxis,\r\n yAxis,\r\n ...props\r\n },\r\n ref,\r\n ) {\r\n const transformedSeries: SeriesData[] = series.map((s) => ({\r\n ...s,\r\n type: \"bar\",\r\n stack: stacked ? \"total\" : undefined,\r\n }));\r\n\r\n // Swap axes for horizontal\r\n const finalXAxis: AxisOptions = horizontal\r\n ? { type: \"value\", ...(yAxis as AxisOptions) }\r\n : { type: \"category\", ...xAxis };\r\n\r\n const finalYAxis: AxisOptions = horizontal\r\n ? { type: \"category\", ...xAxis }\r\n : { type: \"value\", ...(yAxis as AxisOptions) };\r\n\r\n return (\r\n <AstroChart\r\n ref={ref}\r\n type=\"bar\"\r\n series={transformedSeries}\r\n xAxis={finalXAxis}\r\n yAxis={finalYAxis}\r\n tooltip={{ trigger: \"axis\" }}\r\n {...props}\r\n />\r\n );\r\n }),\r\n);\r\n\r\n// =============================================================================\r\n// Scatter Chart\r\n// =============================================================================\r\n\r\nexport interface ScatterChartProps extends PresetProps {\r\n /** Symbol size */\r\n symbolSize?: number | ((value: number[]) => number);\r\n /** Show regression line */\r\n showRegression?: boolean;\r\n}\r\n\r\nexport const ScatterChart = memo(\r\n forwardRef<AstroChartHandle, ScatterChartProps>(function ScatterChart(\r\n { symbolSize = 10, series = [], ...props },\r\n ref,\r\n ) {\r\n const transformedSeries: SeriesData[] = series.map((s) => ({\r\n ...s,\r\n type: \"scatter\",\r\n symbol: {\r\n type: \"circle\",\r\n size: typeof symbolSize === \"number\" ? symbolSize : 10,\r\n },\r\n }));\r\n\r\n return (\r\n <AstroChart\r\n ref={ref}\r\n type=\"scatter\"\r\n series={transformedSeries}\r\n tooltip={{ trigger: \"item\" }}\r\n xAxis={{ type: \"value\" }}\r\n yAxis={{ type: \"value\" }}\r\n {...props}\r\n />\r\n );\r\n }),\r\n);\r\n\r\n// =============================================================================\r\n// Pie Chart\r\n// =============================================================================\r\n\r\nexport interface PieChartProps extends Omit<\r\n PresetProps,\r\n \"xAxis\" | \"yAxis\" | \"zoom\"\r\n> {\r\n /** Show as donut */\r\n donut?: boolean;\r\n /** Inner radius for donut (percentage) */\r\n innerRadius?: string;\r\n /** Outer radius (percentage) */\r\n outerRadius?: string;\r\n /** Show labels */\r\n showLabels?: boolean;\r\n /** Center content (for donut) */\r\n centerContent?: React.ReactNode;\r\n}\r\n\r\nexport const PieChart = memo(\r\n forwardRef<AstroChartHandle, PieChartProps>(function PieChart(\r\n {\r\n donut = false,\r\n innerRadius = \"40%\",\r\n outerRadius = \"70%\",\r\n showLabels = true,\r\n series = [],\r\n ...props\r\n },\r\n ref,\r\n ) {\r\n const transformedSeries: SeriesData[] = series.map((s) => ({\r\n ...s,\r\n type: donut ? \"donut\" : \"pie\",\r\n }));\r\n\r\n return (\r\n <AstroChart\r\n ref={ref}\r\n type={donut ? \"donut\" : \"pie\"}\r\n series={transformedSeries}\r\n tooltip={{ trigger: \"item\" }}\r\n echartsOptions={{\r\n series: [\r\n {\r\n radius: donut ? [innerRadius, outerRadius] : outerRadius,\r\n label: {\r\n show: showLabels,\r\n formatter: \"{b}: {d}%\",\r\n },\r\n },\r\n ],\r\n }}\r\n {...props}\r\n />\r\n );\r\n }),\r\n);\r\n\r\n// =============================================================================\r\n// Donut Chart\r\n// =============================================================================\r\n\r\nexport const DonutChart = memo(\r\n forwardRef<AstroChartHandle, PieChartProps>(function DonutChart(props, ref) {\r\n return <PieChart ref={ref} donut {...props} />;\r\n }),\r\n);\r\n\r\n// =============================================================================\r\n// Gauge Chart\r\n// =============================================================================\r\n\r\nexport interface GaugeChartProps extends Omit<\r\n PresetProps,\r\n \"xAxis\" | \"yAxis\" | \"zoom\" | \"series\"\r\n> {\r\n /** Current value */\r\n value: number;\r\n /** Minimum value */\r\n min?: number;\r\n /** Maximum value */\r\n max?: number;\r\n /** Unit label */\r\n unit?: string;\r\n /** Title label */\r\n label?: string;\r\n /** Threshold colors */\r\n thresholds?: {\r\n value: number;\r\n color: string;\r\n }[];\r\n /** Show progress arc */\r\n progress?: boolean;\r\n /** Show clock-style pointer (needle). Set false for arc + value only. */\r\n showPointer?: boolean;\r\n}\r\n\r\nexport const GaugeChart = memo(\r\n forwardRef<AstroChartHandle, GaugeChartProps>(function GaugeChart(\r\n {\r\n value,\r\n min = 0,\r\n max = 100,\r\n unit = \"%\",\r\n label,\r\n thresholds,\r\n progress = true,\r\n showPointer = true,\r\n width = 220,\r\n height = 220,\r\n ...props\r\n },\r\n ref,\r\n ) {\r\n const { tokens } = useTheme();\r\n const range = max - min;\r\n const safeRange = range === 0 ? 1 : range;\r\n const clampedValue = Math.max(min, Math.min(max, value));\r\n const widthPx =\r\n typeof width === \"number\"\r\n ? width\r\n : typeof height === \"number\"\r\n ? height\r\n : 220;\r\n const heightPx = typeof height === \"number\" ? height : 220;\r\n const gaugeSize = Math.max(120, Math.min(widthPx, heightPx));\r\n const compactGauge = gaugeSize < 170;\r\n const arcWidth = Math.max(8, Math.round(gaugeSize * 0.07));\r\n const valueFontSize = Math.max(16, Math.round(gaugeSize * 0.15));\r\n const labelFontSize = Math.max(10, Math.round(gaugeSize * 0.07));\r\n const unitSuffix = unit?.trim() ?? \"\";\r\n const longUnit = unitSuffix.length > 4;\r\n\r\n const series: SeriesData[] = [\r\n {\r\n id: \"gauge\",\r\n name: label || \"Value\",\r\n type: \"gauge\",\r\n data: [{ x: 0, y: clampedValue }],\r\n },\r\n ];\r\n\r\n // Build color stops from thresholds\r\n const normalizedThresholds = [...(thresholds ?? [])]\r\n .filter((t) => Number.isFinite(t.value))\r\n .sort((a, b) => a.value - b.value);\r\n\r\n const colorStops = normalizedThresholds.map(\r\n (t) =>\r\n [Math.max(0, Math.min(1, (t.value - min) / safeRange)), t.color] as [\r\n number,\r\n string,\r\n ],\r\n );\r\n\r\n if (colorStops.length === 0) {\r\n colorStops.push(\r\n [0.3, SOFT_STATUS_COLORS.normal],\r\n [0.7, SOFT_STATUS_COLORS.caution],\r\n [1, SOFT_STATUS_COLORS.critical],\r\n );\r\n } else if (colorStops[colorStops.length - 1][0] < 1) {\r\n colorStops.push([1, colorStops[colorStops.length - 1][1]]);\r\n }\r\n\r\n const activeColor =\r\n [...colorStops]\r\n .reverse()\r\n .find(([stop]) => stop <= (clampedValue - min) / safeRange)?.[1] ??\r\n SOFT_STATUS_COLORS.normal;\r\n\r\n return (\r\n <AstroChart\r\n ref={ref}\r\n type=\"gauge\"\r\n series={series}\r\n width={width}\r\n height={height}\r\n echartsOptions={{\r\n series: [\r\n {\r\n type: \"gauge\",\r\n min,\r\n max,\r\n progress: {\r\n show: progress,\r\n width: arcWidth,\r\n roundCap: true,\r\n },\r\n axisLine: {\r\n lineStyle: {\r\n width: arcWidth,\r\n color: colorStops,\r\n },\r\n },\r\n axisTick: { show: false },\r\n splitLine: { show: false },\r\n axisLabel: { show: false },\r\n pointer: {\r\n show: showPointer,\r\n length: compactGauge ? \"56%\" : \"60%\",\r\n width: Math.max(3, Math.round(arcWidth * 0.38)),\r\n },\r\n title: {\r\n show: !!label,\r\n offsetCenter: [0, compactGauge ? \"73%\" : \"78%\"],\r\n fontSize: labelFontSize,\r\n color: tokens.colors.text.secondary,\r\n },\r\n detail: {\r\n valueAnimation: true,\r\n formatter: (currentValue: number) => {\r\n const rounded = Math.round(currentValue);\r\n if (!unitSuffix) return `${rounded}`;\r\n if (longUnit) return `${rounded}\\n{unit|${unitSuffix}}`;\r\n return `${rounded}${unitSuffix}`;\r\n },\r\n rich: {\r\n unit: {\r\n color: tokens.colors.text.secondary,\r\n fontSize: Math.max(10, Math.round(valueFontSize * 0.48)),\r\n fontWeight: 500,\r\n lineHeight: Math.round(valueFontSize * 0.78),\r\n },\r\n },\r\n lineHeight: Math.round(valueFontSize * 1.05),\r\n fontSize: valueFontSize,\r\n fontWeight: 700,\r\n offsetCenter: [0, compactGauge ? \"10%\" : \"14%\"],\r\n color: activeColor,\r\n },\r\n data: [{ value: clampedValue, name: label }],\r\n },\r\n ],\r\n }}\r\n {...props}\r\n />\r\n );\r\n }),\r\n);\r\n\r\n// =============================================================================\r\n// Radar Chart\r\n// =============================================================================\r\n\r\nexport interface RadarChartProps extends Omit<\r\n PresetProps,\r\n \"xAxis\" | \"yAxis\" | \"zoom\"\r\n> {\r\n /** Indicator definitions */\r\n indicators: {\r\n name: string;\r\n max: number;\r\n min?: number;\r\n }[];\r\n /** Fill area */\r\n areaStyle?: boolean;\r\n}\r\n\r\nexport const RadarChart = memo(\r\n forwardRef<AstroChartHandle, RadarChartProps>(function RadarChart(\r\n { indicators, areaStyle = true, series = [], ...props },\r\n ref,\r\n ) {\r\n // Extract values from data - support both [{x,y}] and [number] formats\r\n const extractValues = (data: unknown[]): number[] => {\r\n if (!data || data.length === 0) return [];\r\n const first = data[0];\r\n if (typeof first === \"number\") return data as number[];\r\n if (typeof first === \"object\" && first !== null && \"y\" in first) {\r\n return (data as Array<{ y: number }>).map((d) => d.y);\r\n }\r\n return [];\r\n };\r\n\r\n return (\r\n <AstroChart\r\n ref={ref}\r\n type=\"radar\"\r\n series={[]} // Empty - we provide series via echartsOptions\r\n tooltip={{ trigger: \"item\" }}\r\n echartsOptions={{\r\n radar: {\r\n indicator: indicators,\r\n shape: \"polygon\",\r\n },\r\n series: series.map((s) => ({\r\n type: \"radar\",\r\n name: s.name,\r\n data: [\r\n {\r\n value: extractValues(s.data as unknown[]),\r\n name: s.name,\r\n },\r\n ],\r\n areaStyle: areaStyle ? { opacity: 0.3 } : undefined,\r\n })),\r\n }}\r\n {...props}\r\n />\r\n );\r\n }),\r\n);\r\n\r\n// =============================================================================\r\n// Heatmap Chart\r\n// =============================================================================\r\n\r\nexport interface HeatmapChartProps extends PresetProps {\r\n /** X-axis categories */\r\n xCategories: string[];\r\n /** Y-axis categories */\r\n yCategories: string[];\r\n /** Value range */\r\n valueRange?: [number, number];\r\n /** Show value labels */\r\n showLabels?: boolean;\r\n}\r\n\r\nexport const HeatmapChart = memo(\r\n forwardRef<AstroChartHandle, HeatmapChartProps>(function HeatmapChart(\r\n {\r\n xCategories,\r\n yCategories,\r\n valueRange = [0, 100],\r\n showLabels = true,\r\n series = [],\r\n ...props\r\n },\r\n ref,\r\n ) {\r\n // Transform data to heatmap format if needed\r\n const heatmapData = series[0]?.data as unknown[];\r\n\r\n return (\r\n <AstroChart\r\n ref={ref}\r\n type=\"heatmap\"\r\n series={series}\r\n xAxis={{ type: \"category\" }}\r\n yAxis={{ type: \"category\" }}\r\n tooltip={{ trigger: \"item\" }}\r\n echartsOptions={{\r\n xAxis: { data: xCategories },\r\n yAxis: { data: yCategories },\r\n visualMap: {\r\n min: valueRange[0],\r\n max: valueRange[1],\r\n calculable: true,\r\n orient: \"horizontal\",\r\n left: \"center\",\r\n bottom: \"5%\",\r\n },\r\n series: [\r\n {\r\n type: \"heatmap\",\r\n data: heatmapData as [number, number, number][],\r\n label: {\r\n show: showLabels,\r\n },\r\n emphasis: {\r\n itemStyle: {\r\n shadowBlur: 10,\r\n shadowColor: \"rgba(0, 0, 0, 0.5)\",\r\n },\r\n },\r\n },\r\n ],\r\n }}\r\n {...props}\r\n />\r\n );\r\n }),\r\n);\r\n\r\n// =============================================================================\r\n// Time Series Chart (optimized for streaming data)\r\n// =============================================================================\r\n\r\nexport interface TimeSeriesChartProps extends PresetProps {\r\n /** Time window in milliseconds */\r\n timeWindow?: number;\r\n /** Maximum data points */\r\n maxPoints?: number;\r\n /** Auto-scroll to latest data */\r\n autoScroll?: boolean;\r\n /** Show current values */\r\n showCurrentValues?: boolean;\r\n}\r\n\r\nexport const TimeSeriesChart = memo(\r\n forwardRef<AstroChartHandle, TimeSeriesChartProps>(function TimeSeriesChart(\r\n {\r\n timeWindow,\r\n maxPoints = 1000,\r\n autoScroll = true,\r\n showCurrentValues: _showCurrentValues = true,\r\n series = [],\r\n ...props\r\n },\r\n ref,\r\n ) {\r\n const xAxis: AxisOptions = {\r\n type: \"time\",\r\n ...(timeWindow\r\n ? {\r\n min: \"dataMin\",\r\n max: \"dataMax\",\r\n }\r\n : {}),\r\n };\r\n\r\n return (\r\n <AstroChart\r\n ref={ref}\r\n type=\"line\"\r\n series={series.map((s) => ({\r\n ...s,\r\n smooth: true,\r\n symbol: { type: \"none\" },\r\n }))}\r\n xAxis={xAxis}\r\n tooltip={{\r\n trigger: \"axis\",\r\n crosshair: \"x\",\r\n }}\r\n zoom={\r\n autoScroll\r\n ? undefined\r\n : {\r\n enabled: true,\r\n type: \"both\",\r\n axis: \"x\",\r\n }\r\n }\r\n realTime={{\r\n enabled: true,\r\n maxPoints,\r\n timeWindow,\r\n shift: autoScroll,\r\n }}\r\n {...props}\r\n />\r\n );\r\n }),\r\n);\r\n\r\n// =============================================================================\r\n// Dual Axis Chart\r\n// =============================================================================\r\n\r\nexport interface DualAxisChartProps extends PresetProps {\r\n /** Left Y-axis options */\r\n leftAxis?: AxisOptions;\r\n /** Right Y-axis options */\r\n rightAxis?: AxisOptions;\r\n}\r\n\r\nexport const DualAxisChart = memo(\r\n forwardRef<AstroChartHandle, DualAxisChartProps>(function DualAxisChart(\r\n { leftAxis, rightAxis, series = [], ...props },\r\n ref,\r\n ) {\r\n // Assign series to axes based on yAxisIndex\r\n const transformedSeries: SeriesData[] = series.map((s, i) => ({\r\n ...s,\r\n yAxisIndex: s.yAxisIndex ?? i % 2, // Alternate by default\r\n }));\r\n\r\n return (\r\n <AstroChart\r\n ref={ref}\r\n type=\"line\"\r\n series={transformedSeries}\r\n yAxis={[\r\n { position: \"left\", ...leftAxis },\r\n { position: \"right\", ...rightAxis },\r\n ]}\r\n tooltip={{ trigger: \"axis\", crosshair: \"x\" }}\r\n {...props}\r\n />\r\n );\r\n }),\r\n);\r\n\r\n// =============================================================================\r\n// Stacked Area Chart\r\n// =============================================================================\r\n\r\nexport const StackedAreaChart = memo(\r\n forwardRef<AstroChartHandle, AreaChartProps>(\r\n function StackedAreaChart(props, ref) {\r\n return <AreaChart ref={ref} stacked {...props} />;\r\n },\r\n ),\r\n);\r\n\r\n// =============================================================================\r\n// Stacked Bar Chart\r\n// =============================================================================\r\n\r\nexport const StackedBarChart = memo(\r\n forwardRef<AstroChartHandle, BarChartProps>(\r\n function StackedBarChart(props, ref) {\r\n return <BarChart ref={ref} stacked {...props} />;\r\n },\r\n ),\r\n);\r\n\r\n// =============================================================================\r\n// Bubble Chart (AstroUXD compliant)\r\n// =============================================================================\r\n\r\nexport interface BubbleChartProps extends PresetProps {\r\n /** Min bubble size (px) */\r\n minSize?: number;\r\n /** Max bubble size (px) */\r\n maxSize?: number;\r\n /** Show size legend */\r\n showSizeLegend?: boolean;\r\n}\r\n\r\nexport const BubbleChart = memo(\r\n forwardRef<AstroChartHandle, BubbleChartProps>(function BubbleChart(\r\n {\r\n minSize = 10,\r\n maxSize = 60,\r\n showSizeLegend = true,\r\n series = [],\r\n ...props\r\n },\r\n ref,\r\n ) {\r\n // Transform series for bubble (scatter with symbolSize)\r\n const transformedSeries: SeriesData[] = series.map((s) => ({\r\n ...s,\r\n type: \"scatter\" as const,\r\n }));\r\n\r\n return (\r\n <AstroChart\r\n ref={ref}\r\n type=\"scatter\"\r\n series={transformedSeries}\r\n tooltip={{ trigger: \"item\" }}\r\n echartsOptions={{\r\n series: series.map((s, _idx) => {\r\n const data = s.data as Array<\r\n | { x: number; y: number; size?: number; label?: string }\r\n | [number, number, number]\r\n >;\r\n return {\r\n type: \"scatter\",\r\n name: s.name,\r\n data: data.map((d) => {\r\n if (Array.isArray(d)) return d;\r\n return [d.x, d.y, (d as { size?: number }).size ?? 10];\r\n }),\r\n symbolSize: (val: number[]) => {\r\n const size = val[2] ?? minSize;\r\n return Math.max(minSize, Math.min(maxSize, size));\r\n },\r\n };\r\n }),\r\n visualMap: showSizeLegend\r\n ? {\r\n show: true,\r\n dimension: 2,\r\n min: 0,\r\n max: 100,\r\n inRange: { symbolSize: [minSize, maxSize] },\r\n right: 10,\r\n top: \"center\",\r\n }\r\n : undefined,\r\n }}\r\n {...props}\r\n />\r\n );\r\n }),\r\n);\r\n\r\n// =============================================================================\r\n// Histogram Chart (AstroUXD compliant)\r\n// =============================================================================\r\n\r\nexport interface HistogramChartProps extends PresetProps {\r\n /** Number of bins (auto if not specified) */\r\n bins?: number;\r\n /** Show distribution curve overlay */\r\n showCurve?: boolean;\r\n}\r\n\r\nexport const HistogramChart = memo(\r\n forwardRef<AstroChartHandle, HistogramChartProps>(function HistogramChart(\r\n {\r\n bins: _bins = 20,\r\n showCurve: _showCurve = false,\r\n series = [],\r\n xAxis,\r\n ...props\r\n },\r\n ref,\r\n ) {\r\n // Transform data into histogram bins\r\n const transformedSeries: SeriesData[] = series.map((s) => ({\r\n ...s,\r\n type: \"bar\" as const,\r\n }));\r\n\r\n return (\r\n <AstroChart\r\n ref={ref}\r\n type=\"bar\"\r\n series={transformedSeries}\r\n xAxis={{ type: \"category\", ...xAxis }}\r\n yAxis={{ type: \"value\", name: \"Frequency\" }}\r\n tooltip={{ trigger: \"axis\" }}\r\n echartsOptions={{\r\n series: series.map((s) => ({\r\n type: \"bar\",\r\n name: s.name,\r\n data: s.data,\r\n barWidth: \"90%\",\r\n itemStyle: { borderRadius: [2, 2, 0, 0] },\r\n })) as import(\"echarts\").SeriesOption[],\r\n }}\r\n {...props}\r\n />\r\n );\r\n }),\r\n);\r\n\r\n// =============================================================================\r\n// Sankey Diagram (Power/Data Flow)\r\n// =============================================================================\r\n\r\nexport interface SankeyChartProps extends Omit<PresetProps, \"series\"> {\r\n /** Node definitions */\r\n nodes: { name: string; itemStyle?: { color?: string } }[];\r\n /** Link definitions */\r\n links: { source: string; target: string; value: number }[];\r\n /** Orient vertical or horizontal */\r\n orient?: \"horizontal\" | \"vertical\";\r\n}\r\n\r\nexport const SankeyChart = memo(\r\n forwardRef<AstroChartHandle, SankeyChartProps>(function SankeyChart(\r\n { nodes = [], links = [], orient = \"horizontal\", ...props },\r\n ref,\r\n ) {\r\n const { tokens } = useTheme();\r\n\r\n return (\r\n <AstroChart\r\n ref={ref}\r\n type=\"sankey\"\r\n series={[]}\r\n echartsOptions={{\r\n tooltip: {\r\n trigger: \"item\",\r\n triggerOn: \"mousemove\",\r\n },\r\n series: [\r\n {\r\n type: \"sankey\",\r\n orient,\r\n layoutIterations: 32,\r\n emphasis: { focus: \"adjacency\" },\r\n nodeAlign: \"justify\",\r\n lineStyle: { color: \"gradient\", curveness: 0.5 },\r\n data: nodes,\r\n links,\r\n label: {\r\n color: tokens.colors.text.primary,\r\n fontSize: 12,\r\n },\r\n },\r\n ],\r\n }}\r\n {...props}\r\n />\r\n );\r\n }),\r\n);\r\n\r\n// =============================================================================\r\n// Treemap (Storage/Allocation Visualization)\r\n// AstroUXDS compliant hierarchical visualization\r\n// =============================================================================\r\n\r\nexport interface TreemapDataNode {\r\n name: string;\r\n value?: number;\r\n children?: TreemapDataNode[];\r\n itemStyle?: { color?: string };\r\n}\r\n\r\nexport interface TreemapChartProps extends Omit<PresetProps, \"series\"> {\r\n /** Hierarchical data */\r\n data: TreemapDataNode[];\r\n /** Show breadcrumb navigation */\r\n showBreadcrumb?: boolean;\r\n /** Leaf depth to show */\r\n leafDepth?: number;\r\n}\r\n\r\nexport const TreemapChart = memo(\r\n forwardRef<AstroChartHandle, TreemapChartProps>(function TreemapChart(\r\n { data = [], showBreadcrumb = true, leafDepth = 2, ...props },\r\n ref,\r\n ) {\r\n const { tokens } = useTheme();\r\n\r\n return (\r\n <AstroChart\r\n ref={ref}\r\n type=\"treemap\"\r\n series={[]}\r\n echartsOptions={{\r\n tooltip: {\r\n formatter: ((info: any) => {\r\n const value = info.value;\r\n const name = info.name;\r\n return `${name}: ${typeof value === \"number\" ? value.toLocaleString() : value}`;\r\n }) as unknown as string,\r\n },\r\n series: [\r\n {\r\n type: \"treemap\",\r\n data,\r\n leafDepth,\r\n roam: false,\r\n // AstroUXDS compliant breadcrumb navigation\r\n breadcrumb: {\r\n show: showBreadcrumb,\r\n bottom: 10,\r\n itemStyle: { color: \"rgba(100, 116, 139, 0.6)\" }, // Subtle grey\r\n },\r\n label: {\r\n show: true,\r\n formatter: \"{b}\",\r\n color: tokens.colors.text.primary,\r\n fontSize: 12,\r\n },\r\n upperLabel: {\r\n show: true,\r\n height: 30,\r\n color: tokens.colors.text.secondary,\r\n },\r\n // AstroUXDS compliant borders - subtle grey\r\n itemStyle: {\r\n borderColor: \"rgba(100, 116, 139, 0.2)\",\r\n borderWidth: 2,\r\n gapWidth: 2,\r\n },\r\n levels: [\r\n {\r\n itemStyle: {\r\n borderColor: \"rgba(100, 116, 139, 0.3)\",\r\n borderWidth: 4,\r\n gapWidth: 4,\r\n },\r\n upperLabel: { show: false },\r\n },\r\n {\r\n itemStyle: {\r\n borderColor: \"rgba(100, 116, 139, 0.25)\",\r\n borderWidth: 2,\r\n gapWidth: 2,\r\n },\r\n emphasis: {\r\n itemStyle: { borderColor: ASTRO_DATA_VIZ_COLORS.mixed[0] },\r\n }, // Zendir Electric on hover\r\n },\r\n {\r\n colorSaturation: [0.35, 0.5],\r\n itemStyle: {\r\n borderColor: \"rgba(62, 60, 255, 0.3)\",\r\n borderWidth: 1,\r\n }, // Zendir Electric subtle\r\n },\r\n ],\r\n },\r\n ],\r\n }}\r\n {...props}\r\n />\r\n );\r\n }),\r\n);\r\n\r\n// =============================================================================\r\n// Sunburst Chart (Hierarchical Status)\r\n// =============================================================================\r\n\r\nexport interface SunburstDataNode {\r\n name: string;\r\n value?: number;\r\n children?: SunburstDataNode[];\r\n itemStyle?: { color?: string };\r\n}\r\n\r\nexport interface SunburstChartProps extends Omit<PresetProps, \"series\"> {\r\n /** Hierarchical data */\r\n data: SunburstDataNode[];\r\n /** Inner radius (percentage or pixels) */\r\n innerRadius?: string | number;\r\n /** Outer radius (percentage or pixels) */\r\n outerRadius?: string | number;\r\n}\r\n\r\nexport const SunburstChart = memo(\r\n forwardRef<AstroChartHandle, SunburstChartProps>(function SunburstChart(\r\n { data = [], innerRadius = \"15%\", outerRadius = \"80%\", ...props },\r\n ref,\r\n ) {\r\n const { tokens } = useTheme();\r\n\r\n return (\r\n <AstroChart\r\n ref={ref}\r\n type=\"sunburst\"\r\n series={[]}\r\n echartsOptions={{\r\n tooltip: {\r\n trigger: \"item\",\r\n },\r\n // Zendir-branded sunburst visualization\r\n series: [\r\n {\r\n type: \"sunburst\",\r\n data,\r\n radius: [innerRadius, outerRadius],\r\n emphasis: { focus: \"ancestor\" },\r\n label: {\r\n rotate: \"radial\",\r\n color: tokens.colors.text.secondary,\r\n fontSize: 11,\r\n },\r\n itemStyle: {\r\n borderRadius: 4,\r\n borderWidth: 2,\r\n borderColor: \"rgba(62, 60, 255, 0.25)\", // Zendir Electric subtle border\r\n },\r\n levels: [\r\n {},\r\n { r0: \"15%\", r: \"40%\", label: { rotate: \"tangential\" } },\r\n { r0: \"40%\", r: \"65%\" },\r\n {\r\n r0: \"65%\",\r\n r: \"80%\",\r\n label: { position: \"outside\", fontSize: 10 },\r\n },\r\n ],\r\n },\r\n ],\r\n }}\r\n {...props}\r\n />\r\n );\r\n }),\r\n);\r\n\r\n// =============================================================================\r\n// Parallel Coordinates (Multi-Parameter Analysis)\r\n// =============================================================================\r\n\r\nexport interface ParallelAxisDef {\r\n dim: number;\r\n name: string;\r\n min?: number;\r\n max?: number;\r\n type?: \"value\" | \"category\";\r\n data?: string[];\r\n}\r\n\r\nexport interface ParallelChartProps extends Omit<PresetProps, \"series\"> {\r\n /** Axis definitions */\r\n axes: ParallelAxisDef[];\r\n /** Data rows (each row is values for each axis) */\r\n data: (number | string)[][];\r\n /** Line style */\r\n lineStyle?: { opacity?: number; width?: number };\r\n}\r\n\r\nexport const ParallelChart = memo(\r\n forwardRef<AstroChartHandle, ParallelChartProps>(function ParallelChart(\r\n {\r\n axes = [],\r\n data = [],\r\n lineStyle = { opacity: 0.5, width: 1.5 },\r\n ...props\r\n },\r\n ref,\r\n ) {\r\n const { tokens } = useTheme();\r\n\r\n return (\r\n <AstroChart\r\n ref={ref}\r\n type=\"line\"\r\n series={[]}\r\n // AstroUXDS compliant parallel coordinates\r\n echartsOptions={{\r\n parallelAxis: axes.map((axis) => ({\r\n dim: axis.dim,\r\n name: axis.name,\r\n min: axis.min,\r\n max: axis.max,\r\n type: axis.type || \"value\",\r\n data: axis.data,\r\n nameTextStyle: { color: tokens.colors.text.secondary },\r\n axisLine: { lineStyle: { color: \"rgba(100, 116, 139, 0.3)\" } },\r\n axisTick: { lineStyle: { color: \"rgba(100, 116, 139, 0.3)\" } },\r\n axisLabel: { color: tokens.colors.text.tertiary },\r\n })),\r\n parallel: {\r\n left: 60,\r\n right: 60,\r\n bottom: 60,\r\n top: 60,\r\n parallelAxisDefault: {\r\n type: \"value\",\r\n nameLocation: \"end\",\r\n nameGap: 20,\r\n axisLine: { lineStyle: { color: \"rgba(100, 116, 139, 0.3)\" } },\r\n axisTick: { lineStyle: { color: \"rgba(100, 116, 139, 0.3)\" } },\r\n splitLine: { show: false },\r\n axisLabel: { color: tokens.colors.text.tertiary },\r\n },\r\n },\r\n series: [\r\n {\r\n type: \"parallel\",\r\n lineStyle: {\r\n ...lineStyle,\r\n color: ASTRO_DATA_VIZ_COLORS.mixed[0], // Zendir Electric\r\n },\r\n data: data.map((row) => ({ value: row })),\r\n emphasis: {\r\n lineStyle: { width: 3, opacity: 1 },\r\n },\r\n },\r\n ],\r\n }}\r\n {...props}\r\n />\r\n );\r\n }),\r\n);\r\n\r\n// =============================================================================\r\n// Candlestick Chart (Financial/Orbital Maneuver Windows)\r\n// =============================================================================\r\n\r\nexport interface CandlestickDataPoint {\r\n time: number | string;\r\n open: number;\r\n close: number;\r\n low: number;\r\n high: number;\r\n}\r\n\r\nexport interface CandlestickChartProps extends Omit<PresetProps, \"series\"> {\r\n /** OHLC data */\r\n data: CandlestickDataPoint[];\r\n /** Show volume bars */\r\n showVolume?: boolean;\r\n}\r\n\r\nexport const CandlestickChart = memo(\r\n forwardRef<AstroChartHandle, CandlestickChartProps>(function CandlestickChart(\r\n { data = [], showVolume: _showVolume = false, ...props },\r\n ref,\r\n ) {\r\n const { tokens } = useTheme();\r\n const categoryData = data.map((d) => d.time);\r\n const ohlcData = data.map((d) => [d.open, d.close, d.low, d.high]);\r\n\r\n return (\r\n <AstroChart\r\n ref={ref}\r\n type=\"candlestick\"\r\n series={[]}\r\n // Candlestick uses AstroUXDS status colors for semantic meaning\r\n // Green (normal) = bullish/up, Red (critical) = bearish/down\r\n echartsOptions={{\r\n tooltip: {\r\n trigger: \"axis\",\r\n axisPointer: { type: \"cross\" },\r\n },\r\n xAxis: {\r\n type: \"category\",\r\n data: categoryData,\r\n axisLine: { lineStyle: { color: \"rgba(100, 116, 139, 0.3)\" } },\r\n axisLabel: { color: tokens.colors.text.secondary },\r\n },\r\n yAxis: {\r\n type: \"value\",\r\n scale: true,\r\n splitLine: { lineStyle: { color: \"rgba(100, 116, 139, 0.15)\" } },\r\n axisLine: { lineStyle: { color: \"rgba(100, 116, 139, 0.3)\" } },\r\n axisLabel: { color: tokens.colors.text.secondary },\r\n },\r\n series: [\r\n {\r\n type: \"candlestick\",\r\n data: ohlcData,\r\n itemStyle: {\r\n color: SOFT_STATUS_COLORS.normal, // AstroUXDS green (up/bullish)\r\n color0: SOFT_STATUS_COLORS.critical, // AstroUXDS red (down/bearish)\r\n borderColor: SOFT_STATUS_COLORS.normal,\r\n borderColor0: SOFT_STATUS_COLORS.critical,\r\n },\r\n },\r\n ],\r\n dataZoom: [\r\n { type: \"inside\", start: 0, end: 100 },\r\n { show: true, type: \"slider\", bottom: 10 },\r\n ],\r\n }}\r\n {...props}\r\n />\r\n );\r\n }),\r\n);\r\n\r\n// =============================================================================\r\n// Graph/Network Chart (Subsystem Dependencies)\r\n// =============================================================================\r\n\r\nexport interface GraphNode {\r\n id: string;\r\n name: string;\r\n value?: number;\r\n category?: number;\r\n symbolSize?: number;\r\n x?: number;\r\n y?: number;\r\n itemStyle?: { color?: string };\r\n}\r\n\r\nexport interface GraphLink {\r\n source: string;\r\n target: string;\r\n value?: number;\r\n lineStyle?: { width?: number; color?: string };\r\n}\r\n\r\nexport interface GraphCategory {\r\n name: string;\r\n itemStyle?: { color?: string };\r\n}\r\n\r\nexport interface GraphChartProps extends Omit<PresetProps, \"series\"> {\r\n /** Node definitions */\r\n nodes: GraphNode[];\r\n /** Link definitions */\r\n links: GraphLink[];\r\n /** Category definitions */\r\n categories?: GraphCategory[];\r\n /** Layout type */\r\n layout?: \"force\" | \"circular\" | \"none\";\r\n}\r\n\r\nexport const GraphChart = memo(\r\n forwardRef<AstroChartHandle, GraphChartProps>(function GraphChart(\r\n { nodes = [], links = [], categories = [], layout = \"force\", ...props },\r\n ref,\r\n ) {\r\n const { tokens } = useTheme();\r\n\r\n return (\r\n <AstroChart\r\n ref={ref}\r\n type=\"scatter\"\r\n series={[]}\r\n // Zendir-branded network/graph visualization\r\n echartsOptions={{\r\n tooltip: {},\r\n legend:\r\n categories.length > 0\r\n ? {\r\n data: categories.map((c) => c.name),\r\n textStyle: { color: tokens.colors.text.primary },\r\n }\r\n : undefined,\r\n series: [\r\n {\r\n type: \"graph\",\r\n layout,\r\n data: nodes.map((n) => ({\r\n ...n,\r\n symbolSize: n.symbolSize || 30,\r\n })),\r\n links,\r\n categories,\r\n roam: true,\r\n label: {\r\n show: true,\r\n position: \"right\",\r\n formatter: \"{b}\",\r\n color: tokens.colors.text.primary,\r\n fontSize: 11,\r\n },\r\n lineStyle: {\r\n color: \"source\",\r\n curveness: 0.3,\r\n opacity: 0.6,\r\n },\r\n emphasis: {\r\n focus: \"adjacency\",\r\n lineStyle: { width: 3 },\r\n },\r\n force:\r\n layout === \"force\"\r\n ? {\r\n repulsion: 200,\r\n edgeLength: [50, 150],\r\n gravity: 0.1,\r\n }\r\n : undefined,\r\n },\r\n ],\r\n }}\r\n {...props}\r\n />\r\n );\r\n }),\r\n);\r\n\r\n// =============================================================================\r\n// Box Plot Chart\r\n// =============================================================================\r\n\r\nexport interface BoxPlotDataPoint {\r\n /** Category name (x-axis label) */\r\n name: string;\r\n /** Raw data values for computing boxplot statistics */\r\n values: number[];\r\n}\r\n\r\nexport interface BoxPlotChartProps extends Omit<PresetProps, \"series\"> {\r\n /** Box plot data - each item contains a category name and array of values */\r\n data: BoxPlotDataPoint[];\r\n /** Show outliers as scatter points */\r\n showOutliers?: boolean;\r\n /** Custom colors for each box (uses theme palette if not provided) */\r\n colors?: string[];\r\n /** Horizontal orientation (default is vertical) */\r\n horizontal?: boolean;\r\n}\r\n\r\n/**\r\n * Calculate boxplot statistics from raw values\r\n */\r\nfunction calculateBoxplotStats(\r\n values: number[],\r\n): [number, number, number, number, number] {\r\n const sorted = [...values].sort((a, b) => a - b);\r\n const n = sorted.length;\r\n\r\n const min = sorted[0];\r\n const max = sorted[n - 1];\r\n const median =\r\n n % 2 === 0\r\n ? (sorted[n / 2 - 1] + sorted[n / 2]) / 2\r\n : sorted[Math.floor(n / 2)];\r\n\r\n const q1Index = Math.floor(n * 0.25);\r\n const q3Index = Math.floor(n * 0.75);\r\n const q1 = sorted[q1Index];\r\n const q3 = sorted[q3Index];\r\n\r\n // IQR-based whiskers\r\n const iqr = q3 - q1;\r\n const lowerWhisker = Math.max(min, q1 - 1.5 * iqr);\r\n const upperWhisker = Math.min(max, q3 + 1.5 * iqr);\r\n\r\n return [lowerWhisker, q1, median, q3, upperWhisker];\r\n}\r\n\r\n/**\r\n * BoxPlotChart - Statistical distribution visualization\r\n *\r\n * Shows distribution of data through quartiles (box) and whiskers (range).\r\n * Uses theme-aware colors from the data visualization palette.\r\n *\r\n * @example\r\n * ```tsx\r\n * <BoxPlotChart\r\n * title=\"Score Distribution\"\r\n * data={[\r\n * { name: 'Team A', values: [65, 72, 84, 91, 55, 88, 76] },\r\n * { name: 'Team B', values: [78, 82, 95, 88, 70, 92, 85] },\r\n * ]}\r\n * />\r\n * ```\r\n */\r\nexport const BoxPlotChart = memo(\r\n forwardRef<AstroChartHandle, BoxPlotChartProps>(function BoxPlotChart(\r\n { data = [], showOutliers = true, colors, horizontal = false, ...props },\r\n ref,\r\n ) {\r\n const { tokens } = useTheme();\r\n\r\n // Calculate boxplot statistics for each category\r\n const categories = data.map((d) => d.name);\r\n const boxplotData = data.map((d, index) => {\r\n const stats = calculateBoxplotStats(d.values);\r\n return {\r\n value: stats,\r\n itemStyle: colors?.[index]\r\n ? {\r\n color: colors[index],\r\n borderColor: colors[index],\r\n }\r\n : undefined,\r\n };\r\n });\r\n\r\n // Find outliers for each category\r\n const outliers: Array<[number, number]> = [];\r\n if (showOutliers) {\r\n data.forEach((d, catIndex) => {\r\n const sorted = [...d.values].sort((a, b) => a - b);\r\n const n = sorted.length;\r\n const q1Index = Math.floor(n * 0.25);\r\n const q3Index = Math.floor(n * 0.75);\r\n const q1 = sorted[q1Index];\r\n const q3 = sorted[q3Index];\r\n const iqr = q3 - q1;\r\n const lowerBound = q1 - 1.5 * iqr;\r\n const upperBound = q3 + 1.5 * iqr;\r\n\r\n d.values.forEach((v) => {\r\n if (v < lowerBound || v > upperBound) {\r\n outliers.push([catIndex, v]);\r\n }\r\n });\r\n });\r\n }\r\n\r\n const categoryAxis = {\r\n type: \"category\" as const,\r\n data: categories,\r\n boundaryGap: true,\r\n axisLine: { lineStyle: { color: \"rgba(100, 116, 139, 0.3)\" } },\r\n axisLabel: { color: tokens.colors.text.secondary, fontSize: 12 },\r\n splitArea: { show: false },\r\n };\r\n\r\n const valueAxis = {\r\n type: \"value\" as const,\r\n splitLine: { lineStyle: { color: \"rgba(100, 116, 139, 0.15)\" } },\r\n axisLine: { lineStyle: { color: \"rgba(100, 116, 139, 0.3)\" } },\r\n axisLabel: { color: tokens.colors.text.secondary },\r\n };\r\n\r\n return (\r\n <AstroChart\r\n ref={ref}\r\n type=\"boxplot\"\r\n series={[]}\r\n echartsOptions={{\r\n tooltip: {\r\n trigger: \"item\",\r\n axisPointer: { type: \"shadow\" },\r\n formatter: (params: any) => {\r\n if (params.seriesType === \"boxplot\") {\r\n const value = params.value;\r\n return `\r\n <div style=\"font-weight: 600; margin-bottom: 4px;\">${params.name}</div>\r\n <div>Upper: ${value[5]?.toFixed(1) ?? value[4]?.toFixed(1)}</div>\r\n <div>Q3: ${value[4]?.toFixed(1) ?? value[3]?.toFixed(1)}</div>\r\n <div>Median: ${value[3]?.toFixed(1) ?? value[2]?.toFixed(1)}</div>\r\n <div>Q1: ${value[2]?.toFixed(1) ?? value[1]?.toFixed(1)}</div>\r\n <div>Lower: ${value[1]?.toFixed(1) ?? value[0]?.toFixed(1)}</div>\r\n `;\r\n }\r\n return `Outlier: ${params.value[1]}`;\r\n },\r\n },\r\n grid: {\r\n left: \"10%\",\r\n right: \"10%\",\r\n bottom: \"15%\",\r\n top: \"15%\",\r\n },\r\n xAxis: horizontal ? valueAxis : categoryAxis,\r\n yAxis: horizontal ? categoryAxis : valueAxis,\r\n series: [\r\n {\r\n name: \"boxplot\",\r\n type: \"boxplot\" as const,\r\n data: boxplotData,\r\n itemStyle: {\r\n borderWidth: 2,\r\n },\r\n emphasis: {\r\n itemStyle: {\r\n borderWidth: 3,\r\n },\r\n },\r\n },\r\n ...(showOutliers && outliers.length > 0\r\n ? [\r\n {\r\n name: \"outlier\",\r\n type: \"scatter\" as const,\r\n data: outliers,\r\n symbolSize: 8,\r\n itemStyle: {\r\n color: SOFT_STATUS_COLORS.caution,\r\n },\r\n },\r\n ]\r\n : []),\r\n ],\r\n }}\r\n {...props}\r\n />\r\n );\r\n }),\r\n);\r\n"],"mappings":"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"}