+
+
+ {/* Active Progress Track */}
+
+
+ {dotSteps.map((step, index) => {
+ const isActive = currentStep > 0 && currentStep >= step;
+ const leftPos = `${index * (100 / TIMELINE_PHASES.length)}%`;
+ const label =
+ index === 0 ? 'Start' : `End of ${TIMELINE_PHASES[index - 1]}`;
+
+ return (
+
seekToStep(step)}
+ style={{
+ position: 'absolute',
+ left: leftPos,
+ top: '50%',
+ transform: 'translate(-50%, -50%)',
+ width: '16px',
+ height: '16px',
+ borderRadius: '50%',
+ backgroundColor: isActive ? '#007BFF' : '#e0e0e0',
+ border: '3px solid white',
+ cursor: 'pointer',
+ transition: 'background-color 0.3s ease-in-out',
+ boxShadow: isActive
+ ? '0 0 0 2px rgba(0, 123, 255, 0.2)'
+ : 'none'
+ }}
+ />
+ );
+ })}
+
+
+
+ {TIMELINE_PHASES.map((phase, index) => (
+
+ ))}
+
+
+
+
+ {currentStep > 0 && !isPlaying && (
+
+ )}
+
+