Prevent mobile trim release rollback

This commit is contained in:
haixin.yang
2026-07-22 13:46:44 +08:00
parent e5a6d0d5df
commit 25cd44ecb3
2 changed files with 25 additions and 1 deletions
+2 -1
View File
@@ -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?.();
+23
View File
@@ -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 = {