diff --git a/.changeset/smooth-tips-sell.md b/.changeset/smooth-tips-sell.md new file mode 100644 index 000000000..125ca9d7f --- /dev/null +++ b/.changeset/smooth-tips-sell.md @@ -0,0 +1,6 @@ +--- +'@dnd-kit/core': patch +'@dnd-kit/utilities': patch +--- + +Fix scroll calculations for draggable elements in a different frame context than the execution context diff --git a/packages/core/src/utilities/scroll/getScrollableElement.ts b/packages/core/src/utilities/scroll/getScrollableElement.ts index cecef91f7..d583e31ce 100644 --- a/packages/core/src/utilities/scroll/getScrollableElement.ts +++ b/packages/core/src/utilities/scroll/getScrollableElement.ts @@ -20,11 +20,12 @@ export function getScrollableElement(element: EventTarget | null) { return null; } - if ( - isDocument(element) || - element === getOwnerDocument(element).scrollingElement - ) { - return window; + if (isDocument(element)) { + return element.defaultView ?? window; + } + + if (element === getOwnerDocument(element).scrollingElement) { + return getOwnerDocument(element)?.defaultView ?? window; } if (isHTMLElement(element)) { diff --git a/packages/utilities/src/execution-context/getWindow.ts b/packages/utilities/src/execution-context/getWindow.ts index c060a65fc..922ffe729 100644 --- a/packages/utilities/src/execution-context/getWindow.ts +++ b/packages/utilities/src/execution-context/getWindow.ts @@ -14,5 +14,9 @@ export function getWindow(target: Event['target']): typeof window { return window; } - return target.ownerDocument?.defaultView ?? window; + let ownerDoc = target.ownerDocument; + if (!ownerDoc) { + ownerDoc = 'documentElement' in target ? target : null; + } + return ownerDoc?.defaultView ?? window; }