feat: smooth horizontal + vertical scroll on jump/link

follow! gains an optional smooth flag. The jump/link path (goto! with follow?)
now glides both axes; playback-follow stays instant (smooth would fight the
per-frame updates) and scrubbing doesn't scroll at all, so clicking stays snappy.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Your Name 2026-06-30 10:10:55 -04:00
parent 967ca97e84
commit 0c305e42ea

View file

@ -68,10 +68,14 @@
(when (and @video-el source-frame) (when (and @video-el source-frame)
(set! (.-currentTime @video-el) (/ source-frame fps)))) (set! (.-currentTime @video-el) (/ source-frame fps))))
(defn- follow! [fps zoom playhead] (defn- follow!
([fps zoom playhead] (follow! fps zoom playhead false))
([fps zoom playhead smooth?]
(when-let [el @scroll-el] (when-let [el @scroll-el]
(let [x (px playhead fps zoom)] (let [left (max 0 (- (px playhead fps zoom) (/ (.-clientWidth el) 2)))]
(set! (.-scrollLeft el) (max 0 (- x (/ (.-clientWidth el) 2))))))) (if smooth?
(.scrollTo el #js {:left left :behavior "smooth"})
(set! (.-scrollLeft el) left))))))
;; The playhead is a single full-height overlay on `.timeline` (spanning the ;; The playhead is a single full-height overlay on `.timeline` (spanning the
;; pinned annotation lanes AND the scrolling tracks as one line) rather than a ;; pinned annotation lanes AND the scrolling tracks as one line) rather than a
@ -204,7 +208,7 @@
(seek-video! fps (scene/local->source segs local)) (seek-video! fps (scene/local->source segs local))
(when @play (swap! play assoc :idx (seg-at segs local))) ; keep playback in sync (when @play (swap! play assoc :idx (seg-at segs local))) ; keep playback in sync
(when follow? (when follow?
(r/after-render #(do (follow! fps zoom local) (r/after-render #(do (follow! fps zoom local true) ; smooth on jump/link
(scroll-to-seg-track! segs local))))))) (scroll-to-seg-track! segs local)))))))
(defn video-monitor [] (defn video-monitor []