@zendir/ui 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +19 -0
- package/LICENSE +21 -0
- package/README.md +589 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +421 -0
- package/dist/index.js.map +1 -0
- package/dist/react/3d/EarthViewer.d.ts +46 -0
- package/dist/react/3d/EarthViewer.js +836 -0
- package/dist/react/3d/EarthViewer.js.map +1 -0
- package/dist/react/3d/SolarSystemViewer.d.ts +43 -0
- package/dist/react/3d/SolarSystemViewer.js +372 -0
- package/dist/react/3d/SolarSystemViewer.js.map +1 -0
- package/dist/react/3d/ZenSpace3D.d.ts +16 -0
- package/dist/react/3d/ZenSpace3D.js +1253 -0
- package/dist/react/3d/ZenSpace3D.js.map +1 -0
- package/dist/react/3d/ZenSpace3DCesium.d.ts +9 -0
- package/dist/react/3d/ZenSpace3DCesium.js +186 -0
- package/dist/react/3d/ZenSpace3DCesium.js.map +1 -0
- package/dist/react/3d/ZenSpace3DShaders.d.ts +78 -0
- package/dist/react/3d/ZenSpace3DShaders.js +94 -0
- package/dist/react/3d/ZenSpace3DShaders.js.map +1 -0
- package/dist/react/3d/ZenSpace3DTypes.d.ts +614 -0
- package/dist/react/3d/ZenSpace3DUtils.d.ts +183 -0
- package/dist/react/3d/ZenSpace3DUtils.js +213 -0
- package/dist/react/3d/ZenSpace3DUtils.js.map +1 -0
- package/dist/react/3d/index.d.ts +23 -0
- package/dist/react/3d/threeLoader.d.ts +22 -0
- package/dist/react/3d/threeLoader.js +18 -0
- package/dist/react/3d/threeLoader.js.map +1 -0
- package/dist/react/astro/ClassificationBanner.d.ts +25 -0
- package/dist/react/astro/ClassificationBanner.js +83 -0
- package/dist/react/astro/ClassificationBanner.js.map +1 -0
- package/dist/react/astro/GlobalStatusBar.d.ts +42 -0
- package/dist/react/astro/GlobalStatusBar.js +165 -0
- package/dist/react/astro/GlobalStatusBar.js.map +1 -0
- package/dist/react/astro/MissionClock.d.ts +169 -0
- package/dist/react/astro/MissionClock.js +411 -0
- package/dist/react/astro/MissionClock.js.map +1 -0
- package/dist/react/astro/MonitoringIcon.d.ts +60 -0
- package/dist/react/astro/MonitoringIcon.js +369 -0
- package/dist/react/astro/MonitoringIcon.js.map +1 -0
- package/dist/react/astro/Notification.d.ts +42 -0
- package/dist/react/astro/Notification.js +156 -0
- package/dist/react/astro/Notification.js.map +1 -0
- package/dist/react/astro/Progress.d.ts +39 -0
- package/dist/react/astro/Progress.js +149 -0
- package/dist/react/astro/Progress.js.map +1 -0
- package/dist/react/astro/SimulationControls.d.ts +136 -0
- package/dist/react/astro/SimulationControls.js +668 -0
- package/dist/react/astro/SimulationControls.js.map +1 -0
- package/dist/react/astro/StatusIndicator.d.ts +34 -0
- package/dist/react/astro/StatusIndicator.js +189 -0
- package/dist/react/astro/StatusIndicator.js.map +1 -0
- package/dist/react/astro/UnifiedTimeline.d.ts +106 -0
- package/dist/react/astro/UnifiedTimeline.js +1768 -0
- package/dist/react/astro/UnifiedTimeline.js.map +1 -0
- package/dist/react/astro/index.d.ts +63 -0
- package/dist/react/cards/AccessCard.d.ts +37 -0
- package/dist/react/cards/AccessCard.js +410 -0
- package/dist/react/cards/AccessCard.js.map +1 -0
- package/dist/react/cards/OrbitCard.d.ts +31 -0
- package/dist/react/cards/OrbitCard.js +372 -0
- package/dist/react/cards/OrbitCard.js.map +1 -0
- package/dist/react/cards/SpacecraftCard.d.ts +54 -0
- package/dist/react/cards/SpacecraftCard.js +941 -0
- package/dist/react/cards/SpacecraftCard.js.map +1 -0
- package/dist/react/cards/TelemetryCard.d.ts +40 -0
- package/dist/react/cards/TelemetryCard.js +742 -0
- package/dist/react/cards/TelemetryCard.js.map +1 -0
- package/dist/react/cards/TelemetryStreamCard.d.ts +59 -0
- package/dist/react/cards/TelemetryStreamCard.js +309 -0
- package/dist/react/cards/TelemetryStreamCard.js.map +1 -0
- package/dist/react/cards/index.d.ts +13 -0
- package/dist/react/charts/GroundTrackMap.d.ts +112 -0
- package/dist/react/charts/GroundTrackMap.js +1123 -0
- package/dist/react/charts/GroundTrackMap.js.map +1 -0
- package/dist/react/charts/GroundTrackMapLeaflet.d.ts +26 -0
- package/dist/react/charts/GroundTrackMapLeaflet.js +571 -0
- package/dist/react/charts/GroundTrackMapLeaflet.js.map +1 -0
- package/dist/react/charts/groundTrackMapLeafletTiles.d.ts +22 -0
- package/dist/react/charts/groundTrackMapLeafletTiles.js +11 -0
- package/dist/react/charts/groundTrackMapLeafletTiles.js.map +1 -0
- package/dist/react/charts/groundTrackMapLeafletUtils.d.ts +24 -0
- package/dist/react/charts/groundTrackMapLeafletUtils.js +109 -0
- package/dist/react/charts/groundTrackMapLeafletUtils.js.map +1 -0
- package/dist/react/charts/index.d.ts +10 -0
- package/dist/react/charts/unified/AstroChart.d.ts +24 -0
- package/dist/react/charts/unified/AstroChart.js +1405 -0
- package/dist/react/charts/unified/AstroChart.js.map +1 -0
- package/dist/react/charts/unified/PowerOverviewChart.d.ts +73 -0
- package/dist/react/charts/unified/PowerOverviewChart.js +488 -0
- package/dist/react/charts/unified/PowerOverviewChart.js.map +1 -0
- package/dist/react/charts/unified/domain.d.ts +845 -0
- package/dist/react/charts/unified/domain.js +3168 -0
- package/dist/react/charts/unified/domain.js.map +1 -0
- package/dist/react/charts/unified/generators.d.ts +276 -0
- package/dist/react/charts/unified/generators.js +518 -0
- package/dist/react/charts/unified/generators.js.map +1 -0
- package/dist/react/charts/unified/index.d.ts +55 -0
- package/dist/react/charts/unified/presets.d.ts +290 -0
- package/dist/react/charts/unified/presets.js +999 -0
- package/dist/react/charts/unified/presets.js.map +1 -0
- package/dist/react/charts/unified/sync.d.ts +69 -0
- package/dist/react/charts/unified/sync.js +219 -0
- package/dist/react/charts/unified/sync.js.map +1 -0
- package/dist/react/charts/unified/theme.d.ts +447 -0
- package/dist/react/charts/unified/theme.js +562 -0
- package/dist/react/charts/unified/theme.js.map +1 -0
- package/dist/react/charts/unified/types.d.ts +826 -0
- package/dist/react/charts/unified/useChartStream.d.ts +58 -0
- package/dist/react/charts/unified/useChartStream.js +226 -0
- package/dist/react/charts/unified/useChartStream.js.map +1 -0
- package/dist/react/chatgpt/AppCard.d.ts +59 -0
- package/dist/react/chatgpt/AppCard.js +306 -0
- package/dist/react/chatgpt/AppCard.js.map +1 -0
- package/dist/react/chatgpt/ChatGPTCard.d.ts +6 -0
- package/dist/react/chatgpt/index.d.ts +167 -0
- package/dist/react/chatgpt/index.js +166 -0
- package/dist/react/chatgpt/index.js.map +1 -0
- package/dist/react/context/DisplaySettingsContext.d.ts +107 -0
- package/dist/react/context/DisplaySettingsContext.js +169 -0
- package/dist/react/context/DisplaySettingsContext.js.map +1 -0
- package/dist/react/context/index.d.ts +5 -0
- package/dist/react/core/ActivityPlanner.d.ts +45 -0
- package/dist/react/core/ActivityPlanner.js +532 -0
- package/dist/react/core/ActivityPlanner.js.map +1 -0
- package/dist/react/core/AppBar.d.ts +71 -0
- package/dist/react/core/AppBar.js +817 -0
- package/dist/react/core/AppBar.js.map +1 -0
- package/dist/react/core/AstroIcon.d.ts +84 -0
- package/dist/react/core/AstroIcon.js +1243 -0
- package/dist/react/core/AstroIcon.js.map +1 -0
- package/dist/react/core/Badge.d.ts +27 -0
- package/dist/react/core/Badge.js +134 -0
- package/dist/react/core/Badge.js.map +1 -0
- package/dist/react/core/Button.d.ts +26 -0
- package/dist/react/core/Button.js +306 -0
- package/dist/react/core/Button.js.map +1 -0
- package/dist/react/core/CardHeader.d.ts +34 -0
- package/dist/react/core/CardHeader.js +316 -0
- package/dist/react/core/CardHeader.js.map +1 -0
- package/dist/react/core/ChatPanel.d.ts +627 -0
- package/dist/react/core/ChatPanel.js +1144 -0
- package/dist/react/core/ChatPanel.js.map +1 -0
- package/dist/react/core/Checkbox.d.ts +26 -0
- package/dist/react/core/Checkbox.js +130 -0
- package/dist/react/core/Checkbox.js.map +1 -0
- package/dist/react/core/ColorPickerPanel.d.ts +25 -0
- package/dist/react/core/ColorPickerPanel.js +293 -0
- package/dist/react/core/ColorPickerPanel.js.map +1 -0
- package/dist/react/core/CommandBuilder.d.ts +74 -0
- package/dist/react/core/CommandBuilder.js +518 -0
- package/dist/react/core/CommandBuilder.js.map +1 -0
- package/dist/react/core/ConfirmDialog.d.ts +45 -0
- package/dist/react/core/ConfirmDialog.js +315 -0
- package/dist/react/core/ConfirmDialog.js.map +1 -0
- package/dist/react/core/ConnectionForm.d.ts +57 -0
- package/dist/react/core/ConnectionForm.js +496 -0
- package/dist/react/core/ConnectionForm.js.map +1 -0
- package/dist/react/core/Container.d.ts +51 -0
- package/dist/react/core/Container.js +670 -0
- package/dist/react/core/Container.js.map +1 -0
- package/dist/react/core/CopyButton.d.ts +39 -0
- package/dist/react/core/CopyButton.js +105 -0
- package/dist/react/core/CopyButton.js.map +1 -0
- package/dist/react/core/DataTable.d.ts +113 -0
- package/dist/react/core/DataTable.js +446 -0
- package/dist/react/core/DataTable.js.map +1 -0
- package/dist/react/core/DataValue.d.ts +64 -0
- package/dist/react/core/DataValue.js +545 -0
- package/dist/react/core/DataValue.js.map +1 -0
- package/dist/react/core/Dialog.d.ts +32 -0
- package/dist/react/core/Dialog.js +201 -0
- package/dist/react/core/Dialog.js.map +1 -0
- package/dist/react/core/FileExplorer.d.ts +65 -0
- package/dist/react/core/FileExplorer.js +520 -0
- package/dist/react/core/FileExplorer.js.map +1 -0
- package/dist/react/core/GlassCard.d.ts +129 -0
- package/dist/react/core/GlassCard.js +375 -0
- package/dist/react/core/GlassCard.js.map +1 -0
- package/dist/react/core/HeaderIconWithStatus.d.ts +39 -0
- package/dist/react/core/HeaderIconWithStatus.js +157 -0
- package/dist/react/core/HeaderIconWithStatus.js.map +1 -0
- package/dist/react/core/HexViewer.d.ts +143 -0
- package/dist/react/core/HexViewer.js +1106 -0
- package/dist/react/core/HexViewer.js.map +1 -0
- package/dist/react/core/Icon.d.ts +32 -0
- package/dist/react/core/Icon.js +142 -0
- package/dist/react/core/Icon.js.map +1 -0
- package/dist/react/core/ImageGallery.d.ts +41 -0
- package/dist/react/core/ImageGallery.js +320 -0
- package/dist/react/core/ImageGallery.js.map +1 -0
- package/dist/react/core/Input.d.ts +38 -0
- package/dist/react/core/Input.js +288 -0
- package/dist/react/core/Input.js.map +1 -0
- package/dist/react/core/LimitsBar.d.ts +51 -0
- package/dist/react/core/LimitsBar.js +200 -0
- package/dist/react/core/LimitsBar.js.map +1 -0
- package/dist/react/core/LogViewer.d.ts +61 -0
- package/dist/react/core/LogViewer.js +599 -0
- package/dist/react/core/LogViewer.js.map +1 -0
- package/dist/react/core/MessageStream.d.ts +58 -0
- package/dist/react/core/MessageStream.js +455 -0
- package/dist/react/core/MessageStream.js.map +1 -0
- package/dist/react/core/MissionCalendar.d.ts +81 -0
- package/dist/react/core/MissionCalendar.js +1049 -0
- package/dist/react/core/MissionCalendar.js.map +1 -0
- package/dist/react/core/NumberInput.d.ts +85 -0
- package/dist/react/core/NumberInput.js +507 -0
- package/dist/react/core/NumberInput.js.map +1 -0
- package/dist/react/core/PacketViewer.d.ts +73 -0
- package/dist/react/core/PacketViewer.js +431 -0
- package/dist/react/core/PacketViewer.js.map +1 -0
- package/dist/react/core/Pagination.d.ts +30 -0
- package/dist/react/core/Pagination.js +190 -0
- package/dist/react/core/Pagination.js.map +1 -0
- package/dist/react/core/PinInput.d.ts +41 -0
- package/dist/react/core/PinInput.js +210 -0
- package/dist/react/core/PinInput.js.map +1 -0
- package/dist/react/core/Popover.d.ts +55 -0
- package/dist/react/core/Popover.js +288 -0
- package/dist/react/core/Popover.js.map +1 -0
- package/dist/react/core/Select.d.ts +42 -0
- package/dist/react/core/Select.js +303 -0
- package/dist/react/core/Select.js.map +1 -0
- package/dist/react/core/SideNav.d.ts +103 -0
- package/dist/react/core/SideNav.js +551 -0
- package/dist/react/core/SideNav.js.map +1 -0
- package/dist/react/core/SidePanel.d.ts +33 -0
- package/dist/react/core/SidePanel.js +199 -0
- package/dist/react/core/SidePanel.js.map +1 -0
- package/dist/react/core/Tabs.d.ts +47 -0
- package/dist/react/core/Tabs.js +129 -0
- package/dist/react/core/Tabs.js.map +1 -0
- package/dist/react/core/Toast.d.ts +56 -0
- package/dist/react/core/Toast.js +229 -0
- package/dist/react/core/Toast.js.map +1 -0
- package/dist/react/core/Toggle.d.ts +22 -0
- package/dist/react/core/Toggle.js +151 -0
- package/dist/react/core/Toggle.js.map +1 -0
- package/dist/react/core/Tooltip.d.ts +19 -0
- package/dist/react/core/Tooltip.js +179 -0
- package/dist/react/core/Tooltip.js.map +1 -0
- package/dist/react/core/Typography.d.ts +127 -0
- package/dist/react/core/Typography.js +187 -0
- package/dist/react/core/Typography.js.map +1 -0
- package/dist/react/core/index.d.ts +108 -0
- package/dist/react/core/layout/Box.d.ts +77 -0
- package/dist/react/core/layout/Box.js +126 -0
- package/dist/react/core/layout/Box.js.map +1 -0
- package/dist/react/core/layout/Center.d.ts +20 -0
- package/dist/react/core/layout/Center.js +34 -0
- package/dist/react/core/layout/Center.js.map +1 -0
- package/dist/react/core/layout/Divider.d.ts +16 -0
- package/dist/react/core/layout/Divider.js +108 -0
- package/dist/react/core/layout/Divider.js.map +1 -0
- package/dist/react/core/layout/Flex.d.ts +30 -0
- package/dist/react/core/layout/Flex.js +128 -0
- package/dist/react/core/layout/Flex.js.map +1 -0
- package/dist/react/core/layout/Grid.d.ts +36 -0
- package/dist/react/core/layout/Grid.js +142 -0
- package/dist/react/core/layout/Grid.js.map +1 -0
- package/dist/react/core/layout/Spacer.d.ts +8 -0
- package/dist/react/core/layout/Spacer.js +31 -0
- package/dist/react/core/layout/Spacer.js.map +1 -0
- package/dist/react/core/layout/Stack.d.ts +54 -0
- package/dist/react/core/layout/Stack.js +74 -0
- package/dist/react/core/layout/Stack.js.map +1 -0
- package/dist/react/core/layout/index.d.ts +38 -0
- package/dist/react/core/layout/responsive.d.ts +23 -0
- package/dist/react/core/layout/responsive.js +26 -0
- package/dist/react/core/layout/responsive.js.map +1 -0
- package/dist/react/core/layout/useBreakpoint.d.ts +77 -0
- package/dist/react/core/layout/useBreakpoint.js +73 -0
- package/dist/react/core/layout/useBreakpoint.js.map +1 -0
- package/dist/react/core/propertyConfig.d.ts +443 -0
- package/dist/react/core/propertyConfig.js +399 -0
- package/dist/react/core/propertyConfig.js.map +1 -0
- package/dist/react/hooks/index.d.ts +21 -0
- package/dist/react/hooks/useAccessWindows.d.ts +66 -0
- package/dist/react/hooks/useCompactMode.d.ts +82 -0
- package/dist/react/hooks/useCompactMode.js +62 -0
- package/dist/react/hooks/useCompactMode.js.map +1 -0
- package/dist/react/hooks/useLiveSelection.d.ts +57 -0
- package/dist/react/hooks/useSimulationPlayback.d.ts +97 -0
- package/dist/react/hooks/useSimulationTime.d.ts +61 -0
- package/dist/react/hooks/useSpacecraftPosition.d.ts +50 -0
- package/dist/react/hooks/useSpacecraftPosition.js +89 -0
- package/dist/react/hooks/useSpacecraftPosition.js.map +1 -0
- package/dist/react/hooks/useTelemetry.d.ts +55 -0
- package/dist/react/hooks/useTelemetry.js +73 -0
- package/dist/react/hooks/useTelemetry.js.map +1 -0
- package/dist/react/hooks/useZendirSession.d.ts +109 -0
- package/dist/react/hooks/useZendirSession.js +148 -0
- package/dist/react/hooks/useZendirSession.js.map +1 -0
- package/dist/react/index.d.ts +74 -0
- package/dist/react/shared/ErrorBoundary.d.ts +63 -0
- package/dist/react/shared/ErrorBoundary.js +142 -0
- package/dist/react/shared/ErrorBoundary.js.map +1 -0
- package/dist/react/shared/Skeleton.d.ts +110 -0
- package/dist/react/shared/Skeleton.js +324 -0
- package/dist/react/shared/Skeleton.js.map +1 -0
- package/dist/react/shared/index.d.ts +12 -0
- package/dist/react/theme/ThemeProvider.d.ts +385 -0
- package/dist/react/theme/ThemeProvider.js +1096 -0
- package/dist/react/theme/ThemeProvider.js.map +1 -0
- package/dist/react/theme/astro-tokens.d.ts +153 -0
- package/dist/react/theme/cardAccent.d.ts +75 -0
- package/dist/react/theme/cardAccent.js +137 -0
- package/dist/react/theme/cardAccent.js.map +1 -0
- package/dist/react/theme/config.d.ts +39 -0
- package/dist/react/theme/index.d.ts +9 -0
- package/dist/react/types.d.ts +360 -0
- package/dist/react/types.js +58 -0
- package/dist/react/types.js.map +1 -0
- package/dist/react/utils/index.d.ts +247 -0
- package/dist/react/utils/index.js +423 -0
- package/dist/react/utils/index.js.map +1 -0
- package/dist/react/visualizations/EclipseTimerCard.d.ts +17 -0
- package/dist/react/visualizations/EclipseTimerCard.js +250 -0
- package/dist/react/visualizations/EclipseTimerCard.js.map +1 -0
- package/dist/react/visualizations/LinkBudgetCard.d.ts +50 -0
- package/dist/react/visualizations/LinkBudgetCard.js +444 -0
- package/dist/react/visualizations/LinkBudgetCard.js.map +1 -0
- package/dist/react/visualizations/NavBallCard.d.ts +17 -0
- package/dist/react/visualizations/NavBallCard.js +243 -0
- package/dist/react/visualizations/NavBallCard.js.map +1 -0
- package/dist/react/visualizations/PropulsionCard.d.ts +37 -0
- package/dist/react/visualizations/PropulsionCard.js +298 -0
- package/dist/react/visualizations/PropulsionCard.js.map +1 -0
- package/dist/react/visualizations/SensorFootprintCard.d.ts +33 -0
- package/dist/react/visualizations/SensorFootprintCard.js +326 -0
- package/dist/react/visualizations/SensorFootprintCard.js.map +1 -0
- package/dist/react/visualizations/ThermalHeatmapCard.d.ts +38 -0
- package/dist/react/visualizations/ThermalHeatmapCard.js +372 -0
- package/dist/react/visualizations/ThermalHeatmapCard.js.map +1 -0
- package/dist/react/visualizations/index.d.ts +17 -0
- package/dist/react.d.ts +1 -0
- package/dist/react.js +421 -0
- package/dist/react.js.map +1 -0
- package/dist/shaders/atmosphere.frag.js +5 -0
- package/dist/shaders/atmosphere.frag.js.map +1 -0
- package/dist/shaders/atmosphere.vert.js +5 -0
- package/dist/shaders/atmosphere.vert.js.map +1 -0
- package/dist/shaders/stars.frag.js +5 -0
- package/dist/shaders/stars.frag.js.map +1 -0
- package/dist/shaders/stars.vert.js +5 -0
- package/dist/shaders/stars.vert.js.map +1 -0
- package/dist/style.css +143 -0
- package/dist/tokens/index.d.ts +296 -0
- package/dist/tokens/index.js +263 -0
- package/dist/tokens/index.js.map +1 -0
- package/dist/tokens/tokens.css +155 -0
- package/dist/types/index.d.ts +23 -0
- package/dist/types.d.ts +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +220 -0
- package/sdk-stub.js +22 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GroundTrackMap.js","sources":["../../../src/react/charts/GroundTrackMap.tsx"],"sourcesContent":["/**\n * @zendir/ui - GroundTrackMap Component (Enhanced)\n * \n * Full-featured 2D world map showing spacecraft ground tracks, current positions,\n * ground station locations, coverage footprints, satellite icons, and day/night terminator.\n * \n * Inspired by Astro UXDS TT&C Monitor / GRM Dashboard ground map patterns:\n * - Satellite icons with status-colored indicators (not just dots)\n * - Ground station antenna icons with coverage circles\n * - Sensor/antenna footprint cone projections\n * - Future orbit tracks (dashed) vs past tracks (solid)\n * - Day/night terminator\n * - Multi-satellite support\n * - Interactive hover tooltips\n * - AOS/LOS markers on track\n * - Legend with satellite/station counts\n * \n * Astro UX Compliance:\n * - Theme-integrated via useTheme()\n * - Uses official Astro status colors from theme tokens\n * - Uses Astro monitoring icon patterns\n * - 14pt minimum for labels (AstroUXDS guideline)\n * - Consistent with Astro data visualization patterns\n */\n\nimport React, { useRef, useEffect, useCallback, useMemo, useState } from 'react';\nimport { useTheme } from '../theme';\nimport { AstroIcon } from '../core/AstroIcon';\nimport type { GroundTrackPoint, GroundStation } from '../types';\nimport type { GroundTrackMapLeafletProps } from './GroundTrackMapLeaflet';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface SatelliteTrack {\n /** Unique satellite identifier */\n id: string;\n /** Satellite display name */\n name: string;\n /** Ground track points */\n groundTrack: GroundTrackPoint[];\n /** Track color */\n color?: string;\n /** Satellite status for icon coloring */\n status?: 'normal' | 'caution' | 'serious' | 'critical' | 'standby' | 'off';\n /** Access mask (true = in contact) */\n accessMask?: boolean[];\n /** Show this satellite's sensor footprint */\n showFootprint?: boolean;\n /** Footprint radius in degrees (sensor cone half-angle on ground) */\n footprintRadius?: number;\n /** Show future (predicted) track as dashed line */\n futureTrackIndex?: number;\n /** AOS/LOS markers */\n passMarkers?: Array<{ type: 'aos' | 'los'; latitude: number; longitude: number; label?: string }>;\n}\n\nexport interface GroundStationEnhanced extends GroundStation {\n /** Station status */\n status?: 'normal' | 'caution' | 'serious' | 'critical' | 'standby' | 'off';\n /** Show coverage circle */\n showCoverage?: boolean;\n /** Coverage radius in degrees (visibility horizon) */\n coverageRadius?: number;\n /** Station type (affects icon) */\n type?: 'dish' | 'phased-array' | 'omni' | 'relay';\n}\n\n/** \n * SRO-compatible team path format (space-range-operator CustomMap data shape).\n * Provide this as an alternative to `satellites` for plug-and-play compatibility.\n */\nexport interface TeamPath {\n /** Team/satellite name */\n name: string;\n /** Track color */\n color?: string;\n /** Ordered position array */\n positions: Array<{\n lat: number;\n lng: number;\n time?: number;\n altitude?: number | null;\n }>;\n}\n\n/** SRO-compatible ground station format */\nexport interface SROGroundStation {\n name: string;\n latitude: number;\n longitude: number;\n altitude?: number | null;\n}\n\nexport interface GroundTrackMapProps {\n /** Single satellite ground track (legacy API) */\n groundTrack?: GroundTrackPoint[];\n /** Multiple satellite tracks */\n satellites?: SatelliteTrack[];\n /** Ground stations to display */\n groundStations?: (GroundStation | GroundStationEnhanced | SROGroundStation)[];\n /** Access mask for single-satellite mode (legacy API) */\n accessMask?: boolean[];\n\n // --- SRO-compatible alternate API (space-range-operator plug-and-play) ---\n /** Team path data (SRO CustomMap format) — auto-converts to satellites internally */\n teamPaths?: TeamPath[];\n\n // --- Display options ---\n /** Show day/night terminator */\n showTerminator?: boolean;\n /** Show grid lines */\n showGrid?: boolean;\n /** Show legend */\n showLegend?: boolean;\n /** Show equator highlight */\n showEquator?: boolean;\n /** Show recenter button (SRO compat) */\n showRecenterButton?: boolean;\n\n // --- State ---\n /** Whether data is still loading (SRO compat) */\n isLoading?: boolean;\n /** Message when there is no data (SRO compat) */\n emptyMessage?: string;\n\n // --- Sizing ---\n /** Chart width (default: 100%) */\n width?: number | string;\n /** Chart height — number for fixed px, or CSS string like '100%' to fill a flex parent */\n height?: number | string;\n /** Minimum height CSS string (SRO compat, e.g. \"400px\") */\n minHeight?: string;\n\n // --- Centering ---\n /** Default center [lat, lon] (SRO compat) */\n defaultCenter?: [number, number];\n /** Default zoom level 1-10 (SRO compat, affects initial scale) */\n defaultZoom?: number;\n\n /** Custom className */\n className?: string;\n /** Click handler for satellites */\n onSatelliteClick?: (satelliteId: string) => void;\n /** Click handler for ground stations */\n onStationClick?: (stationId: string) => void;\n\n /** Map backend: 'leaflet' (default, requires leaflet peer) or 'canvas' */\n mapProvider?: 'leaflet' | 'canvas';\n /** Tile URL for Leaflet (default: CartoDB dark). Ignored when mapProvider is 'canvas'. */\n tileUrl?: string;\n}\n\n// =============================================================================\n// Constants — aligned with official Astro UXDS status colors\n// These MUST match the STATUS_COLORS in unified/theme.ts and ThemeProvider\n// =============================================================================\n\nconst STATUS_COLOR_MAP: Record<string, string> = {\n normal: '#56f000', // Green — Astro UXDS \"Normal\"\n standby: '#2dccff', // Cyan — Astro UXDS \"Standby\"\n caution: '#fce83a', // Yellow — Astro UXDS \"Caution\"\n serious: '#ffb302', // Orange — Astro UXDS \"Serious\"\n critical: '#ff3838', // Red — Astro UXDS \"Critical\"\n off: '#a4abb6', // Grey — Astro UXDS \"Off\"\n};\n\nconst DEFAULT_TRACK_COLORS = [\n '#2dccff', '#3E3CFF', '#9D70FF', '#56f000', '#fce83a', '#ff7849', '#2dd4bf', '#ff3838',\n];\n\n// Earth constants for realistic coverage calculations\nconst EARTH_RADIUS_KM = 6371;\nconst _DEG_PER_KM = 1 / 111.32; // Approximate degrees per km at equator\n\n// Higher-quality world map coastline paths (Mercator-compatible)\nconst WORLD_MAP_PATHS = [\n // North America\n 'M-168,70 L-168,60 L-145,63 L-140,58 L-130,55 L-125,49 L-122,48 L-117,33 L-115,28 L-105,22 L-97,18 L-88,20 L-82,25 L-82,30 L-80,32 L-67,47 L-60,46 L-55,52 L-56,60 L-65,70 L-85,73 L-100,72 L-130,70 L-168,70',\n // South America\n 'M-82,12 L-77,8 L-73,11 L-65,5 L-60,5 L-50,0 L-45,-5 L-43,-10 L-39,-15 L-38,-22 L-40,-25 L-43,-30 L-48,-33 L-50,-40 L-55,-48 L-57,-52 L-68,-55 L-73,-50 L-78,-42 L-80,-20 L-78,-5 L-82,12',\n // Europe + Africa\n 'M-10,72 L-5,60 L-5,48 L0,44 L3,44 L5,48 L8,44 L3,37 L-5,35 L-17,28 L-17,15 L-8,10 L-4,5 L5,5 L10,2 L15,-3 L22,-12 L28,-22 L33,-30 L30,-35 L22,-35 L18,-27 L12,-20 L8,-10 L3,0 L-5,10 L-12,15 L-15,20 L-13,32 L-10,38 L0,48 L8,55 L15,58 L20,60 L25,65 L30,70 L-10,72',\n // Asia \n 'M30,70 L40,65 L50,60 L60,55 L70,50 L80,45 L90,45 L100,40 L105,35 L110,30 L115,25 L120,30 L125,35 L130,40 L135,45 L140,50 L145,55 L150,60 L155,65 L160,68 L170,70 L180,70 L180,72 L30,72 L30,70',\n // Australia\n 'M112,-12 L118,-14 L125,-15 L132,-13 L138,-15 L143,-17 L148,-20 L152,-23 L153,-28 L150,-33 L147,-37 L140,-38 L134,-36 L130,-33 L126,-30 L120,-30 L116,-28 L114,-24 L113,-18 L112,-12',\n // Antarctica\n 'M-180,-72 L180,-72 L180,-90 L-180,-90 Z',\n];\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\n/**\n * Calculate ground station visibility radius in degrees.\n * Uses spherical Earth geometry: for a station with minimum elevation angle `elDeg`\n * and a satellite at altitude `altKm`, the half-angle subtended at Earth center is:\n * ρ = acos(R / (R + h)) − el_rad\n * Then the ground-range in degrees ≈ ρ * (180/π).\n * If no altitude context, coverageRadius prop is used directly (in degrees).\n */\nfunction _visibilityRadiusDeg(altitudeKm: number = 500, minElevationDeg: number = 5): number {\n const elRad = (minElevationDeg * Math.PI) / 180;\n const rho = Math.acos(EARTH_RADIUS_KM / (EARTH_RADIUS_KM + altitudeKm)) - elRad;\n return Math.max(0, (rho * 180) / Math.PI);\n}\n\n/**\n * Draw a ground-circle footprint using great-circle math.\n * Given a center lat/lon and an angular radius (in degrees measured along\n * Earth's surface), compute N points around the circle on the sphere, then\n * project each to equirectangular pixel coordinates.\n *\n * This produces a circle that is geographically correct AND looks natural\n * on the map — at high latitudes the circle is wider in longitude because\n * that's how equirectangular projection works, but it's capped by reality\n * rather than a simple 1/cos blowup.\n */\nfunction drawCoverageEllipse(\n ctx: CanvasRenderingContext2D,\n centerLat: number,\n centerLon: number,\n radiusDeg: number,\n W: number,\n H: number,\n lonToX: (lon: number, w: number) => number,\n latToY: (lat: number, h: number) => number,\n numSegments: number = 72,\n): void {\n const lat0 = (centerLat * Math.PI) / 180;\n const lon0 = (centerLon * Math.PI) / 180;\n const d = (radiusDeg * Math.PI) / 180; // angular radius in radians\n\n // Compute the center pixel once — all points are placed relative to this\n // so the circle never jumps across the date-line seam.\n const cx = lonToX(centerLon, W);\n const cy = latToY(centerLat, H);\n const pxPerDegLon = W / 360;\n const pxPerDegLat = H / 180;\n\n ctx.beginPath();\n for (let i = 0; i <= numSegments; i++) {\n const bearing = (i / numSegments) * 2 * Math.PI;\n\n // Great-circle destination formula\n const sinLat = Math.sin(lat0) * Math.cos(d) + Math.cos(lat0) * Math.sin(d) * Math.cos(bearing);\n const lat = Math.asin(Math.max(-1, Math.min(1, sinLat)));\n const lon = lon0 + Math.atan2(\n Math.sin(bearing) * Math.sin(d) * Math.cos(lat0),\n Math.cos(d) - Math.sin(lat0) * sinLat,\n );\n\n const pLatDeg = (lat * 180) / Math.PI;\n const pLonDeg = (lon * 180) / Math.PI;\n\n // Pixel offset from center — no normalization, so no date-line jump\n const dLon = pLonDeg - centerLon;\n const dLat = pLatDeg - centerLat;\n const px = cx + dLon * pxPerDegLon;\n const py = cy - dLat * pxPerDegLat; // Y inverted (lat goes up, pixels go down)\n\n if (i === 0) ctx.moveTo(px, py);\n else ctx.lineTo(px, py);\n }\n ctx.closePath();\n}\n\n/** Calculate solar terminator points for a given date */\nfunction calculateTerminator(date: Date, numPoints: number = 72): Array<{ lat: number; lon: number }> {\n const dayOfYear = Math.floor((date.getTime() - new Date(date.getFullYear(), 0, 0).getTime()) / 86400000);\n const declination = -23.44 * Math.cos((2 * Math.PI / 365) * (dayOfYear + 10));\n const decRad = (declination * Math.PI) / 180;\n const hourAngle = ((date.getUTCHours() + date.getUTCMinutes() / 60) / 24) * 360 - 180;\n\n const points: Array<{ lat: number; lon: number }> = [];\n for (let i = 0; i <= numPoints; i++) {\n const latRad = ((i / numPoints) * 180 - 90) * (Math.PI / 180);\n const cosH = -Math.tan(latRad) * Math.tan(decRad);\n let lon: number;\n if (cosH < -1) lon = hourAngle + 180;\n else if (cosH > 1) lon = hourAngle;\n else lon = hourAngle + (Math.acos(cosH) * 180) / Math.PI;\n\n while (lon > 180) lon -= 360;\n while (lon < -180) lon += 360;\n points.push({ lat: (i / numPoints) * 180 - 90, lon });\n }\n return points;\n}\n\n// =============================================================================\n// Component\n// =============================================================================\n\nexport function GroundTrackMap({\n groundTrack,\n satellites = [],\n groundStations = [],\n accessMask,\n teamPaths,\n showTerminator = true,\n showGrid = true,\n showLegend = true,\n showEquator = true,\n showRecenterButton = false,\n isLoading = false,\n emptyMessage = 'No orbital data available',\n width = '100%',\n height = '100%',\n minHeight = '400px',\n defaultCenter,\n defaultZoom,\n className = '',\n onSatelliteClick,\n onStationClick,\n mapProvider = 'leaflet',\n tileUrl,\n}: GroundTrackMapProps): React.ReactElement {\n const { tokens } = useTheme();\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const [tooltip, setTooltip] = useState<{\n x: number; y: number;\n type: 'satellite' | 'station';\n name: string;\n status: string;\n statusColor: string;\n lat: number;\n lon: number;\n alt?: number;\n // Ground station extras\n stationType?: string;\n network?: string;\n coverageRadius?: number;\n // Satellite extras\n trackColor?: string;\n hasFootprint?: boolean;\n futurePoints?: number;\n pastPoints?: number;\n } | null>(null);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const [_viewOffset, setViewOffset] = useState<{ x: number; y: number }>({ x: 0, y: 0 });\n\n // Normalize satellites: support SRO teamPaths, legacy single-track, and native API\n const allSatellites = useMemo<SatelliteTrack[]>(() => {\n // Priority 1: native satellites prop\n if (satellites.length > 0) return satellites;\n // Priority 2: SRO teamPaths format — auto-convert\n if (teamPaths && teamPaths.length > 0) {\n return teamPaths.map((tp, idx) => ({\n id: `team-${idx}`,\n name: tp.name,\n color: tp.color,\n status: 'normal' as const,\n groundTrack: tp.positions\n .filter(p => p.lat != null && p.lng != null)\n .map(p => ({\n latitude: p.lat,\n longitude: p.lng,\n altitude: p.altitude ?? 0,\n timestamp: p.time != null ? new Date(p.time * 1000).toISOString() : new Date().toISOString(),\n })),\n }));\n }\n // Priority 3: legacy single-track API\n if (groundTrack && groundTrack.length > 0) {\n return [{\n id: 'primary',\n name: 'Satellite',\n groundTrack,\n status: 'normal',\n accessMask,\n }];\n }\n return [];\n }, [satellites, groundTrack, accessMask, teamPaths]);\n\n // Stable defaults for Leaflet so animated updates don't get new refs and trigger map recreation\n const leafletDefaultCenter = useMemo<[number, number]>(() => defaultCenter ?? [20, 0], [defaultCenter]);\n const leafletDefaultZoom = useMemo(() => defaultZoom ?? 2, [defaultZoom]);\n\n // Optional Leaflet map: load when mapProvider is 'leaflet'\n const [LeafletMap, setLeafletMap] = useState<React.ComponentType<GroundTrackMapLeafletProps> | null>(null);\n const [leafletFailed, setLeafletFailed] = useState(false);\n\n useEffect(() => {\n if (mapProvider !== 'leaflet') return;\n import('./GroundTrackMapLeaflet')\n .then((m) => setLeafletMap(() => m.GroundTrackMapLeaflet))\n .catch((err) => {\n console.warn('[GroundTrackMap] Leaflet backend failed to load. Install \"leaflet\" and ensure it is resolvable. Falling back to static canvas.', err);\n setLeafletFailed(true);\n });\n }, [mapProvider]);\n\n // All canvas-backend hooks must run unconditionally (same hook count every render)\n // Recenter handler (canvas backend)\n const handleRecenter = useCallback(() => {\n setViewOffset({ x: 0, y: 0 });\n }, []);\n\n const COLORS = useMemo(() => ({\n background: tokens.colors.background.base,\n grid: tokens.colors.border.muted,\n text: tokens.colors.text.secondary,\n accent: tokens.colors.accent.primary,\n land: 'rgba(30, 40, 58, 0.92)',\n ocean: tokens.colors.background.base,\n night: 'rgba(0, 10, 40, 0.35)',\n equator: 'rgba(88, 166, 255, 0.25)',\n }), [tokens]);\n\n const lonToX = useCallback((lon: number, w: number) => {\n let normalizedLon = lon;\n while (normalizedLon > 180) normalizedLon -= 360;\n while (normalizedLon < -180) normalizedLon += 360;\n return ((normalizedLon + 180) / 360) * w;\n }, []);\n\n const latToY = useCallback((lat: number, h: number) => {\n return ((90 - lat) / 180) * h;\n }, []);\n\n const draw = useCallback(() => {\n const canvas = canvasRef.current;\n const container = containerRef.current;\n if (!canvas || !container) return;\n\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n\n const dpr = window.devicePixelRatio || 1;\n const rect = container.getBoundingClientRect();\n const W = rect.width;\n // When height is a CSS string ('100%'), use the measured container height\n const H = typeof height === 'number' ? height : rect.height || 400;\n\n canvas.width = W * dpr;\n canvas.height = H * dpr;\n canvas.style.width = `${W}px`;\n canvas.style.height = `${H}px`;\n ctx.scale(dpr, dpr);\n\n // === Background ===\n ctx.fillStyle = COLORS.background;\n ctx.fillRect(0, 0, W, H);\n\n // === Day/Night Terminator ===\n if (showTerminator) {\n const terminator = calculateTerminator(new Date());\n ctx.fillStyle = COLORS.night;\n\n // Night covers BOTH halves: east of sunset terminator AND west of sunrise terminator.\n // We draw them as two separate filled paths to avoid antimeridian artefacts.\n\n // ─── RIGHT strip: from sunset terminator going EAST to the right edge ───\n ctx.beginPath();\n ctx.moveTo(W, 0);\n ctx.lineTo(W, H);\n let prevRX = W;\n for (let i = terminator.length - 1; i >= 0; i--) {\n const x = lonToX(terminator[i].lon, W);\n const y = latToY(terminator[i].lat, H);\n // If there's an antimeridian jump, stitch along the edge\n if (Math.abs(x - prevRX) > W * 0.5 && i < terminator.length - 1) {\n const edgeX = prevRX > W / 2 ? W : 0;\n ctx.lineTo(edgeX, y);\n ctx.closePath(); ctx.fill();\n ctx.beginPath();\n ctx.moveTo(W, y);\n }\n ctx.lineTo(x, y);\n prevRX = x;\n }\n ctx.closePath();\n ctx.fill();\n\n // ─── LEFT strip: from left edge going EAST to the sunrise terminator ───\n // Sunrise is sunset shifted by −180°\n const normLon = (l: number) => { let r = l; while (r > 180) r -= 360; while (r < -180) r += 360; return r; };\n ctx.beginPath();\n ctx.moveTo(0, 0);\n ctx.lineTo(0, H);\n let prevLX = 0;\n for (let i = terminator.length - 1; i >= 0; i--) {\n const sunriseLon = normLon(terminator[i].lon - 180);\n const x = lonToX(sunriseLon, W);\n const y = latToY(terminator[i].lat, H);\n if (Math.abs(x - prevLX) > W * 0.5 && i < terminator.length - 1) {\n const edgeX = prevLX < W / 2 ? 0 : W;\n ctx.lineTo(edgeX, y);\n ctx.closePath(); ctx.fill();\n ctx.beginPath();\n ctx.moveTo(0, y);\n }\n ctx.lineTo(x, y);\n prevLX = x;\n }\n ctx.closePath();\n ctx.fill();\n }\n\n // === World Map (land visible against ocean) ===\n ctx.fillStyle = COLORS.land;\n ctx.strokeStyle = 'rgba(100, 120, 160, 0.25)';\n ctx.lineWidth = 1;\n\n for (const pathStr of WORLD_MAP_PATHS) {\n const commands = pathStr.split(' ');\n ctx.beginPath();\n for (const cmd of commands) {\n if (cmd.startsWith('M') || cmd.startsWith('L')) {\n const coords = cmd.substring(1).split(',');\n const lon = parseFloat(coords[0]);\n const lat = parseFloat(coords[1]);\n const x = lonToX(lon, W);\n const y = latToY(lat, H);\n if (cmd.startsWith('M')) ctx.moveTo(x, y);\n else ctx.lineTo(x, y);\n } else if (cmd === 'Z') {\n ctx.closePath();\n }\n }\n ctx.fill();\n ctx.stroke();\n }\n\n // === Grid ===\n if (showGrid) {\n ctx.strokeStyle = COLORS.grid;\n ctx.lineWidth = 0.4;\n for (let lon = -180; lon <= 180; lon += 30) {\n const x = lonToX(lon, W);\n ctx.beginPath(); ctx.moveTo(x, 0); ctx.lineTo(x, H); ctx.stroke();\n }\n for (let lat = -90; lat <= 90; lat += 30) {\n const y = latToY(lat, H);\n ctx.beginPath(); ctx.moveTo(0, y); ctx.lineTo(W, y); ctx.stroke();\n }\n }\n\n // === Equator ===\n if (showEquator) {\n const eqY = latToY(0, H);\n ctx.strokeStyle = COLORS.equator;\n ctx.lineWidth = 1;\n ctx.setLineDash([6, 4]);\n ctx.beginPath(); ctx.moveTo(0, eqY); ctx.lineTo(W, eqY); ctx.stroke();\n ctx.setLineDash([]);\n }\n\n // === Ground Station Coverage Circles (latitude-corrected ellipses) ===\n for (const gs of groundStations) {\n const enhanced = gs as GroundStationEnhanced;\n if (enhanced.showCoverage && enhanced.coverageRadius) {\n const statusColor = STATUS_COLOR_MAP[enhanced.status || 'standby'] || STATUS_COLOR_MAP.standby;\n\n // Use the coverage radius as-is (in degrees) — caller can compute\n // from visibilityRadiusDeg() or provide a direct value\n drawCoverageEllipse(ctx, gs.latitude, gs.longitude, enhanced.coverageRadius, W, H, lonToX, latToY);\n ctx.fillStyle = `${statusColor}15`;\n ctx.fill();\n ctx.strokeStyle = `${statusColor}40`;\n ctx.lineWidth = 1;\n ctx.setLineDash([4, 3]);\n ctx.stroke();\n ctx.setLineDash([]);\n }\n }\n\n // === Ground Stations (Astro UX Icons + Status Badges) ===\n for (const gs of groundStations) {\n const enhanced = gs as GroundStationEnhanced;\n const x = lonToX(gs.longitude, W);\n const y = latToY(gs.latitude, H);\n const status = enhanced.status || 'standby';\n const statusColor = STATUS_COLOR_MAP[status] || STATUS_COLOR_MAP.standby;\n const stationType = enhanced.type || 'dish';\n const iconSize = 20;\n const halfIcon = iconSize / 2;\n\n ctx.save();\n ctx.translate(x, y);\n\n // -- Background circle (subtle glow) --\n ctx.beginPath();\n ctx.arc(0, 0, halfIcon + 2, 0, Math.PI * 2);\n ctx.fillStyle = `${statusColor}18`;\n ctx.fill();\n\n // -- Icon background pill --\n ctx.beginPath();\n ctx.arc(0, 0, halfIcon, 0, Math.PI * 2);\n ctx.fillStyle = 'rgba(15, 23, 42, 0.85)';\n ctx.fill();\n ctx.strokeStyle = `${statusColor}66`;\n ctx.lineWidth = 1.5;\n ctx.stroke();\n\n // -- Draw Astro UX icon via SVG paths scaled to icon size --\n ctx.save();\n const iconScale = iconSize / 24;\n ctx.translate(-halfIcon, -halfIcon);\n ctx.scale(iconScale, iconScale);\n\n if (stationType === 'dish' || stationType === 'omni') {\n // Antenna icon (concentric arcs — Astro antenna pattern)\n ctx.strokeStyle = statusColor;\n ctx.fillStyle = statusColor;\n ctx.lineWidth = 2 / iconScale;\n // Outer arc\n ctx.beginPath(); ctx.arc(12, 12, 10, Math.PI * 1.25, Math.PI * 1.75); ctx.stroke();\n // Middle arc\n ctx.beginPath(); ctx.arc(12, 12, 6.5, Math.PI * 1.2, Math.PI * 1.8); ctx.stroke();\n // Inner arc\n ctx.beginPath(); ctx.arc(12, 12, 3, Math.PI * 1.15, Math.PI * 1.85); ctx.stroke();\n // Center dot (feed point)\n ctx.beginPath(); ctx.arc(12, 12, 1.5, 0, Math.PI * 2); ctx.fill();\n // Stand\n ctx.lineWidth = 1.5 / iconScale;\n ctx.beginPath(); ctx.moveTo(12, 14); ctx.lineTo(12, 20); ctx.stroke();\n ctx.beginPath(); ctx.moveTo(8, 20); ctx.lineTo(16, 20); ctx.stroke();\n } else if (stationType === 'phased-array') {\n // Phased array icon (grid pattern)\n ctx.strokeStyle = statusColor;\n ctx.fillStyle = statusColor;\n ctx.lineWidth = 1.5 / iconScale;\n ctx.strokeRect(5, 4, 14, 12);\n // Grid lines\n for (let gx = 8; gx <= 16; gx += 4) {\n ctx.beginPath(); ctx.moveTo(gx, 4); ctx.lineTo(gx, 16); ctx.stroke();\n }\n for (let gy = 8; gy <= 12; gy += 4) {\n ctx.beginPath(); ctx.moveTo(5, gy); ctx.lineTo(19, gy); ctx.stroke();\n }\n // Stand\n ctx.beginPath(); ctx.moveTo(12, 16); ctx.lineTo(12, 21); ctx.stroke();\n ctx.beginPath(); ctx.moveTo(8, 21); ctx.lineTo(16, 21); ctx.stroke();\n } else {\n // Relay: satellite dish with signal waves\n ctx.strokeStyle = statusColor;\n ctx.fillStyle = statusColor;\n ctx.lineWidth = 2 / iconScale;\n // Dish bowl\n ctx.beginPath(); ctx.arc(10, 12, 7, Math.PI * 0.8, Math.PI * 1.7); ctx.stroke();\n // Feed arm\n ctx.lineWidth = 1.5 / iconScale;\n ctx.beginPath(); ctx.moveTo(10, 12); ctx.lineTo(16, 6); ctx.stroke();\n // Signal waves\n ctx.lineWidth = 1.2 / iconScale;\n ctx.beginPath(); ctx.arc(17, 5, 2.5, Math.PI * 1.2, Math.PI * 1.7); ctx.stroke();\n ctx.beginPath(); ctx.arc(17, 5, 4.5, Math.PI * 1.15, Math.PI * 1.75); ctx.stroke();\n // Base\n ctx.lineWidth = 1.5 / iconScale;\n ctx.beginPath(); ctx.moveTo(10, 14); ctx.lineTo(10, 20); ctx.stroke();\n ctx.beginPath(); ctx.moveTo(6, 20); ctx.lineTo(14, 20); ctx.stroke();\n }\n\n ctx.restore(); // icon scaling\n\n // -- Astro UX Status Badge (top-left of icon) --\n const badgeX = -halfIcon + 1;\n const badgeY = -halfIcon + 1;\n const badgeSize = 7;\n\n // Badge background ring\n ctx.beginPath();\n ctx.arc(badgeX, badgeY, badgeSize / 2 + 2, 0, Math.PI * 2);\n ctx.fillStyle = 'rgba(15, 23, 42, 0.9)';\n ctx.fill();\n\n // Status shape per Astro UX spec (StatusIndicator.tsx canonical reference):\n // off → small filled dot, standby → ring (hollow circle),\n // normal → filled circle, caution → square,\n // serious → diamond, critical → triangle pointing DOWN\n ctx.fillStyle = statusColor;\n ctx.strokeStyle = statusColor;\n ctx.lineWidth = 1;\n if (status === 'normal') {\n // Filled circle for normal\n ctx.beginPath();\n ctx.arc(badgeX, badgeY, badgeSize / 2, 0, Math.PI * 2);\n ctx.fill();\n } else if (status === 'standby') {\n // Ring (hollow circle) for standby\n ctx.beginPath();\n ctx.arc(badgeX, badgeY, badgeSize / 2 - 0.5, 0, Math.PI * 2);\n ctx.lineWidth = 2;\n ctx.stroke();\n } else if (status === 'caution') {\n // Square for caution\n const hs = badgeSize / 2;\n ctx.fillRect(badgeX - hs, badgeY - hs, badgeSize, badgeSize);\n } else if (status === 'serious') {\n // Diamond for serious\n const hs = badgeSize / 2;\n ctx.beginPath();\n ctx.moveTo(badgeX, badgeY - hs);\n ctx.lineTo(badgeX + hs, badgeY);\n ctx.lineTo(badgeX, badgeY + hs);\n ctx.lineTo(badgeX - hs, badgeY);\n ctx.closePath();\n ctx.fill();\n } else if (status === 'critical') {\n // Triangle pointing DOWN for critical\n const hs = badgeSize / 2;\n ctx.beginPath();\n ctx.moveTo(badgeX, badgeY + hs); // bottom point\n ctx.lineTo(badgeX + hs, badgeY - hs); // top-right\n ctx.lineTo(badgeX - hs, badgeY - hs); // top-left\n ctx.closePath();\n ctx.fill();\n } else {\n // Off: small filled dot\n ctx.beginPath();\n ctx.arc(badgeX, badgeY, badgeSize / 3, 0, Math.PI * 2);\n ctx.fill();\n }\n\n ctx.restore();\n\n // Label\n ctx.fillStyle = COLORS.text;\n ctx.font = '9px \"Inter\", system-ui, sans-serif';\n ctx.textAlign = 'center';\n ctx.fillText(gs.name.length > 14 ? gs.name.slice(0, 14) + '…' : gs.name, x, y + halfIcon + 12);\n }\n\n // === Satellite Tracks ===\n allSatellites.forEach((sat, satIdx) => {\n const track = sat.groundTrack;\n if (!track || track.length === 0) return;\n\n const trackColor = sat.color || DEFAULT_TRACK_COLORS[satIdx % DEFAULT_TRACK_COLORS.length];\n const futureIdx = sat.futureTrackIndex ?? track.length;\n\n // Draw past track (solid)\n ctx.strokeStyle = trackColor;\n ctx.lineWidth = 2;\n ctx.lineCap = 'round';\n ctx.lineJoin = 'round';\n ctx.setLineDash([]);\n ctx.beginPath();\n\n let prevX = lonToX(track[0].longitude, W);\n let prevY = latToY(track[0].latitude, H);\n ctx.moveTo(prevX, prevY);\n\n for (let i = 1; i < Math.min(futureIdx, track.length); i++) {\n const x = lonToX(track[i].longitude, W);\n const y = latToY(track[i].latitude, H);\n const crossesDateLine = Math.abs(x - prevX) > W / 2;\n if (crossesDateLine) {\n ctx.stroke(); ctx.beginPath(); ctx.moveTo(x, y);\n } else {\n ctx.lineTo(x, y);\n }\n prevX = x; prevY = y;\n }\n ctx.stroke();\n\n // Draw future track (dashed)\n if (futureIdx < track.length) {\n ctx.strokeStyle = `${trackColor}88`;\n ctx.lineWidth = 1.5;\n ctx.setLineDash([6, 4]);\n ctx.beginPath();\n ctx.moveTo(lonToX(track[futureIdx].longitude, W), latToY(track[futureIdx].latitude, H));\n let fpx = lonToX(track[futureIdx].longitude, W);\n\n for (let i = futureIdx + 1; i < track.length; i++) {\n const x = lonToX(track[i].longitude, W);\n const y = latToY(track[i].latitude, H);\n if (Math.abs(x - fpx) > W / 2) {\n ctx.stroke(); ctx.beginPath(); ctx.moveTo(x, y);\n } else {\n ctx.lineTo(x, y);\n }\n fpx = x;\n }\n ctx.stroke();\n ctx.setLineDash([]);\n }\n\n // Draw access segments (contact passes)\n if (sat.accessMask && sat.accessMask.some(Boolean)) {\n ctx.strokeStyle = STATUS_COLOR_MAP.normal;\n ctx.lineWidth = 3;\n ctx.setLineDash([]);\n ctx.beginPath();\n let drawing = false;\n let apx = lonToX(track[0].longitude, W);\n\n for (let i = 0; i < track.length; i++) {\n const x = lonToX(track[i].longitude, W);\n const y = latToY(track[i].latitude, H);\n const active = sat.accessMask[i];\n const crossesDateLine = i > 0 && Math.abs(x - apx) > W / 2;\n\n if (active && !crossesDateLine) {\n if (!drawing) { ctx.moveTo(x, y); drawing = true; }\n else ctx.lineTo(x, y);\n } else {\n if (drawing) { ctx.stroke(); ctx.beginPath(); drawing = false; }\n }\n apx = x;\n }\n if (drawing) ctx.stroke();\n }\n\n // AOS/LOS markers\n if (sat.passMarkers) {\n for (const marker of sat.passMarkers) {\n const mx = lonToX(marker.longitude, W);\n const my = latToY(marker.latitude, H);\n const markerColor = marker.type === 'aos' ? STATUS_COLOR_MAP.normal : STATUS_COLOR_MAP.critical;\n\n ctx.save();\n ctx.translate(mx, my);\n // Triangle marker\n ctx.beginPath();\n if (marker.type === 'aos') {\n ctx.moveTo(0, -6); ctx.lineTo(4, 2); ctx.lineTo(-4, 2);\n } else {\n ctx.moveTo(0, 6); ctx.lineTo(4, -2); ctx.lineTo(-4, -2);\n }\n ctx.closePath();\n ctx.fillStyle = markerColor;\n ctx.fill();\n ctx.restore();\n\n if (marker.label) {\n ctx.fillStyle = markerColor;\n ctx.font = '8px \"Inter\", system-ui, sans-serif';\n ctx.textAlign = 'center';\n ctx.fillText(marker.label, mx, marker.type === 'aos' ? my - 9 : my + 13);\n }\n }\n }\n\n // Satellite footprint (latitude-corrected ellipse)\n if (sat.showFootprint && sat.footprintRadius) {\n const lastPt = futureIdx > 0 ? track[Math.min(futureIdx - 1, track.length - 1)] : track[track.length - 1];\n\n drawCoverageEllipse(ctx, lastPt.latitude, lastPt.longitude, sat.footprintRadius, W, H, lonToX, latToY);\n ctx.fillStyle = `${trackColor}12`;\n ctx.fill();\n ctx.strokeStyle = `${trackColor}50`;\n ctx.lineWidth = 1;\n ctx.setLineDash([3, 3]);\n ctx.stroke();\n ctx.setLineDash([]);\n }\n\n // Current position satellite icon (Astro UX style)\n const currentIdx = futureIdx > 0 ? Math.min(futureIdx - 1, track.length - 1) : track.length - 1;\n const current = track[currentIdx];\n const cx = lonToX(current.longitude, W);\n const cy = latToY(current.latitude, H);\n const satStatus = sat.status || 'normal';\n const statusColor = STATUS_COLOR_MAP[satStatus] || STATUS_COLOR_MAP.normal;\n const satIconSize = 22;\n const satHalf = satIconSize / 2;\n\n // Outer pulsing glow\n ctx.beginPath();\n ctx.arc(cx, cy, satHalf + 6, 0, Math.PI * 2);\n ctx.fillStyle = `${statusColor}12`;\n ctx.fill();\n\n ctx.beginPath();\n ctx.arc(cx, cy, satHalf + 3, 0, Math.PI * 2);\n ctx.fillStyle = `${statusColor}20`;\n ctx.fill();\n\n // Icon background\n ctx.save();\n ctx.translate(cx, cy);\n\n ctx.beginPath();\n ctx.arc(0, 0, satHalf, 0, Math.PI * 2);\n ctx.fillStyle = 'rgba(15, 23, 42, 0.88)';\n ctx.fill();\n ctx.strokeStyle = `${statusColor}88`;\n ctx.lineWidth = 1.5;\n ctx.stroke();\n\n // Draw satellite shape (body + solar panels)\n ctx.fillStyle = statusColor;\n // Body (rounded rect approximation)\n const bw = 5, bh = 3.5;\n ctx.beginPath();\n ctx.moveTo(-bw / 2 + 0.5, -bh / 2);\n ctx.lineTo(bw / 2 - 0.5, -bh / 2);\n ctx.arcTo(bw / 2, -bh / 2, bw / 2, -bh / 2 + 0.5, 0.5);\n ctx.lineTo(bw / 2, bh / 2 - 0.5);\n ctx.arcTo(bw / 2, bh / 2, bw / 2 - 0.5, bh / 2, 0.5);\n ctx.lineTo(-bw / 2 + 0.5, bh / 2);\n ctx.arcTo(-bw / 2, bh / 2, -bw / 2, bh / 2 - 0.5, 0.5);\n ctx.lineTo(-bw / 2, -bh / 2 + 0.5);\n ctx.arcTo(-bw / 2, -bh / 2, -bw / 2 + 0.5, -bh / 2, 0.5);\n ctx.closePath();\n ctx.fill();\n\n // Solar panel left\n ctx.fillStyle = `${statusColor}BB`;\n ctx.fillRect(-satHalf + 2, -2, 5, 4);\n // Panel lines\n ctx.strokeStyle = `${statusColor}55`;\n ctx.lineWidth = 0.5;\n ctx.beginPath();\n ctx.moveTo(-satHalf + 4.5, -2); ctx.lineTo(-satHalf + 4.5, 2);\n ctx.stroke();\n\n // Solar panel right\n ctx.fillStyle = `${statusColor}BB`;\n ctx.fillRect(satHalf - 7, -2, 5, 4);\n ctx.strokeStyle = `${statusColor}55`;\n ctx.beginPath();\n ctx.moveTo(satHalf - 4.5, -2); ctx.lineTo(satHalf - 4.5, 2);\n ctx.stroke();\n\n // Panel connectors\n ctx.strokeStyle = statusColor;\n ctx.lineWidth = 1;\n ctx.beginPath();\n ctx.moveTo(-bw / 2, 0); ctx.lineTo(-satHalf + 7, 0);\n ctx.moveTo(bw / 2, 0); ctx.lineTo(satHalf - 7, 0);\n ctx.stroke();\n\n // -- Astro UX Status Badge (top-left of satellite icon) --\n // Shapes per canonical StatusIndicator.tsx:\n // off → small dot, standby → ring, normal → filled circle,\n // caution → square, serious → diamond, critical → triangle DOWN\n const satBadgeX = -satHalf + 2;\n const satBadgeY = -satHalf + 2;\n const satBadgeSize = 7;\n\n // Badge background\n ctx.beginPath();\n ctx.arc(satBadgeX, satBadgeY, satBadgeSize / 2 + 2, 0, Math.PI * 2);\n ctx.fillStyle = 'rgba(15, 23, 42, 0.9)';\n ctx.fill();\n\n ctx.fillStyle = statusColor;\n ctx.strokeStyle = statusColor;\n ctx.lineWidth = 1;\n if (satStatus === 'normal') {\n // Filled circle\n ctx.beginPath();\n ctx.arc(satBadgeX, satBadgeY, satBadgeSize / 2, 0, Math.PI * 2);\n ctx.fill();\n } else if (satStatus === 'standby') {\n // Ring (hollow circle)\n ctx.beginPath();\n ctx.arc(satBadgeX, satBadgeY, satBadgeSize / 2 - 0.5, 0, Math.PI * 2);\n ctx.lineWidth = 2;\n ctx.stroke();\n } else if (satStatus === 'caution') {\n const hs = satBadgeSize / 2;\n ctx.fillRect(satBadgeX - hs, satBadgeY - hs, satBadgeSize, satBadgeSize);\n } else if (satStatus === 'serious') {\n // Diamond\n const hs = satBadgeSize / 2;\n ctx.beginPath();\n ctx.moveTo(satBadgeX, satBadgeY - hs);\n ctx.lineTo(satBadgeX + hs, satBadgeY);\n ctx.lineTo(satBadgeX, satBadgeY + hs);\n ctx.lineTo(satBadgeX - hs, satBadgeY);\n ctx.closePath();\n ctx.fill();\n } else if (satStatus === 'critical') {\n // Triangle pointing DOWN\n const hs = satBadgeSize / 2;\n ctx.beginPath();\n ctx.moveTo(satBadgeX, satBadgeY + hs); // bottom point\n ctx.lineTo(satBadgeX + hs, satBadgeY - hs); // top-right\n ctx.lineTo(satBadgeX - hs, satBadgeY - hs); // top-left\n ctx.closePath();\n ctx.fill();\n } else {\n // Off: small filled dot\n ctx.beginPath();\n ctx.arc(satBadgeX, satBadgeY, satBadgeSize / 3, 0, Math.PI * 2);\n ctx.fill();\n }\n\n ctx.restore();\n\n // Satellite label\n ctx.fillStyle = '#fff';\n ctx.font = 'bold 10px \"Inter\", system-ui, sans-serif';\n ctx.textAlign = 'center';\n ctx.fillText(sat.name, cx, cy - satHalf - 6);\n });\n\n // === Legend ===\n if (showLegend && (allSatellites.length > 0 || groundStations.length > 0)) {\n const legendX = 10;\n const legendY = 10;\n const lineHeight = 14;\n const items: Array<{ color: string; label: string; dash?: boolean }> = [];\n\n allSatellites.forEach((sat, idx) => {\n const c = sat.color || DEFAULT_TRACK_COLORS[idx % DEFAULT_TRACK_COLORS.length];\n items.push({ color: c, label: sat.name });\n });\n if (groundStations.length > 0) {\n items.push({ color: STATUS_COLOR_MAP.standby, label: `${groundStations.length} Ground Station${groundStations.length > 1 ? 's' : ''}` });\n }\n\n const maxLabelWidth = Math.max(...items.map(item => ctx.measureText(item.label).width)) + 28;\n const legendH = items.length * lineHeight + 10;\n\n ctx.fillStyle = 'rgba(0, 0, 0, 0.6)';\n ctx.strokeStyle = 'rgba(100, 116, 139, 0.3)';\n ctx.lineWidth = 1;\n const r = 4;\n ctx.beginPath();\n ctx.moveTo(legendX + r, legendY);\n ctx.lineTo(legendX + maxLabelWidth - r, legendY);\n ctx.arcTo(legendX + maxLabelWidth, legendY, legendX + maxLabelWidth, legendY + r, r);\n ctx.lineTo(legendX + maxLabelWidth, legendY + legendH - r);\n ctx.arcTo(legendX + maxLabelWidth, legendY + legendH, legendX + maxLabelWidth - r, legendY + legendH, r);\n ctx.lineTo(legendX + r, legendY + legendH);\n ctx.arcTo(legendX, legendY + legendH, legendX, legendY + legendH - r, r);\n ctx.lineTo(legendX, legendY + r);\n ctx.arcTo(legendX, legendY, legendX + r, legendY, r);\n ctx.closePath();\n ctx.fill();\n ctx.stroke();\n\n items.forEach((item, i) => {\n const iy = legendY + 8 + i * lineHeight;\n // Color swatch\n ctx.fillStyle = item.color;\n ctx.beginPath();\n ctx.arc(legendX + 10, iy + 3, 4, 0, Math.PI * 2);\n ctx.fill();\n // Label\n ctx.fillStyle = 'rgba(255, 255, 255, 0.85)';\n ctx.font = '10px \"Inter\", system-ui, sans-serif';\n ctx.textAlign = 'left';\n ctx.fillText(item.label, legendX + 20, iy + 7);\n });\n }\n\n // === No Data Message ===\n if (allSatellites.length === 0 && groundStations.length === 0) {\n ctx.fillStyle = COLORS.text;\n ctx.font = '12px \"Inter\", system-ui, sans-serif';\n ctx.textAlign = 'center';\n ctx.fillText(emptyMessage, W / 2, H / 2);\n }\n }, [allSatellites, groundStations, height, showTerminator, showGrid, showLegend, showEquator, lonToX, latToY, COLORS, emptyMessage]);\n\n // Tooltip on mouse move\n const handleMouseMove = useCallback((e: React.MouseEvent<HTMLCanvasElement>) => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n const rect = canvas.getBoundingClientRect();\n const mx = e.clientX - rect.left;\n const my = e.clientY - rect.top;\n const W = rect.width;\n const H = typeof height === 'number' ? height : rect.height;\n\n // Check satellite positions\n for (const sat of allSatellites) {\n if (!sat.groundTrack.length) continue;\n const futureIdx = sat.futureTrackIndex ?? sat.groundTrack.length;\n const currentIdx = futureIdx > 0 ? Math.min(futureIdx - 1, sat.groundTrack.length - 1) : sat.groundTrack.length - 1;\n const lastPt = sat.groundTrack[currentIdx];\n const sx = lonToX(lastPt.longitude, W);\n const sy = latToY(lastPt.latitude, H);\n const dist = Math.sqrt((mx - sx) ** 2 + (my - sy) ** 2);\n if (dist < 18) {\n const satStatus = sat.status || 'normal';\n setTooltip({\n x: e.clientX - rect.left + 15,\n y: e.clientY - rect.top - 10,\n type: 'satellite',\n name: sat.name,\n status: satStatus,\n statusColor: STATUS_COLOR_MAP[satStatus] || STATUS_COLOR_MAP.normal,\n lat: lastPt.latitude,\n lon: lastPt.longitude,\n alt: lastPt.altitude,\n trackColor: sat.color || DEFAULT_TRACK_COLORS[allSatellites.indexOf(sat) % DEFAULT_TRACK_COLORS.length],\n hasFootprint: sat.showFootprint,\n futurePoints: sat.groundTrack.length - futureIdx,\n pastPoints: futureIdx,\n });\n return;\n }\n }\n\n // Check ground stations\n for (const gs of groundStations) {\n const gx = lonToX(gs.longitude, W);\n const gy = latToY(gs.latitude, H);\n const dist = Math.sqrt((mx - gx) ** 2 + (my - gy) ** 2);\n if (dist < 16) {\n const enhanced = gs as GroundStationEnhanced;\n const gsStatus = enhanced.status || 'standby';\n setTooltip({\n x: e.clientX - rect.left + 15,\n y: e.clientY - rect.top - 10,\n type: 'station',\n name: gs.name,\n status: gsStatus,\n statusColor: STATUS_COLOR_MAP[gsStatus] || STATUS_COLOR_MAP.standby,\n lat: gs.latitude,\n lon: gs.longitude,\n stationType: enhanced.type || 'dish',\n network: ('network' in gs && gs.network) ? String(gs.network) : undefined,\n coverageRadius: enhanced.coverageRadius,\n });\n return;\n }\n }\n\n setTooltip(null);\n }, [allSatellites, groundStations, height, lonToX, latToY]);\n\n const handleClick = useCallback((e: React.MouseEvent<HTMLCanvasElement>) => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n const rect = canvas.getBoundingClientRect();\n const mx = e.clientX - rect.left;\n const my = e.clientY - rect.top;\n const W = rect.width;\n const H = typeof height === 'number' ? height : rect.height;\n\n for (const sat of allSatellites) {\n if (!sat.groundTrack.length) continue;\n const futureIdx = sat.futureTrackIndex ?? sat.groundTrack.length;\n const currentIdx = futureIdx > 0 ? Math.min(futureIdx - 1, sat.groundTrack.length - 1) : sat.groundTrack.length - 1;\n const currentPt = sat.groundTrack[currentIdx];\n const sx = lonToX(currentPt.longitude, W);\n const sy = latToY(currentPt.latitude, H);\n if (Math.sqrt((mx - sx) ** 2 + (my - sy) ** 2) < 15) {\n onSatelliteClick?.(sat.id);\n return;\n }\n }\n\n for (const gs of groundStations) {\n const gx = lonToX(gs.longitude, W);\n const gy = latToY(gs.latitude, H);\n if (Math.sqrt((mx - gx) ** 2 + (my - gy) ** 2) < 12) {\n onStationClick?.('id' in gs ? gs.id : gs.name);\n return;\n }\n }\n }, [allSatellites, groundStations, height, lonToX, latToY, onSatelliteClick, onStationClick]);\n\n useEffect(() => {\n draw();\n window.addEventListener('resize', draw);\n return () => window.removeEventListener('resize', draw);\n }, [draw]);\n\n // Leaflet backend: return after all hooks so hook count is stable\n const resolvedMinHeightForLeaflet = minHeight || (typeof height === 'number' ? `${height}px` : '400px');\n\n if (mapProvider === 'leaflet') {\n if (LeafletMap) {\n return (\n <div\n role=\"img\"\n aria-label={allSatellites.length > 0 || groundStations.length > 0 ? 'Ground track map showing satellite tracks and ground stations' : 'Ground track map'}\n style={{\n display: 'block',\n width: width ?? '100%',\n height: typeof height === 'string' ? height : undefined,\n minHeight: resolvedMinHeightForLeaflet,\n }}\n >\n <LeafletMap\n allSatellites={allSatellites}\n groundStations={groundStations}\n showTerminator={showTerminator}\n showGrid={showGrid}\n showLegend={showLegend}\n showEquator={showEquator}\n showRecenterButton={showRecenterButton}\n defaultCenter={leafletDefaultCenter}\n defaultZoom={leafletDefaultZoom}\n height={height}\n width={width}\n minHeight={minHeight}\n emptyMessage={emptyMessage}\n tileUrl={tileUrl}\n className={className}\n onSatelliteClick={onSatelliteClick}\n onStationClick={onStationClick}\n />\n </div>\n );\n }\n if (!leafletFailed) {\n return (\n <div\n className={`zendir-ground-track-map ${className}`}\n style={{\n width,\n height: typeof height === 'string' ? height : undefined,\n minHeight: resolvedMinHeightForLeaflet,\n backgroundColor: tokens.colors.background.base,\n borderRadius: 8,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <span style={{ color: tokens.colors.text.secondary, fontSize: 14 }}>Loading map…</span>\n </div>\n );\n }\n }\n\n const resolvedMinHeight = minHeight || (typeof height === 'number' ? `${height}px` : '400px');\n\n // Loading state\n if (isLoading) {\n return (\n <div\n className={`zendir-ground-track-map ${className}`}\n style={{\n width,\n minHeight: resolvedMinHeight,\n backgroundColor: COLORS.background,\n borderRadius: '8px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <span style={{ color: COLORS.text, fontSize: '14px', letterSpacing: '1px' }}>Loading…</span>\n </div>\n );\n }\n\n return (\n <div\n ref={containerRef}\n role=\"img\"\n aria-label={allSatellites.length > 0 || groundStations.length > 0 ? 'Ground track map showing satellite tracks and ground stations' : 'Ground track map'}\n className={`zendir-ground-track-map ${className}`}\n style={{ width, height: typeof height === 'string' ? height : undefined, minHeight: resolvedMinHeight, backgroundColor: COLORS.background, borderRadius: '8px', overflow: 'hidden', position: 'relative' }}\n data-map-backend=\"canvas\"\n >\n {/* Hint when Leaflet was requested but failed (e.g. leaflet not installed) */}\n {mapProvider === 'leaflet' && leafletFailed && (\n <div\n style={{\n position: 'absolute',\n bottom: 8,\n left: 8,\n zIndex: 100,\n padding: '4px 8px',\n background: 'rgba(0,0,0,0.75)',\n color: '#fce83a',\n fontSize: 11,\n borderRadius: 4,\n }}\n >\n Static view (install <code style={{ fontFamily: 'monospace' }}>leaflet</code> for zoom/pan)\n </div>\n )}\n {/* Recenter button (SRO compat) */}\n {showRecenterButton && (\n <button\n type=\"button\"\n onClick={handleRecenter}\n title=\"Recenter Map\"\n aria-label=\"Recenter map\"\n style={{\n position: 'absolute',\n top: '8px',\n right: '8px',\n zIndex: 20,\n background: 'rgba(30, 41, 59, 0.85)',\n border: '1px solid rgba(100, 116, 139, 0.4)',\n borderRadius: '4px',\n color: '#fff',\n cursor: 'pointer',\n padding: '4px 8px',\n fontSize: '12px',\n lineHeight: '1',\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n }}\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n <path d=\"M12 2v4M12 18v4M2 12h4M18 12h4\" />\n </svg>\n </button>\n )}\n\n <canvas\n ref={canvasRef}\n style={{ display: 'block', cursor: tooltip ? 'pointer' : 'default' }}\n onMouseMove={handleMouseMove}\n onMouseLeave={() => setTooltip(null)}\n onClick={handleClick}\n />\n {tooltip && (\n <div\n style={{\n position: 'absolute',\n left: tooltip.x,\n top: tooltip.y,\n background: 'rgba(15, 23, 42, 0.95)',\n backdropFilter: 'blur(8px)',\n border: `1px solid ${tooltip.statusColor}40`,\n borderRadius: '8px',\n padding: 0,\n pointerEvents: 'none',\n zIndex: 10,\n color: 'rgba(255, 255, 255, 0.9)',\n fontSize: '11px',\n fontFamily: '\"Inter\", system-ui, sans-serif',\n lineHeight: '1.5',\n boxShadow: `0 4px 16px rgba(0, 0, 0, 0.5), 0 0 12px ${tooltip.statusColor}15`,\n minWidth: 180,\n overflow: 'hidden',\n }}\n >\n {/* Header with status accent */}\n <div style={{\n padding: '6px 10px',\n borderBottom: `1px solid ${tooltip.statusColor}25`,\n background: `${tooltip.statusColor}10`,\n display: 'flex', alignItems: 'center', gap: 6,\n }}>\n <span style={{\n width: 8, height: 8, borderRadius: tooltip.status === 'caution' ? 1 : '50%',\n background: tooltip.statusColor, display: 'inline-block', flexShrink: 0,\n boxShadow: `0 0 4px ${tooltip.statusColor}88`,\n }} />\n <span style={{ fontWeight: 600, fontSize: 12 }}>{tooltip.name}</span>\n <span style={{\n marginLeft: 'auto', fontSize: 9, fontWeight: 600, textTransform: 'uppercase',\n color: tooltip.statusColor, letterSpacing: '0.5px',\n }}>\n {tooltip.status}\n </span>\n </div>\n {/* Details */}\n <div style={{ padding: '6px 10px', display: 'flex', flexDirection: 'column', gap: 3 }}>\n {/* Type badge */}\n <div style={{ display: 'flex', alignItems: 'center', gap: 6, marginBottom: 2 }}>\n <span style={{\n fontSize: 9, fontWeight: 600, padding: '1px 5px',\n borderRadius: 3, textTransform: 'uppercase', letterSpacing: '0.3px',\n background: tooltip.type === 'satellite' ? 'rgba(45, 204, 255, 0.15)' : 'rgba(86, 240, 0, 0.15)',\n color: tooltip.type === 'satellite' ? '#2dccff' : '#56f000',\n }}>\n {tooltip.type === 'satellite' ? (\n <>\n <AstroIcon name=\"satellite\" size=\"extra-small\" label=\"Satellite\" style={{ marginRight: 4, verticalAlign: 'middle' }} />\n Satellite\n </>\n ) : (\n <>\n <AstroIcon name=\"antenna\" size=\"extra-small\" label={tooltip.stationType || 'Ground station'} style={{ marginRight: 4, verticalAlign: 'middle' }} />\n {tooltip.stationType || 'dish'}\n </>\n )}\n </span>\n {tooltip.network && (\n <span style={{\n fontSize: 9, padding: '1px 5px', borderRadius: 3,\n background: 'rgba(157, 112, 255, 0.15)', color: '#9D70FF',\n }}>\n {tooltip.network}\n </span>\n )}\n </div>\n {/* Coordinates */}\n <div style={{ display: 'grid', gridTemplateColumns: '52px 1fr', gap: '2px 8px', fontSize: 10 }}>\n <span style={{ color: 'rgba(255,255,255,0.5)' }}>Lat</span>\n <span style={{ fontFamily: '\"Roboto Mono\", monospace', fontWeight: 500 }}>\n {tooltip.lat >= 0 ? '+' : ''}{tooltip.lat.toFixed(4)}°\n </span>\n <span style={{ color: 'rgba(255,255,255,0.5)' }}>Lon</span>\n <span style={{ fontFamily: '\"Roboto Mono\", monospace', fontWeight: 500 }}>\n {tooltip.lon >= 0 ? '+' : ''}{tooltip.lon.toFixed(4)}°\n </span>\n {tooltip.alt !== undefined && (\n <>\n <span style={{ color: 'rgba(255,255,255,0.5)' }}>Altitude</span>\n <span style={{ fontFamily: '\"Roboto Mono\", monospace', fontWeight: 500 }}>\n {tooltip.alt.toFixed(1)} km\n </span>\n </>\n )}\n {tooltip.coverageRadius !== undefined && (\n <>\n <span style={{ color: 'rgba(255,255,255,0.5)' }}>Coverage</span>\n <span style={{ fontFamily: '\"Roboto Mono\", monospace', fontWeight: 500 }}>\n {tooltip.coverageRadius.toFixed(1)}° radius\n </span>\n </>\n )}\n </div>\n {/* Satellite extras */}\n {tooltip.type === 'satellite' && (tooltip.pastPoints !== undefined || tooltip.futurePoints !== undefined) && (\n <div style={{ marginTop: 3, paddingTop: 3, borderTop: '1px solid rgba(255,255,255,0.08)', display: 'flex', gap: 10, fontSize: 9 }}>\n {tooltip.pastPoints !== undefined && (\n <span><span style={{ color: tooltip.trackColor }}>━</span> {tooltip.pastPoints} past pts</span>\n )}\n {tooltip.futurePoints !== undefined && tooltip.futurePoints > 0 && (\n <span><span style={{ color: `${tooltip.trackColor}88` }}>╌</span> {tooltip.futurePoints} predicted</span>\n )}\n {tooltip.hasFootprint && <span style={{ color: '#9D70FF' }}>◎ Footprint</span>}\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n );\n}\n\nexport default GroundTrackMap;\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
import { GroundStation } from '../types';
|
|
3
|
+
import { SatelliteTrack, GroundStationEnhanced, SROGroundStation } from './GroundTrackMap';
|
|
4
|
+
|
|
5
|
+
export type GroundStationMapItem = GroundStation | GroundStationEnhanced | SROGroundStation;
|
|
6
|
+
export interface GroundTrackMapLeafletProps {
|
|
7
|
+
allSatellites: SatelliteTrack[];
|
|
8
|
+
groundStations: GroundStationMapItem[];
|
|
9
|
+
showTerminator?: boolean;
|
|
10
|
+
showGrid?: boolean;
|
|
11
|
+
showLegend?: boolean;
|
|
12
|
+
showEquator?: boolean;
|
|
13
|
+
showRecenterButton?: boolean;
|
|
14
|
+
defaultCenter?: [number, number];
|
|
15
|
+
defaultZoom?: number;
|
|
16
|
+
height?: number | string;
|
|
17
|
+
width?: number | string;
|
|
18
|
+
minHeight?: string;
|
|
19
|
+
emptyMessage?: string;
|
|
20
|
+
tileUrl?: string;
|
|
21
|
+
className?: string;
|
|
22
|
+
onSatelliteClick?: (id: string) => void;
|
|
23
|
+
onStationClick?: (id: string) => void;
|
|
24
|
+
}
|
|
25
|
+
export declare function GroundTrackMapLeaflet({ allSatellites, groundStations, showTerminator, showGrid, showLegend, showEquator, showRecenterButton, defaultCenter, defaultZoom, height, width, minHeight, emptyMessage, tileUrl, className, onSatelliteClick, onStationClick, }: GroundTrackMapLeafletProps): React.ReactElement;
|
|
26
|
+
export default GroundTrackMapLeaflet;
|