From 05e84dd5db78fce145a70623875a5639d5d409a0 Mon Sep 17 00:00:00 2001 From: thejeff77 Date: Thu, 27 Aug 2026 05:47:09 -0600 Subject: [PATCH] fix(web): restore timeline scroll when the asset id cannot be resolved (#30916) Co-authored-by: Daniel Dietzler Co-authored-by: Daniel Dietzler <36593685+danieldietzler@users.noreply.github.com> --- web/src/lib/components/timeline/Timeline.svelte | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/web/src/lib/components/timeline/Timeline.svelte b/web/src/lib/components/timeline/Timeline.svelte index 1fe6c7b09..a98e2beb8 100644 --- a/web/src/lib/components/timeline/Timeline.svelte +++ b/web/src/lib/components/timeline/Timeline.svelte @@ -210,13 +210,13 @@ } const scrollTarget = assetViewerManager.gridScrollTarget?.at; const scrolled = scrollTarget ? await scrollAndLoadAsset(scrollTarget) : false; - if (!scrolled) { - // if the asset is not found, scroll to the top - timelineManager.scrollTo(0); - } else if (scrollTarget) { + if (scrolled && scrollTarget) { await tick(); focusAsset(scrollTarget); + } else { + timelineManager.scrollTo(lastVisibleScrollTop); } + invisible = false; }; @@ -224,6 +224,9 @@ let initialLoadWasAssetViewer: boolean | null = null; // only modified in beforeNavigate() let hasNavigatedToOrFromAssetViewer: boolean = false; + // The layout sets `display: none` on this subtree while the viewer is open. + // Browsers drop the scroll offset of a hidden element. + let lastVisibleScrollTop = 0; // beforeNavigate is only called AFTER a svelte route has already been loaded // and a new route is being navigated to. It will never be called on direct @@ -309,6 +312,9 @@ if (!scrollableElement) { return; } + if (!assetViewerManager.isViewing) { + lastVisibleScrollTop = scrollableElement.scrollTop; + } if (timelineManager.limitedScroll) { // edge case - scroll limited due to size of content, must adjust - use the overall percent instead