import { useState, useRef, useEffect } from 'react' export function TimelineBar({ simulationResults, currentTime, onTimeChange, isPlaying, onPlayPause, playbackSpeed, onPlaybackSpeedChange, }) { const [showEventForm, setShowEventForm] = useState(false) const [newEventTime, setNewEventTime] = useState('') const [newEventLabel, setNewEventLabel] = useState('') const [newEventType, setNewEventType] = useState('marker') const timelineRef = useRef(null) if (!simulationResults) { return (

Run simulation to see timeline

) } const { states, events, summary } = simulationResults const maxTime = summary.t_max // Handle timeline scrub const handleTimelineClick = (e) => { if (!timelineRef.current) return const rect = timelineRef.current.getBoundingClientRect() const percent = (e.clientX - rect.left) / rect.width const t = Math.max(0, Math.min(maxTime, percent * maxTime)) onTimeChange(t) } // Event colors const eventColors = { engine: '#ef4444', guidance: '#f59e0b', marker: '#8b5cf6', jettison: '#06b6d4', } return (
{/* Playback controls */}
Speed:
t = {currentTime.toFixed(2)} s / {maxTime.toFixed(1)} s
{/* Timeline */}
{/* Event markers */} {events.map(event => { const percent = (event.t / maxTime) * 100 return (
{/* Label above */}
{event.label}
) })} {/* Playhead */}
{/* Event list below */}
{events.slice(0, 5).map(event => (
{event.t.toFixed(1)}s {event.label}
))} {events.length > 5 && (
+{events.length - 5} more events
)}
) }