From 25cd44ecb34bc007ee59452aef9eacd71153f4a7 Mon Sep 17 00:00:00 2001 From: "haixin.yang" Date: Wed, 22 Jul 2026 13:46:44 +0800 Subject: [PATCH] Prevent mobile trim release rollback --- src/lib/timelineEdgeAutoScroll.js | 3 ++- src/lib/timelineEdgeAutoScroll.test.js | 23 +++++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/lib/timelineEdgeAutoScroll.js b/src/lib/timelineEdgeAutoScroll.js index 1757eb5..21c829d 100644 --- a/src/lib/timelineEdgeAutoScroll.js +++ b/src/lib/timelineEdgeAutoScroll.js @@ -51,6 +51,7 @@ export function createTimelineEdgeAutoScroller({ trackElement, pointerType, time (pointerType === "touch" && isMobile) || (["mouse", "pen"].includes(pointerType) && !isMobile) ); + const usesDesktopTrailingSpacer = enabled && !isMobile; const rulerElement = enabled ? trackElement.closest?.(".timeline-board")?.querySelector?.(".timeline-ruler-canvas") : null; if (enabled) { trackElement.classList?.add("is-trimming"); @@ -79,7 +80,7 @@ export function createTimelineEdgeAutoScroller({ trackElement, pointerType, time spacerElement.style.width = `${geometry.width}px`; }; - if (enabled && scrollElement?.ownerDocument?.createElement) { + if (usesDesktopTrailingSpacer && scrollElement?.ownerDocument?.createElement) { const previousSpacer = scrollElement.querySelector?.("[data-timeline-trim-scroll-spacer]"); previousSpacer?.__timelineTrimCleanup?.(); previousSpacer?.remove?.(); diff --git a/src/lib/timelineEdgeAutoScroll.test.js b/src/lib/timelineEdgeAutoScroll.test.js index b58e762..08da88a 100644 --- a/src/lib/timelineEdgeAutoScroll.test.js +++ b/src/lib/timelineEdgeAutoScroll.test.js @@ -66,6 +66,29 @@ describe("mobile timeline edge auto-scroll", () => { expect(rulerClasses.has("is-trimming")).toBe(false); }); + it("never creates or settles a desktop trailing spacer on mobile", () => { + let appended = 0; + const scrollElement = { + clientWidth: 400, + scrollLeft: 120, + ownerDocument: { createElement: () => ({}) }, + appendChild: () => { appended += 1; }, + }; + const track = { + classList: { add() {}, remove() {} }, + closest: () => null, + parentElement: scrollElement, + }; + const scroller = createTimelineEdgeAutoScroller({ + trackElement: track, + pointerType: "touch", + win: { matchMedia: () => ({ matches: true }), requestAnimationFrame: () => 1, cancelAnimationFrame() {} }, + }); + scroller.stop(); + expect(appended).toBe(0); + expect(scrollElement.scrollLeft).toBe(120); + }); + it("enables the same edge-scroll lifecycle for desktop mouse trimming", () => { const values = new Set(); const track = {