Jump the playhead to a bar. Out-of-range values clamp to the session.
A seek lands on a complete bar even under intra-bar replay: scrubbing to a half-formed candle is not a position anyone asks for, and it would make the same slider position mean different things on the way past.
Constructing the controller enters replay: it snapshots the chart's data and viewport and immediately shows
startIndex. That is the gesture a replay button makes, and it means the snapshot is taken before anything has moved, sostop()can put the user back exactly where they were.