@zendir/ui 0.3.0 → 0.3.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.
- package/dist/index.js +62 -62
- package/dist/react/3d/ZenSpace3D.js +3 -2
- package/dist/react/3d/ZenSpace3DShaders.js +478 -0
- package/dist/react/3d/ZenSpace3DShaders.js.map +1 -0
- package/dist/react/3d/capturePngAnalysis.js +42 -0
- package/dist/react/3d/capturePngAnalysis.js.map +1 -0
- package/dist/react/3d/index.js +57 -0
- package/dist/react/3d/index.js.map +1 -0
- package/dist/react/3d/threeLoader.js +4 -0
- package/dist/react/3d/threeLoader.js.map +1 -1
- package/dist/react/astro/ClassificationBanner.js +1 -1
- package/dist/react/astro/GlobalStatusBar.js +1 -1
- package/dist/react/astro/MissionClock.js +8 -5
- package/dist/react/astro/MissionClock.js.map +1 -1
- package/dist/react/astro/MonitoringIcon.js +1 -1
- package/dist/react/astro/Notification.js +1 -1
- package/dist/react/astro/Progress.js +1 -1
- package/dist/react/astro/SimulationControls.js +1 -1
- package/dist/react/astro/StatusIndicator.js +1 -1
- package/dist/react/astro/UnifiedTimeline.js +1 -1
- package/dist/react/astro/index.js +34 -0
- package/dist/react/astro/index.js.map +1 -0
- package/dist/react/cards/AccessCard.js +410 -0
- package/dist/react/cards/AccessCard.js.map +1 -0
- package/dist/react/cards/OrbitCard.js +372 -0
- package/dist/react/cards/OrbitCard.js.map +1 -0
- package/dist/react/cards/SpacecraftCard.js +941 -0
- package/dist/react/cards/SpacecraftCard.js.map +1 -0
- package/dist/react/cards/TelemetryCard.js +742 -0
- package/dist/react/cards/TelemetryCard.js.map +1 -0
- package/dist/react/cards/TelemetryStreamCard.js +309 -0
- package/dist/react/cards/TelemetryStreamCard.js.map +1 -0
- package/dist/react/cards/index.js +13 -0
- package/dist/react/cards/index.js.map +1 -0
- package/dist/react/charts/GroundTrackMap.js +1 -1
- package/dist/react/charts/GroundTrackMapLeaflet.js +1 -1
- package/dist/react/charts/index.js +104 -0
- package/dist/react/charts/index.js.map +1 -0
- package/dist/react/charts/unified/AstroChart.js +1 -1
- 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.js +3168 -0
- package/dist/react/charts/unified/domain.js.map +1 -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/presets.js +1000 -0
- package/dist/react/charts/unified/presets.js.map +1 -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.js +331 -4
- package/dist/react/charts/unified/theme.js.map +1 -1
- package/dist/react/charts/unified/useChartStream.js +226 -0
- package/dist/react/charts/unified/useChartStream.js.map +1 -0
- package/dist/react/chatgpt/index.js +163 -0
- package/dist/react/chatgpt/index.js.map +1 -0
- package/dist/react/core/data/DataTable.js +1 -1
- package/dist/react/core/data/DataValue.js +1 -1
- package/dist/react/core/display/AstroIcon.js +1 -1
- package/dist/react/core/display/Badge.js +1 -1
- package/dist/react/core/display/CardHeader.js +1 -1
- package/dist/react/core/display/Container.js +1 -1
- package/dist/react/core/display/GlassCard.js +1 -1
- package/dist/react/core/display/HeaderIconWithStatus.js +1 -1
- package/dist/react/core/feedback/Dialog.js +1 -1
- package/dist/react/core/feedback/Toast.js +1 -1
- package/dist/react/core/index.js +161 -0
- package/dist/react/core/index.js.map +1 -0
- package/dist/react/core/inputs/Button.js +1 -1
- package/dist/react/core/inputs/Checkbox.js +1 -1
- package/dist/react/core/inputs/Input.js +1 -1
- package/dist/react/core/inputs/NumberInput.js +1 -1
- package/dist/react/core/inputs/PinInput.js +1 -1
- package/dist/react/core/inputs/Select.js +1 -1
- package/dist/react/core/inputs/Toggle.js +1 -1
- package/dist/react/core/layout/Box.js +1 -1
- package/dist/react/core/layout/Flex.js +1 -1
- package/dist/react/core/layout/Grid.js +1 -1
- package/dist/react/core/layout/Stack.js +1 -1
- package/dist/react/core/navigation/AppBar.js +1 -1
- package/dist/react/core/navigation/Pagination.js +1 -1
- package/dist/react/core/navigation/SideNav.js +1 -1
- package/dist/react/core/navigation/Tabs.js +1 -1
- package/dist/react/core/overlays/SidePanel.js +1 -1
- package/dist/react/core/overlays/Tooltip.js +1 -1
- package/dist/react/core/widgets/Capture.js +1 -1
- package/dist/react/core/widgets/ChatPanel.js +1 -1
- package/dist/react/core/widgets/ColorPickerPanel.js +1 -1
- package/dist/react/core/widgets/ConnectionForm.js +1 -1
- package/dist/react/core/widgets/FileExplorer.js +1 -1
- package/dist/react/core/widgets/ImageGallery.js +1 -1
- package/dist/react/core/widgets/MessageStream.js +1 -1
- package/dist/react/core/widgets/MissionCalendar.js +1 -1
- package/dist/react/hooks/useCompactMode.js +1 -1
- package/dist/react/panels/index.js +8 -0
- package/dist/react/panels/index.js.map +1 -0
- package/dist/react/theme/config.js +30 -0
- package/dist/react/theme/config.js.map +1 -0
- package/dist/react/theme/index.js +19 -0
- package/dist/react/theme/index.js.map +1 -0
- package/dist/react/utils/index.js +8 -0
- package/dist/react/utils/index.js.map +1 -1
- package/dist/react.js +62 -62
- package/package.json +45 -37
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ZenSpace3DShaders.js","sources":["../../../src/react/3d/ZenSpace3DShaders.ts"],"sourcesContent":["/**\r\n * @zendir/ui - ZenSpace3D Shaders\r\n * \r\n * Advanced GLSL shaders for atmosphere, glow effects, coverage visualization,\r\n * and other space rendering effects.\r\n */\r\n\r\n// =============================================================================\r\n// Atmosphere Shader (Enhanced from original)\r\n// =============================================================================\r\n\r\nexport const atmosphereVertexShader = `\r\nvarying vec3 vNormal;\r\nvarying vec3 vPosition;\r\nvarying float vIntensity;\r\n\r\nvoid main() {\r\n vNormal = normalize(normalMatrix * normal);\r\n vPosition = position;\r\n \r\n // Calculate intensity based on view angle\r\n vec4 worldPosition = modelMatrix * vec4(position, 1.0);\r\n vec3 viewDirection = normalize(cameraPosition - worldPosition.xyz);\r\n vIntensity = pow(0.65 - dot(vNormal, viewDirection), 2.0);\r\n \r\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n}\r\n`;\r\n\r\nexport const atmosphereFragmentShader = `\r\nvarying vec3 vNormal;\r\nvarying vec3 vPosition;\r\nvarying float vIntensity;\r\n\r\nuniform vec3 glowColor;\r\nuniform float glowIntensity;\r\n\r\nvoid main() {\r\n // Fresnel-based glow\r\n float intensity = vIntensity * glowIntensity;\r\n \r\n // Add subtle color variation\r\n vec3 color = glowColor * intensity;\r\n \r\n // Fade at edges for smoother blending\r\n float alpha = intensity * 0.8;\r\n \r\n gl_FragColor = vec4(color, alpha);\r\n}\r\n`;\r\n\r\n// =============================================================================\r\n// Enhanced Stars Shader (Twinkling with nebula)\r\n// =============================================================================\r\n\r\nexport const starsVertexShader = `\r\nattribute float opacity;\r\nattribute float size;\r\nattribute vec3 customColor;\r\n\r\nvarying float vOpacity;\r\nvarying vec3 vColor;\r\n\r\nuniform float time;\r\nuniform float pointSize;\r\n\r\nvoid main() {\r\n vOpacity = opacity;\r\n vColor = customColor;\r\n \r\n // Twinkle effect\r\n float twinkle = sin(time * (0.5 + opacity * 2.0) + opacity * 100.0) * 0.5 + 0.5;\r\n vOpacity = opacity * (0.6 + twinkle * 0.4);\r\n \r\n vec4 mvPosition = modelViewMatrix * vec4(position, 1.0);\r\n \r\n // Size attenuation\r\n float sizeMultiplier = size > 0.0 ? size : 1.0;\r\n gl_PointSize = pointSize * sizeMultiplier * (300.0 / -mvPosition.z);\r\n gl_PointSize = clamp(gl_PointSize, 0.5, 8.0);\r\n \r\n gl_Position = projectionMatrix * mvPosition;\r\n}\r\n`;\r\n\r\nexport const starsFragmentShader = `\r\nvarying float vOpacity;\r\nvarying vec3 vColor;\r\n\r\nvoid main() {\r\n // Circular point with soft edge\r\n vec2 center = gl_PointCoord - vec2(0.5);\r\n float dist = length(center);\r\n \r\n if (dist > 0.5) discard;\r\n \r\n // Soft glow falloff\r\n float alpha = smoothstep(0.5, 0.0, dist) * vOpacity;\r\n \r\n // Apply color\r\n vec3 color = vColor.r > 0.0 ? vColor : vec3(1.0, 1.0, 1.0);\r\n \r\n gl_FragColor = vec4(color, alpha);\r\n}\r\n`;\r\n\r\n// =============================================================================\r\n// Coverage Heatmap Shader\r\n// =============================================================================\r\n\r\nexport const coverageVertexShader = `\r\nvarying vec2 vUv;\r\nvarying vec3 vNormal;\r\nvarying vec3 vPosition;\r\n\r\nvoid main() {\r\n vUv = uv;\r\n vNormal = normalize(normalMatrix * normal);\r\n vPosition = (modelMatrix * vec4(position, 1.0)).xyz;\r\n \r\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n}\r\n`;\r\n\r\nexport const coverageFragmentShader = `\r\nuniform sampler2D coverageMap;\r\nuniform vec3 lowColor;\r\nuniform vec3 highColor;\r\nuniform float opacity;\r\nuniform float time;\r\n\r\nvarying vec2 vUv;\r\nvarying vec3 vNormal;\r\nvarying vec3 vPosition;\r\n\r\nvoid main() {\r\n // Sample coverage value\r\n float coverage = texture2D(coverageMap, vUv).r;\r\n \r\n // Animated pulse for active areas\r\n float pulse = sin(time * 2.0) * 0.1 + 0.9;\r\n coverage *= coverage > 0.5 ? pulse : 1.0;\r\n \r\n // Color gradient\r\n vec3 color = mix(lowColor, highColor, coverage);\r\n \r\n // Fresnel edge highlight\r\n vec3 viewDir = normalize(cameraPosition - vPosition);\r\n float fresnel = pow(1.0 - dot(vNormal, viewDir), 2.0);\r\n color += vec3(0.1, 0.3, 0.5) * fresnel * coverage;\r\n \r\n // Hexagon pattern overlay (subtle)\r\n float hexPattern = fract(vUv.x * 20.0 + vUv.y * 10.0);\r\n color *= 0.95 + hexPattern * 0.05;\r\n \r\n gl_FragColor = vec4(color, coverage * opacity);\r\n}\r\n`;\r\n\r\n// =============================================================================\r\n// Visibility Cone Shader\r\n// =============================================================================\r\n\r\nexport const visibilityConeVertexShader = `\r\nvarying vec3 vPosition;\r\nvarying vec3 vNormal;\r\nvarying float vDistFromApex;\r\n\r\nuniform vec3 apexPosition;\r\n\r\nvoid main() {\r\n vPosition = (modelMatrix * vec4(position, 1.0)).xyz;\r\n vNormal = normalize(normalMatrix * normal);\r\n vDistFromApex = distance(position, apexPosition);\r\n \r\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n}\r\n`;\r\n\r\nexport const visibilityConeFragmentShader = `\r\nuniform vec3 coneColor;\r\nuniform float coneOpacity;\r\nuniform float time;\r\n\r\nvarying vec3 vPosition;\r\nvarying vec3 vNormal;\r\nvarying float vDistFromApex;\r\n\r\nvoid main() {\r\n // Fresnel effect for edge visibility\r\n vec3 viewDir = normalize(cameraPosition - vPosition);\r\n float fresnel = pow(1.0 - abs(dot(vNormal, viewDir)), 2.0);\r\n \r\n // Animated scan line effect\r\n float scan = fract(vDistFromApex * 0.001 - time * 0.5);\r\n scan = smoothstep(0.0, 0.1, scan) * smoothstep(0.2, 0.1, scan);\r\n \r\n // Distance-based opacity (fade towards apex)\r\n float distFade = smoothstep(0.0, 500.0, vDistFromApex);\r\n \r\n // Combine effects\r\n float alpha = (fresnel * 0.3 + 0.1 + scan * 0.2) * coneOpacity * distFade;\r\n \r\n gl_FragColor = vec4(coneColor, alpha);\r\n}\r\n`;\r\n\r\n// =============================================================================\r\n// Orbit Line Shader\r\n// =============================================================================\r\n\r\nexport const orbitLineVertexShader = `\r\nattribute float lineDistance;\r\nvarying float vLineDistance;\r\nvarying float vOpacity;\r\n\r\nuniform float totalLength;\r\nuniform float time;\r\nuniform float dashScale;\r\n\r\nvoid main() {\r\n vLineDistance = lineDistance;\r\n \r\n // Animated dash effect\r\n float animOffset = mod(time * 0.5, 1.0) * totalLength;\r\n float dashPos = mod(lineDistance + animOffset, dashScale);\r\n vOpacity = smoothstep(0.0, dashScale * 0.3, dashPos) * \r\n smoothstep(dashScale, dashScale * 0.7, dashPos);\r\n \r\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n}\r\n`;\r\n\r\nexport const orbitLineFragmentShader = `\r\nuniform vec3 lineColor;\r\nuniform float lineOpacity;\r\n\r\nvarying float vLineDistance;\r\nvarying float vOpacity;\r\n\r\nvoid main() {\r\n gl_FragColor = vec4(lineColor, lineOpacity * vOpacity);\r\n}\r\n`;\r\n\r\n// =============================================================================\r\n// Satellite/Object Glow Shader\r\n// =============================================================================\r\n\r\nexport const objectGlowVertexShader = `\r\nvarying vec3 vNormal;\r\nvarying vec3 vViewPosition;\r\n\r\nvoid main() {\r\n vNormal = normalize(normalMatrix * normal);\r\n vec4 mvPosition = modelViewMatrix * vec4(position, 1.0);\r\n vViewPosition = -mvPosition.xyz;\r\n \r\n gl_Position = projectionMatrix * mvPosition;\r\n}\r\n`;\r\n\r\nexport const objectGlowFragmentShader = `\r\nuniform vec3 glowColor;\r\nuniform float glowIntensity;\r\nuniform float glowPower;\r\n\r\nvarying vec3 vNormal;\r\nvarying vec3 vViewPosition;\r\n\r\nvoid main() {\r\n vec3 viewDir = normalize(vViewPosition);\r\n float fresnel = pow(1.0 - abs(dot(vNormal, viewDir)), glowPower);\r\n \r\n vec3 color = glowColor * glowIntensity * fresnel;\r\n float alpha = fresnel * glowIntensity;\r\n \r\n gl_FragColor = vec4(color, alpha);\r\n}\r\n`;\r\n\r\n// =============================================================================\r\n// Selection Ring Shader\r\n// =============================================================================\r\n\r\nexport const selectionRingVertexShader = `\r\nvarying vec2 vUv;\r\n\r\nvoid main() {\r\n vUv = uv;\r\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n}\r\n`;\r\n\r\nexport const selectionRingFragmentShader = `\r\nuniform vec3 ringColor;\r\nuniform float time;\r\nuniform float ringWidth;\r\nuniform float ringRadius;\r\n\r\nvarying vec2 vUv;\r\n\r\nvoid main() {\r\n vec2 center = vUv - vec2(0.5);\r\n float dist = length(center);\r\n \r\n // Ring shape\r\n float ring = smoothstep(ringRadius - ringWidth, ringRadius, dist) *\r\n smoothstep(ringRadius + ringWidth, ringRadius, dist);\r\n \r\n // Animated rotation\r\n float angle = atan(center.y, center.x);\r\n float rotatingDash = sin(angle * 8.0 - time * 3.0) * 0.5 + 0.5;\r\n \r\n // Pulse effect\r\n float pulse = sin(time * 2.0) * 0.2 + 0.8;\r\n \r\n float alpha = ring * rotatingDash * pulse;\r\n \r\n gl_FragColor = vec4(ringColor, alpha);\r\n}\r\n`;\r\n\r\n// =============================================================================\r\n// Terminator (Day/Night) Shader\r\n// =============================================================================\r\n\r\nexport const terminatorVertexShader = `\r\nvarying vec3 vWorldPosition;\r\nvarying vec3 vNormal;\r\n\r\nvoid main() {\r\n vWorldPosition = (modelMatrix * vec4(position, 1.0)).xyz;\r\n vNormal = normalize(normalMatrix * normal);\r\n \r\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n}\r\n`;\r\n\r\nexport const terminatorFragmentShader = `\r\nuniform vec3 sunDirection;\r\nuniform sampler2D dayTexture;\r\nuniform sampler2D nightTexture;\r\n\r\nvarying vec3 vWorldPosition;\r\nvarying vec3 vNormal;\r\n\r\nvoid main() {\r\n // Calculate sun illumination\r\n float sunDot = dot(vNormal, sunDirection);\r\n \r\n // Smooth transition at terminator\r\n float dayFactor = smoothstep(-0.1, 0.2, sunDot);\r\n \r\n // Sample textures (simplified - using world position for UV)\r\n vec2 uv = vec2(\r\n atan(vWorldPosition.z, vWorldPosition.x) / (2.0 * 3.14159) + 0.5,\r\n asin(vWorldPosition.y / length(vWorldPosition)) / 3.14159 + 0.5\r\n );\r\n \r\n vec4 dayColor = texture2D(dayTexture, uv);\r\n vec4 nightColor = texture2D(nightTexture, uv);\r\n \r\n // Blend day and night\r\n vec4 color = mix(nightColor, dayColor, dayFactor);\r\n \r\n // Add city lights glow on night side\r\n float nightGlow = (1.0 - dayFactor) * nightColor.r * 0.5;\r\n color.rgb += vec3(1.0, 0.9, 0.7) * nightGlow;\r\n \r\n gl_FragColor = color;\r\n}\r\n`;\r\n\r\n// =============================================================================\r\n// Grid Shader (Lat/Lon lines)\r\n// =============================================================================\r\n\r\nexport const gridVertexShader = `\r\nvarying vec3 vPosition;\r\n\r\nvoid main() {\r\n vPosition = position;\r\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n}\r\n`;\r\n\r\nexport const gridFragmentShader = `\r\nuniform vec3 gridColor;\r\nuniform float gridOpacity;\r\nuniform float gridSpacing;\r\nuniform float lineWidth;\r\n\r\nvarying vec3 vPosition;\r\n\r\nvoid main() {\r\n // Convert position to lat/lon\r\n float lat = asin(vPosition.y / length(vPosition)) * 57.2958; // rad to deg\r\n float lon = atan(vPosition.z, vPosition.x) * 57.2958;\r\n \r\n // Create grid lines\r\n float latLine = abs(mod(lat + 90.0, gridSpacing) - gridSpacing * 0.5);\r\n float lonLine = abs(mod(lon + 180.0, gridSpacing) - gridSpacing * 0.5);\r\n \r\n float line = min(latLine, lonLine);\r\n float alpha = smoothstep(lineWidth, 0.0, line) * gridOpacity;\r\n \r\n // Highlight equator and prime meridian\r\n float equator = smoothstep(1.0, 0.0, abs(lat));\r\n float primeMeridian = smoothstep(1.0, 0.0, abs(lon));\r\n alpha += (equator + primeMeridian) * 0.3;\r\n \r\n gl_FragColor = vec4(gridColor, alpha);\r\n}\r\n`;\r\n\r\n// =============================================================================\r\n// Planet Ring Shader (Saturn-like)\r\n// =============================================================================\r\n\r\nexport const planetRingVertexShader = `\r\nvarying vec2 vUv;\r\nvarying vec3 vWorldPosition;\r\n\r\nvoid main() {\r\n vUv = uv;\r\n vWorldPosition = (modelMatrix * vec4(position, 1.0)).xyz;\r\n \r\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n}\r\n`;\r\n\r\nexport const planetRingFragmentShader = `\r\nuniform vec3 ringColor;\r\nuniform float innerRadius;\r\nuniform float outerRadius;\r\nuniform float ringOpacity;\r\nuniform vec3 sunDirection;\r\n\r\nvarying vec2 vUv;\r\nvarying vec3 vWorldPosition;\r\n\r\nvoid main() {\r\n vec2 center = vUv - vec2(0.5);\r\n float dist = length(center) * 2.0;\r\n \r\n // Ring bands\r\n float normalizedDist = (dist - innerRadius) / (outerRadius - innerRadius);\r\n \r\n if (normalizedDist < 0.0 || normalizedDist > 1.0) discard;\r\n \r\n // Create ring bands pattern\r\n float bands = sin(normalizedDist * 50.0) * 0.3 + 0.7;\r\n float gaps = step(0.3, fract(normalizedDist * 5.0));\r\n \r\n // Simple shadow from planet\r\n float shadow = smoothstep(0.3, 0.5, dist);\r\n \r\n float alpha = bands * gaps * ringOpacity * shadow;\r\n \r\n gl_FragColor = vec4(ringColor, alpha);\r\n}\r\n`;\r\n\r\n// =============================================================================\r\n// Debris Field Shader (for instanced rendering)\r\n// =============================================================================\r\n\r\nexport const debrisVertexShader = `\r\nattribute vec3 instancePosition;\r\nattribute float instanceSize;\r\nattribute vec3 instanceColor;\r\n\r\nvarying vec3 vColor;\r\nvarying float vSize;\r\n\r\nuniform float time;\r\n\r\nvoid main() {\r\n vColor = instanceColor;\r\n vSize = instanceSize;\r\n \r\n // Apply instance transform\r\n vec3 transformed = position * instanceSize + instancePosition;\r\n \r\n // Slight rotation animation\r\n float angle = time * 0.5 + instancePosition.x * 0.01;\r\n mat2 rot = mat2(cos(angle), -sin(angle), sin(angle), cos(angle));\r\n transformed.xz = rot * transformed.xz;\r\n \r\n gl_Position = projectionMatrix * modelViewMatrix * vec4(transformed, 1.0);\r\n}\r\n`;\r\n\r\nexport const debrisFragmentShader = `\r\nvarying vec3 vColor;\r\nvarying float vSize;\r\n\r\nvoid main() {\r\n gl_FragColor = vec4(vColor, 1.0);\r\n}\r\n`;\r\n\r\n// =============================================================================\r\n// Shader Uniforms Helpers\r\n// =============================================================================\r\n\r\nexport interface AtmosphereUniforms {\r\n glowColor: { value: [number, number, number] };\r\n glowIntensity: { value: number };\r\n}\r\n\r\nexport interface StarsUniforms {\r\n time: { value: number };\r\n pointSize: { value: number };\r\n}\r\n\r\nexport interface CoverageUniforms {\r\n coverageMap: { value: unknown };\r\n lowColor: { value: [number, number, number] };\r\n highColor: { value: [number, number, number] };\r\n opacity: { value: number };\r\n time: { value: number };\r\n}\r\n\r\nexport interface VisibilityConeUniforms {\r\n coneColor: { value: [number, number, number] };\r\n coneOpacity: { value: number };\r\n time: { value: number };\r\n apexPosition: { value: [number, number, number] };\r\n}\r\n\r\nexport function createAtmosphereUniforms(\r\n color: [number, number, number] = [0.3, 0.6, 1.0],\r\n intensity: number = 1.5\r\n): AtmosphereUniforms {\r\n return {\r\n glowColor: { value: color },\r\n glowIntensity: { value: intensity },\r\n };\r\n}\r\n\r\nexport function createStarsUniforms(pointSize: number = 2.0): StarsUniforms {\r\n return {\r\n time: { value: 0 },\r\n pointSize: { value: pointSize },\r\n };\r\n}\r\n\r\nexport function createVisibilityConeUniforms(\r\n color: [number, number, number] = [0.2, 0.8, 0.9],\r\n opacity: number = 0.3\r\n): VisibilityConeUniforms {\r\n return {\r\n coneColor: { value: color },\r\n coneOpacity: { value: opacity },\r\n time: { value: 0 },\r\n apexPosition: { value: [0, 0, 0] },\r\n };\r\n}\r\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
function rgbToLuma(r, g, b) {
|
|
2
|
+
return 0.2126 * r + 0.7152 * g + 0.0722 * b;
|
|
3
|
+
}
|
|
4
|
+
async function meanLuminanceFromPngBytes(png) {
|
|
5
|
+
var _a;
|
|
6
|
+
if (typeof createImageBitmap !== "function" || typeof document === "undefined") {
|
|
7
|
+
return 0;
|
|
8
|
+
}
|
|
9
|
+
try {
|
|
10
|
+
const blob = new Blob([png], { type: "image/png" });
|
|
11
|
+
const bmp = await createImageBitmap(blob);
|
|
12
|
+
const w = bmp.width;
|
|
13
|
+
const h = bmp.height;
|
|
14
|
+
const canvas = document.createElement("canvas");
|
|
15
|
+
const step = Math.max(1, Math.floor(Math.sqrt(w * h / 4096)));
|
|
16
|
+
canvas.width = Math.ceil(w / step);
|
|
17
|
+
canvas.height = Math.ceil(h / step);
|
|
18
|
+
const ctx = canvas.getContext("2d");
|
|
19
|
+
if (!ctx) return 0;
|
|
20
|
+
ctx.drawImage(bmp, 0, 0, w, h, 0, 0, canvas.width, canvas.height);
|
|
21
|
+
const { data } = ctx.getImageData(0, 0, canvas.width, canvas.height);
|
|
22
|
+
let sum = 0;
|
|
23
|
+
const n = data.length / 4;
|
|
24
|
+
for (let i = 0; i < data.length; i += 4) {
|
|
25
|
+
sum += rgbToLuma(data[i], data[i + 1], data[i + 2]);
|
|
26
|
+
}
|
|
27
|
+
(_a = bmp.close) == null ? void 0 : _a.call(bmp);
|
|
28
|
+
return n > 0 ? sum / n : 0;
|
|
29
|
+
} catch {
|
|
30
|
+
return 0;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
async function isPngMostlyBlack(png, threshold = 5) {
|
|
34
|
+
const m = await meanLuminanceFromPngBytes(png);
|
|
35
|
+
return m < threshold;
|
|
36
|
+
}
|
|
37
|
+
export {
|
|
38
|
+
isPngMostlyBlack,
|
|
39
|
+
meanLuminanceFromPngBytes,
|
|
40
|
+
rgbToLuma
|
|
41
|
+
};
|
|
42
|
+
//# sourceMappingURL=capturePngAnalysis.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capturePngAnalysis.js","sources":["../../../src/react/3d/capturePngAnalysis.ts"],"sourcesContent":["/**\r\n * Lightweight PNG analysis for capture QA (brightness / \"all black\" detection).\r\n * Used by tests and optional runtime checks — keep dependency-free (no pngjs).\r\n */\r\n\r\n/** ITU-R BT.709 luma from RGB */\r\nexport function rgbToLuma(r: number, g: number, b: number): number {\r\n return 0.2126 * r + 0.7152 * g + 0.0722 * b;\r\n}\r\n\r\n/**\r\n * Sample mean luma of PNG bytes by drawing to a small canvas (browser / happy-dom).\r\n * Returns 0 if decode fails. For very large images, samples a grid (max ~4096 samples).\r\n */\r\nexport async function meanLuminanceFromPngBytes(png: Uint8Array): Promise<number> {\r\n if (typeof createImageBitmap !== 'function' || typeof document === 'undefined') {\r\n return 0;\r\n }\r\n try {\r\n const blob = new Blob([png as unknown as BlobPart], { type: 'image/png' });\r\n const bmp = await createImageBitmap(blob);\r\n const w = bmp.width;\r\n const h = bmp.height;\r\n const canvas = document.createElement('canvas');\r\n const step = Math.max(1, Math.floor(Math.sqrt((w * h) / 4096)));\r\n canvas.width = Math.ceil(w / step);\r\n canvas.height = Math.ceil(h / step);\r\n const ctx = canvas.getContext('2d');\r\n if (!ctx) return 0;\r\n ctx.drawImage(bmp, 0, 0, w, h, 0, 0, canvas.width, canvas.height);\r\n const { data } = ctx.getImageData(0, 0, canvas.width, canvas.height);\r\n let sum = 0;\r\n const n = data.length / 4;\r\n for (let i = 0; i < data.length; i += 4) {\r\n sum += rgbToLuma(data[i], data[i + 1], data[i + 2]);\r\n }\r\n bmp.close?.();\r\n return n > 0 ? sum / n : 0;\r\n } catch {\r\n return 0;\r\n }\r\n}\r\n\r\n/**\r\n * True if the image is uniformly dark (likely failed render / empty GL buffer).\r\n * Threshold is mean luma on 0–255 scale (default 5 ≈ pure black).\r\n */\r\nexport async function isPngMostlyBlack(png: Uint8Array, threshold = 5): Promise<boolean> {\r\n const m = await meanLuminanceFromPngBytes(png);\r\n return m < threshold;\r\n}\r\n"],"names":[],"mappings":"AAMO,SAAS,UAAU,GAAW,GAAW,GAAmB;AACjE,SAAO,SAAS,IAAI,SAAS,IAAI,SAAS;AAC5C;AAMA,eAAsB,0BAA0B,KAAkC;AAR3E;AASL,MAAI,OAAO,sBAAsB,cAAc,OAAO,aAAa,aAAa;AAC9E,WAAO;AAAA,EACT;AACA,MAAI;AACF,UAAM,OAAO,IAAI,KAAK,CAAC,GAA0B,GAAG,EAAE,MAAM,aAAa;AACzE,UAAM,MAAM,MAAM,kBAAkB,IAAI;AACxC,UAAM,IAAI,IAAI;AACd,UAAM,IAAI,IAAI;AACd,UAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,UAAM,OAAO,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,KAAM,IAAI,IAAK,IAAI,CAAC,CAAC;AAC9D,WAAO,QAAQ,KAAK,KAAK,IAAI,IAAI;AACjC,WAAO,SAAS,KAAK,KAAK,IAAI,IAAI;AAClC,UAAM,MAAM,OAAO,WAAW,IAAI;AAClC,QAAI,CAAC,IAAK,QAAO;AACjB,QAAI,UAAU,KAAK,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,OAAO,OAAO,OAAO,MAAM;AAChE,UAAM,EAAE,KAAA,IAAS,IAAI,aAAa,GAAG,GAAG,OAAO,OAAO,OAAO,MAAM;AACnE,QAAI,MAAM;AACV,UAAM,IAAI,KAAK,SAAS;AACxB,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK,GAAG;AACvC,aAAO,UAAU,KAAK,CAAC,GAAG,KAAK,IAAI,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC;AAAA,IACpD;AACA,cAAI,UAAJ;AACA,WAAO,IAAI,IAAI,MAAM,IAAI;AAAA,EAC3B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAMA,eAAsB,iBAAiB,KAAiB,YAAY,GAAqB;AACvF,QAAM,IAAI,MAAM,0BAA0B,GAAG;AAC7C,SAAO,IAAI;AACb;"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { ZenSpace3D, ZenSpace3D as ZenSpace3D2 } from "./ZenSpace3D.js";
|
|
2
|
+
import { ZenSpace3DCesium } from "./ZenSpace3DCesium.js";
|
|
3
|
+
import { DEG_TO_RAD, EARTH_RADIUS_KM, KM_TO_SCENE, RAD_TO_DEG, SCENE_EARTH_RADIUS, easeOutCubic, latLonAltToCartesian } from "./ZenSpace3DUtils.js";
|
|
4
|
+
import { atmosphereFragmentShader, atmosphereVertexShader, coverageFragmentShader, coverageVertexShader, createAtmosphereUniforms, createStarsUniforms, createVisibilityConeUniforms, debrisFragmentShader, debrisVertexShader, gridFragmentShader, gridVertexShader, objectGlowFragmentShader, objectGlowVertexShader, orbitLineFragmentShader, orbitLineVertexShader, planetRingFragmentShader, planetRingVertexShader, selectionRingFragmentShader, selectionRingVertexShader, starsFragmentShader, starsVertexShader, terminatorFragmentShader, terminatorVertexShader, visibilityConeFragmentShader, visibilityConeVertexShader } from "./ZenSpace3DShaders.js";
|
|
5
|
+
import { computeDofBlurPx, createCesiumCaptureSource, ecefEulerXyzToHpr, ecefMetersToSdkPosition, eulerXyzToHpr } from "./CesiumCaptureSource.js";
|
|
6
|
+
import { isPngMostlyBlack, meanLuminanceFromPngBytes, rgbToLuma } from "./capturePngAnalysis.js";
|
|
7
|
+
import { isThreeLoaded, loadThree } from "./threeLoader.js";
|
|
8
|
+
import { useSimulationScene } from "../hooks/useSimulationScene.js";
|
|
9
|
+
export {
|
|
10
|
+
DEG_TO_RAD,
|
|
11
|
+
EARTH_RADIUS_KM,
|
|
12
|
+
KM_TO_SCENE,
|
|
13
|
+
RAD_TO_DEG,
|
|
14
|
+
SCENE_EARTH_RADIUS,
|
|
15
|
+
ZenSpace3D,
|
|
16
|
+
ZenSpace3DCesium,
|
|
17
|
+
ZenSpace3D2 as ZenSpace3DDefault,
|
|
18
|
+
atmosphereFragmentShader,
|
|
19
|
+
atmosphereVertexShader,
|
|
20
|
+
computeDofBlurPx,
|
|
21
|
+
coverageFragmentShader,
|
|
22
|
+
coverageVertexShader,
|
|
23
|
+
createAtmosphereUniforms,
|
|
24
|
+
createCesiumCaptureSource,
|
|
25
|
+
createStarsUniforms,
|
|
26
|
+
createVisibilityConeUniforms,
|
|
27
|
+
debrisFragmentShader,
|
|
28
|
+
debrisVertexShader,
|
|
29
|
+
easeOutCubic,
|
|
30
|
+
ecefEulerXyzToHpr,
|
|
31
|
+
ecefMetersToSdkPosition,
|
|
32
|
+
eulerXyzToHpr,
|
|
33
|
+
gridFragmentShader,
|
|
34
|
+
gridVertexShader,
|
|
35
|
+
isPngMostlyBlack,
|
|
36
|
+
isThreeLoaded,
|
|
37
|
+
latLonAltToCartesian,
|
|
38
|
+
loadThree,
|
|
39
|
+
meanLuminanceFromPngBytes,
|
|
40
|
+
objectGlowFragmentShader,
|
|
41
|
+
objectGlowVertexShader,
|
|
42
|
+
orbitLineFragmentShader,
|
|
43
|
+
orbitLineVertexShader,
|
|
44
|
+
planetRingFragmentShader,
|
|
45
|
+
planetRingVertexShader,
|
|
46
|
+
rgbToLuma,
|
|
47
|
+
selectionRingFragmentShader,
|
|
48
|
+
selectionRingVertexShader,
|
|
49
|
+
starsFragmentShader,
|
|
50
|
+
starsVertexShader,
|
|
51
|
+
terminatorFragmentShader,
|
|
52
|
+
terminatorVertexShader,
|
|
53
|
+
useSimulationScene,
|
|
54
|
+
visibilityConeFragmentShader,
|
|
55
|
+
visibilityConeVertexShader
|
|
56
|
+
};
|
|
57
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"threeLoader.js","sources":["../../../src/react/3d/threeLoader.ts"],"sourcesContent":["/**\r\n * Shared Three.js loader\r\n * \r\n * Ensures only one instance of Three.js is loaded across all 3D components.\r\n * This prevents the \"Multiple instances of Three.js being imported\" warning.\r\n */\r\n\r\nexport type ThreeModule = typeof import('three');\r\nexport type OrbitControlsType = typeof import('three/examples/jsm/controls/OrbitControls.js').OrbitControls;\r\n\r\ninterface ThreeLoaderResult {\r\n THREE: ThreeModule;\r\n OrbitControls: OrbitControlsType;\r\n}\r\n\r\n// Cached promise to ensure single load\r\nlet loadPromise: Promise<ThreeLoaderResult> | null = null;\r\n\r\n/**\r\n * Load Three.js and OrbitControls\r\n * Returns cached instance if already loaded\r\n */\r\nexport async function loadThree(): Promise<ThreeLoaderResult> {\r\n if (loadPromise) {\r\n return loadPromise;\r\n }\r\n\r\n loadPromise = (async () => {\r\n const [THREE, { OrbitControls }] = await Promise.all([\r\n import('three'),\r\n import('three/examples/jsm/controls/OrbitControls.js'),\r\n ]);\r\n \r\n return { THREE, OrbitControls };\r\n })();\r\n\r\n return loadPromise;\r\n}\r\n\r\n/**\r\n * Check if Three.js is already loaded\r\n */\r\nexport function isThreeLoaded(): boolean {\r\n return loadPromise !== null;\r\n}\r\n"],"names":[],"mappings":"AAgBA,IAAI,cAAiD;AAMrD,eAAsB,YAAwC;AAC5D,MAAI,aAAa;AACf,WAAO;AAAA,EACT;AAEA,iBAAe,YAAY;AACzB,UAAM,CAAC,OAAO,EAAE,cAAA,CAAe,IAAI,MAAM,QAAQ,IAAI;AAAA,MACnD,OAAO,OAAO;AAAA,MACd,OAAO,8CAA8C;AAAA,IAAA,CACtD;AAED,WAAO,EAAE,OAAO,cAAA;AAAA,EAClB,GAAA;AAEA,SAAO;AACT;"}
|
|
1
|
+
{"version":3,"file":"threeLoader.js","sources":["../../../src/react/3d/threeLoader.ts"],"sourcesContent":["/**\r\n * Shared Three.js loader\r\n * \r\n * Ensures only one instance of Three.js is loaded across all 3D components.\r\n * This prevents the \"Multiple instances of Three.js being imported\" warning.\r\n */\r\n\r\nexport type ThreeModule = typeof import('three');\r\nexport type OrbitControlsType = typeof import('three/examples/jsm/controls/OrbitControls.js').OrbitControls;\r\n\r\ninterface ThreeLoaderResult {\r\n THREE: ThreeModule;\r\n OrbitControls: OrbitControlsType;\r\n}\r\n\r\n// Cached promise to ensure single load\r\nlet loadPromise: Promise<ThreeLoaderResult> | null = null;\r\n\r\n/**\r\n * Load Three.js and OrbitControls\r\n * Returns cached instance if already loaded\r\n */\r\nexport async function loadThree(): Promise<ThreeLoaderResult> {\r\n if (loadPromise) {\r\n return loadPromise;\r\n }\r\n\r\n loadPromise = (async () => {\r\n const [THREE, { OrbitControls }] = await Promise.all([\r\n import('three'),\r\n import('three/examples/jsm/controls/OrbitControls.js'),\r\n ]);\r\n \r\n return { THREE, OrbitControls };\r\n })();\r\n\r\n return loadPromise;\r\n}\r\n\r\n/**\r\n * Check if Three.js is already loaded\r\n */\r\nexport function isThreeLoaded(): boolean {\r\n return loadPromise !== null;\r\n}\r\n"],"names":[],"mappings":"AAgBA,IAAI,cAAiD;AAMrD,eAAsB,YAAwC;AAC5D,MAAI,aAAa;AACf,WAAO;AAAA,EACT;AAEA,iBAAe,YAAY;AACzB,UAAM,CAAC,OAAO,EAAE,cAAA,CAAe,IAAI,MAAM,QAAQ,IAAI;AAAA,MACnD,OAAO,OAAO;AAAA,MACd,OAAO,8CAA8C;AAAA,IAAA,CACtD;AAED,WAAO,EAAE,OAAO,cAAA;AAAA,EAClB,GAAA;AAEA,SAAO;AACT;AAKO,SAAS,gBAAyB;AACvC,SAAO,gBAAgB;AACzB;"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsx } from "react/jsx-runtime";
|
|
2
2
|
import { memo } from "react";
|
|
3
|
-
import { classNames } from "../utils/index.js";
|
|
4
3
|
import { useTheme } from "../theme/ThemeProvider.js";
|
|
4
|
+
import { classNames } from "../utils/index.js";
|
|
5
5
|
const CLASSIFICATION_STYLES = {
|
|
6
6
|
unclassified: {
|
|
7
7
|
bg: "#007a33",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
2
|
import { memo } from "react";
|
|
3
|
-
import { safeAccentText, classNames } from "../utils/index.js";
|
|
4
3
|
import { useTheme } from "../theme/ThemeProvider.js";
|
|
4
|
+
import { safeAccentText, classNames } from "../utils/index.js";
|
|
5
5
|
const GlobalStatusBar = memo(function GlobalStatusBar2({
|
|
6
6
|
appName = "Zendir",
|
|
7
7
|
appDomain,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
2
|
import { memo, useState, useMemo, useCallback, useEffect } from "react";
|
|
3
|
-
import { tabularNumsStyle, classNames } from "../utils/index.js";
|
|
4
3
|
import { useTheme } from "../theme/ThemeProvider.js";
|
|
4
|
+
import { tabularNumsStyle, classNames } from "../utils/index.js";
|
|
5
5
|
function formatMET(ms, showMilliseconds = false) {
|
|
6
6
|
const totalSeconds = Math.floor(Math.abs(ms) / 1e3);
|
|
7
7
|
const days = Math.floor(totalSeconds / 86400);
|
|
@@ -342,7 +342,7 @@ const MissionClock = memo(function MissionClock2({
|
|
|
342
342
|
}
|
|
343
343
|
);
|
|
344
344
|
});
|
|
345
|
-
memo(function SimpleTimer2({
|
|
345
|
+
const SimpleTimer = memo(function SimpleTimer2({
|
|
346
346
|
label,
|
|
347
347
|
timestamp,
|
|
348
348
|
direction = "countdown",
|
|
@@ -359,7 +359,7 @@ memo(function SimpleTimer2({
|
|
|
359
359
|
const timer = { label, timestamp, direction, status, showDays };
|
|
360
360
|
return /* @__PURE__ */ jsx("div", { className: classNames("zendir-simple-timer", className), children: /* @__PURE__ */ jsx(TimerDisplay, { timer, currentTime: now, tokens }) });
|
|
361
361
|
});
|
|
362
|
-
memo(function MissionElapsedTime2({
|
|
362
|
+
const MissionElapsedTime = memo(function MissionElapsedTime2({
|
|
363
363
|
launchTime,
|
|
364
364
|
showMilliseconds = false,
|
|
365
365
|
className = "",
|
|
@@ -378,7 +378,7 @@ memo(function MissionElapsedTime2({
|
|
|
378
378
|
}
|
|
379
379
|
);
|
|
380
380
|
});
|
|
381
|
-
memo(function SimulationClock2({
|
|
381
|
+
const SimulationClock = memo(function SimulationClock2({
|
|
382
382
|
epoch,
|
|
383
383
|
elapsedSeconds = 0,
|
|
384
384
|
timeScale = 1,
|
|
@@ -406,6 +406,9 @@ memo(function SimulationClock2({
|
|
|
406
406
|
);
|
|
407
407
|
});
|
|
408
408
|
export {
|
|
409
|
-
MissionClock
|
|
409
|
+
MissionClock,
|
|
410
|
+
MissionElapsedTime,
|
|
411
|
+
SimpleTimer,
|
|
412
|
+
SimulationClock
|
|
410
413
|
};
|
|
411
414
|
//# sourceMappingURL=MissionClock.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MissionClock.js","sources":["../../../src/react/astro/MissionClock.tsx"],"sourcesContent":["/**\n * @zendir/ui - MissionClock Component (Pure React)\n * \n * Advanced mission time display following Astro UX patterns with full\n * space operations support.\n * \n * Features:\n * - Theme-integrated via useTheme()\n * - UTC/Zulu time display\n * - Configurable formats (12h, 24h, ISO)\n * - Optional seconds display\n * - AOS/LOS timer support (Acquisition/Loss of Signal)\n * - MET (Mission Elapsed Time) display\n * - Julian day format (DOY-###)\n * - Simulation time support (custom epoch/time source)\n * - Tabular numbers for stability\n * - Zendir SDK integration for real-time data\n * \n * Space Operations Terminology:\n * - AOS: Acquisition of Signal - when satellite rises above horizon\n * - LOS: Loss of Signal - when satellite passes below horizon\n * - TCA: Time of Closest Approach - maximum elevation point\n * - MET: Mission Elapsed Time - time since launch (dd:hh:mm:ss)\n * - DOY: Day of Year - Julian day format\n */\n\nimport React, { memo, useState, useEffect, useCallback, useMemo } from 'react';\nimport { useTheme } from '../theme';\nimport { classNames, tabularNumsStyle } from '../utils';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type ClockFormat = '12h' | '24h' | 'iso' | 'met';\nexport type DateFormat = 'iso' | 'julian' | 'gregorian' | 'none';\nexport type TimeSource = 'realtime' | 'simulation' | 'custom';\n\n/**\n * Timer configuration for AOS/LOS countdown/up timers\n */\nexport interface TimerConfig {\n /** Timer label (e.g., \"AOS\", \"LOS\", \"MET\") */\n label: string;\n /** Target timestamp (for countdown) or start timestamp (for countup) */\n timestamp: Date;\n /** Timer direction: 'countdown' counts to target, 'countup' counts from start */\n direction: 'countdown' | 'countup';\n /** Optional status color */\n status?: 'normal' | 'caution' | 'critical' | 'standby';\n /** Show days in timer format */\n showDays?: boolean;\n}\n\n/**\n * Simulation time configuration\n */\nexport interface SimulationTimeConfig {\n /** Simulation epoch (t=0) as Date or ISO string */\n epoch: Date | string;\n /** Current simulation time offset in seconds from epoch */\n elapsedSeconds?: number;\n /** Time scale factor (1 = realtime, 2 = 2x speed, etc.) */\n timeScale?: number;\n /** Whether simulation is running */\n isRunning?: boolean;\n /** Callback to get current simulation time */\n getCurrentTime?: () => Date;\n}\n\nexport interface MissionClockProps {\n /** Clock format */\n format?: ClockFormat;\n /** Timezone label to display */\n timezone?: string;\n /** Hide seconds */\n hideSeconds?: boolean;\n /** Small size variant */\n small?: boolean;\n /** Show date */\n showDate?: boolean;\n /** Date format (iso, julian, gregorian) */\n dateFormat?: DateFormat;\n /** Custom className */\n className?: string;\n /** Click handler */\n onClick?: () => void;\n \n // === AOS/LOS Timer Support ===\n /** AOS timer - countdown/up to Acquisition of Signal */\n aosTimer?: TimerConfig | Date;\n /** LOS timer - countdown/up to Loss of Signal */\n losTimer?: TimerConfig | Date;\n /** Additional custom timers */\n customTimers?: TimerConfig[];\n \n // === Simulation Time Support ===\n /** Time source: realtime, simulation, or custom */\n timeSource?: TimeSource;\n /** Simulation time configuration (for timeSource='simulation') */\n simulationConfig?: SimulationTimeConfig;\n /** Custom time provider (for timeSource='custom') */\n customTime?: Date | (() => Date);\n \n // === Mission Elapsed Time ===\n /** Mission start time for MET display */\n missionStart?: Date | string;\n /** Show MET (Mission Elapsed Time) instead of wall clock */\n showMET?: boolean;\n \n // === Advanced Options ===\n /** Update interval in milliseconds (default: 1000) */\n updateInterval?: number;\n /** Compact mode - single line display */\n compact?: boolean;\n /** Show milliseconds */\n showMilliseconds?: boolean;\n}\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/**\n * Format duration as dd:hh:mm:ss (MET format)\n */\nfunction formatMET(ms: number, showMilliseconds = false): string {\n const totalSeconds = Math.floor(Math.abs(ms) / 1000);\n const days = Math.floor(totalSeconds / 86400);\n const hours = Math.floor((totalSeconds % 86400) / 3600);\n const minutes = Math.floor((totalSeconds % 3600) / 60);\n const seconds = totalSeconds % 60;\n \n const sign = ms < 0 ? '-' : '';\n \n if (showMilliseconds) {\n const millis = Math.floor(Math.abs(ms) % 1000);\n return `${sign}${days.toString().padStart(2, '0')}:${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}.${millis.toString().padStart(3, '0')}`;\n }\n \n return `${sign}${days.toString().padStart(2, '0')}:${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;\n}\n\n/**\n * Format duration for timers (compact: hh:mm:ss or mm:ss)\n */\nfunction formatTimerDuration(ms: number, showDays = false): string {\n const totalSeconds = Math.floor(Math.abs(ms) / 1000);\n const days = Math.floor(totalSeconds / 86400);\n const hours = Math.floor((totalSeconds % 86400) / 3600);\n const minutes = Math.floor((totalSeconds % 3600) / 60);\n const seconds = totalSeconds % 60;\n \n const sign = ms < 0 ? '-' : '';\n \n if (showDays && days > 0) {\n return `${sign}${days}d ${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;\n }\n \n if (hours > 0 || showDays) {\n return `${sign}${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;\n }\n \n return `${sign}${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;\n}\n\n/**\n * Get Julian day (day of year 001-366)\n */\nfunction getJulianDay(date: Date): string {\n const start = new Date(Date.UTC(date.getUTCFullYear(), 0, 0));\n const diff = date.getTime() - start.getTime();\n const oneDay = 1000 * 60 * 60 * 24;\n const day = Math.floor(diff / oneDay);\n return day.toString().padStart(3, '0');\n}\n\n/**\n * Normalize timer config from Date or TimerConfig\n */\nfunction normalizeTimerConfig(timer: TimerConfig | Date | undefined, label: string): TimerConfig | undefined {\n if (!timer) return undefined;\n if (timer instanceof Date) {\n return {\n label,\n timestamp: timer,\n direction: 'countdown',\n };\n }\n return timer;\n}\n\n// ============================================================================\n// Timer Sub-component\n// ============================================================================\n\ninterface TimerDisplayProps {\n timer: TimerConfig;\n currentTime: Date;\n tokens: ReturnType<typeof useTheme>['tokens'];\n compact?: boolean;\n}\n\nconst TimerDisplay = memo(function TimerDisplay({\n timer,\n currentTime,\n tokens,\n compact = false,\n}: TimerDisplayProps) {\n const diff = timer.direction === 'countdown'\n ? timer.timestamp.getTime() - currentTime.getTime()\n : currentTime.getTime() - timer.timestamp.getTime();\n \n const isNegative = diff < 0;\n const statusColor = timer.status \n ? tokens.colors.status[timer.status]\n : isNegative \n ? tokens.colors.status.caution \n : tokens.colors.status.normal;\n \n return (\n <div\n style={{\n display: 'flex',\n alignItems: compact ? 'center' : 'flex-start',\n flexDirection: compact ? 'row' : 'column',\n gap: compact ? 8 : 2,\n padding: `${tokens.spacing.xs} ${tokens.spacing.sm}`,\n backgroundColor: `${statusColor}15`,\n borderRadius: tokens.borderRadius.sm,\n border: `1px solid ${statusColor}30`,\n }}\n >\n <span\n style={{\n fontSize: tokens.typography.fontSize.xs,\n fontWeight: tokens.typography.fontWeight.semibold,\n color: statusColor,\n textTransform: 'uppercase',\n letterSpacing: tokens.typography.letterSpacing.wide,\n }}\n >\n {timer.label}\n </span>\n <span\n style={{\n fontSize: compact ? tokens.typography.fontSize.sm : tokens.typography.fontSize.base,\n fontWeight: tokens.typography.fontWeight.bold, // Bold (700) for timer readability\n fontFamily: tokens.typography.fontFamily.mono,\n color: statusColor,\n ...tabularNumsStyle,\n }}\n >\n {isNegative ? '+' : ''}{formatTimerDuration(diff, timer.showDays)}\n </span>\n </div>\n );\n});\n\n// ============================================================================\n// Main Component\n// ============================================================================\n\n/**\n * MissionClock - Advanced mission time display for space operations\n * \n * Supports real-time clock, simulation time, MET (Mission Elapsed Time),\n * and AOS/LOS timers following Astro UX Design System patterns.\n * \n * @example\n * ```tsx\n * // Basic clock\n * <MissionClock format=\"24h\" timezone=\"UTC\" />\n * \n * // With AOS/LOS timers\n * <MissionClock\n * format=\"24h\"\n * aosTimer={{ label: 'AOS', timestamp: new Date('2024-03-15T10:30:00Z'), direction: 'countdown' }}\n * losTimer={{ label: 'LOS', timestamp: new Date('2024-03-15T10:45:00Z'), direction: 'countdown' }}\n * />\n * \n * // Simulation time\n * <MissionClock\n * timeSource=\"simulation\"\n * simulationConfig={{\n * epoch: new Date('2026-01-01T00:00:00Z'),\n * elapsedSeconds: 3600,\n * timeScale: 1,\n * }}\n * />\n * \n * // Mission Elapsed Time\n * <MissionClock\n * showMET\n * missionStart={new Date('2026-01-01T00:00:00Z')}\n * />\n * \n * // Julian day format\n * <MissionClock showDate dateFormat=\"julian\" />\n * ```\n */\nexport const MissionClock = memo(function MissionClock({\n format = '24h',\n timezone = 'UTC',\n hideSeconds = false,\n small = false,\n showDate = false,\n dateFormat = 'iso',\n className = '',\n onClick,\n aosTimer,\n losTimer,\n customTimers = [],\n timeSource = 'realtime',\n simulationConfig,\n customTime,\n missionStart,\n showMET = false,\n updateInterval = 1000,\n compact = false,\n showMilliseconds = false,\n}: MissionClockProps): React.ReactElement {\n const { tokens, theme } = useTheme();\n const isTransparentTheme = theme === 'transparent' || theme === 'transparent-bold' || theme === 'transparent-minimal';\n \n // State for current time\n const [time, setTime] = useState(() => getCurrentTimeFromSource());\n \n // Normalize timer configs\n const normalizedAOS = useMemo(() => normalizeTimerConfig(aosTimer, 'AOS'), [aosTimer]);\n const normalizedLOS = useMemo(() => normalizeTimerConfig(losTimer, 'LOS'), [losTimer]);\n \n // All timers combined\n const allTimers = useMemo(() => {\n const timers: TimerConfig[] = [];\n if (normalizedAOS) timers.push(normalizedAOS);\n if (normalizedLOS) timers.push(normalizedLOS);\n return [...timers, ...customTimers];\n }, [normalizedAOS, normalizedLOS, customTimers]);\n \n // Get current time based on source\n function getCurrentTimeFromSource(): Date {\n switch (timeSource) {\n case 'simulation':\n if (simulationConfig) {\n if (simulationConfig.getCurrentTime) {\n return simulationConfig.getCurrentTime();\n }\n const epoch = typeof simulationConfig.epoch === 'string' \n ? new Date(simulationConfig.epoch) \n : simulationConfig.epoch;\n const elapsed = (simulationConfig.elapsedSeconds || 0) * 1000;\n return new Date(epoch.getTime() + elapsed);\n }\n return new Date();\n \n case 'custom':\n if (customTime) {\n return typeof customTime === 'function' ? customTime() : customTime;\n }\n return new Date();\n \n case 'realtime':\n default:\n return new Date();\n }\n }\n \n // Format time display\n const formatTimeDisplay = useCallback((date: Date): string => {\n if (showMET && missionStart) {\n const start = typeof missionStart === 'string' ? new Date(missionStart) : missionStart;\n const elapsed = date.getTime() - start.getTime();\n return formatMET(elapsed, showMilliseconds);\n }\n \n if (format === 'met' && missionStart) {\n const start = typeof missionStart === 'string' ? new Date(missionStart) : missionStart;\n const elapsed = date.getTime() - start.getTime();\n return formatMET(elapsed, showMilliseconds);\n }\n \n const hours = date.getUTCHours();\n const mins = date.getUTCMinutes();\n const secs = date.getUTCSeconds();\n const millis = date.getUTCMilliseconds();\n\n let hoursStr: string;\n let suffix = '';\n\n if (format === '12h') {\n const h12 = hours % 12 || 12;\n hoursStr = h12.toString().padStart(2, '0');\n suffix = hours >= 12 ? ' PM' : ' AM';\n } else {\n hoursStr = hours.toString().padStart(2, '0');\n }\n\n const minsStr = mins.toString().padStart(2, '0');\n const secsStr = secs.toString().padStart(2, '0');\n const millisStr = millis.toString().padStart(3, '0');\n\n if (hideSeconds) {\n return `${hoursStr}:${minsStr}${suffix}`;\n }\n \n if (showMilliseconds) {\n return `${hoursStr}:${minsStr}:${secsStr}.${millisStr}${suffix}`;\n }\n \n return `${hoursStr}:${minsStr}:${secsStr}${suffix}`;\n }, [format, hideSeconds, showMET, missionStart, showMilliseconds]);\n\n // Format date display\n const formatDateDisplay = useCallback((date: Date): string => {\n switch (dateFormat) {\n case 'julian': {\n const year = date.getUTCFullYear();\n const doy = getJulianDay(date);\n return `${year}/${doy}`;\n }\n case 'gregorian': {\n const year = date.getUTCFullYear();\n const month = (date.getUTCMonth() + 1).toString().padStart(2, '0');\n const day = date.getUTCDate().toString().padStart(2, '0');\n return `${month}/${day}/${year}`;\n }\n case 'iso':\n default:\n if (format === 'iso') {\n return date.toISOString().split('T')[0];\n }\n const year = date.getUTCFullYear();\n const month = (date.getUTCMonth() + 1).toString().padStart(2, '0');\n const day = date.getUTCDate().toString().padStart(2, '0');\n return `${year}-${month}-${day}`;\n }\n }, [format, dateFormat]);\n\n // Update time at interval\n useEffect(() => {\n // Calculate effective update interval\n const effectiveInterval = showMilliseconds ? Math.min(updateInterval, 100) : (hideSeconds ? 60000 : updateInterval);\n \n const intervalId = setInterval(() => {\n setTime(getCurrentTimeFromSource());\n }, effectiveInterval);\n\n return () => clearInterval(intervalId);\n }, [hideSeconds, updateInterval, showMilliseconds, timeSource, simulationConfig, customTime]);\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (onClick && (e.key === 'Enter' || e.key === ' ')) {\n e.preventDefault();\n onClick();\n }\n };\n \n // Determine display label\n const displayLabel = useMemo(() => {\n if (showMET || format === 'met') {\n return 'MET';\n }\n if (timeSource === 'simulation') {\n return 'SIM';\n }\n return timezone;\n }, [showMET, format, timeSource, timezone]);\n\n return (\n <div\n className={classNames('zendir-mission-clock', className)}\n onClick={onClick}\n onKeyDown={onClick ? handleKeyDown : undefined}\n tabIndex={onClick ? 0 : undefined}\n role=\"timer\"\n aria-label={`Current time: ${formatTimeDisplay(time)} ${displayLabel}`}\n style={{\n display: 'inline-flex',\n flexDirection: compact ? 'row' : 'column',\n alignItems: 'center',\n gap: compact ? 16 : 4,\n padding: small ? `${tokens.spacing.xs} ${tokens.spacing.sm}` : `${tokens.spacing.sm} ${tokens.spacing.md}`,\n backgroundColor: isTransparentTheme ? 'transparent' : tokens.colors.background.surface,\n ...(isTransparentTheme && { backdropFilter: 'blur(12px)', WebkitBackdropFilter: 'blur(12px)' as const }),\n ...(tokens.colors.border.cardStyle ?? { border: `1px solid ${tokens.colors.border.muted}` }),\n borderRadius: tokens.borderRadius.md,\n cursor: onClick ? 'pointer' : 'default',\n outline: 'none',\n transition: tokens.animation.fast,\n ...tabularNumsStyle,\n }}\n >\n {/* Main clock section */}\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n gap: 2,\n }}\n >\n {/* Date (optional) */}\n {showDate && dateFormat !== 'none' && (\n <span\n style={{\n fontSize: tokens.typography.fontSize.xs,\n fontWeight: tokens.typography.fontWeight.normal,\n fontFamily: tokens.typography.fontFamily.mono,\n color: tokens.colors.text.tertiary,\n letterSpacing: tokens.typography.letterSpacing.normal,\n }}\n >\n {formatDateDisplay(time)}\n </span>\n )}\n\n {/* Time - Using bold weight for critical time displays (Apple/Google best practice) */}\n <span\n style={{\n fontSize: small ? tokens.typography.fontSize.base : tokens.typography.fontSize.xl,\n fontWeight: tokens.typography.fontWeight.bold, // Bold (700) for readability - time is critical info\n fontFamily: tokens.typography.fontFamily.mono,\n letterSpacing: tokens.typography.letterSpacing.normal,\n color: tokens.colors.text.primary,\n }}\n >\n {formatTimeDisplay(time)}\n </span>\n\n {/* Label (timezone/MET/SIM) */}\n {displayLabel && (\n <span\n style={{\n fontSize: tokens.typography.fontSize.xs,\n fontWeight: tokens.typography.fontWeight.medium,\n color: timeSource === 'simulation' \n ? tokens.colors.status.caution \n : tokens.colors.text.tertiary,\n textTransform: 'uppercase',\n letterSpacing: tokens.typography.letterSpacing.wide,\n }}\n >\n {displayLabel}\n </span>\n )}\n </div>\n \n {/* AOS/LOS Timers */}\n {allTimers.length > 0 && (\n <div\n style={{\n display: 'flex',\n flexDirection: compact ? 'row' : 'column',\n gap: 8,\n }}\n >\n {allTimers.map((timer, index) => (\n <TimerDisplay\n key={`${timer.label}-${index}`}\n timer={timer}\n currentTime={time}\n tokens={tokens}\n compact={compact}\n />\n ))}\n </div>\n )}\n </div>\n );\n});\n\n// ============================================================================\n// Convenience Components\n// ============================================================================\n\n/**\n * SimpleTimer - Standalone countdown/up timer\n */\nexport interface SimpleTimerProps {\n /** Timer label */\n label: string;\n /** Target/start timestamp */\n timestamp: Date;\n /** Timer direction */\n direction?: 'countdown' | 'countup';\n /** Status color */\n status?: 'normal' | 'caution' | 'critical' | 'standby';\n /** Show days */\n showDays?: boolean;\n /** Custom className */\n className?: string;\n}\n\nexport const SimpleTimer = memo(function SimpleTimer({\n label,\n timestamp,\n direction = 'countdown',\n status,\n showDays = false,\n className = '',\n}: SimpleTimerProps): React.ReactElement {\n const { tokens } = useTheme();\n const [now, setNow] = useState(new Date());\n \n useEffect(() => {\n const interval = setInterval(() => setNow(new Date()), 1000);\n return () => clearInterval(interval);\n }, []);\n \n const timer: TimerConfig = { label, timestamp, direction, status, showDays };\n \n return (\n <div className={classNames('zendir-simple-timer', className)}>\n <TimerDisplay timer={timer} currentTime={now} tokens={tokens} />\n </div>\n );\n});\n\n/**\n * MissionElapsedTime - Dedicated MET display\n */\nexport interface MissionElapsedTimeProps {\n /** Mission launch/start time */\n launchTime: Date | string;\n /** Show milliseconds */\n showMilliseconds?: boolean;\n /** Custom className */\n className?: string;\n /** Small variant */\n small?: boolean;\n}\n\nexport const MissionElapsedTime = memo(function MissionElapsedTime({\n launchTime,\n showMilliseconds = false,\n className = '',\n small = false,\n}: MissionElapsedTimeProps): React.ReactElement {\n return (\n <MissionClock\n format=\"met\"\n missionStart={launchTime}\n showMET\n showMilliseconds={showMilliseconds}\n className={className}\n small={small}\n timezone=\"\"\n />\n );\n});\n\n/**\n * SimulationClock - Clock driven by simulation time\n */\nexport interface SimulationClockProps {\n /** Simulation epoch */\n epoch: Date | string;\n /** Elapsed seconds from epoch */\n elapsedSeconds?: number;\n /** Time scale factor */\n timeScale?: number;\n /** Whether simulation is running */\n isRunning?: boolean;\n /** Show date */\n showDate?: boolean;\n /** Date format */\n dateFormat?: DateFormat;\n /** Custom className */\n className?: string;\n /** Small variant */\n small?: boolean;\n}\n\nexport const SimulationClock = memo(function SimulationClock({\n epoch,\n elapsedSeconds = 0,\n timeScale = 1,\n isRunning = true,\n showDate = true,\n dateFormat = 'julian',\n className = '',\n small = false,\n}: SimulationClockProps): React.ReactElement {\n return (\n <MissionClock\n timeSource=\"simulation\"\n simulationConfig={{\n epoch,\n elapsedSeconds,\n timeScale,\n isRunning,\n }}\n showDate={showDate}\n dateFormat={dateFormat}\n className={className}\n small={small}\n />\n );\n});\n\nexport default MissionClock;\n"],"names":["TimerDisplay","MissionClock","year","month","day","SimpleTimer","MissionElapsedTime","SimulationClock"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"MissionClock.js","sources":["../../../src/react/astro/MissionClock.tsx"],"sourcesContent":["/**\n * @zendir/ui - MissionClock Component (Pure React)\n * \n * Advanced mission time display following Astro UX patterns with full\n * space operations support.\n * \n * Features:\n * - Theme-integrated via useTheme()\n * - UTC/Zulu time display\n * - Configurable formats (12h, 24h, ISO)\n * - Optional seconds display\n * - AOS/LOS timer support (Acquisition/Loss of Signal)\n * - MET (Mission Elapsed Time) display\n * - Julian day format (DOY-###)\n * - Simulation time support (custom epoch/time source)\n * - Tabular numbers for stability\n * - Zendir SDK integration for real-time data\n * \n * Space Operations Terminology:\n * - AOS: Acquisition of Signal - when satellite rises above horizon\n * - LOS: Loss of Signal - when satellite passes below horizon\n * - TCA: Time of Closest Approach - maximum elevation point\n * - MET: Mission Elapsed Time - time since launch (dd:hh:mm:ss)\n * - DOY: Day of Year - Julian day format\n */\n\nimport React, { memo, useState, useEffect, useCallback, useMemo } from 'react';\nimport { useTheme } from '../theme';\nimport { classNames, tabularNumsStyle } from '../utils';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type ClockFormat = '12h' | '24h' | 'iso' | 'met';\nexport type DateFormat = 'iso' | 'julian' | 'gregorian' | 'none';\nexport type TimeSource = 'realtime' | 'simulation' | 'custom';\n\n/**\n * Timer configuration for AOS/LOS countdown/up timers\n */\nexport interface TimerConfig {\n /** Timer label (e.g., \"AOS\", \"LOS\", \"MET\") */\n label: string;\n /** Target timestamp (for countdown) or start timestamp (for countup) */\n timestamp: Date;\n /** Timer direction: 'countdown' counts to target, 'countup' counts from start */\n direction: 'countdown' | 'countup';\n /** Optional status color */\n status?: 'normal' | 'caution' | 'critical' | 'standby';\n /** Show days in timer format */\n showDays?: boolean;\n}\n\n/**\n * Simulation time configuration\n */\nexport interface SimulationTimeConfig {\n /** Simulation epoch (t=0) as Date or ISO string */\n epoch: Date | string;\n /** Current simulation time offset in seconds from epoch */\n elapsedSeconds?: number;\n /** Time scale factor (1 = realtime, 2 = 2x speed, etc.) */\n timeScale?: number;\n /** Whether simulation is running */\n isRunning?: boolean;\n /** Callback to get current simulation time */\n getCurrentTime?: () => Date;\n}\n\nexport interface MissionClockProps {\n /** Clock format */\n format?: ClockFormat;\n /** Timezone label to display */\n timezone?: string;\n /** Hide seconds */\n hideSeconds?: boolean;\n /** Small size variant */\n small?: boolean;\n /** Show date */\n showDate?: boolean;\n /** Date format (iso, julian, gregorian) */\n dateFormat?: DateFormat;\n /** Custom className */\n className?: string;\n /** Click handler */\n onClick?: () => void;\n \n // === AOS/LOS Timer Support ===\n /** AOS timer - countdown/up to Acquisition of Signal */\n aosTimer?: TimerConfig | Date;\n /** LOS timer - countdown/up to Loss of Signal */\n losTimer?: TimerConfig | Date;\n /** Additional custom timers */\n customTimers?: TimerConfig[];\n \n // === Simulation Time Support ===\n /** Time source: realtime, simulation, or custom */\n timeSource?: TimeSource;\n /** Simulation time configuration (for timeSource='simulation') */\n simulationConfig?: SimulationTimeConfig;\n /** Custom time provider (for timeSource='custom') */\n customTime?: Date | (() => Date);\n \n // === Mission Elapsed Time ===\n /** Mission start time for MET display */\n missionStart?: Date | string;\n /** Show MET (Mission Elapsed Time) instead of wall clock */\n showMET?: boolean;\n \n // === Advanced Options ===\n /** Update interval in milliseconds (default: 1000) */\n updateInterval?: number;\n /** Compact mode - single line display */\n compact?: boolean;\n /** Show milliseconds */\n showMilliseconds?: boolean;\n}\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/**\n * Format duration as dd:hh:mm:ss (MET format)\n */\nfunction formatMET(ms: number, showMilliseconds = false): string {\n const totalSeconds = Math.floor(Math.abs(ms) / 1000);\n const days = Math.floor(totalSeconds / 86400);\n const hours = Math.floor((totalSeconds % 86400) / 3600);\n const minutes = Math.floor((totalSeconds % 3600) / 60);\n const seconds = totalSeconds % 60;\n \n const sign = ms < 0 ? '-' : '';\n \n if (showMilliseconds) {\n const millis = Math.floor(Math.abs(ms) % 1000);\n return `${sign}${days.toString().padStart(2, '0')}:${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}.${millis.toString().padStart(3, '0')}`;\n }\n \n return `${sign}${days.toString().padStart(2, '0')}:${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;\n}\n\n/**\n * Format duration for timers (compact: hh:mm:ss or mm:ss)\n */\nfunction formatTimerDuration(ms: number, showDays = false): string {\n const totalSeconds = Math.floor(Math.abs(ms) / 1000);\n const days = Math.floor(totalSeconds / 86400);\n const hours = Math.floor((totalSeconds % 86400) / 3600);\n const minutes = Math.floor((totalSeconds % 3600) / 60);\n const seconds = totalSeconds % 60;\n \n const sign = ms < 0 ? '-' : '';\n \n if (showDays && days > 0) {\n return `${sign}${days}d ${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;\n }\n \n if (hours > 0 || showDays) {\n return `${sign}${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;\n }\n \n return `${sign}${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;\n}\n\n/**\n * Get Julian day (day of year 001-366)\n */\nfunction getJulianDay(date: Date): string {\n const start = new Date(Date.UTC(date.getUTCFullYear(), 0, 0));\n const diff = date.getTime() - start.getTime();\n const oneDay = 1000 * 60 * 60 * 24;\n const day = Math.floor(diff / oneDay);\n return day.toString().padStart(3, '0');\n}\n\n/**\n * Normalize timer config from Date or TimerConfig\n */\nfunction normalizeTimerConfig(timer: TimerConfig | Date | undefined, label: string): TimerConfig | undefined {\n if (!timer) return undefined;\n if (timer instanceof Date) {\n return {\n label,\n timestamp: timer,\n direction: 'countdown',\n };\n }\n return timer;\n}\n\n// ============================================================================\n// Timer Sub-component\n// ============================================================================\n\ninterface TimerDisplayProps {\n timer: TimerConfig;\n currentTime: Date;\n tokens: ReturnType<typeof useTheme>['tokens'];\n compact?: boolean;\n}\n\nconst TimerDisplay = memo(function TimerDisplay({\n timer,\n currentTime,\n tokens,\n compact = false,\n}: TimerDisplayProps) {\n const diff = timer.direction === 'countdown'\n ? timer.timestamp.getTime() - currentTime.getTime()\n : currentTime.getTime() - timer.timestamp.getTime();\n \n const isNegative = diff < 0;\n const statusColor = timer.status \n ? tokens.colors.status[timer.status]\n : isNegative \n ? tokens.colors.status.caution \n : tokens.colors.status.normal;\n \n return (\n <div\n style={{\n display: 'flex',\n alignItems: compact ? 'center' : 'flex-start',\n flexDirection: compact ? 'row' : 'column',\n gap: compact ? 8 : 2,\n padding: `${tokens.spacing.xs} ${tokens.spacing.sm}`,\n backgroundColor: `${statusColor}15`,\n borderRadius: tokens.borderRadius.sm,\n border: `1px solid ${statusColor}30`,\n }}\n >\n <span\n style={{\n fontSize: tokens.typography.fontSize.xs,\n fontWeight: tokens.typography.fontWeight.semibold,\n color: statusColor,\n textTransform: 'uppercase',\n letterSpacing: tokens.typography.letterSpacing.wide,\n }}\n >\n {timer.label}\n </span>\n <span\n style={{\n fontSize: compact ? tokens.typography.fontSize.sm : tokens.typography.fontSize.base,\n fontWeight: tokens.typography.fontWeight.bold, // Bold (700) for timer readability\n fontFamily: tokens.typography.fontFamily.mono,\n color: statusColor,\n ...tabularNumsStyle,\n }}\n >\n {isNegative ? '+' : ''}{formatTimerDuration(diff, timer.showDays)}\n </span>\n </div>\n );\n});\n\n// ============================================================================\n// Main Component\n// ============================================================================\n\n/**\n * MissionClock - Advanced mission time display for space operations\n * \n * Supports real-time clock, simulation time, MET (Mission Elapsed Time),\n * and AOS/LOS timers following Astro UX Design System patterns.\n * \n * @example\n * ```tsx\n * // Basic clock\n * <MissionClock format=\"24h\" timezone=\"UTC\" />\n * \n * // With AOS/LOS timers\n * <MissionClock\n * format=\"24h\"\n * aosTimer={{ label: 'AOS', timestamp: new Date('2024-03-15T10:30:00Z'), direction: 'countdown' }}\n * losTimer={{ label: 'LOS', timestamp: new Date('2024-03-15T10:45:00Z'), direction: 'countdown' }}\n * />\n * \n * // Simulation time\n * <MissionClock\n * timeSource=\"simulation\"\n * simulationConfig={{\n * epoch: new Date('2026-01-01T00:00:00Z'),\n * elapsedSeconds: 3600,\n * timeScale: 1,\n * }}\n * />\n * \n * // Mission Elapsed Time\n * <MissionClock\n * showMET\n * missionStart={new Date('2026-01-01T00:00:00Z')}\n * />\n * \n * // Julian day format\n * <MissionClock showDate dateFormat=\"julian\" />\n * ```\n */\nexport const MissionClock = memo(function MissionClock({\n format = '24h',\n timezone = 'UTC',\n hideSeconds = false,\n small = false,\n showDate = false,\n dateFormat = 'iso',\n className = '',\n onClick,\n aosTimer,\n losTimer,\n customTimers = [],\n timeSource = 'realtime',\n simulationConfig,\n customTime,\n missionStart,\n showMET = false,\n updateInterval = 1000,\n compact = false,\n showMilliseconds = false,\n}: MissionClockProps): React.ReactElement {\n const { tokens, theme } = useTheme();\n const isTransparentTheme = theme === 'transparent' || theme === 'transparent-bold' || theme === 'transparent-minimal';\n \n // State for current time\n const [time, setTime] = useState(() => getCurrentTimeFromSource());\n \n // Normalize timer configs\n const normalizedAOS = useMemo(() => normalizeTimerConfig(aosTimer, 'AOS'), [aosTimer]);\n const normalizedLOS = useMemo(() => normalizeTimerConfig(losTimer, 'LOS'), [losTimer]);\n \n // All timers combined\n const allTimers = useMemo(() => {\n const timers: TimerConfig[] = [];\n if (normalizedAOS) timers.push(normalizedAOS);\n if (normalizedLOS) timers.push(normalizedLOS);\n return [...timers, ...customTimers];\n }, [normalizedAOS, normalizedLOS, customTimers]);\n \n // Get current time based on source\n function getCurrentTimeFromSource(): Date {\n switch (timeSource) {\n case 'simulation':\n if (simulationConfig) {\n if (simulationConfig.getCurrentTime) {\n return simulationConfig.getCurrentTime();\n }\n const epoch = typeof simulationConfig.epoch === 'string' \n ? new Date(simulationConfig.epoch) \n : simulationConfig.epoch;\n const elapsed = (simulationConfig.elapsedSeconds || 0) * 1000;\n return new Date(epoch.getTime() + elapsed);\n }\n return new Date();\n \n case 'custom':\n if (customTime) {\n return typeof customTime === 'function' ? customTime() : customTime;\n }\n return new Date();\n \n case 'realtime':\n default:\n return new Date();\n }\n }\n \n // Format time display\n const formatTimeDisplay = useCallback((date: Date): string => {\n if (showMET && missionStart) {\n const start = typeof missionStart === 'string' ? new Date(missionStart) : missionStart;\n const elapsed = date.getTime() - start.getTime();\n return formatMET(elapsed, showMilliseconds);\n }\n \n if (format === 'met' && missionStart) {\n const start = typeof missionStart === 'string' ? new Date(missionStart) : missionStart;\n const elapsed = date.getTime() - start.getTime();\n return formatMET(elapsed, showMilliseconds);\n }\n \n const hours = date.getUTCHours();\n const mins = date.getUTCMinutes();\n const secs = date.getUTCSeconds();\n const millis = date.getUTCMilliseconds();\n\n let hoursStr: string;\n let suffix = '';\n\n if (format === '12h') {\n const h12 = hours % 12 || 12;\n hoursStr = h12.toString().padStart(2, '0');\n suffix = hours >= 12 ? ' PM' : ' AM';\n } else {\n hoursStr = hours.toString().padStart(2, '0');\n }\n\n const minsStr = mins.toString().padStart(2, '0');\n const secsStr = secs.toString().padStart(2, '0');\n const millisStr = millis.toString().padStart(3, '0');\n\n if (hideSeconds) {\n return `${hoursStr}:${minsStr}${suffix}`;\n }\n \n if (showMilliseconds) {\n return `${hoursStr}:${minsStr}:${secsStr}.${millisStr}${suffix}`;\n }\n \n return `${hoursStr}:${minsStr}:${secsStr}${suffix}`;\n }, [format, hideSeconds, showMET, missionStart, showMilliseconds]);\n\n // Format date display\n const formatDateDisplay = useCallback((date: Date): string => {\n switch (dateFormat) {\n case 'julian': {\n const year = date.getUTCFullYear();\n const doy = getJulianDay(date);\n return `${year}/${doy}`;\n }\n case 'gregorian': {\n const year = date.getUTCFullYear();\n const month = (date.getUTCMonth() + 1).toString().padStart(2, '0');\n const day = date.getUTCDate().toString().padStart(2, '0');\n return `${month}/${day}/${year}`;\n }\n case 'iso':\n default:\n if (format === 'iso') {\n return date.toISOString().split('T')[0];\n }\n const year = date.getUTCFullYear();\n const month = (date.getUTCMonth() + 1).toString().padStart(2, '0');\n const day = date.getUTCDate().toString().padStart(2, '0');\n return `${year}-${month}-${day}`;\n }\n }, [format, dateFormat]);\n\n // Update time at interval\n useEffect(() => {\n // Calculate effective update interval\n const effectiveInterval = showMilliseconds ? Math.min(updateInterval, 100) : (hideSeconds ? 60000 : updateInterval);\n \n const intervalId = setInterval(() => {\n setTime(getCurrentTimeFromSource());\n }, effectiveInterval);\n\n return () => clearInterval(intervalId);\n }, [hideSeconds, updateInterval, showMilliseconds, timeSource, simulationConfig, customTime]);\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (onClick && (e.key === 'Enter' || e.key === ' ')) {\n e.preventDefault();\n onClick();\n }\n };\n \n // Determine display label\n const displayLabel = useMemo(() => {\n if (showMET || format === 'met') {\n return 'MET';\n }\n if (timeSource === 'simulation') {\n return 'SIM';\n }\n return timezone;\n }, [showMET, format, timeSource, timezone]);\n\n return (\n <div\n className={classNames('zendir-mission-clock', className)}\n onClick={onClick}\n onKeyDown={onClick ? handleKeyDown : undefined}\n tabIndex={onClick ? 0 : undefined}\n role=\"timer\"\n aria-label={`Current time: ${formatTimeDisplay(time)} ${displayLabel}`}\n style={{\n display: 'inline-flex',\n flexDirection: compact ? 'row' : 'column',\n alignItems: 'center',\n gap: compact ? 16 : 4,\n padding: small ? `${tokens.spacing.xs} ${tokens.spacing.sm}` : `${tokens.spacing.sm} ${tokens.spacing.md}`,\n backgroundColor: isTransparentTheme ? 'transparent' : tokens.colors.background.surface,\n ...(isTransparentTheme && { backdropFilter: 'blur(12px)', WebkitBackdropFilter: 'blur(12px)' as const }),\n ...(tokens.colors.border.cardStyle ?? { border: `1px solid ${tokens.colors.border.muted}` }),\n borderRadius: tokens.borderRadius.md,\n cursor: onClick ? 'pointer' : 'default',\n outline: 'none',\n transition: tokens.animation.fast,\n ...tabularNumsStyle,\n }}\n >\n {/* Main clock section */}\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n gap: 2,\n }}\n >\n {/* Date (optional) */}\n {showDate && dateFormat !== 'none' && (\n <span\n style={{\n fontSize: tokens.typography.fontSize.xs,\n fontWeight: tokens.typography.fontWeight.normal,\n fontFamily: tokens.typography.fontFamily.mono,\n color: tokens.colors.text.tertiary,\n letterSpacing: tokens.typography.letterSpacing.normal,\n }}\n >\n {formatDateDisplay(time)}\n </span>\n )}\n\n {/* Time - Using bold weight for critical time displays (Apple/Google best practice) */}\n <span\n style={{\n fontSize: small ? tokens.typography.fontSize.base : tokens.typography.fontSize.xl,\n fontWeight: tokens.typography.fontWeight.bold, // Bold (700) for readability - time is critical info\n fontFamily: tokens.typography.fontFamily.mono,\n letterSpacing: tokens.typography.letterSpacing.normal,\n color: tokens.colors.text.primary,\n }}\n >\n {formatTimeDisplay(time)}\n </span>\n\n {/* Label (timezone/MET/SIM) */}\n {displayLabel && (\n <span\n style={{\n fontSize: tokens.typography.fontSize.xs,\n fontWeight: tokens.typography.fontWeight.medium,\n color: timeSource === 'simulation' \n ? tokens.colors.status.caution \n : tokens.colors.text.tertiary,\n textTransform: 'uppercase',\n letterSpacing: tokens.typography.letterSpacing.wide,\n }}\n >\n {displayLabel}\n </span>\n )}\n </div>\n \n {/* AOS/LOS Timers */}\n {allTimers.length > 0 && (\n <div\n style={{\n display: 'flex',\n flexDirection: compact ? 'row' : 'column',\n gap: 8,\n }}\n >\n {allTimers.map((timer, index) => (\n <TimerDisplay\n key={`${timer.label}-${index}`}\n timer={timer}\n currentTime={time}\n tokens={tokens}\n compact={compact}\n />\n ))}\n </div>\n )}\n </div>\n );\n});\n\n// ============================================================================\n// Convenience Components\n// ============================================================================\n\n/**\n * SimpleTimer - Standalone countdown/up timer\n */\nexport interface SimpleTimerProps {\n /** Timer label */\n label: string;\n /** Target/start timestamp */\n timestamp: Date;\n /** Timer direction */\n direction?: 'countdown' | 'countup';\n /** Status color */\n status?: 'normal' | 'caution' | 'critical' | 'standby';\n /** Show days */\n showDays?: boolean;\n /** Custom className */\n className?: string;\n}\n\nexport const SimpleTimer = memo(function SimpleTimer({\n label,\n timestamp,\n direction = 'countdown',\n status,\n showDays = false,\n className = '',\n}: SimpleTimerProps): React.ReactElement {\n const { tokens } = useTheme();\n const [now, setNow] = useState(new Date());\n \n useEffect(() => {\n const interval = setInterval(() => setNow(new Date()), 1000);\n return () => clearInterval(interval);\n }, []);\n \n const timer: TimerConfig = { label, timestamp, direction, status, showDays };\n \n return (\n <div className={classNames('zendir-simple-timer', className)}>\n <TimerDisplay timer={timer} currentTime={now} tokens={tokens} />\n </div>\n );\n});\n\n/**\n * MissionElapsedTime - Dedicated MET display\n */\nexport interface MissionElapsedTimeProps {\n /** Mission launch/start time */\n launchTime: Date | string;\n /** Show milliseconds */\n showMilliseconds?: boolean;\n /** Custom className */\n className?: string;\n /** Small variant */\n small?: boolean;\n}\n\nexport const MissionElapsedTime = memo(function MissionElapsedTime({\n launchTime,\n showMilliseconds = false,\n className = '',\n small = false,\n}: MissionElapsedTimeProps): React.ReactElement {\n return (\n <MissionClock\n format=\"met\"\n missionStart={launchTime}\n showMET\n showMilliseconds={showMilliseconds}\n className={className}\n small={small}\n timezone=\"\"\n />\n );\n});\n\n/**\n * SimulationClock - Clock driven by simulation time\n */\nexport interface SimulationClockProps {\n /** Simulation epoch */\n epoch: Date | string;\n /** Elapsed seconds from epoch */\n elapsedSeconds?: number;\n /** Time scale factor */\n timeScale?: number;\n /** Whether simulation is running */\n isRunning?: boolean;\n /** Show date */\n showDate?: boolean;\n /** Date format */\n dateFormat?: DateFormat;\n /** Custom className */\n className?: string;\n /** Small variant */\n small?: boolean;\n}\n\nexport const SimulationClock = memo(function SimulationClock({\n epoch,\n elapsedSeconds = 0,\n timeScale = 1,\n isRunning = true,\n showDate = true,\n dateFormat = 'julian',\n className = '',\n small = false,\n}: SimulationClockProps): React.ReactElement {\n return (\n <MissionClock\n timeSource=\"simulation\"\n simulationConfig={{\n epoch,\n elapsedSeconds,\n timeScale,\n isRunning,\n }}\n showDate={showDate}\n dateFormat={dateFormat}\n className={className}\n small={small}\n />\n );\n});\n\nexport default MissionClock;\n"],"names":["TimerDisplay","MissionClock","year","month","day","SimpleTimer","MissionElapsedTime","SimulationClock"],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
2
|
import React, { memo, useState } from "react";
|
|
3
|
+
import { useTheme } from "../theme/ThemeProvider.js";
|
|
3
4
|
import { classNames } from "../utils/index.js";
|
|
4
5
|
import { isValidIconName, Icon } from "../core/display/Icon.js";
|
|
5
|
-
import { useTheme } from "../theme/ThemeProvider.js";
|
|
6
6
|
const STATUS_BORDER_COLORS = {
|
|
7
7
|
off: "#3c3e42",
|
|
8
8
|
standby: "#285766",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
2
|
import { memo, useState, useRef, useEffect, useCallback } from "react";
|
|
3
|
-
import { classNames } from "../utils/index.js";
|
|
4
3
|
import { useTheme } from "../theme/ThemeProvider.js";
|
|
4
|
+
import { classNames } from "../utils/index.js";
|
|
5
5
|
const STATUS_ICONS = {
|
|
6
6
|
// Standby - Blue ring with info symbol
|
|
7
7
|
standby: /* @__PURE__ */ jsxs("svg", { viewBox: "0 0 24 24", fill: "currentColor", width: "20", height: "20", children: [
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
2
|
import { memo } from "react";
|
|
3
|
-
import { formatPercentage, classNames } from "../utils/index.js";
|
|
4
3
|
import { useTheme } from "../theme/ThemeProvider.js";
|
|
4
|
+
import { formatPercentage, classNames } from "../utils/index.js";
|
|
5
5
|
function ProgressStatusShape({
|
|
6
6
|
status,
|
|
7
7
|
color,
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { jsx, jsxs, Fragment } from "react/jsx-runtime";
|
|
2
2
|
import { memo, useMemo, useCallback, useState } from "react";
|
|
3
|
+
import { useTheme } from "../theme/ThemeProvider.js";
|
|
3
4
|
import { tabularNumsStyle, safeAccentText, classNames } from "../utils/index.js";
|
|
4
5
|
import { AstroIcon } from "../core/display/AstroIcon.js";
|
|
5
6
|
import { Tooltip } from "../core/overlays/Tooltip.js";
|
|
6
|
-
import { useTheme } from "../theme/ThemeProvider.js";
|
|
7
7
|
const DEFAULT_TIME_SCALE_PRESETS = [0.1, 0.25, 0.5, 1, 2, 5, 10, 60, 3600];
|
|
8
8
|
const DEFAULT_STEP_SIZE_PRESETS = [1, 5, 10, 30, 60, 300, 600, 3600];
|
|
9
9
|
function formatElapsedTime(seconds) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
2
|
import { memo } from "react";
|
|
3
|
-
import { classNames } from "../utils/index.js";
|
|
4
3
|
import { useTheme } from "../theme/ThemeProvider.js";
|
|
4
|
+
import { classNames } from "../utils/index.js";
|
|
5
5
|
const STATUS_COLORS_DARK = {
|
|
6
6
|
off: "#a4abb6",
|
|
7
7
|
standby: "#2dccff",
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { jsxs, jsx, Fragment } from "react/jsx-runtime";
|
|
2
2
|
import { memo, useState, useCallback, useMemo, useRef, useEffect } from "react";
|
|
3
|
+
import { useTheme } from "../theme/ThemeProvider.js";
|
|
3
4
|
import { classNames, safeAccentText } from "../utils/index.js";
|
|
4
5
|
import { useCategoryPalette } from "../context/CategoryContext.js";
|
|
5
6
|
import { Icon } from "../core/display/Icon.js";
|
|
@@ -7,7 +8,6 @@ import { Badge } from "../core/display/Badge.js";
|
|
|
7
8
|
import { Tooltip } from "../core/overlays/Tooltip.js";
|
|
8
9
|
import { Button } from "../core/inputs/Button.js";
|
|
9
10
|
import { useBreakpoint } from "../core/layout/useBreakpoint.js";
|
|
10
|
-
import { useTheme } from "../theme/ThemeProvider.js";
|
|
11
11
|
const Z = {
|
|
12
12
|
/** Base layer for track events / scatter dots */
|
|
13
13
|
trackEvent: 1,
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { StatusIndicator } from "./StatusIndicator.js";
|
|
2
|
+
import { ClassificationBanner } from "./ClassificationBanner.js";
|
|
3
|
+
import { GlobalStatusBar } from "./GlobalStatusBar.js";
|
|
4
|
+
import { MissionClock, MissionElapsedTime, SimpleTimer, SimulationClock } from "./MissionClock.js";
|
|
5
|
+
import { MiniSimulationControls, SimulationControls, SimulationControlsWithClock } from "./SimulationControls.js";
|
|
6
|
+
import { MonitoringIcon } from "./MonitoringIcon.js";
|
|
7
|
+
import { Progress } from "./Progress.js";
|
|
8
|
+
import { Notification } from "./Notification.js";
|
|
9
|
+
import { TIMELINE_FILTER_TEAM_LEGACY, TIMELINE_FILTER_TEAM_NONE, UnifiedTimeline, getTimelineEventDisplayStatus, getTimelineTeamAccent, getTimelineTeamDisplayLabel, getTimelineTeamFilterKey, isTimelineFilterActive, matchesTimelineFilter } from "./UnifiedTimeline.js";
|
|
10
|
+
export {
|
|
11
|
+
ClassificationBanner,
|
|
12
|
+
GlobalStatusBar,
|
|
13
|
+
MiniSimulationControls,
|
|
14
|
+
MissionClock,
|
|
15
|
+
MissionElapsedTime,
|
|
16
|
+
MonitoringIcon,
|
|
17
|
+
Notification,
|
|
18
|
+
Progress,
|
|
19
|
+
SimpleTimer,
|
|
20
|
+
SimulationClock,
|
|
21
|
+
SimulationControls,
|
|
22
|
+
SimulationControlsWithClock,
|
|
23
|
+
StatusIndicator,
|
|
24
|
+
TIMELINE_FILTER_TEAM_LEGACY,
|
|
25
|
+
TIMELINE_FILTER_TEAM_NONE,
|
|
26
|
+
UnifiedTimeline as Timeline,
|
|
27
|
+
getTimelineEventDisplayStatus,
|
|
28
|
+
getTimelineTeamAccent,
|
|
29
|
+
getTimelineTeamDisplayLabel,
|
|
30
|
+
getTimelineTeamFilterKey,
|
|
31
|
+
isTimelineFilterActive,
|
|
32
|
+
matchesTimelineFilter
|
|
33
|
+
};
|
|
34
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;"}
|