mirror of https://github.com/ghostfolio/ghostfolio
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1 lines
346 KiB
1 lines
346 KiB
{"version":3,"file":"drag-drop.mjs","sources":["../../../../../darwin_arm64-fastbuild-ST-fdfa778d11ba/bin/src/cdk/drag-drop/dom/clone-node.ts","../../../../../darwin_arm64-fastbuild-ST-fdfa778d11ba/bin/src/cdk/drag-drop/dom/dom-rect.ts","../../../../../darwin_arm64-fastbuild-ST-fdfa778d11ba/bin/src/cdk/drag-drop/dom/parent-position-tracker.ts","../../../../../darwin_arm64-fastbuild-ST-fdfa778d11ba/bin/src/cdk/drag-drop/dom/root-node.ts","../../../../../darwin_arm64-fastbuild-ST-fdfa778d11ba/bin/src/cdk/drag-drop/dom/styling.ts","../../../../../darwin_arm64-fastbuild-ST-fdfa778d11ba/bin/src/cdk/drag-drop/drag-drop-registry.ts","../../../../../darwin_arm64-fastbuild-ST-fdfa778d11ba/bin/src/cdk/drag-drop/dom/transition-duration.ts","../../../../../darwin_arm64-fastbuild-ST-fdfa778d11ba/bin/src/cdk/drag-drop/preview-ref.ts","../../../../../darwin_arm64-fastbuild-ST-fdfa778d11ba/bin/src/cdk/drag-drop/drag-ref.ts","../../../../../darwin_arm64-fastbuild-ST-fdfa778d11ba/bin/src/cdk/drag-drop/drag-utils.ts","../../../../../darwin_arm64-fastbuild-ST-fdfa778d11ba/bin/src/cdk/drag-drop/sorting/single-axis-sort-strategy.ts","../../../../../darwin_arm64-fastbuild-ST-fdfa778d11ba/bin/src/cdk/drag-drop/sorting/mixed-sort-strategy.ts","../../../../../darwin_arm64-fastbuild-ST-fdfa778d11ba/bin/src/cdk/drag-drop/drop-list-ref.ts","../../../../../darwin_arm64-fastbuild-ST-fdfa778d11ba/bin/src/cdk/drag-drop/drag-drop.ts","../../../../../darwin_arm64-fastbuild-ST-fdfa778d11ba/bin/src/cdk/drag-drop/drag-parent.ts","../../../../../darwin_arm64-fastbuild-ST-fdfa778d11ba/bin/src/cdk/drag-drop/directives/assertions.ts","../../../../../darwin_arm64-fastbuild-ST-fdfa778d11ba/bin/src/cdk/drag-drop/directives/drag-handle.ts","../../../../../darwin_arm64-fastbuild-ST-fdfa778d11ba/bin/src/cdk/drag-drop/directives/config.ts","../../../../../darwin_arm64-fastbuild-ST-fdfa778d11ba/bin/src/cdk/drag-drop/directives/drag.ts","../../../../../darwin_arm64-fastbuild-ST-fdfa778d11ba/bin/src/cdk/drag-drop/directives/drop-list-group.ts","../../../../../darwin_arm64-fastbuild-ST-fdfa778d11ba/bin/src/cdk/drag-drop/directives/drop-list.ts","../../../../../darwin_arm64-fastbuild-ST-fdfa778d11ba/bin/src/cdk/drag-drop/directives/drag-preview.ts","../../../../../darwin_arm64-fastbuild-ST-fdfa778d11ba/bin/src/cdk/drag-drop/directives/drag-placeholder.ts","../../../../../darwin_arm64-fastbuild-ST-fdfa778d11ba/bin/src/cdk/drag-drop/drag-drop-module.ts"],"sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n/** Creates a deep clone of an element. */\nexport function deepCloneNode(node: HTMLElement): HTMLElement {\n const clone = node.cloneNode(true) as HTMLElement;\n const descendantsWithId = clone.querySelectorAll('[id]');\n const nodeName = node.nodeName.toLowerCase();\n\n // Remove the `id` to avoid having multiple elements with the same id on the page.\n clone.removeAttribute('id');\n\n for (let i = 0; i < descendantsWithId.length; i++) {\n descendantsWithId[i].removeAttribute('id');\n }\n\n if (nodeName === 'canvas') {\n transferCanvasData(node as HTMLCanvasElement, clone as HTMLCanvasElement);\n } else if (nodeName === 'input' || nodeName === 'select' || nodeName === 'textarea') {\n transferInputData(node as HTMLInputElement, clone as HTMLInputElement);\n }\n\n transferData('canvas', node, clone, transferCanvasData);\n transferData('input, textarea, select', node, clone, transferInputData);\n return clone;\n}\n\n/** Matches elements between an element and its clone and allows for their data to be cloned. */\nfunction transferData<T extends Element>(\n selector: string,\n node: HTMLElement,\n clone: HTMLElement,\n callback: (source: T, clone: T) => void,\n) {\n const descendantElements = node.querySelectorAll<T>(selector);\n\n if (descendantElements.length) {\n const cloneElements = clone.querySelectorAll<T>(selector);\n\n for (let i = 0; i < descendantElements.length; i++) {\n callback(descendantElements[i], cloneElements[i]);\n }\n }\n}\n\n// Counter for unique cloned radio button names.\nlet cloneUniqueId = 0;\n\n/** Transfers the data of one input element to another. */\nfunction transferInputData(\n source: Element & {value: string},\n clone: Element & {value: string; name: string; type: string},\n) {\n // Browsers throw an error when assigning the value of a file input programmatically.\n if (clone.type !== 'file') {\n clone.value = source.value;\n }\n\n // Radio button `name` attributes must be unique for radio button groups\n // otherwise original radio buttons can lose their checked state\n // once the clone is inserted in the DOM.\n if (clone.type === 'radio' && clone.name) {\n clone.name = `mat-clone-${clone.name}-${cloneUniqueId++}`;\n }\n}\n\n/** Transfers the data of one canvas element to another. */\nfunction transferCanvasData(source: HTMLCanvasElement, clone: HTMLCanvasElement) {\n const context = clone.getContext('2d');\n\n if (context) {\n // In some cases `drawImage` can throw (e.g. if the canvas size is 0x0).\n // We can't do much about it so just ignore the error.\n try {\n context.drawImage(source, 0, 0);\n } catch {}\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n/** Gets a mutable version of an element's bounding `DOMRect`. */\nexport function getMutableClientRect(element: Element): DOMRect {\n const rect = element.getBoundingClientRect();\n\n // We need to clone the `clientRect` here, because all the values on it are readonly\n // and we need to be able to update them. Also we can't use a spread here, because\n // the values on a `DOMRect` aren't own properties. See:\n // https://developer.mozilla.org/en-US/docs/Web/API/Element/getBoundingClientRect#Notes\n return {\n top: rect.top,\n right: rect.right,\n bottom: rect.bottom,\n left: rect.left,\n width: rect.width,\n height: rect.height,\n x: rect.x,\n y: rect.y,\n } as DOMRect;\n}\n\n/**\n * Checks whether some coordinates are within a `DOMRect`.\n * @param clientRect DOMRect that is being checked.\n * @param x Coordinates along the X axis.\n * @param y Coordinates along the Y axis.\n */\nexport function isInsideClientRect(clientRect: DOMRect, x: number, y: number) {\n const {top, bottom, left, right} = clientRect;\n return y >= top && y <= bottom && x >= left && x <= right;\n}\n\n/**\n * Checks if the child element is overflowing from its parent.\n * @param parentRect - The bounding rect of the parent element.\n * @param childRect - The bounding rect of the child element.\n */\nexport function isOverflowingParent(parentRect: DOMRect, childRect: DOMRect): boolean {\n // check for horizontal overflow (left and right)\n const isLeftOverflowing = childRect.left < parentRect.left;\n const isRightOverflowing = childRect.left + childRect.width > parentRect.right;\n\n // check for vertical overflow (top and bottom)\n const isTopOverflowing = childRect.top < parentRect.top;\n const isBottomOverflowing = childRect.top + childRect.height > parentRect.bottom;\n\n return isLeftOverflowing || isRightOverflowing || isTopOverflowing || isBottomOverflowing;\n}\n\n/**\n * Updates the top/left positions of a `DOMRect`, as well as their bottom/right counterparts.\n * @param domRect `DOMRect` that should be updated.\n * @param top Amount to add to the `top` position.\n * @param left Amount to add to the `left` position.\n */\nexport function adjustDomRect(\n domRect: {\n top: number;\n bottom: number;\n left: number;\n right: number;\n width: number;\n height: number;\n },\n top: number,\n left: number,\n) {\n domRect.top += top;\n domRect.bottom = domRect.top + domRect.height;\n\n domRect.left += left;\n domRect.right = domRect.left + domRect.width;\n}\n\n/**\n * Checks whether the pointer coordinates are close to a DOMRect.\n * @param rect DOMRect to check against.\n * @param threshold Threshold around the DOMRect.\n * @param pointerX Coordinates along the X axis.\n * @param pointerY Coordinates along the Y axis.\n */\nexport function isPointerNearDomRect(\n rect: DOMRect,\n threshold: number,\n pointerX: number,\n pointerY: number,\n): boolean {\n const {top, right, bottom, left, width, height} = rect;\n const xThreshold = width * threshold;\n const yThreshold = height * threshold;\n\n return (\n pointerY > top - yThreshold &&\n pointerY < bottom + yThreshold &&\n pointerX > left - xThreshold &&\n pointerX < right + xThreshold\n );\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {_getEventTarget} from '../../platform';\nimport {getMutableClientRect, adjustDomRect} from './dom-rect';\n\n/** Object holding the scroll position of something. */\ninterface ScrollPosition {\n top: number;\n left: number;\n}\n\n/** Keeps track of the scroll position and dimensions of the parents of an element. */\nexport class ParentPositionTracker {\n /** Cached positions of the scrollable parent elements. */\n readonly positions = new Map<\n Document | HTMLElement,\n {\n scrollPosition: ScrollPosition;\n clientRect?: DOMRect;\n }\n >();\n\n constructor(private _document: Document) {}\n\n /** Clears the cached positions. */\n clear() {\n this.positions.clear();\n }\n\n /** Caches the positions. Should be called at the beginning of a drag sequence. */\n cache(elements: readonly HTMLElement[]) {\n this.clear();\n this.positions.set(this._document, {\n scrollPosition: this.getViewportScrollPosition(),\n });\n\n elements.forEach(element => {\n this.positions.set(element, {\n scrollPosition: {top: element.scrollTop, left: element.scrollLeft},\n clientRect: getMutableClientRect(element),\n });\n });\n }\n\n /** Handles scrolling while a drag is taking place. */\n handleScroll(event: Event): ScrollPosition | null {\n const target = _getEventTarget<HTMLElement | Document>(event)!;\n const cachedPosition = this.positions.get(target);\n\n if (!cachedPosition) {\n return null;\n }\n\n const scrollPosition = cachedPosition.scrollPosition;\n let newTop: number;\n let newLeft: number;\n\n if (target === this._document) {\n const viewportScrollPosition = this.getViewportScrollPosition();\n newTop = viewportScrollPosition.top;\n newLeft = viewportScrollPosition.left;\n } else {\n newTop = (target as HTMLElement).scrollTop;\n newLeft = (target as HTMLElement).scrollLeft;\n }\n\n const topDifference = scrollPosition.top - newTop;\n const leftDifference = scrollPosition.left - newLeft;\n\n // Go through and update the cached positions of the scroll\n // parents that are inside the element that was scrolled.\n this.positions.forEach((position, node) => {\n if (position.clientRect && target !== node && target.contains(node)) {\n adjustDomRect(position.clientRect, topDifference, leftDifference);\n }\n });\n\n scrollPosition.top = newTop;\n scrollPosition.left = newLeft;\n\n return {top: topDifference, left: leftDifference};\n }\n\n /**\n * Gets the scroll position of the viewport. Note that we use the scrollX and scrollY directly,\n * instead of going through the `ViewportRuler`, because the first value the ruler looks at is\n * the top/left offset of the `document.documentElement` which works for most cases, but breaks\n * if the element is offset by something like the `BlockScrollStrategy`.\n */\n getViewportScrollPosition() {\n return {top: window.scrollY, left: window.scrollX};\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {EmbeddedViewRef} from '@angular/core';\n\n/**\n * Gets the root HTML element of an embedded view.\n * If the root is not an HTML element it gets wrapped in one.\n */\nexport function getRootNode(viewRef: EmbeddedViewRef<any>, _document: Document): HTMLElement {\n const rootNodes: Node[] = viewRef.rootNodes;\n\n if (rootNodes.length === 1 && rootNodes[0].nodeType === _document.ELEMENT_NODE) {\n return rootNodes[0] as HTMLElement;\n }\n\n const wrapper = _document.createElement('div');\n rootNodes.forEach(node => wrapper.appendChild(node));\n return wrapper;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n/**\n * Extended CSSStyleDeclaration that includes a couple of drag-related\n * properties that aren't in the built-in TS typings.\n */\nexport interface DragCSSStyleDeclaration extends CSSStyleDeclaration {\n msScrollSnapType: string;\n scrollSnapType: string;\n webkitTapHighlightColor: string;\n}\n\n/**\n * Shallow-extends a stylesheet object with another stylesheet-like object.\n * Note that the keys in `source` have to be dash-cased.\n * @docs-private\n */\nexport function extendStyles(\n dest: CSSStyleDeclaration,\n source: Record<string, string>,\n importantProperties?: Set<string>,\n) {\n for (let key in source) {\n if (source.hasOwnProperty(key)) {\n const value = source[key];\n\n if (value) {\n dest.setProperty(key, value, importantProperties?.has(key) ? 'important' : '');\n } else {\n dest.removeProperty(key);\n }\n }\n }\n\n return dest;\n}\n\n/**\n * Toggles whether the native drag interactions should be enabled for an element.\n * @param element Element on which to toggle the drag interactions.\n * @param enable Whether the drag interactions should be enabled.\n * @docs-private\n */\nexport function toggleNativeDragInteractions(element: HTMLElement, enable: boolean) {\n const userSelect = enable ? '' : 'none';\n\n extendStyles(element.style, {\n 'touch-action': enable ? '' : 'none',\n '-webkit-user-drag': enable ? '' : 'none',\n '-webkit-tap-highlight-color': enable ? '' : 'transparent',\n 'user-select': userSelect,\n '-ms-user-select': userSelect,\n '-webkit-user-select': userSelect,\n '-moz-user-select': userSelect,\n });\n}\n\n/**\n * Toggles whether an element is visible while preserving its dimensions.\n * @param element Element whose visibility to toggle\n * @param enable Whether the element should be visible.\n * @param importantProperties Properties to be set as `!important`.\n * @docs-private\n */\nexport function toggleVisibility(\n element: HTMLElement,\n enable: boolean,\n importantProperties?: Set<string>,\n) {\n extendStyles(\n element.style,\n {\n position: enable ? '' : 'fixed',\n top: enable ? '' : '0',\n opacity: enable ? '' : '0',\n left: enable ? '' : '-999em',\n },\n importantProperties,\n );\n}\n\n/**\n * Combines a transform string with an optional other transform\n * that exited before the base transform was applied.\n */\nexport function combineTransforms(transform: string, initialTransform?: string): string {\n return initialTransform && initialTransform != 'none'\n ? transform + ' ' + initialTransform\n : transform;\n}\n\n/**\n * Matches the target element's size to the source's size.\n * @param target Element that needs to be resized.\n * @param sourceRect Dimensions of the source element.\n */\nexport function matchElementSize(target: HTMLElement, sourceRect: DOMRect): void {\n target.style.width = `${sourceRect.width}px`;\n target.style.height = `${sourceRect.height}px`;\n target.style.transform = getTransform(sourceRect.left, sourceRect.top);\n}\n\n/**\n * Gets a 3d `transform` that can be applied to an element.\n * @param x Desired position of the element along the X axis.\n * @param y Desired position of the element along the Y axis.\n */\nexport function getTransform(x: number, y: number): string {\n // Round the transforms since some browsers will\n // blur the elements for sub-pixel transforms.\n return `translate3d(${Math.round(x)}px, ${Math.round(y)}px, 0)`;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n ChangeDetectionStrategy,\n Component,\n Injectable,\n ListenerOptions,\n NgZone,\n OnDestroy,\n RendererFactory2,\n ViewEncapsulation,\n WritableSignal,\n inject,\n signal,\n DOCUMENT,\n} from '@angular/core';\n\nimport {_CdkPrivateStyleLoader} from '../private';\nimport {Observable, Observer, Subject, merge} from 'rxjs';\nimport type {DropListRef} from './drop-list-ref';\nimport type {DragRef} from './drag-ref';\nimport type {CdkDrag} from './directives/drag';\n\n/** Event options that can be used to bind a capturing event. */\nconst capturingEventOptions = {\n capture: true,\n};\n\n/** Event options that can be used to bind an active, capturing event. */\nconst activeCapturingEventOptions = {\n passive: false,\n capture: true,\n};\n\n/**\n * Component used to load the drag&drop reset styles.\n * @docs-private\n */\n@Component({\n styleUrl: 'resets.css',\n encapsulation: ViewEncapsulation.None,\n template: '',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {'cdk-drag-resets-container': ''},\n})\nexport class _ResetsLoader {}\n\n/**\n * Service that keeps track of all the drag item and drop container\n * instances, and manages global event listeners on the `document`.\n * @docs-private\n */\n@Injectable({providedIn: 'root'})\nexport class DragDropRegistry implements OnDestroy {\n private _ngZone = inject(NgZone);\n private _document = inject(DOCUMENT);\n private _styleLoader = inject(_CdkPrivateStyleLoader);\n private _renderer = inject(RendererFactory2).createRenderer(null, null);\n private _cleanupDocumentTouchmove: (() => void) | undefined;\n private _scroll: Subject<Event> = new Subject<Event>();\n\n /** Registered drop container instances. */\n private _dropInstances = new Set<DropListRef>();\n\n /** Registered drag item instances. */\n private _dragInstances = new Set<DragRef>();\n\n /** Drag item instances that are currently being dragged. */\n private _activeDragInstances: WritableSignal<DragRef[]> = signal([]);\n\n /** Keeps track of the event listeners that we've bound to the `document`. */\n private _globalListeners: (() => void)[] | undefined;\n\n /**\n * Predicate function to check if an item is being dragged. Moved out into a property,\n * because it'll be called a lot and we don't want to create a new function every time.\n */\n private _draggingPredicate = (item: DragRef) => item.isDragging();\n\n /**\n * Map tracking DOM nodes and their corresponding drag directives. Note that this is different\n * from looking through the `_dragInstances` and getting their root node, because the root node\n * isn't necessarily the node that the directive is set on.\n */\n private _domNodesToDirectives: WeakMap<Node, CdkDrag> | null = null;\n\n /**\n * Emits the `touchmove` or `mousemove` events that are dispatched\n * while the user is dragging a drag item instance.\n */\n readonly pointerMove: Subject<TouchEvent | MouseEvent> = new Subject<TouchEvent | MouseEvent>();\n\n /**\n * Emits the `touchend` or `mouseup` events that are dispatched\n * while the user is dragging a drag item instance.\n */\n readonly pointerUp: Subject<TouchEvent | MouseEvent> = new Subject<TouchEvent | MouseEvent>();\n\n constructor(...args: unknown[]);\n constructor() {}\n\n /** Adds a drop container to the registry. */\n registerDropContainer(drop: DropListRef) {\n if (!this._dropInstances.has(drop)) {\n this._dropInstances.add(drop);\n }\n }\n\n /** Adds a drag item instance to the registry. */\n registerDragItem(drag: DragRef) {\n this._dragInstances.add(drag);\n\n // The `touchmove` event gets bound once, ahead of time, because WebKit\n // won't preventDefault on a dynamically-added `touchmove` listener.\n // See https://bugs.webkit.org/show_bug.cgi?id=184250.\n if (this._dragInstances.size === 1) {\n this._ngZone.runOutsideAngular(() => {\n // The event handler has to be explicitly active,\n // because newer browsers make it passive by default.\n this._cleanupDocumentTouchmove?.();\n this._cleanupDocumentTouchmove = this._renderer.listen(\n this._document,\n 'touchmove',\n this._persistentTouchmoveListener,\n activeCapturingEventOptions,\n );\n });\n }\n }\n\n /** Removes a drop container from the registry. */\n removeDropContainer(drop: DropListRef) {\n this._dropInstances.delete(drop);\n }\n\n /** Removes a drag item instance from the registry. */\n removeDragItem(drag: DragRef) {\n this._dragInstances.delete(drag);\n this.stopDragging(drag);\n\n if (this._dragInstances.size === 0) {\n this._cleanupDocumentTouchmove?.();\n }\n }\n\n /**\n * Starts the dragging sequence for a drag instance.\n * @param drag Drag instance which is being dragged.\n * @param event Event that initiated the dragging.\n */\n startDragging(drag: DragRef, event: TouchEvent | MouseEvent) {\n // Do not process the same drag twice to avoid memory leaks and redundant listeners\n if (this._activeDragInstances().indexOf(drag) > -1) {\n return;\n }\n\n this._styleLoader.load(_ResetsLoader);\n this._activeDragInstances.update(instances => [...instances, drag]);\n\n if (this._activeDragInstances().length === 1) {\n // We explicitly bind __active__ listeners here, because newer browsers will default to\n // passive ones for `mousemove` and `touchmove`. The events need to be active, because we\n // use `preventDefault` to prevent the page from scrolling while the user is dragging.\n const isTouchEvent = event.type.startsWith('touch');\n const endEventHandler = (e: Event) => this.pointerUp.next(e as TouchEvent | MouseEvent);\n\n const toBind: [name: string, handler: (event: Event) => void, options: ListenerOptions][] = [\n // Use capturing so that we pick up scroll changes in any scrollable nodes that aren't\n // the document. See https://github.com/angular/components/issues/17144.\n ['scroll', (e: Event) => this._scroll.next(e), capturingEventOptions],\n\n // Preventing the default action on `mousemove` isn't enough to disable text selection\n // on Safari so we need to prevent the selection event as well. Alternatively this can\n // be done by setting `user-select: none` on the `body`, however it has causes a style\n // recalculation which can be expensive on pages with a lot of elements.\n ['selectstart', this._preventDefaultWhileDragging, activeCapturingEventOptions],\n ];\n\n if (isTouchEvent) {\n toBind.push(\n ['touchend', endEventHandler, capturingEventOptions],\n ['touchcancel', endEventHandler, capturingEventOptions],\n );\n } else {\n toBind.push(['mouseup', endEventHandler, capturingEventOptions]);\n }\n\n // We don't have to bind a move event for touch drag sequences, because\n // we already have a persistent global one bound from `registerDragItem`.\n if (!isTouchEvent) {\n toBind.push([\n 'mousemove',\n (e: Event) => this.pointerMove.next(e as MouseEvent),\n activeCapturingEventOptions,\n ]);\n }\n\n this._ngZone.runOutsideAngular(() => {\n this._globalListeners = toBind.map(([name, handler, options]) =>\n this._renderer.listen(this._document, name, handler, options),\n );\n });\n }\n }\n\n /** Stops dragging a drag item instance. */\n stopDragging(drag: DragRef) {\n this._activeDragInstances.update(instances => {\n const index = instances.indexOf(drag);\n if (index > -1) {\n instances.splice(index, 1);\n return [...instances];\n }\n return instances;\n });\n\n if (this._activeDragInstances().length === 0) {\n this._clearGlobalListeners();\n }\n }\n\n /** Gets whether a drag item instance is currently being dragged. */\n isDragging(drag: DragRef) {\n return this._activeDragInstances().indexOf(drag) > -1;\n }\n\n /**\n * Gets a stream that will emit when any element on the page is scrolled while an item is being\n * dragged.\n * @param shadowRoot Optional shadow root that the current dragging sequence started from.\n * Top-level listeners won't pick up events coming from the shadow DOM so this parameter can\n * be used to include an additional top-level listener at the shadow root level.\n */\n scrolled(shadowRoot?: DocumentOrShadowRoot | null): Observable<Event> {\n const streams: Observable<Event>[] = [this._scroll];\n\n if (shadowRoot && shadowRoot !== this._document) {\n // Note that this is basically the same as `fromEvent` from rxjs, but we do it ourselves,\n // because we want to guarantee that the event is bound outside of the `NgZone`. With\n // `fromEvent` it'll only happen if the subscription is outside the `NgZone`.\n streams.push(\n new Observable((observer: Observer<Event>) => {\n return this._ngZone.runOutsideAngular(() => {\n const cleanup = this._renderer.listen(\n shadowRoot as ShadowRoot,\n 'scroll',\n (event: Event) => {\n if (this._activeDragInstances().length) {\n observer.next(event);\n }\n },\n capturingEventOptions,\n );\n\n return () => {\n cleanup();\n };\n });\n }),\n );\n }\n\n return merge(...streams);\n }\n\n /**\n * Tracks the DOM node which has a draggable directive.\n * @param node Node to track.\n * @param dragRef Drag directive set on the node.\n */\n registerDirectiveNode(node: Node, dragRef: CdkDrag): void {\n this._domNodesToDirectives ??= new WeakMap();\n this._domNodesToDirectives.set(node, dragRef);\n }\n\n /**\n * Stops tracking a draggable directive node.\n * @param node Node to stop tracking.\n */\n removeDirectiveNode(node: Node): void {\n this._domNodesToDirectives?.delete(node);\n }\n\n /**\n * Gets the drag directive corresponding to a specific DOM node, if any.\n * @param node Node for which to do the lookup.\n */\n getDragDirectiveForNode(node: Node): CdkDrag | null {\n return this._domNodesToDirectives?.get(node) || null;\n }\n\n ngOnDestroy() {\n this._dragInstances.forEach(instance => this.removeDragItem(instance));\n this._dropInstances.forEach(instance => this.removeDropContainer(instance));\n this._domNodesToDirectives = null;\n this._clearGlobalListeners();\n this.pointerMove.complete();\n this.pointerUp.complete();\n }\n\n /**\n * Event listener that will prevent the default browser action while the user is dragging.\n * @param event Event whose default action should be prevented.\n */\n private _preventDefaultWhileDragging = (event: Event) => {\n if (this._activeDragInstances().length > 0) {\n event.preventDefault();\n }\n };\n\n /** Event listener for `touchmove` that is bound even if no dragging is happening. */\n private _persistentTouchmoveListener = (event: TouchEvent) => {\n if (this._activeDragInstances().length > 0) {\n // Note that we only want to prevent the default action after dragging has actually started.\n // Usually this is the same time at which the item is added to the `_activeDragInstances`,\n // but it could be pushed back if the user has set up a drag delay or threshold.\n if (this._activeDragInstances().some(this._draggingPredicate)) {\n event.preventDefault();\n }\n\n this.pointerMove.next(event);\n }\n };\n\n /** Clears out the global event listeners from the `document`. */\n private _clearGlobalListeners() {\n this._globalListeners?.forEach(cleanup => cleanup());\n this._globalListeners = undefined;\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n/** Parses a CSS time value to milliseconds. */\nfunction parseCssTimeUnitsToMs(value: string): number {\n // Some browsers will return it in seconds, whereas others will return milliseconds.\n const multiplier = value.toLowerCase().indexOf('ms') > -1 ? 1 : 1000;\n return parseFloat(value) * multiplier;\n}\n\n/** Gets the transform transition duration, including the delay, of an element in milliseconds. */\nexport function getTransformTransitionDurationInMs(element: HTMLElement): number {\n const computedStyle = getComputedStyle(element);\n const transitionedProperties = parseCssPropertyValue(computedStyle, 'transition-property');\n const property = transitionedProperties.find(prop => prop === 'transform' || prop === 'all');\n\n // If there's no transition for `all` or `transform`, we shouldn't do anything.\n if (!property) {\n return 0;\n }\n\n // Get the index of the property that we're interested in and match\n // it up to the same index in `transition-delay` and `transition-duration`.\n const propertyIndex = transitionedProperties.indexOf(property);\n const rawDurations = parseCssPropertyValue(computedStyle, 'transition-duration');\n const rawDelays = parseCssPropertyValue(computedStyle, 'transition-delay');\n\n return (\n parseCssTimeUnitsToMs(rawDurations[propertyIndex]) +\n parseCssTimeUnitsToMs(rawDelays[propertyIndex])\n );\n}\n\n/** Parses out multiple values from a computed style into an array. */\nfunction parseCssPropertyValue(computedStyle: CSSStyleDeclaration, name: string): string[] {\n const value = computedStyle.getPropertyValue(name);\n return value.split(',').map(part => part.trim());\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {EmbeddedViewRef, Renderer2, TemplateRef, ViewContainerRef} from '@angular/core';\nimport {Direction} from '../bidi';\nimport {\n extendStyles,\n getTransform,\n matchElementSize,\n toggleNativeDragInteractions,\n} from './dom/styling';\nimport {deepCloneNode} from './dom/clone-node';\nimport {getRootNode} from './dom/root-node';\nimport {getTransformTransitionDurationInMs} from './dom/transition-duration';\n\n/** Template that can be used to create a drag preview element. */\nexport interface DragPreviewTemplate<T = any> {\n matchSize?: boolean;\n template: TemplateRef<T> | null;\n viewContainer: ViewContainerRef;\n context: T;\n}\n\n/** Inline styles to be set as `!important` while dragging. */\nconst importantProperties = new Set([\n // Needs to be important, because some `mat-table` sets `position: sticky !important`. See #22781.\n 'position',\n]);\n\nexport class PreviewRef {\n /** Reference to the view of the preview element. */\n private _previewEmbeddedView: EmbeddedViewRef<any> | null = null;\n\n /** Reference to the preview element. */\n private _preview!: HTMLElement;\n\n get element(): HTMLElement {\n return this._preview;\n }\n\n constructor(\n private _document: Document,\n private _rootElement: HTMLElement,\n private _direction: Direction,\n private _initialDomRect: DOMRect,\n private _previewTemplate: DragPreviewTemplate | null,\n private _previewClass: string | string[] | null,\n private _pickupPositionOnPage: {\n x: number;\n y: number;\n },\n private _initialTransform: string | null,\n private _zIndex: number,\n private _renderer: Renderer2,\n ) {}\n\n attach(parent: HTMLElement): void {\n this._preview = this._createPreview();\n parent.appendChild(this._preview);\n\n // The null check is necessary for browsers that don't support the popover API.\n // Note that we use a string access for compatibility with Closure.\n if (supportsPopover(this._preview)) {\n this._preview['showPopover']();\n }\n }\n\n destroy(): void {\n this._preview.remove();\n this._previewEmbeddedView?.destroy();\n this._preview = this._previewEmbeddedView = null!;\n }\n\n setTransform(value: string): void {\n this._preview.style.transform = value;\n }\n\n getBoundingClientRect(): DOMRect {\n return this._preview.getBoundingClientRect();\n }\n\n addClass(className: string): void {\n this._preview.classList.add(className);\n }\n\n getTransitionDuration(): number {\n return getTransformTransitionDurationInMs(this._preview);\n }\n\n addEventListener(name: string, handler: (event: any) => void): () => void {\n return this._renderer.listen(this._preview, name, handler);\n }\n\n private _createPreview(): HTMLElement {\n const previewConfig = this._previewTemplate;\n const previewClass = this._previewClass;\n const previewTemplate = previewConfig ? previewConfig.template : null;\n let preview: HTMLElement;\n\n if (previewTemplate && previewConfig) {\n // Measure the element before we've inserted the preview\n // since the insertion could throw off the measurement.\n const rootRect = previewConfig.matchSize ? this._initialDomRect : null;\n const viewRef = previewConfig.viewContainer.createEmbeddedView(\n previewTemplate,\n previewConfig.context,\n );\n viewRef.detectChanges();\n preview = getRootNode(viewRef, this._document);\n this._previewEmbeddedView = viewRef;\n if (previewConfig.matchSize) {\n matchElementSize(preview, rootRect!);\n } else {\n preview.style.transform = getTransform(\n this._pickupPositionOnPage.x,\n this._pickupPositionOnPage.y,\n );\n }\n } else {\n preview = deepCloneNode(this._rootElement);\n matchElementSize(preview, this._initialDomRect!);\n\n if (this._initialTransform) {\n preview.style.transform = this._initialTransform;\n }\n }\n\n extendStyles(\n preview.style,\n {\n // It's important that we disable the pointer events on the preview, because\n // it can throw off the `document.elementFromPoint` calls in the `CdkDropList`.\n 'pointer-events': 'none',\n // If the preview has a margin, it can throw off our positioning so we reset it. The reset\n // value for `margin-right` needs to be `auto` when opened as a popover, because our\n // positioning is always top/left based, but native popover seems to position itself\n // to the top/right if `<html>` or `<body>` have `dir=\"rtl\"` (see #29604). Setting it\n // to `auto` pushed it to the top/left corner in RTL and is a noop in LTR.\n 'margin': supportsPopover(preview) ? '0 auto 0 0' : '0',\n 'position': 'fixed',\n 'top': '0',\n 'left': '0',\n 'z-index': this._zIndex + '',\n },\n importantProperties,\n );\n\n toggleNativeDragInteractions(preview, false);\n preview.classList.add('cdk-drag-preview');\n preview.setAttribute('popover', 'manual');\n preview.setAttribute('dir', this._direction);\n\n if (previewClass) {\n if (Array.isArray(previewClass)) {\n previewClass.forEach(className => preview.classList.add(className));\n } else {\n preview.classList.add(previewClass);\n }\n }\n\n return preview;\n }\n}\n\n/** Checks whether a specific element supports the popover API. */\nfunction supportsPopover(element: HTMLElement): boolean {\n return 'showPopover' in element;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {isFakeMousedownFromScreenReader, isFakeTouchstartFromScreenReader} from '../a11y';\nimport {Direction} from '../bidi';\nimport {coerceElement} from '../coercion';\nimport {_getEventTarget, _getShadowRoot} from '../platform';\nimport {ViewportRuler} from '../scrolling';\nimport {\n DOCUMENT,\n ElementRef,\n EmbeddedViewRef,\n Injector,\n NgZone,\n Renderer2,\n RendererFactory2,\n TemplateRef,\n ViewContainerRef,\n signal,\n} from '@angular/core';\nimport {Observable, Subject, Subscription} from 'rxjs';\nimport {deepCloneNode} from './dom/clone-node';\nimport {adjustDomRect, getMutableClientRect, isOverflowingParent} from './dom/dom-rect';\nimport {ParentPositionTracker} from './dom/parent-position-tracker';\nimport {getRootNode} from './dom/root-node';\nimport {\n DragCSSStyleDeclaration,\n combineTransforms,\n getTransform,\n toggleNativeDragInteractions,\n toggleVisibility,\n} from './dom/styling';\nimport {DragDropRegistry} from './drag-drop-registry';\nimport type {DropListRef} from './drop-list-ref';\nimport {DragPreviewTemplate, PreviewRef} from './preview-ref';\n\n/** Object that can be used to configure the behavior of DragRef. */\nexport interface DragRefConfig {\n /**\n * Minimum amount of pixels that the user should\n * drag, before the CDK initiates a drag sequence.\n */\n dragStartThreshold: number;\n\n /**\n * Amount the pixels the user should drag before the CDK\n * considers them to have changed the drag direction.\n */\n pointerDirectionChangeThreshold: number;\n\n /** `z-index` for the absolutely-positioned elements that are created by the drag item. */\n zIndex?: number;\n\n /** Ref that the current drag item is nested in. */\n parentDragRef?: DragRef;\n}\n\n/** Function that can be used to constrain the position of a dragged element. */\nexport type DragConstrainPosition = (\n userPointerPosition: Point,\n dragRef: DragRef,\n dimensions: DOMRect,\n pickupPositionInElement: Point,\n) => Point;\n\n/** Options that can be used to bind a passive event listener. */\nconst passiveEventListenerOptions = {passive: true};\n\n/** Options that can be used to bind an active event listener. */\nconst activeEventListenerOptions = {passive: false};\n\n/** Event options that can be used to bind an active, capturing event. */\nconst activeCapturingEventOptions = {\n passive: false,\n capture: true,\n};\n\n/**\n * Time in milliseconds for which to ignore mouse events, after\n * receiving a touch event. Used to avoid doing double work for\n * touch devices where the browser fires fake mouse events, in\n * addition to touch events.\n */\nconst MOUSE_EVENT_IGNORE_TIME = 800;\n\n/** Class applied to the drag placeholder. */\nconst PLACEHOLDER_CLASS = 'cdk-drag-placeholder';\n\n// TODO(crisbeto): add an API for moving a draggable up/down the\n// list programmatically. Useful for keyboard controls.\n\n/** Template that can be used to create a drag helper element (e.g. a preview or a placeholder). */\ninterface DragHelperTemplate<T = any> {\n template: TemplateRef<T> | null;\n viewContainer: ViewContainerRef;\n context: T;\n}\n\n/** Point on the page or within an element. */\nexport interface Point {\n x: number;\n y: number;\n}\n\n/** Inline styles to be set as `!important` while dragging. */\nconst dragImportantProperties = new Set([\n // Needs to be important, because some `mat-table` sets `position: sticky !important`. See #22781.\n 'position',\n]);\n\n/**\n * Possible places into which the preview of a drag item can be inserted.\n * - `global` - Preview will be inserted at the bottom of the `<body>`. The advantage is that\n * you don't have to worry about `overflow: hidden` or `z-index`, but the item won't retain\n * its inherited styles.\n * - `parent` - Preview will be inserted into the parent of the drag item. The advantage is that\n * inherited styles will be preserved, but it may be clipped by `overflow: hidden` or not be\n * visible due to `z-index`. Furthermore, the preview is going to have an effect over selectors\n * like `:nth-child` and some flexbox configurations.\n * - `ElementRef<HTMLElement> | HTMLElement` - Preview will be inserted into a specific element.\n * Same advantages and disadvantages as `parent`.\n */\nexport type PreviewContainer = 'global' | 'parent' | ElementRef<HTMLElement> | HTMLElement;\n\n/**\n * Creates a `DragRef` for an element, turning it into a draggable item.\n * @param injector Injector used to resolve dependencies.\n * @param element Element to which to attach the dragging functionality.\n * @param config Object used to configure the dragging behavior.\n */\nexport function createDragRef<T = unknown>(\n injector: Injector,\n element: ElementRef<HTMLElement> | HTMLElement,\n config: DragRefConfig = {\n dragStartThreshold: 5,\n pointerDirectionChangeThreshold: 5,\n },\n): DragRef<T> {\n const renderer =\n injector.get(Renderer2, null, {optional: true}) ||\n injector.get(RendererFactory2).createRenderer(null, null);\n\n return new DragRef(\n element,\n config,\n injector.get(DOCUMENT),\n injector.get(NgZone),\n injector.get(ViewportRuler),\n injector.get(DragDropRegistry),\n renderer,\n );\n}\n\n/**\n * Reference to a draggable item. Used to manipulate or dispose of the item.\n */\nexport class DragRef<T = any> {\n private _rootElementCleanups: (() => void)[] | undefined;\n private _cleanupShadowRootSelectStart: (() => void) | undefined;\n\n /** Element displayed next to the user's pointer while the element is dragged. */\n private _preview: PreviewRef | null = null;\n\n /** Container into which to insert the preview. */\n private _previewContainer: PreviewContainer | undefined;\n\n /** Reference to the view of the placeholder element. */\n private _placeholderRef: EmbeddedViewRef<any> | null = null;\n\n /** Element that is rendered instead of the draggable item while it is being sorted. */\n private _placeholder!: HTMLElement;\n\n /** Coordinates within the element at which the user picked up the element. */\n private _pickupPositionInElement!: Point;\n\n /** Coordinates on the page at which the user picked up the element. */\n private _pickupPositionOnPage!: Point;\n\n /**\n * Marker node used to save the place in the DOM where the element was\n * picked up so that it can be restored at the end of the drag sequence.\n */\n private _marker!: Comment;\n\n /**\n * Element indicating the position from which the item was picked up initially.\n */\n private _anchor: HTMLElement | null = null;\n\n /**\n * CSS `transform` applied to the element when it isn't being dragged. We need a\n * passive transform in order for the dragged element to retain its new position\n * after the user has stopped dragging and because we need to know the relative\n * position in case they start dragging again. This corresponds to `element.style.transform`.\n */\n private _passiveTransform: Point = {x: 0, y: 0};\n\n /** CSS `transform` that is applied to the element while it's being dragged. */\n private _activeTransform: Point = {x: 0, y: 0};\n\n /** Inline `transform` value that the element had before the first dragging sequence. */\n private _initialTransform?: string;\n\n /**\n * Whether the dragging sequence has been started. Doesn't\n * necessarily mean that the element has been moved.\n */\n private _hasStartedDragging = signal(false);\n\n /** Whether the element has moved since the user started dragging it. */\n private _hasMoved = false;\n\n /** Drop container in which the DragRef resided when dragging began. */\n private _initialContainer!: DropListRef;\n\n /** Index at which the item started in its initial container. */\n private _initialIndex!: number;\n\n /** Cached positions of scrollable parent elements. */\n private _parentPositions: ParentPositionTracker;\n\n /** Emits when the item is being moved. */\n private readonly _moveEvents = new Subject<{\n source: DragRef;\n pointerPosition: {x: number; y: number};\n event: MouseEvent | TouchEvent;\n distance: Point;\n delta: {x: -1 | 0 | 1; y: -1 | 0 | 1};\n }>();\n\n /** Keeps track of the direction in which the user is dragging along each axis. */\n private _pointerDirectionDelta!: {x: -1 | 0 | 1; y: -1 | 0 | 1};\n\n /** Pointer position at which the last change in the delta occurred. */\n private _pointerPositionAtLastDirectionChange!: Point;\n\n /** Position of the pointer at the last pointer event. */\n private _lastKnownPointerPosition!: Point;\n\n /**\n * Root DOM node of the drag instance. This is the element that will\n * be moved around as the user is dragging.\n */\n private _rootElement!: HTMLElement;\n\n /**\n * Nearest ancestor SVG, relative to which coordinates are calculated if dragging SVGElement\n */\n private _ownerSVGElement: SVGSVGElement | null = null;\n\n /**\n * Inline style value of `-webkit-tap-highlight-color` at the time the\n * dragging was started. Used to restore the value once we're done dragging.\n */\n private _rootElementTapHighlight!: string;\n\n /** Subscription to pointer movement events. */\n private _pointerMoveSubscription = Subscription.EMPTY;\n\n /** Subscription to the event that is dispatched when the user lifts their pointer. */\n private _pointerUpSubscription = Subscription.EMPTY;\n\n /** Subscription to the viewport being scrolled. */\n private _scrollSubscription = Subscription.EMPTY;\n\n /** Subscription to the viewport being resized. */\n private _resizeSubscription = Subscription.EMPTY;\n\n /**\n * Time at which the last touch event occurred. Used to avoid firing the same\n * events multiple times on touch devices where the browser will fire a fake\n * mouse event for each touch event, after a certain time.\n */\n private _lastTouchEventTime!: number;\n\n /** Time at which the last dragging sequence was started. */\n private _dragStartTime!: number;\n\n /** Cached reference to the boundary element. */\n private _boundaryElement: HTMLElement | null = null;\n\n /** Whether the native dragging interactions have been enabled on the root element. */\n private _nativeInteractionsEnabled = true;\n\n /** Client rect of the root element when the dragging sequence has started. */\n private _initialDomRect?: DOMRect;\n\n /** Cached dimensions of the preview element. Should be read via `_getPreviewRect`. */\n private _previewRect?: DOMRect;\n\n /** Cached dimensions of the boundary element. */\n private _boundaryRect?: DOMRect;\n\n /** Element that will be used as a template to create the draggable item's preview. */\n private _previewTemplate?: DragPreviewTemplate | null;\n\n /** Template for placeholder element rendered to show where a draggable would be dropped. */\n private _placeholderTemplate?: DragHelperTemplate | null;\n\n /** Elements that can be used to drag the draggable item. */\n private _handles: HTMLElement[] = [];\n\n /** Registered handles that are currently disabled. */\n private _disabledHandles = new Set<HTMLElement>();\n\n /** Droppable container that the draggable is a part of. */\n private _dropContainer?: DropListRef;\n\n /** Layout direction of the item. */\n private _direction: Direction = 'ltr';\n\n /** Ref that the current drag item is nested in. */\n private _parentDragRef: DragRef<unknown> | null = null;\n\n /**\n * Cached shadow root that the element is placed in. `null` means that the element isn't in\n * the shadow DOM and `undefined` means that it hasn't been resolved yet. Should be read via\n * `_getShadowRoot`, not directly.\n */\n private _cachedShadowRoot: ShadowRoot | null | undefined;\n\n /** Axis along which dragging is locked. */\n lockAxis: 'x' | 'y' | null = null;\n\n /**\n * Amount of milliseconds to wait after the user has put their\n * pointer down before starting to drag the element.\n */\n dragStartDelay: number | {touch: number; mouse: number} = 0;\n\n /** Class to be added to the preview element. */\n previewClass: string | string[] | undefined;\n\n /**\n * If the parent of the dragged element has a `scale` transform, it can throw off the\n * positioning when the user starts dragging. Use this input to notify the CDK of the scale.\n */\n scale: number = 1;\n\n /** Whether starting to drag this element is disabled. */\n get disabled(): boolean {\n return this._disabled || !!(this._dropContainer && this._dropContainer.disabled);\n }\n set disabled(value: boolean) {\n if (value !== this._disabled) {\n this._disabled = value;\n this._toggleNativeDragInteractions();\n this._handles.forEach(handle => toggleNativeDragInteractions(handle, value));\n }\n }\n private _disabled = false;\n\n /** Emits as the drag sequence is being prepared. */\n readonly beforeStarted = new Subject<void>();\n\n /** Emits when the user starts dragging the item. */\n readonly started = new Subject<{source: DragRef; event: MouseEvent | TouchEvent}>();\n\n /** Emits when the user has released a drag item, before any animations have started. */\n readonly released = new Subject<{source: DragRef; event: MouseEvent | TouchEvent}>();\n\n /** Emits when the user stops dragging an item in the container. */\n readonly ended = new Subject<{\n source: DragRef;\n distance: Point;\n dropPoint: Point;\n event: MouseEvent | TouchEvent;\n }>();\n\n /** Emits when the user has moved the item into a new container. */\n readonly entered = new Subject<{container: DropListRef; item: DragRef; currentIndex: number}>();\n\n /** Emits when the user removes the item its container by dragging it into another container. */\n readonly exited = new Subject<{container: DropListRef; item: DragRef}>();\n\n /** Emits when the user drops the item inside a container. */\n readonly dropped = new Subject<{\n previousIndex: number;\n currentIndex: number;\n item: DragRef;\n container: DropListRef;\n previousContainer: DropListRef;\n distance: Point;\n dropPoint: Point;\n isPointerOverContainer: boolean;\n event: MouseEvent | TouchEvent;\n }>();\n\n /**\n * Emits as the user is dragging the item. Use with caution,\n * because this event will fire for every pixel that the user has dragged.\n */\n readonly moved: Observable<{\n source: DragRef;\n pointerPosition: {x: number; y: number};\n event: MouseEvent | TouchEvent;\n distance: Point;\n delta: {x: -1 | 0 | 1; y: -1 | 0 | 1};\n }> = this._moveEvents;\n\n /** Arbitrary data that can be attached to the drag item. */\n data!: T;\n\n /**\n * Function that can be used to customize the logic of how the position of the drag item\n * is limited while it's being dragged. Gets called with a point containing the current position\n * of the user's pointer on the page, a reference to the item being dragged and its dimensions.\n * Should return a point describing where the item should be rendered.\n */\n constrainPosition?: DragConstrainPosition;\n\n constructor(\n element: ElementRef<HTMLElement> | HTMLElement,\n private _config: DragRefConfig,\n private _document: Document,\n private _ngZone: NgZone,\n private _viewportRuler: ViewportRuler,\n private _dragDropRegistry: DragDropRegistry,\n private _renderer: Renderer2,\n ) {\n this.withRootElement(element).withParent(_config.parentDragRef || null);\n this._parentPositions = new ParentPositionTracker(_document);\n _dragDropRegistry.registerDragItem(this);\n }\n\n /**\n * Returns the element that is being used as a placeholder\n * while the current element is being dragged.\n */\n getPlaceholderElement(): HTMLElement {\n return this._placeholder;\n }\n\n /** Returns the root draggable element. */\n getRootElement(): HTMLElement {\n return this._rootElement;\n }\n\n /**\n * Gets the currently-visible element that represents the drag item.\n * While dragging this is the placeholder, otherwise it's the root element.\n */\n getVisibleElement(): HTMLElement {\n return this.isDragging() ? this.getPlaceholderElement() : this.getRootElement();\n }\n\n /** Registers the handles that can be used to drag the element. */\n withHandles(handles: (HTMLElement | ElementRef<HTMLElement>)[]): this {\n this._handles = handles.map(handle => coerceElement(handle));\n this._handles.forEach(handle => toggleNativeDragInteractions(handle, this.disabled));\n this._toggleNativeDragInteractions();\n\n // Delete any lingering disabled handles that may have been destroyed. Note that we re-create\n // the set, rather than iterate over it and filter out the destroyed handles, because while\n // the ES spec allows for sets to be modified while they're being iterated over, some polyfills\n // use an array internally which may throw an error.\n const disabledHandles = new Set<HTMLElement>();\n this._disabledHandles.forEach(handle => {\n if (this._handles.indexOf(handle) > -1) {\n disabledHandles.add(handle);\n }\n });\n this._disabledHandles = disabledHandles;\n return this;\n }\n\n /**\n * Registers the template that should be used for the drag preview.\n * @param template Template that from which to stamp out the preview.\n */\n withPreviewTemplate(template: DragPreviewTemplate | null): this {\n this._previewTemplate = template;\n return this;\n }\n\n /**\n * Registers the template that should be used for the drag placeholder.\n * @param template Template that from which to stamp out the placeholder.\n */\n withPlaceholderTemplate(template: DragHelperTemplate | null): this {\n this._placeholderTemplate = template;\n return this;\n }\n\n /**\n * Sets an alternate drag root element. The root element is the element that will be moved as\n * the user is dragging. Passing an alternate root element is useful when trying to enable\n * dragging on an element that you might not have access to.\n */\n withRootElement(rootElement: ElementRef<HTMLElement> | HTMLElement): this {\n const element = coerceElement(rootElement);\n\n if (element !== this._rootElement) {\n this._removeRootElementListeners();\n const renderer = this._renderer;\n this._rootElementCleanups = this._ngZone.runOutsideAngular(() => [\n renderer.listen(element, 'mousedown', this._pointerDown, activeEventListenerOptions),\n renderer.listen(element, 'touchstart', this._pointerDown, passiveEventListenerOptions),\n renderer.listen(element, 'dragstart', this._nativeDragStart, activeEventListenerOptions),\n ]);\n this._initialTransform = undefined;\n this._rootElement = element;\n }\n\n if (typeof SVGElement !== 'undefined' && this._rootElement instanceof SVGElement) {\n this._ownerSVGElement = this._rootElement.ownerSVGElement;\n }\n\n return this;\n }\n\n /**\n * Element to which the draggable's position will be constrained.\n */\n withBoundaryElement(boundaryElement: ElementRef<HTMLElement> | HTMLElement | null): this {\n this._boundaryElement = boundaryElement ? coerceElement(boundaryElement) : null;\n this._resizeSubscription.unsubscribe();\n if (boundaryElement) {\n this._resizeSubscription = this._viewportRuler\n .change(10)\n .subscribe(() => this._containInsideBoundaryOnResize());\n }\n return this;\n }\n\n /** Sets the parent ref that the ref is nested in. */\n withParent(parent: DragRef<unknown> | null): this {\n this._parentDragRef = parent;\n return this;\n }\n\n /** Removes the dragging functionality from the DOM element. */\n dispose() {\n this._removeRootElementListeners();\n\n // Do this check before removing from the registry since it'll\n // stop being considered as dragged once it is removed.\n if (this.isDragging()) {\n // Since we move out the element to the end of the body while it's being\n // dragged, we have to make sure that it's removed if it gets destroyed.\n this._rootElement?.remove();\n }\n\n this._marker?.remove();\n this._destroyPreview();\n this._destroyPlaceholder();\n this._dragDropRegistry.removeDragItem(this);\n this._removeListeners();\n this.beforeStarted.complete();\n this.started.complete();\n this.released.complete();\n this.ended.complete();\n this.entered.complete();\n this.exited.complete();\n this.dropped.complete();\n this._moveEvents.complete();\n this._handles = [];\n this._disabledHandles.clear();\n this._dropContainer = undefined;\n this._resizeSubscription.unsubscribe();\n this._parentPositions.clear();\n this._boundaryElement =\n this._rootElement =\n this._ownerSVGElement =\n this._placeholderTemplate =\n this._previewTemplate =\n this._marker =\n this._parentDragRef =\n null!;\n }\n\n /** Checks whether the element is currently being dragged. */\n isDragging(): boolean {\n return this._hasStartedDragging() && this._dragDropRegistry.isDragging(this);\n }\n\n /** Resets a standalone drag item to its initial position. */\n reset(): void {\n this._rootElement.style.transform = this._initialTransform || '';\n this._activeTransform = {x: 0, y: 0};\n this._passiveTransform = {x: 0, y: 0};\n }\n\n /** Resets drag item to end of boundary element. */\n resetToBoundary(): void {\n if (\n // can be null if the drag item was never dragged.\n this._boundaryElement &&\n this._rootElement &&\n // check if we are overflowing off our boundary element\n isOverflowingParent(\n this._boundaryElement.getBoundingClientRect(),\n this._rootElement.getBoundingClientRect(),\n )\n ) {\n const parentRect = this._boundaryElement.getBoundingClientRect();\n const childRect = this._rootElement.getBoundingClientRect();\n\n let offsetX = 0;\n let offsetY = 0;\n\n // check if we are overflowing from left or right\n if (childRect.left < parentRect.left) {\n offsetX = parentRect.left - childRect.left;\n } else if (childRect.right > parentRect.right) {\n offsetX = parentRect.right - childRect.right;\n }\n\n // check if we are overflowing from top or bottom\n if (childRect.top < parentRect.top) {\n offsetY = parentRect.top - childRect.top;\n } else if (childRect.bottom > parentRect.bottom) {\n offsetY = parentRect.bottom - childRect.bottom;\n }\n\n const currentLeft = this._activeTransform.x;\n const currentTop = this._activeTransform.y;\n\n let x = currentLeft + offsetX,\n y = currentTop + offsetY;\n\n this._rootElement.style.transform = getTransform(x, y);\n this._activeTransform = {x, y};\n this._passiveTransform = {x, y};\n }\n }\n\n /**\n * Sets a handle as disabled. While a handle is disabled, it'll capture and interrupt dragging.\n * @param handle Handle element that should be disabled.\n */\n disableHandle(handle: HTMLElement) {\n if (!this._disabledHandles.has(handle) && this._handles.indexOf(handle) > -1) {\n this._disabledHandles.add(handle);\n toggleNativeDragInteractions(handle, true);\n }\n }\n\n /**\n * Enables a handle, if it has been disabled.\n * @param handle Handle element to be enabled.\n */\n enableHandle(handle: HTMLElement) {\n if (this._disabledHandles.has(handle)) {\n this._disabledHandles.delete(handle);\n toggleNativeDragInteractions(handle, this.disabled);\n }\n }\n\n /** Sets the layout direction of the draggable item. */\n withDirection(direction: Direction): this {\n this._direction = direction;\n return this;\n }\n\n /** Sets the container that the item is part of. */\n _withDropContainer(container: DropListRef) {\n this._dropContainer = container;\n }\n\n /**\n * Gets the current position in pixels the draggable outside of a drop container.\n */\n getFreeDragPosition(): Readonly<Point> {\n const position = this.isDragging() ? this._activeTransform : this._passiveTransform;\n return {x: position.x, y: position.y};\n }\n\n /**\n * Sets the current position in pixels the draggable outside of a drop container.\n * @param value New position to be set.\n */\n setFreeDragPosition(value: Point): this {\n this._activeTransform = {x: 0, y: 0};\n this._passiveTransform.x = value.x;\n this._passiveTransform.y = value.y;\n\n if (!this._dropContainer) {\n this._applyRootElementTransform(value.x, value.y);\n }\n\n return this;\n }\n\n /**\n * Sets the container into which to insert the preview element.\n * @param value Container into which to insert the preview.\n */\n withPreviewContainer(value: PreviewContainer): this {\n this._previewContainer = value;\n return this;\n }\n\n /** Updates the item's sort order based on the last-known pointer position. */\n _sortFromLastPointerPosition() {\n const position = this._lastKnownPointerPosition;\n\n if (position && this._dropContainer) {\n this._updateActiveDropContainer(this._getConstrainedPointerPosition(position), position);\n }\n }\n\n /** Unsubscribes from the global subscriptions. */\n private _removeListeners() {\n this._pointerMoveSubscription.unsubscribe();\n this._pointerUpSubscription.unsubscribe();\n this._scrollSubscription.unsubscribe();\n this._cleanupShadowRootSelectStart?.();\n this._cleanupShadowRootSelectStart = undefined;\n }\n\n /** Destroys the preview element and its ViewRef. */\n private _destroyPreview() {\n this._preview?.destroy();\n this._preview = null;\n }\n\n /** Destroys the placeholder element and its ViewRef. */\n private _destroyPlaceholder() {\n this._anchor?.remove();\n this._placeholder?.remove();\n this._placeholderRef?.destroy();\n this._placeholder = this._anchor = this._placeholderRef = null!;\n }\n\n /** Handler for the `mousedown`/`touchstart` events. */\n private _pointerDown = (event: MouseEvent | TouchEvent) => {\n this.beforeStarted.next();\n\n // Delegate the event based on whether it started from a handle or the element itself.\n if (this._handles.length) {\n const targetHandle = this._getTargetHandle(event);\n\n if (targetHandle && !this._disabledHandles.has(targetHandle) && !this.disabled) {\n this._initializeDragSequence(targetHandle, event);\n }\n } else if (!this.disabled) {\n this._initializeDragSequence(this._rootElement, event);\n }\n };\n\n /** Handler that is invoked when the user moves their pointer after they've initiated a drag. */\n private _pointerMove = (event: MouseEvent | TouchEvent) => {\n const pointerPosition = this._getPointerPositionOnPage(event);\n\n if (!this._hasStartedDragging()) {\n const distanceX = Math.abs(pointerPosition.x - this._pickupPositionOnPage.x);\n const distanceY = Math.abs(pointerPosition.y - this._pickupPositionOnPage.y);\n const isOverThreshold = distanceX + distanceY >= this._config.dragStartThreshold;\n\n // Only start dragging after the user has moved more than the minimum distance in either\n // direction. Note that this is preferable over doing something like `skip(minimumDistance)`\n // in the `pointerMove` subscription, because we're not guaranteed to have one move event\n // per pixel of movement (e.g. if the user moves their pointer quickly).\n if (isOverThreshold) {\n const isDelayElapsed = Date.now() >= this._dragStartTime + this._getDragStartDelay(event);\n const container = this._dropContainer;\n\n if (!isDelayElapsed) {\n this._endDragSequence(event);\n return;\n }\n\n // Prevent other drag sequences from starting while something in the container is still\n // being dragged. This can happen while we're waiting for the drop animation to finish\n // and can cause errors, because some elements might still be moving around.\n if (!container || (!container.isDragging() && !container.isReceiving())) {\n // Prevent the default action as soon as the dragging sequence is considered as\n // \"started\" since waiting for the next event can allow the device to begin scrolling.\n if (event.cancelable) {\n event.preventDefault();\n }\n this._hasStartedDragging.set(true);\n this._ngZone.run(() => this._startDragSequence(event));\n }\n }\n\n return;\n }\n\n // We prevent the default action down here so that we know that dragging has started. This is\n // important for touch devices where doing this too early can unnecessarily block scrolling,\n // if there's a dragging delay.\n if (event.cancelable) {\n event.preventDefault();\n }\n\n const constrainedPointerPosition = this._getConstrainedPointerPosition(pointerPosition);\n this._hasMoved = true;\n this._lastKnownPointerPosition = pointerPosition;\n this._updatePointerDirectionDelta(constrainedPointerPosition);\n\n if (this._dropContainer) {\n this._updateActiveDropContainer(constrainedPointerPosition, pointerPosition);\n } else {\n // If there's a position constraint function, we want the element's top/left to be at the\n // specific position on the page. Use the initial position as a reference if that's the case.\n const offset = this.constrainPosition ? this._initialDomRect! : this._pickupPositionOnPage;\n const activeTransform = this._activeTransform;\n activeTransform.x = constrainedPointerPosition.x - offset.x + this._passiveTransform.x;\n activeTransform.y = constrainedPointerPosition.y - offset.y + this._passiveTransform.y;\n this._applyRootElementTransform(activeTransform.x, activeTransform.y);\n }\n\n // Since this event gets fired for every pixel while dragging, we only\n // want to fire it if the consumer opted into it. Also we have to\n // re-enter the zone because we run all of the events on the outside.\n if (this._moveEvents.observers.length) {\n this._ngZone.run(() => {\n this._moveEvents.next({\n source: this,\n pointerPosition: constrainedPointerPosition,\n event,\n distance: this._getDragDistance(constrainedPointerPosition),\n delta: this._pointerDirectionDelta,\n });\n });\n }\n };\n\n /** Handler that is invoked when the user lifts their pointer up, after initiating a drag. */\n private _pointerUp = (event: MouseEvent | TouchEvent) => {\n this._endDragSequence(event);\n };\n\n /**\n * Clears subscriptions and stops the dragging sequence.\n * @param event Browser event object that ended the sequence.\n */\n private _endDragSequence(event: MouseEvent | TouchEvent) {\n // Note that here we use `isDragging` from the service, rather than from `this`.\n // The difference is that the one from the service reflects whether a dragging sequence\n // has been initiated, whereas the one on `this` includes whether the user has passed\n // the minimum dragging threshold.\n if (!this._dragDropRegistry.isDragging(this)) {\n return;\n }\n\n this._removeListeners();\n this._dragDropRegistry.stopDragging(this);\n this._toggleNativeDragInteractions();\n\n if (this._handles) {\n (this._rootElement.style as DragCSSStyleDeclaration).webkitTapHighlightColor =\n this._rootElementTapHighlight;\n }\n\n if (!this._hasStartedDragging()) {\n return;\n }\n\n this.released.next({source: this, event});\n\n if (this._dropContainer) {\n // Stop scrolling immediately, instead of waiting for the animation to finish.\n this._dropContainer._stopScrolling();\n this._animatePreviewToPlaceholder().then(() => {\n this._cleanupDragArtifacts(event);\n this._cleanupCachedDimensions();\n this._dragDropRegistry.stopDragging(this);\n });\n } else {\n // Convert the active transform into a passive one. This means that next time\n // the user starts dragging the item, its position will be calculated relatively\n // to the new passive transform.\n this._passiveTransform.x = this._activeTransform.x;\n const pointerPosition = this._getPointerPositionOnPage(event);\n this._passiveTransform.y = this._activeTransform.y;\n this._ngZone.run(() => {\n this.ended.next({\n source: this,\n distance: this._getDragDistance(pointerPosition),\n dropPoint: pointerPosition,\n event,\n });\n });\n this._cleanupCachedDimensions();\n this._dragDropRegistry.stopDragging(this);\n }\n }\n\n /** Starts the dragging sequence. */\n private _startDragSequence(event: MouseEvent | TouchEvent) {\n if (isTouchEvent(event)) {\n this._lastTouchEventTime = Date.now();\n }\n\n this._toggleNativeDragInteractions();\n\n // Needs to happen before the root element is moved.\n const shadowRoot = this._getShadowRoot();\n const dropContainer = this._dropContainer;\n\n if (shadowRoot) {\n // In some browsers the global `selectstart` that we maintain in the `DragDropRegistry`\n // doesn't cross the shadow boundary so we have to prevent it at the shadow root (see #28792).\n this._ngZone.runOutsideAngular(() => {\n this._cleanupShadowRootSelectStart = this._renderer.listen(\n shadowRoot,\n 'selectstart',\n shadowDomSelectStart,\n activeCapturingEventOptions,\n );\n });\n }\n\n if (dropContainer) {\n const element = this._rootElement;\n const parent = element.parentNode as HTMLElement;\n const placeholder = (this._placeholder = this._createPlaceholderElement());\n const marker = (this._marker =\n this._marker ||\n this._document.createComment(\n typeof ngDevMode === 'undefined' || ngDevMode ? 'cdk-drag-marker' : '',\n ));\n\n // Insert a marker node so that we can restore the element's position in the DOM.\n parent.insertBefore(marker, element);\n\n // There's no risk of transforms stacking when inside a drop container so\n // we can keep the initial transform up to date any time dragging starts.\n this._initialTransform = element.style.transform || '';\n\n // Create the preview after the initial transform has\n // been cached, because it can be affected by the transform.\n this._preview = new PreviewRef(\n this._document,\n this._rootElement,\n this._direction,\n this._initialDomRect!,\n this._previewTemplate || null,\n this.previewClass || null,\n this._pickupPositionOnPage,\n this._initialTransform,\n this._config.zIndex || 1000,\n this._renderer,\n );\n this._preview.attach(this._getPreviewInsertionPoint(parent, shadowRoot));\n\n // We move the element out at the end of the body and we make it hidden, because keeping it in\n // place will throw off the consumer's `:last-child` selectors. We can't remove the element\n // from the DOM completely, because iOS will stop firing all subsequent events in the chain.\n toggleVisibility(element, false, dragImportantProperties);\n this._document.body.appendChild(parent.replaceChild(placeholder, element));\n this.started.next({source: this, event}); // Emit before notifying the container.\n dropContainer.start();\n this._initialContainer = dropContainer;\n this._initialIndex = dropContainer.getItemIndex(this);\n } else {\n this.started.next({source: this, event});\n this._initialContainer = this._initialIndex = undefined!;\n }\n\n // Important to run after we've called `start` on the parent container\n // so that it has had time to resolve its scrollable parents.\n this._parentPositions.cache(dropContainer ? dropContainer.getScrollableParents() : []);\n }\n\n /**\n * Sets up the different variables and subscriptions\n * that will be necessary for the dragging sequence.\n * @param referenceElement Element that started the drag sequence.\n * @param event Browser event object that started the sequence.\n */\n private _initializeDragSequence(referenceElement: HTMLElement, event: MouseEvent | TouchEvent) {\n // Stop propagation if the item is inside another\n // draggable so we don't start multiple drag sequences.\n if (this._parentDragRef) {\n event.stopPropagation();\n }\n\n const isDragging = this.isDragging();\n const isTouchSequence = isTouchEvent(event);\n const isAuxiliaryMouseButton = !isTouchSequence && (event as MouseEvent).button !== 0;\n const rootElement = this._rootElement;\n const target = _getEventTarget(event);\n const isSyntheticEvent =\n !isTouchSequence &&\n this._lastTouchEventTime &&\n this._lastTouchEventTime + MOUSE_EVENT_IGNORE_TIME > Date.now();\n const isFakeEvent = isTouchSequence\n ? isFakeTouchstartFromScreenReader(event as TouchEvent)\n : isFakeMousedownFromScreenReader(event as MouseEvent);\n\n // If the event started from an element with the native HTML drag&drop, it'll interfere\n // with our own dragging (e.g. `img` tags do it by default). Prevent the default action\n // to stop it from happening. Note that preventing on `dragstart` also seems to work, but\n // it's flaky and it fails if the user drags it away quickly. Also note that we only want\n // to do this for `mousedown` since doing the same for `touchstart` will stop any `click`\n // events from firing on touch devices.\n if (target && (target as HTMLElement).draggable && event.type === 'mousedown') {\n event.preventDefault();\n }\n\n // Abort if the user is already dragging or is using a mouse button other than the primary one.\n if (isDragging || isAuxiliaryMouseButton || isSyntheticEvent || isFakeEvent) {\n return;\n }\n\n // If we've got handles, we need to disable the tap highlight on the entire root element,\n // otherwise iOS will still add it, even though all the drag interactions on the handle\n // are disabled.\n if (this._handles.length) {\n const rootStyles = rootElement.style as DragCSSStyleDeclaration;\n this._rootElementTapHighlight = rootStyles.webkitTapHighlightColor || '';\n rootStyles.webkitTapHighlightColor = 'transparent';\n }\n\n this._hasMoved = false;\n this._hasStartedDragging.set(this._hasMoved);\n\n // Avoid multiple subscriptions and memory leaks when multi touch\n // (isDragging check above isn't enough because of possible temporal and/or dimensional delays)\n this._removeListeners();\n this._initialDomRect = this._rootElement.getBoundingClientRect();\n this._pointerMoveSubscription = this._dragDropRegistry.pointerMove.subscribe(this._pointerMove);\n this._pointerUpSubscription = this._dragDropRegistry.pointerUp.subscribe(this._pointerUp);\n this._scrollSubscription = this._dragDropRegistry\n .scrolled(this._getShadowRoot())\n .subscribe(scrollEvent => this._updateOnScroll(scrollEvent));\n\n if (this._boundaryElement) {\n this._boundaryRect = getMutableClientRect(this._boundaryElement);\n }\n\n // If we have a custom preview we can't know ahead of time how large it'll be so we position\n // it next to the cursor. The exception is when the consumer has opted into making the preview\n // the same size as the root element, in which case we do know the size.\n const previewTemplate = this._previewTemplate;\n this._pickupPositionInElement =\n previewTemplate && previewTemplate.template && !previewTemplate.matchSize\n ? {x: 0, y: 0}\n : this._getPointerPositionInElement(this._initialDomRect, referenceElement, event);\n const pointerPosition =\n (this._pickupPositionOnPage =\n this._lastKnownPointerPosition =\n this._getPointerPositionOnPage(event));\n this._pointerDirectionDelta = {x: 0, y: 0};\n this._pointerPositionAtLastDirectionChange = {x: pointerPosition.x, y: pointerPosition.y};\n this._dragStartTime = Date.now();\n this._dragDropRegistry.startDragging(this, event);\n }\n\n /** Cleans up the DOM artifacts that were added to facilitate the element being dragged. */\n private _cleanupDragArtifacts(event: MouseEvent | TouchEvent) {\n // Restore the element's visibility and insert it at its old position in the DOM.\n // It's important that we maintain the position, because moving the element around in the DOM\n // can throw off `NgFor` which does smart diffing and re-creates elements only when necessary,\n // while moving the existing elements in all other cases.\n toggleVisibility(this._rootElement, true, dragImportantProperties);\n this._marker.parentNode!.replaceChild(this._rootElement, this._marker);\n\n this._destroyPreview();\n this._destroyPlaceholder();\n this._initialDomRect =\n this._boundaryRect =\n this._previewRect =\n this._initialTransform =\n undefined;\n\n // Re-enter the NgZone since we bound `document` events on the outside.\n this._ngZone.run(() => {\n const container = this._dropContainer!;\n const currentIndex = container.getItemIndex(this);\n const pointerPosition = this._getPointerPositionOnPage(event);\n const distance = this._getDragDistance(pointerPosition);\n const isPointerOverContainer = container._isOverContainer(\n pointerPosition.x,\n pointerPosition.y,\n );\n\n this.ended.next({source: this, distance, dropPoint: pointerPosition, event});\n this.dropped.next({\n item: this,\n currentIndex,\n previousIndex: this._initialIndex,\n container: container,\n previousContainer: this._initialContainer,\n isPointerOverContainer,\n distance,\n dropPoint: pointerPosition,\n event,\n });\n container.drop(\n this,\n currentIndex,\n this._initialIndex,\n this._initialContainer,\n isPointerOverContainer,\n distance,\n pointerPosition,\n event,\n );\n this._dropContainer = this._initialContainer;\n });\n }\n\n /**\n * Updates the item's position in its drop container, or moves it\n * into a new one, depending on its current drag position.\n */\n private _updateActiveDropContainer({x, y}: Point, {x: rawX, y: rawY}: Point) {\n // Drop container that draggable has been moved into.\n let newContainer = this._initialContainer._getSiblingContainerFromPosition(this, x, y);\n\n // If we couldn't find a new container to move the item into, and the item has left its\n // initial container, check whether the it's over the initial container. This handles the\n // case where two containers are connected one way and the user tries to undo dragging an\n // item into a new container.\n if (\n !newContainer &&\n this._dropContainer !== this._initialContainer &&\n this._initialContainer._isOverContainer(x, y)\n ) {\n newContainer = this._initialContainer;\n }\n\n if (newContainer && newContainer !== this._dropContainer) {\n this._ngZone.run(() => {\n const exitIndex = this._dropContainer!.getItemIndex(this);\n const nextItemElement =\n this._dropContainer!.getItemAtIndex(exitIndex + 1)?.getVisibleElement() || null;\n\n // Notify the old container that the item has left.\n this.exited.next({item: this, container: this._dropContainer!});\n this._dropContainer!.exit(this);\n this._conditionallyInsertAnchor(newContainer, this._dropContainer!, nextItemElement);\n // Notify the new container that the item has entered.\n this._dropContainer = newContainer!;\n this._dropContainer.enter(\n this,\n x,\n y,\n // If we're re-entering the initial container and sorting is disabled,\n // put item the into its starting index to begin with.\n newContainer === this._initialContainer && newContainer.sortingDisabled\n ? this._initialIndex\n : undefined,\n );\n this.entered.next({\n item: this,\n container: newContainer!,\n currentIndex: newContainer!.getItemIndex(this),\n });\n });\n }\n\n // Dragging may have been interrupted as a result of the events above.\n if (this.isDragging()) {\n this._dropContainer!._startScrollingIfNecessary(rawX, rawY);\n this._dropContainer!._sortItem(this, x, y, this._pointerDirectionDelta);\n\n if (this.constrainPosition) {\n this._applyPreviewTransform(x, y);\n } else {\n this._applyPreviewTransform(\n x - this._pickupPositionInElement.x,\n y - this._pickupPositionInElement.y,\n );\n }\n }\n }\n\n /**\n * Animates the preview element from its current position to the location of the drop placeholder.\n * @returns Promise that resolves when the animation completes.\n */\n private _animatePreviewToPlaceholder(): Promise<void> {\n // If the user hasn't moved yet, the transitionend event won't fire.\n if (!this._hasMoved) {\n return Promise.resolve();\n }\n\n const placeholderRect = this._placeholder.getBoundingClientRect();\n\n // Apply the class that adds a transition to the preview.\n this._preview!.addClass('cdk-drag-animating');\n\n // Move the preview to the placeholder position.\n this._applyPreviewTransform(placeholderRect.left, placeholderRect.top);\n\n // If the element doesn't have a `transition`, the `transitionend` event won't fire. Since\n // we need to trigger a style recalculation in order for the `cdk-drag-animating` class to\n // apply its style, we take advantage of the available info to figure out whether we need to\n // bind the event in the first place.\n const duration = this._preview!.getTransitionDuration();\n\n if (duration === 0) {\n return Promise.resolve();\n }\n\n return this._ngZone.runOutsideAngular(() => {\n return new Promise(resolve => {\n const handler = (event: TransitionEvent) => {\n if (\n !event ||\n (this._preview &&\n _getEventTarget(event) === this._preview.element &&\n event.propertyName === 'transform')\n ) {\n cleanupListener();\n resolve();\n clearTimeout(timeout);\n }\n };\n\n // If a transition is short enough, the browser might not fire the `transitionend` event.\n // Since we know how long it's supposed to take, add a timeout with a 50% buffer that'll\n // fire if the transition hasn't completed when it was supposed to.\n const timeout = setTimeout(handler as Function, duration * 1.5);\n const cleanupListener = this._preview!.addEventListener('transitionend', handler);\n });\n });\n }\n\n /** Creates an element that will be shown instead of the current element while dragging. */\n private _createPlaceholderElement(): HTMLElement {\n const placeholderConfig = this._placeholderTemplate;\n const placeholderTemplate = placeholderConfig ? placeholderConfig.template : null;\n let placeholder: HTMLElement;\n\n if (placeholderTemplate) {\n this._placeholderRef = placeholderConfig!.viewContainer.createEmbeddedView(\n placeholderTemplate,\n placeholderConfig!.context,\n );\n this._placeholderRef.detectChanges();\n placeholder = getRootNode(this._placeholderRef, this._document);\n } else {\n placeholder = deepCloneNode(this._rootElement);\n }\n\n // Stop pointer events on the preview so the user can't\n // interact with it while the preview is animating.\n placeholder.style.pointerEvents = 'none';\n placeholder.classList.add(PLACEHOLDER_CLASS);\n return placeholder;\n }\n\n /**\n * Figures out the coordinates at which an element was picked up.\n * @param referenceElement Element that initiated the dragging.\n * @param event Event that initiated the dragging.\n */\n private _getPointerPositionInElement(\n elementRect: DOMRect,\n referenceElement: HTMLElement,\n event: MouseEvent | TouchEvent,\n ): Point {\n const handleElement = referenceElement === this._rootElement ? null : referenceElement;\n const referenceRect = handleElement ? handleElement.getBoundingClientRect() : elementRect;\n const point = isTouchEvent(event) ? event.targetTouches[0] : event;\n const scrollPosition = this._getViewportScrollPosition();\n const x = point.pageX - referenceRect.left - scrollPosition.left;\n const y = point.pageY - referenceRect.top - scrollPosition.top;\n\n return {\n x: referenceRect.left - elementRect.left + x,\n y: referenceRect.top - elementRect.top + y,\n };\n }\n\n /** Determines the point of the page that was touched by the user. */\n private _getPointerPositionOnPage(event: MouseEvent | TouchEvent): Point {\n const scrollPosition = this._getViewportScrollPosition();\n const point = isTouchEvent(event)\n ? // `touches` will be empty for start/end events so we have to fall back to `changedTouches`.\n // Also note that on real devices we're guaranteed for either `touches` or `changedTouches`\n // to have a value, but Firefox in device emulation mode has a bug where both can be empty\n // for `touchstart` and `touchend` so we fall back to a dummy object in order to avoid\n // throwing an error. The value returned here will be incorrect, but since this only\n // breaks inside a developer tool and the value is only used for secondary information,\n // we can get away with it. See https://bugzilla.mozilla.org/show_bug.cgi?id=1615824.\n event.touches[0] || event.changedTouches[0] || {pageX: 0, pageY: 0}\n : event;\n\n const x = point.pageX - scrollPosition.left;\n const y = point.pageY - scrollPosition.top;\n\n // if dragging SVG element, try to convert from the screen coordinate system to the SVG\n // coordinate system\n if (this._ownerSVGElement) {\n const svgMatrix = this._ownerSVGElement.getScreenCTM();\n if (svgMatrix) {\n const svgPoint = this._ownerSVGElement.createSVGPoint();\n svgPoint.x = x;\n svgPoint.y = y;\n return svgPoint.matrixTransform(svgMatrix.inverse());\n }\n }\n\n return {x, y};\n }\n\n /** Gets the pointer position on the page, accounting for any position constraints. */\n private _getConstrainedPointerPosition(point: Point): Point {\n const dropContainerLock = this._dropContainer ? this._dropContainer.lockAxis : null;\n let {x, y} = this.constrainPosition\n ? this.constrainPosition(point, this, this._initialDomRect!, this._pickupPositionInElement)\n : point;\n\n if (this.lockAxis === 'x' || dropContainerLock === 'x') {\n y =\n this._pickupPositionOnPage.y -\n (this.constrainPosition ? this._pickupPositionInElement.y : 0);\n } else if (this.lockAxis === 'y' || dropContainerLock === 'y') {\n x =\n this._pickupPositionOnPage.x -\n (this.constrainPosition ? this._pickupPositionInElement.x : 0);\n }\n\n if (this._boundaryRect) {\n // If not using a custom constrain we need to account for the pickup position in the element\n // otherwise we do not need to do this, as it has already been accounted for\n const {x: pickupX, y: pickupY} = !this.constrainPosition\n ? this._pickupPositionInElement\n : {x: 0, y: 0};\n\n const boundaryRect = this._boundaryRect;\n const {width: previewWidth, height: previewHeight} = this._getPreviewRect();\n const minY = boundaryRect.top + pickupY;\n const maxY = boundaryRect.bottom - (previewHeight - pickupY);\n const minX = boundaryRect.left + pickupX;\n const maxX = boundaryRect.right - (previewWidth - pickupX);\n\n x = clamp(x, minX, maxX);\n y = clamp(y, minY, maxY);\n }\n\n return {x, y};\n }\n\n /** Updates the current drag delta, based on the user's current pointer position on the page. */\n private _updatePointerDirectionDelta(pointerPositionOnPage: Point) {\n const {x, y} = pointerPositionOnPage;\n const delta = this._pointerDirectionDelta;\n const positionSinceLastChange = this._pointerPositionAtLastDirectionChange;\n\n // Amount of pixels the user has dragged since the last time the direction changed.\n const changeX = Math.abs(x - positionSinceLastChange.x);\n const changeY = Math.abs(y - positionSinceLastChange.y);\n\n // Because we handle pointer events on a per-pixel basis, we don't want the delta\n // to change for every pixel, otherwise anything that depends on it can look erratic.\n // To make the delta more consistent, we track how much the user has moved since the last\n // delta change and we only update it after it has reached a certain threshold.\n if (changeX > this._config.pointerDirectionChangeThreshold) {\n delta.x = x > positionSinceLastChange.x ? 1 : -1;\n positionSinceLastChange.x = x;\n }\n\n if (changeY > this._config.pointerDirectionChangeThreshold) {\n delta.y = y > positionSinceLastChange.y ? 1 : -1;\n positionSinceLastChange.y = y;\n }\n\n return delta;\n }\n\n /** Toggles the native drag interactions, based on how many handles are registered. */\n private _toggleNativeDragInteractions() {\n if (!this._rootElement || !this._handles) {\n return;\n }\n\n const shouldEnable = this._handles.length > 0 || !this.isDragging();\n\n if (shouldEnable !== this._nativeInteractionsEnabled) {\n this._nativeInteractionsEnabled = shouldEnable;\n toggleNativeDragInteractions(this._rootElement, shouldEnable);\n }\n }\n\n /** Removes the manually-added event listeners from the root element. */\n private _removeRootElementListeners() {\n this._rootElementCleanups?.forEach(cleanup => cleanup());\n this._rootElementCleanups = undefined;\n }\n\n /**\n * Applies a `transform` to the root element, taking into account any existing transforms on it.\n * @param x New transform value along the X axis.\n * @param y New transform value along the Y axis.\n */\n private _applyRootElementTransform(x: number, y: number) {\n const scale = 1 / this.scale;\n const transform = getTransform(x * scale, y * scale);\n const styles = this._rootElement.style;\n\n // Cache the previous transform amount only after the first drag sequence, because\n // we don't want our own transforms to stack on top of each other.\n // Should be excluded none because none + translate3d(x, y, x) is invalid css\n if (this._initialTransform == null) {\n this._initialTransform =\n styles.transform && styles.transform != 'none' ? styles.transform : '';\n }\n\n // Preserve the previous `transform` value, if there was one. Note that we apply our own\n // transform before the user's, because things like rotation can affect which direction\n // the element will be translated towards.\n styles.transform = combineTransforms(transform, this._initialTransform);\n }\n\n /**\n * Applies a `transform` to the preview, taking into account any existing transforms on it.\n * @param x New transform value along the X axis.\n * @param y New transform value along the Y axis.\n */\n private _applyPreviewTransform(x: number, y: number) {\n // Only apply the initial transform if the preview is a clone of the original element, otherwise\n // it could be completely different and the transform might not make sense anymore.\n const initialTransform = this._previewTemplate?.template ? undefined : this._initialTransform;\n const transform = getTransform(x, y);\n this._preview!.setTransform(combineTransforms(transform, initialTransform));\n }\n\n /**\n * Gets the distance that the user has dragged during the current drag sequence.\n * @param currentPosition Current position of the user's pointer.\n */\n private _getDragDistance(currentPosition: Point): Point {\n const pickupPosition = this._pickupPositionOnPage;\n\n if (pickupPosition) {\n return {x: currentPosition.x - pickupPosition.x, y: currentPosition.y - pickupPosition.y};\n }\n\n return {x: 0, y: 0};\n }\n\n /** Cleans up any cached element dimensions that we don't need after dragging has stopped. */\n private _cleanupCachedDimensions() {\n this._boundaryRect = this._previewRect = undefined;\n this._parentPositions.clear();\n }\n\n /**\n * Checks whether the element is still inside its boundary after the viewport has been resized.\n * If not, the position is adjusted so that the element fits again.\n */\n private _containInsideBoundaryOnResize() {\n let {x, y} = this._passiveTransform;\n\n if ((x === 0 && y === 0) || this.isDragging() || !this._boundaryElement) {\n return;\n }\n\n // Note: don't use `_clientRectAtStart` here, because we want the latest position.\n const elementRect = this._rootElement.getBoundingClientRect();\n const boundaryRect = this._boundaryElement.getBoundingClientRect();\n\n // It's possible that the element got hidden away after dragging (e.g. by switching to a\n // different tab). Don't do anything in this case so we don't clear the user's position.\n if (\n (boundaryRect.width === 0 && boundaryRect.height === 0) ||\n (elementRect.width === 0 && elementRect.height === 0)\n ) {\n return;\n }\n\n const leftOverflow = boundaryRect.left - elementRect.left;\n const rightOverflow = elementRect.right - boundaryRect.right;\n const topOverflow = boundaryRect.top - elementRect.top;\n const bottomOverflow = elementRect.bottom - boundaryRect.bottom;\n\n // If the element has become wider than the boundary, we can't\n // do much to make it fit so we just anchor it to the left.\n if (boundaryRect.width > elementRect.width) {\n if (leftOverflow > 0) {\n x += leftOverflow;\n }\n\n if (rightOverflow > 0) {\n x -= rightOverflow;\n }\n } else {\n x = 0;\n }\n\n // If the element has become taller than the boundary, we can't\n // do much to make it fit so we just anchor it to the top.\n if (boundaryRect.height > elementRect.height) {\n if (topOverflow > 0) {\n y += topOverflow;\n }\n\n if (bottomOverflow > 0) {\n y -= bottomOverflow;\n }\n } else {\n y = 0;\n }\n\n if (x !== this._passiveTransform.x || y !== this._passiveTransform.y) {\n this.setFreeDragPosition({y, x});\n }\n }\n\n /** Gets the drag start delay, based on the event type. */\n private _getDragStartDelay(event: MouseEvent | TouchEvent): number {\n const value = this.dragStartDelay;\n\n if (typeof value === 'number') {\n return value;\n } else if (isTouchEvent(event)) {\n return value.touch;\n }\n\n return value ? value.mouse : 0;\n }\n\n /** Updates the internal state of the draggable element when scrolling has occurred. */\n private _updateOnScroll(event: Event) {\n const scrollDifference = this._parentPositions.handleScroll(event);\n\n if (scrollDifference) {\n const target = _getEventTarget<HTMLElement | Document>(event)!;\n\n // DOMRect dimensions are based on the scroll position of the page and its parent\n // node so we have to update the cached boundary DOMRect if the user has scrolled.\n if (\n this._boundaryRect &&\n target !== this._boundaryElement &&\n target.contains(this._boundaryElement)\n ) {\n adjustDomRect(this._boundaryRect, scrollDifference.top, scrollDifference.left);\n }\n\n this._pickupPositionOnPage.x += scrollDifference.left;\n this._pickupPositionOnPage.y += scrollDifference.top;\n\n // If we're in free drag mode, we have to update the active transform, because\n // it isn't relative to the viewport like the preview inside a drop list.\n if (!this._dropContainer) {\n this._activeTransform.x -= scrollDifference.left;\n this._activeTransform.y -= scrollDifference.top;\n this._applyRootElementTransform(this._activeTransform.x, this._activeTransform.y);\n }\n }\n }\n\n /** Gets the scroll position of the viewport. */\n private _getViewportScrollPosition() {\n return (\n this._parentPositions.positions.get(this._document)?.scrollPosition ||\n this._parentPositions.getViewportScrollPosition()\n );\n }\n\n /**\n * Lazily resolves and returns the shadow root of the element. We do this in a function, rather\n * than saving it in property directly on init, because we want to resolve it as late as possible\n * in order to ensure that the element has been moved into the shadow DOM. Doing it inside the\n * constructor might be too early if the element is inside of something like `ngFor` or `ngIf`.\n */\n private _getShadowRoot(): ShadowRoot | null {\n if (this._cachedShadowRoot === undefined) {\n this._cachedShadowRoot = _getShadowRoot(this._rootElement);\n }\n\n return this._cachedShadowRoot;\n }\n\n /** Gets the element into which the drag preview should be inserted. */\n private _getPreviewInsertionPoint(\n initialParent: HTMLElement,\n shadowRoot: ShadowRoot | null,\n ): HTMLElement {\n const previewContainer = this._previewContainer || 'global';\n\n if (previewContainer === 'parent') {\n return initialParent;\n }\n\n if (previewContainer === 'global') {\n const documentRef = this._document;\n\n // We can't use the body if the user is in fullscreen mode,\n // because the preview will render under the fullscreen element.\n // TODO(crisbeto): dedupe this with the `FullscreenOverlayContainer` eventually.\n return (\n shadowRoot ||\n documentRef.fullscreenElement ||\n (documentRef as any).webkitFullscreenElement ||\n (documentRef as any).mozFullScreenElement ||\n (documentRef as any).msFullscreenElement ||\n documentRef.body\n );\n }\n\n return coerceElement(previewContainer);\n }\n\n /** Lazily resolves and returns the dimensions of the preview. */\n private _getPreviewRect(): DOMRect {\n // Cache the preview element rect if we haven't cached it already or if\n // we cached it too early before the element dimensions were computed.\n if (!this._previewRect || (!this._previewRect.width && !this._previewRect.height)) {\n this._previewRect = this._preview\n ? this._preview!.getBoundingClientRect()\n : this._initialDomRect!;\n }\n\n return this._previewRect;\n }\n\n /** Handles a native `dragstart` event. */\n private _nativeDragStart = (event: DragEvent) => {\n if (this._handles.length) {\n const targetHandle = this._getTargetHandle(event);\n\n if (targetHandle && !this._disabledHandles.has(targetHandle) && !this.disabled) {\n event.preventDefault();\n }\n } else if (!this.disabled) {\n // Usually this isn't necessary since the we prevent the default action in `pointerDown`,\n // but some cases like dragging of links can slip through (see #24403).\n event.preventDefault();\n }\n };\n\n /** Gets a handle that is the target of an event. */\n private _getTargetHandle(event: Event): HTMLElement | undefined {\n return this._handles.find(handle => {\n return event.target && (event.target === handle || handle.contains(event.target as Node));\n });\n }\n\n /** Inserts the anchor element, if it's valid. */\n private _conditionallyInsertAnchor(\n newContainer: DropListRef,\n exitContainer: DropListRef,\n nextItemElement: HTMLElement | null,\n ) {\n // Remove the anchor when returning to the initial container.\n if (newContainer === this._initialContainer) {\n this._anchor?.remove();\n this._anchor = null;\n } else if (exitContainer === this._initialContainer && exitContainer.hasAnchor) {\n // Insert the anchor when leaving the initial container.\n const anchor = (this._anchor ??= deepCloneNode(this._placeholder));\n anchor.classList.remove(PLACEHOLDER_CLASS);\n anchor.classList.add('cdk-drag-anchor');\n\n // Clear the transform since the single-axis strategy uses transforms to sort the items.\n anchor.style.transform = '';\n\n // When the item leaves the initial container, the container's DOM will be restored to\n // its original state, except for the dragged item which is removed. Insert the anchor in\n // the position from which the item left so that the list looks consistent.\n if (nextItemElement) {\n nextItemElement.before(anchor);\n } else {\n coerceElement(exitContainer.element).appendChild(anchor);\n }\n }\n }\n}\n\n/** Clamps a value between a minimum and a maximum. */\nfunction clamp(value: number, min: number, max: number) {\n return Math.max(min, Math.min(max, value));\n}\n\n/** Determines whether an event is a touch event. */\nfunction isTouchEvent(event: MouseEvent | TouchEvent): event is TouchEvent {\n // This function is called for every pixel that the user has dragged so we need it to be\n // as fast as possible. Since we only bind mouse events and touch events, we can assume\n // that if the event's name starts with `t`, it's a touch event.\n return event.type[0] === 't';\n}\n\n/** Callback invoked for `selectstart` events inside the shadow DOM. */\nfunction shadowDomSelectStart(event: Event) {\n event.preventDefault();\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n/**\n * Moves an item one index in an array to another.\n * @param array Array in which to move the item.\n * @param fromIndex Starting index of the item.\n * @param toIndex Index to which the item should be moved.\n */\nexport function moveItemInArray<T = any>(array: T[], fromIndex: number, toIndex: number): void {\n const from = clamp(fromIndex, array.length - 1);\n const to = clamp(toIndex, array.length - 1);\n\n if (from === to) {\n return;\n }\n\n const target = array[from];\n const delta = to < from ? -1 : 1;\n\n for (let i = from; i !== to; i += delta) {\n array[i] = array[i + delta];\n }\n\n array[to] = target;\n}\n\n/**\n * Moves an item from one array to another.\n * @param currentArray Array from which to transfer the item.\n * @param targetArray Array into which to put the item.\n * @param currentIndex Index of the item in its current array.\n * @param targetIndex Index at which to insert the item.\n */\nexport function transferArrayItem<T = any>(\n currentArray: T[],\n targetArray: T[],\n currentIndex: number,\n targetIndex: number,\n): void {\n const from = clamp(currentIndex, currentArray.length - 1);\n const to = clamp(targetIndex, targetArray.length);\n\n if (currentArray.length) {\n targetArray.splice(to, 0, currentArray.splice(from, 1)[0]);\n }\n}\n\n/**\n * Copies an item from one array to another, leaving it in its\n * original position in current array.\n * @param currentArray Array from which to copy the item.\n * @param targetArray Array into which is copy the item.\n * @param currentIndex Index of the item in its current array.\n * @param targetIndex Index at which to insert the item.\n *\n */\nexport function copyArrayItem<T = any>(\n currentArray: T[],\n targetArray: T[],\n currentIndex: number,\n targetIndex: number,\n): void {\n const to = clamp(targetIndex, targetArray.length);\n\n if (currentArray.length) {\n targetArray.splice(to, 0, currentArray[currentIndex]);\n }\n}\n\n/** Clamps a number between zero and a maximum. */\nfunction clamp(value: number, max: number): number {\n return Math.max(0, Math.min(max, value));\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Direction} from '../../bidi';\nimport {DragDropRegistry} from '../drag-drop-registry';\nimport {moveItemInArray} from '../drag-utils';\nimport {combineTransforms} from '../dom/styling';\nimport {adjustDomRect, getMutableClientRect, isInsideClientRect} from '../dom/dom-rect';\nimport {DropListSortStrategy, SortPredicate} from './drop-list-sort-strategy';\nimport type {DragRef} from '../drag-ref';\n\n/**\n * Entry in the position cache for draggable items.\n * @docs-private\n */\ninterface CachedItemPosition<T> {\n /** Instance of the drag item. */\n drag: T;\n /** Dimensions of the item. */\n clientRect: DOMRect;\n /** Amount by which the item has been moved since dragging started. */\n offset: number;\n /** Inline transform that the drag item had when dragging started. */\n initialTransform: string;\n}\n\n/**\n * Strategy that only supports sorting along a single axis.\n * Items are reordered using CSS transforms which allows for sorting to be animated.\n * @docs-private\n */\nexport class SingleAxisSortStrategy implements DropListSortStrategy {\n /** Root element container of the drop list. */\n private _element!: HTMLElement;\n\n /** Function used to determine if an item can be sorted into a specific index. */\n private _sortPredicate!: SortPredicate<DragRef>;\n\n /** Cache of the dimensions of all the items inside the container. */\n private _itemPositions: CachedItemPosition<DragRef>[] = [];\n\n /**\n * Draggable items that are currently active inside the container. Includes the items\n * that were there at the start of the sequence, as well as any items that have been dragged\n * in, but haven't been dropped yet.\n */\n private _activeDraggables!: DragRef[];\n\n /** Direction in which the list is oriented. */\n orientation: 'vertical' | 'horizontal' = 'vertical';\n\n /** Layout direction of the drop list. */\n direction: Direction = 'ltr';\n\n constructor(private _dragDropRegistry: DragDropRegistry) {}\n\n /**\n * Keeps track of the item that was last swapped with the dragged item, as well as what direction\n * the pointer was moving in when the swap occurred and whether the user's pointer continued to\n * overlap with the swapped item after the swapping occurred.\n */\n private _previousSwap = {\n drag: null as DragRef | null,\n delta: 0,\n overlaps: false,\n };\n\n /**\n * To be called when the drag sequence starts.\n * @param items Items that are currently in the list.\n */\n start(items: readonly DragRef[]) {\n this.withItems(items);\n }\n\n /**\n * To be called when an item is being sorted.\n * @param item Item to be sorted.\n * @param pointerX Position of the item along the X axis.\n * @param pointerY Position of the item along the Y axis.\n * @param pointerDelta Direction in which the pointer is moving along each axis.\n */\n sort(item: DragRef, pointerX: number, pointerY: number, pointerDelta: {x: number; y: number}) {\n const siblings = this._itemPositions;\n const newIndex = this._getItemIndexFromPointerPosition(item, pointerX, pointerY, pointerDelta);\n\n if (newIndex === -1 && siblings.length > 0) {\n return null;\n }\n\n const isHorizontal = this.orientation === 'horizontal';\n const currentIndex = siblings.findIndex(currentItem => currentItem.drag === item);\n const siblingAtNewPosition = siblings[newIndex];\n const currentPosition = siblings[currentIndex].clientRect;\n const newPosition = siblingAtNewPosition.clientRect;\n const delta = currentIndex > newIndex ? 1 : -1;\n\n // How many pixels the item's placeholder should be offset.\n const itemOffset = this._getItemOffsetPx(currentPosition, newPosition, delta);\n\n // How many pixels all the other items should be offset.\n const siblingOffset = this._getSiblingOffsetPx(currentIndex, siblings, delta);\n\n // Save the previous order of the items before moving the item to its new index.\n // We use this to check whether an item has been moved as a result of the sorting.\n const oldOrder = siblings.slice();\n\n // Shuffle the array in place.\n moveItemInArray(siblings, currentIndex, newIndex);\n\n siblings.forEach((sibling, index) => {\n // Don't do anything if the position hasn't changed.\n if (oldOrder[index] === sibling) {\n return;\n }\n\n const isDraggedItem = sibling.drag === item;\n const offset = isDraggedItem ? itemOffset : siblingOffset;\n const elementToOffset = isDraggedItem\n ? item.getPlaceholderElement()\n : sibling.drag.getRootElement();\n\n // Update the offset to reflect the new position.\n sibling.offset += offset;\n\n const transformAmount = Math.round(sibling.offset * (1 / sibling.drag.scale));\n\n // Since we're moving the items with a `transform`, we need to adjust their cached\n // client rects to reflect their new position, as well as swap their positions in the cache.\n // Note that we shouldn't use `getBoundingClientRect` here to update the cache, because the\n // elements may be mid-animation which will give us a wrong result.\n if (isHorizontal) {\n // Round the transforms since some browsers will\n // blur the elements, for sub-pixel transforms.\n elementToOffset.style.transform = combineTransforms(\n `translate3d(${transformAmount}px, 0, 0)`,\n sibling.initialTransform,\n );\n adjustDomRect(sibling.clientRect, 0, offset);\n } else {\n elementToOffset.style.transform = combineTransforms(\n `translate3d(0, ${transformAmount}px, 0)`,\n sibling.initialTransform,\n );\n adjustDomRect(sibling.clientRect, offset, 0);\n }\n });\n\n // Note that it's important that we do this after the client rects have been adjusted.\n this._previousSwap.overlaps = isInsideClientRect(newPosition, pointerX, pointerY);\n this._previousSwap.drag = siblingAtNewPosition.drag;\n this._previousSwap.delta = isHorizontal ? pointerDelta.x : pointerDelta.y;\n\n return {previousIndex: currentIndex, currentIndex: newIndex};\n }\n\n /**\n * Called when an item is being moved into the container.\n * @param item Item that was moved into the container.\n * @param pointerX Position of the item along the X axis.\n * @param pointerY Position of the item along the Y axis.\n * @param index Index at which the item entered. If omitted, the container will try to figure it\n * out automatically.\n */\n enter(item: DragRef, pointerX: number, pointerY: number, index?: number): void {\n const newIndex =\n index == null || index < 0\n ? // We use the coordinates of where the item entered the drop\n // zone to figure out at which index it should be inserted.\n this._getItemIndexFromPointerPosition(item, pointerX, pointerY)\n : index;\n\n const activeDraggables = this._activeDraggables;\n const currentIndex = activeDraggables.indexOf(item);\n const placeholder = item.getPlaceholderElement();\n let newPositionReference: DragRef | undefined = activeDraggables[newIndex];\n\n // If the item at the new position is the same as the item that is being dragged,\n // it means that we're trying to restore the item to its initial position. In this\n // case we should use the next item from the list as the reference.\n if (newPositionReference === item) {\n newPositionReference = activeDraggables[newIndex + 1];\n }\n\n // If we didn't find a new position reference, it means that either the item didn't start off\n // in this container, or that the item requested to be inserted at the end of the list.\n if (\n !newPositionReference &&\n (newIndex == null || newIndex === -1 || newIndex < activeDraggables.length - 1) &&\n this._shouldEnterAsFirstChild(pointerX, pointerY)\n ) {\n newPositionReference = activeDraggables[0];\n }\n\n // Since the item may be in the `activeDraggables` already (e.g. if the user dragged it\n // into another container and back again), we have to ensure that it isn't duplicated.\n if (currentIndex > -1) {\n activeDraggables.splice(currentIndex, 1);\n }\n\n // Don't use items that are being dragged as a reference, because\n // their element has been moved down to the bottom of the body.\n if (newPositionReference && !this._dragDropRegistry.isDragging(newPositionReference)) {\n const element = newPositionReference.getRootElement();\n element.parentElement!.insertBefore(placeholder, element);\n activeDraggables.splice(newIndex, 0, item);\n } else {\n this._element.appendChild(placeholder);\n activeDraggables.push(item);\n }\n\n // The transform needs to be cleared so it doesn't throw off the measurements.\n placeholder.style.transform = '';\n\n // Note that usually `start` is called together with `enter` when an item goes into a new\n // container. This will cache item positions, but we need to refresh them since the amount\n // of items has changed.\n this._cacheItemPositions();\n }\n\n /** Sets the items that are currently part of the list. */\n withItems(items: readonly DragRef[]): void {\n this._activeDraggables = items.slice();\n this._cacheItemPositions();\n }\n\n /** Assigns a sort predicate to the strategy. */\n withSortPredicate(predicate: SortPredicate<DragRef>): void {\n this._sortPredicate = predicate;\n }\n\n /** Resets the strategy to its initial state before dragging was started. */\n reset() {\n // TODO(crisbeto): may have to wait for the animations to finish.\n this._activeDraggables?.forEach(item => {\n const rootElement = item.getRootElement();\n\n if (rootElement) {\n const initialTransform = this._itemPositions.find(p => p.drag === item)?.initialTransform;\n rootElement.style.transform = initialTransform || '';\n }\n });\n\n this._itemPositions = [];\n this._activeDraggables = [];\n this._previousSwap.drag = null;\n this._previousSwap.delta = 0;\n this._previousSwap.overlaps = false;\n }\n\n /**\n * Gets a snapshot of items currently in the list.\n * Can include items that we dragged in from another list.\n */\n getActiveItemsSnapshot(): readonly DragRef[] {\n return this._activeDraggables;\n }\n\n /** Gets the index of a specific item. */\n getItemIndex(item: DragRef): number {\n return this._getVisualItemPositions().findIndex(currentItem => currentItem.drag === item);\n }\n\n /** Gets the item at a specific index. */\n getItemAtIndex(index: number): DragRef | null {\n return this._getVisualItemPositions()[index]?.drag || null;\n }\n\n /** Used to notify the strategy that the scroll position has changed. */\n updateOnScroll(topDifference: number, leftDifference: number) {\n // Since we know the amount that the user has scrolled we can shift all of the\n // client rectangles ourselves. This is cheaper than re-measuring everything and\n // we can avoid inconsistent behavior where we might be measuring the element before\n // its position has changed.\n this._itemPositions.forEach(({clientRect}) => {\n adjustDomRect(clientRect, topDifference, leftDifference);\n });\n\n // We need two loops for this, because we want all of the cached\n // positions to be up-to-date before we re-sort the item.\n this._itemPositions.forEach(({drag}) => {\n if (this._dragDropRegistry.isDragging(drag)) {\n // We need to re-sort the item manually, because the pointer move\n // events won't be dispatched while the user is scrolling.\n drag._sortFromLastPointerPosition();\n }\n });\n }\n\n withElementContainer(container: HTMLElement): void {\n this._element = container;\n }\n\n /** Refreshes the position cache of the items and sibling containers. */\n private _cacheItemPositions() {\n const isHorizontal = this.orientation === 'horizontal';\n\n this._itemPositions = this._activeDraggables\n .map(drag => {\n const elementToMeasure = drag.getVisibleElement();\n return {\n drag,\n offset: 0,\n initialTransform: elementToMeasure.style.transform || '',\n clientRect: getMutableClientRect(elementToMeasure),\n };\n })\n .sort((a, b) => {\n return isHorizontal\n ? a.clientRect.left - b.clientRect.left\n : a.clientRect.top - b.clientRect.top;\n });\n }\n\n private _getVisualItemPositions() {\n // Items are sorted always by top/left in the cache, however they flow differently in RTL.\n // The rest of the logic still stands no matter what orientation we're in, however\n // we need to invert the array when determining the index.\n return this.orientation === 'horizontal' && this.direction === 'rtl'\n ? this._itemPositions.slice().reverse()\n : this._itemPositions;\n }\n\n /**\n * Gets the offset in pixels by which the item that is being dragged should be moved.\n * @param currentPosition Current position of the item.\n * @param newPosition Position of the item where the current item should be moved.\n * @param delta Direction in which the user is moving.\n */\n private _getItemOffsetPx(currentPosition: DOMRect, newPosition: DOMRect, delta: 1 | -1) {\n const isHorizontal = this.orientation === 'horizontal';\n let itemOffset = isHorizontal\n ? newPosition.left - currentPosition.left\n : newPosition.top - currentPosition.top;\n\n // Account for differences in the item width/height.\n if (delta === -1) {\n itemOffset += isHorizontal\n ? newPosition.width - currentPosition.width\n : newPosition.height - currentPosition.height;\n }\n\n return itemOffset;\n }\n\n /**\n * Gets the offset in pixels by which the items that aren't being dragged should be moved.\n * @param currentIndex Index of the item currently being dragged.\n * @param siblings All of the items in the list.\n * @param delta Direction in which the user is moving.\n */\n private _getSiblingOffsetPx(\n currentIndex: number,\n siblings: CachedItemPosition<DragRef>[],\n delta: 1 | -1,\n ) {\n const isHorizontal = this.orientation === 'horizontal';\n const currentPosition = siblings[currentIndex].clientRect;\n const immediateSibling = siblings[currentIndex + delta * -1];\n let siblingOffset = currentPosition[isHorizontal ? 'width' : 'height'] * delta;\n\n if (immediateSibling) {\n const start = isHorizontal ? 'left' : 'top';\n const end = isHorizontal ? 'right' : 'bottom';\n\n // Get the spacing between the start of the current item and the end of the one immediately\n // after it in the direction in which the user is dragging, or vice versa. We add it to the\n // offset in order to push the element to where it will be when it's inline and is influenced\n // by the `margin` of its siblings.\n if (delta === -1) {\n siblingOffset -= immediateSibling.clientRect[start] - currentPosition[end];\n } else {\n siblingOffset += currentPosition[start] - immediateSibling.clientRect[end];\n }\n }\n\n return siblingOffset;\n }\n\n /**\n * Checks if pointer is entering in the first position\n * @param pointerX Position of the user's pointer along the X axis.\n * @param pointerY Position of the user's pointer along the Y axis.\n */\n private _shouldEnterAsFirstChild(pointerX: number, pointerY: number) {\n if (!this._activeDraggables.length) {\n return false;\n }\n\n const itemPositions = this._itemPositions;\n const isHorizontal = this.orientation === 'horizontal';\n\n // `itemPositions` are sorted by position while `activeDraggables` are sorted by child index\n // check if container is using some sort of \"reverse\" ordering (eg: flex-direction: row-reverse)\n const reversed = itemPositions[0].drag !== this._activeDraggables[0];\n if (reversed) {\n const lastItemRect = itemPositions[itemPositions.length - 1].clientRect;\n return isHorizontal ? pointerX >= lastItemRect.right : pointerY >= lastItemRect.bottom;\n } else {\n const firstItemRect = itemPositions[0].clientRect;\n return isHorizontal ? pointerX <= firstItemRect.left : pointerY <= firstItemRect.top;\n }\n }\n\n /**\n * Gets the index of an item in the drop container, based on the position of the user's pointer.\n * @param item Item that is being sorted.\n * @param pointerX Position of the user's pointer along the X axis.\n * @param pointerY Position of the user's pointer along the Y axis.\n * @param delta Direction in which the user is moving their pointer.\n */\n private _getItemIndexFromPointerPosition(\n item: DragRef,\n pointerX: number,\n pointerY: number,\n delta?: {x: number; y: number},\n ): number {\n const isHorizontal = this.orientation === 'horizontal';\n const index = this._itemPositions.findIndex(({drag, clientRect}) => {\n // Skip the item itself.\n if (drag === item) {\n return false;\n }\n\n if (delta) {\n const direction = isHorizontal ? delta.x : delta.y;\n\n // If the user is still hovering over the same item as last time, their cursor hasn't left\n // the item after we made the swap, and they didn't change the direction in which they're\n // dragging, we don't consider it a direction swap.\n if (\n drag === this._previousSwap.drag &&\n this._previousSwap.overlaps &&\n direction === this._previousSwap.delta\n ) {\n return false;\n }\n }\n\n return isHorizontal\n ? // Round these down since most browsers report client rects with\n // sub-pixel precision, whereas the pointer coordinates are rounded to pixels.\n pointerX >= Math.floor(clientRect.left) && pointerX < Math.floor(clientRect.right)\n : pointerY >= Math.floor(clientRect.top) && pointerY < Math.floor(clientRect.bottom);\n });\n\n return index === -1 || !this._sortPredicate(index, item) ? -1 : index;\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {_getShadowRoot} from '../../platform';\nimport {moveItemInArray} from '../drag-utils';\nimport {DropListSortStrategy, SortPredicate} from './drop-list-sort-strategy';\nimport {DragDropRegistry} from '../drag-drop-registry';\nimport type {DragRef} from '../drag-ref';\n\n/**\n * Strategy that only supports sorting on a list that might wrap.\n * Items are reordered by moving their DOM nodes around.\n * @docs-private\n */\nexport class MixedSortStrategy implements DropListSortStrategy {\n /** Root element container of the drop list. */\n private _element!: HTMLElement;\n\n /** Function used to determine if an item can be sorted into a specific index. */\n private _sortPredicate!: SortPredicate<DragRef>;\n\n /** Lazily-resolved root node containing the list. Use `_getRootNode` to read this. */\n private _rootNode: DocumentOrShadowRoot | undefined;\n\n /**\n * Draggable items that are currently active inside the container. Includes the items\n * that were there at the start of the sequence, as well as any items that have been dragged\n * in, but haven't been dropped yet.\n */\n private _activeItems!: DragRef[];\n\n /**\n * Keeps track of the item that was last swapped with the dragged item, as well as what direction\n * the pointer was moving in when the swap occurred and whether the user's pointer continued to\n * overlap with the swapped item after the swapping occurred.\n */\n private _previousSwap = {\n drag: null as DragRef | null,\n deltaX: 0,\n deltaY: 0,\n overlaps: false,\n };\n\n /**\n * Keeps track of the relationship between a node and its next sibling. This information\n * is used to restore the DOM to the order it was in before dragging started.\n */\n private _relatedNodes: [node: Node, nextSibling: Node | null][] = [];\n\n constructor(\n private _document: Document,\n private _dragDropRegistry: DragDropRegistry,\n ) {}\n\n /**\n * To be called when the drag sequence starts.\n * @param items Items that are currently in the list.\n */\n start(items: readonly DragRef[]): void {\n const childNodes = this._element.childNodes;\n this._relatedNodes = [];\n\n for (let i = 0; i < childNodes.length; i++) {\n const node = childNodes[i];\n this._relatedNodes.push([node, node.nextSibling]);\n }\n\n this.withItems(items);\n }\n\n /**\n * To be called when an item is being sorted.\n * @param item Item to be sorted.\n * @param pointerX Position of the item along the X axis.\n * @param pointerY Position of the item along the Y axis.\n * @param pointerDelta Direction in which the pointer is moving along each axis.\n */\n sort(\n item: DragRef,\n pointerX: number,\n pointerY: number,\n pointerDelta: {x: number; y: number},\n ): {previousIndex: number; currentIndex: number} | null {\n const newIndex = this._getItemIndexFromPointerPosition(item, pointerX, pointerY);\n const previousSwap = this._previousSwap;\n\n if (newIndex === -1 || this._activeItems[newIndex] === item) {\n return null;\n }\n\n const toSwapWith = this._activeItems[newIndex];\n\n // Prevent too many swaps over the same item.\n if (\n previousSwap.drag === toSwapWith &&\n previousSwap.overlaps &&\n previousSwap.deltaX === pointerDelta.x &&\n previousSwap.deltaY === pointerDelta.y\n ) {\n return null;\n }\n\n const previousIndex = this.getItemIndex(item);\n const current = item.getPlaceholderElement();\n const overlapElement = toSwapWith.getRootElement();\n\n if (newIndex > previousIndex) {\n overlapElement.after(current);\n } else {\n overlapElement.before(current);\n }\n\n moveItemInArray(this._activeItems, previousIndex, newIndex);\n\n const newOverlapElement = this._getRootNode().elementFromPoint(pointerX, pointerY);\n // Note: it's tempting to save the entire `pointerDelta` object here, however that'll\n // break this functionality, because the same object is passed for all `sort` calls.\n previousSwap.deltaX = pointerDelta.x;\n previousSwap.deltaY = pointerDelta.y;\n previousSwap.drag = toSwapWith;\n previousSwap.overlaps =\n overlapElement === newOverlapElement || overlapElement.contains(newOverlapElement);\n\n return {\n previousIndex,\n currentIndex: newIndex,\n };\n }\n\n /**\n * Called when an item is being moved into the container.\n * @param item Item that was moved into the container.\n * @param pointerX Position of the item along the X axis.\n * @param pointerY Position of the item along the Y axis.\n * @param index Index at which the item entered. If omitted, the container will try to figure it\n * out automatically.\n */\n enter(item: DragRef, pointerX: number, pointerY: number, index?: number): void {\n // Remove the item from current set of items first so that it doesn't throw off the indexes\n // further down in this method. See https://github.com/angular/components/issues/31505\n const currentIndex = this._activeItems.indexOf(item);\n\n if (currentIndex > -1) {\n this._activeItems.splice(currentIndex, 1);\n }\n\n let enterIndex =\n index == null || index < 0\n ? this._getItemIndexFromPointerPosition(item, pointerX, pointerY)\n : index;\n\n // In some cases (e.g. when the container has padding) we might not be able to figure\n // out which item to insert the dragged item next to, because the pointer didn't overlap\n // with anything. In that case we find the item that's closest to the pointer.\n if (enterIndex === -1) {\n enterIndex = this._getClosestItemIndexToPointer(item, pointerX, pointerY);\n }\n\n const targetItem = this._activeItems[enterIndex] as DragRef | undefined;\n\n if (targetItem && !this._dragDropRegistry.isDragging(targetItem)) {\n this._activeItems.splice(enterIndex, 0, item);\n targetItem.getRootElement().before(item.getPlaceholderElement());\n } else {\n this._activeItems.push(item);\n this._element.appendChild(item.getPlaceholderElement());\n }\n }\n\n /** Sets the items that are currently part of the list. */\n withItems(items: readonly DragRef[]): void {\n this._activeItems = items.slice();\n }\n\n /** Assigns a sort predicate to the strategy. */\n withSortPredicate(predicate: SortPredicate<DragRef>): void {\n this._sortPredicate = predicate;\n }\n\n /** Resets the strategy to its initial state before dragging was started. */\n reset(): void {\n const root = this._element;\n const previousSwap = this._previousSwap;\n\n // Moving elements around in the DOM can break things like the `@for` loop, because it\n // uses comment nodes to know where to insert elements. To avoid such issues, we restore\n // the DOM nodes in the list to their original order when the list is reset.\n // Note that this could be simpler if we just saved all the nodes, cleared the root\n // and then appended them in the original order. We don't do it, because it can break\n // down depending on when the snapshot was taken. E.g. we may end up snapshotting the\n // placeholder element which is removed after dragging.\n for (let i = this._relatedNodes.length - 1; i > -1; i--) {\n const [node, nextSibling] = this._relatedNodes[i];\n if (node.parentNode === root && node.nextSibling !== nextSibling) {\n if (nextSibling === null) {\n root.appendChild(node);\n } else if (nextSibling.parentNode === root) {\n root.insertBefore(node, nextSibling);\n }\n }\n }\n\n this._relatedNodes = [];\n this._activeItems = [];\n previousSwap.drag = null;\n previousSwap.deltaX = previousSwap.deltaY = 0;\n previousSwap.overlaps = false;\n }\n\n /**\n * Gets a snapshot of items currently in the list.\n * Can include items that we dragged in from another list.\n */\n getActiveItemsSnapshot(): readonly DragRef[] {\n return this._activeItems;\n }\n\n /** Gets the index of a specific item. */\n getItemIndex(item: DragRef): number {\n return this._activeItems.indexOf(item);\n }\n\n /** Gets the item at a specific index. */\n getItemAtIndex(index: number): DragRef | null {\n return this._activeItems[index] || null;\n }\n\n /** Used to notify the strategy that the scroll position has changed. */\n updateOnScroll(): void {\n this._activeItems.forEach(item => {\n if (this._dragDropRegistry.isDragging(item)) {\n // We need to re-sort the item manually, because the pointer move\n // events won't be dispatched while the user is scrolling.\n item._sortFromLastPointerPosition();\n }\n });\n }\n\n withElementContainer(container: HTMLElement): void {\n if (container !== this._element) {\n this._element = container;\n this._rootNode = undefined;\n }\n }\n\n /**\n * Gets the index of an item in the drop container, based on the position of the user's pointer.\n * @param item Item that is being sorted.\n * @param pointerX Position of the user's pointer along the X axis.\n * @param pointerY Position of the user's pointer along the Y axis.\n * @param delta Direction in which the user is moving their pointer.\n */\n private _getItemIndexFromPointerPosition(\n item: DragRef,\n pointerX: number,\n pointerY: number,\n ): number {\n const elementAtPoint = this._getRootNode().elementFromPoint(\n Math.floor(pointerX),\n Math.floor(pointerY),\n );\n const index = elementAtPoint\n ? this._activeItems.findIndex(item => {\n const root = item.getRootElement();\n return elementAtPoint === root || root.contains(elementAtPoint);\n })\n : -1;\n return index === -1 || !this._sortPredicate(index, item) ? -1 : index;\n }\n\n /** Lazily resolves the list's root node. */\n private _getRootNode(): DocumentOrShadowRoot {\n // Resolve the root node lazily to ensure that the drop list is in its final place in the DOM.\n if (!this._rootNode) {\n this._rootNode = _getShadowRoot(this._element) || this._document;\n }\n return this._rootNode;\n }\n\n /**\n * Finds the index of the item that's closest to the item being dragged.\n * @param item Item being dragged.\n * @param pointerX Position of the user's pointer along the X axis.\n * @param pointerY Position of the user's pointer along the Y axis.\n */\n private _getClosestItemIndexToPointer(item: DragRef, pointerX: number, pointerY: number): number {\n if (this._activeItems.length === 0) {\n return -1;\n }\n\n if (this._activeItems.length === 1) {\n return 0;\n }\n\n let minDistance = Infinity;\n let minIndex = -1;\n\n // Find the Euclidean distance (https://en.wikipedia.org/wiki/Euclidean_distance) between each\n // item and the pointer, and return the smallest one. Note that this is a bit flawed in that DOM\n // nodes are rectangles, not points, so we use the top/left coordinates. It should be enough\n // for our purposes.\n for (let i = 0; i < this._activeItems.length; i++) {\n const current = this._activeItems[i];\n if (current !== item) {\n const {x, y} = current.getRootElement().getBoundingClientRect();\n const distance = Math.hypot(pointerX - x, pointerY - y);\n\n if (distance < minDistance) {\n minDistance = distance;\n minIndex = i;\n }\n }\n }\n\n return minIndex;\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {DOCUMENT, ElementRef, Injector, NgZone} from '@angular/core';\nimport {Direction} from '../bidi';\nimport {coerceElement} from '../coercion';\nimport {ViewportRuler} from '../scrolling';\nimport {_getShadowRoot} from '../platform';\nimport {Subject, Subscription, interval, animationFrameScheduler} from 'rxjs';\nimport {takeUntil} from 'rxjs/operators';\nimport {DragDropRegistry} from './drag-drop-registry';\nimport type {DragRef, Point} from './drag-ref';\nimport {isPointerNearDomRect, isInsideClientRect} from './dom/dom-rect';\nimport {ParentPositionTracker} from './dom/parent-position-tracker';\nimport {DragCSSStyleDeclaration} from './dom/styling';\nimport {DropListSortStrategy} from './sorting/drop-list-sort-strategy';\nimport {SingleAxisSortStrategy} from './sorting/single-axis-sort-strategy';\nimport {MixedSortStrategy} from './sorting/mixed-sort-strategy';\nimport {DropListOrientation} from './directives/config';\n\n/**\n * Proximity, as a ratio to width/height, at which a\n * dragged item will affect the drop container.\n */\nconst DROP_PROXIMITY_THRESHOLD = 0.05;\n\n/**\n * Proximity, as a ratio to width/height at which to start auto-scrolling the drop list or the\n * viewport. The value comes from trying it out manually until it feels right.\n */\nconst SCROLL_PROXIMITY_THRESHOLD = 0.05;\n\n/** Vertical direction in which we can auto-scroll. */\nenum AutoScrollVerticalDirection {\n NONE,\n UP,\n DOWN,\n}\n\n/** Horizontal direction in which we can auto-scroll. */\nenum AutoScrollHorizontalDirection {\n NONE,\n LEFT,\n RIGHT,\n}\n\n/**\n * Creates a `DropListRef` for an element, turning it into a drop list.\n * @param injector Injector used to resolve dependencies.\n * @param element Element to which to attach the drop list functionality.\n */\nexport function createDropListRef<T = unknown>(\n injector: Injector,\n element: ElementRef<HTMLElement> | HTMLElement,\n): DropListRef<T> {\n return new DropListRef(\n element,\n injector.get(DragDropRegistry),\n injector.get(DOCUMENT),\n injector.get(NgZone),\n injector.get(ViewportRuler),\n );\n}\n\n/**\n * Reference to a drop list. Used to manipulate or dispose of the container.\n */\nexport class DropListRef<T = any> {\n /** Element that the drop list is attached to. */\n element: HTMLElement | ElementRef<HTMLElement>;\n\n /** Whether starting a dragging sequence from this container is disabled. */\n disabled: boolean = false;\n\n /** Whether sorting items within the list is disabled. */\n sortingDisabled: boolean = false;\n\n /** Locks the position of the draggable elements inside the container along the specified axis. */\n lockAxis: 'x' | 'y' | null = null;\n\n /**\n * Whether auto-scrolling the view when the user\n * moves their pointer close to the edges is disabled.\n */\n autoScrollDisabled: boolean = false;\n\n /** Number of pixels to scroll for each frame when auto-scrolling an element. */\n autoScrollStep: number = 2;\n\n /**\n * Whether the items in the list should leave an anchor node when leaving the initial container.\n */\n hasAnchor: boolean = false;\n\n /**\n * Function that is used to determine whether an item\n * is allowed to be moved into a drop container.\n */\n enterPredicate: (drag: DragRef, drop: DropListRef) => boolean = () => true;\n\n /** Function that is used to determine whether an item can be sorted into a particular index. */\n sortPredicate: (index: number, drag: DragRef, drop: DropListRef) => boolean = () => true;\n\n /** Emits right before dragging has started. */\n readonly beforeStarted = new Subject<void>();\n\n /**\n * Emits when the user has moved a new drag item into this container.\n */\n readonly entered = new Subject<{item: DragRef; container: DropListRef; currentIndex: number}>();\n\n /**\n * Emits when the user removes an item from the container\n * by dragging it into another container.\n */\n readonly exited = new Subject<{item: DragRef; container: DropListRef}>();\n\n /** Emits when the user drops an item inside the container. */\n readonly dropped = new Subject<{\n item: DragRef;\n currentIndex: number;\n previousIndex: number;\n container: DropListRef;\n previousContainer: DropListRef;\n isPointerOverContainer: boolean;\n distance: Point;\n dropPoint: Point;\n event: MouseEvent | TouchEvent;\n }>();\n\n /** Emits as the user is swapping items while actively dragging. */\n readonly sorted = new Subject<{\n previousIndex: number;\n currentIndex: number;\n container: DropListRef;\n item: DragRef;\n }>();\n\n /** Emits when a dragging sequence is started in a list connected to the current one. */\n readonly receivingStarted = new Subject<{\n receiver: DropListRef;\n initiator: DropListRef;\n items: DragRef[];\n }>();\n\n /** Emits when a dragging sequence is stopped from a list connected to the current one. */\n readonly receivingStopped = new Subject<{\n receiver: DropListRef;\n initiator: DropListRef;\n }>();\n\n /** Arbitrary data that can be attached to the drop list. */\n data!: T;\n\n /** Element that is the direct parent of the drag items. */\n private _container!: HTMLElement;\n\n /** Whether an item in the list is being dragged. */\n private _isDragging = false;\n\n /** Keeps track of the positions of any parent scrollable elements. */\n private _parentPositions: ParentPositionTracker;\n\n /** Strategy being used to sort items within the list. */\n private _sortStrategy!: DropListSortStrategy;\n\n /** Cached `DOMRect` of the drop list. */\n private _domRect: DOMRect | undefined;\n\n /** Draggable items in the container. */\n private _draggables: readonly DragRef[] = [];\n\n /** Drop lists that are connected to the current one. */\n private _siblings: readonly DropListRef[] = [];\n\n /** Connected siblings that currently have a dragged item. */\n private _activeSiblings = new Set<DropListRef>();\n\n /** Subscription to the window being scrolled. */\n private _viewportScrollSubscription = Subscription.EMPTY;\n\n /** Vertical direction in which the list is currently scrolling. */\n private _verticalScrollDirection = AutoScrollVerticalDirection.NONE;\n\n /** Horizontal direction in which the list is currently scrolling. */\n private _horizontalScrollDirection = AutoScrollHorizontalDirection.NONE;\n\n /** Node that is being auto-scrolled. */\n private _scrollNode!: HTMLElement | Window;\n\n /** Used to signal to the current auto-scroll sequence when to stop. */\n private readonly _stopScrollTimers = new Subject<void>();\n\n /** Shadow root of the current element. Necessary for `elementFromPoint` to resolve correctly. */\n private _cachedShadowRoot: DocumentOrShadowRoot | null = null;\n\n /** Reference to the document. */\n private _document: Document;\n\n /** Elements that can be scrolled while the user is dragging. */\n private _scrollableElements: HTMLElement[] = [];\n\n /** Initial value for the element's `scroll-snap-type` style. */\n private _initialScrollSnap!: string;\n\n /** Direction of the list's layout. */\n private _direction: Direction = 'ltr';\n\n constructor(\n element: ElementRef<HTMLElement> | HTMLElement,\n private _dragDropRegistry: DragDropRegistry,\n _document: any,\n private _ngZone: NgZone,\n private _viewportRuler: ViewportRuler,\n ) {\n const coercedElement = (this.element = coerceElement(element));\n this._document = _document;\n this.withOrientation('vertical').withElementContainer(coercedElement);\n _dragDropRegistry.registerDropContainer(this);\n this._parentPositions = new ParentPositionTracker(_document);\n }\n\n /** Removes the drop list functionality from the DOM element. */\n dispose() {\n this._stopScrolling();\n this._stopScrollTimers.complete();\n this._viewportScrollSubscription.unsubscribe();\n this.beforeStarted.complete();\n this.entered.complete();\n this.exited.complete();\n this.dropped.complete();\n this.sorted.complete();\n this.receivingStarted.complete();\n this.receivingStopped.complete();\n this._activeSiblings.clear();\n this._scrollNode = null!;\n this._parentPositions.clear();\n this._dragDropRegistry.removeDropContainer(this);\n }\n\n /** Whether an item from this list is currently being dragged. */\n isDragging() {\n return this._isDragging;\n }\n\n /** Starts dragging an item. */\n start(): void {\n this._draggingStarted();\n this._notifyReceivingSiblings();\n }\n\n /**\n * Attempts to move an item into the container.\n * @param item Item that was moved into the container.\n * @param pointerX Position of the item along the X axis.\n * @param pointerY Position of the item along the Y axis.\n * @param index Index at which the item entered. If omitted, the container will try to figure it\n * out automatically.\n */\n enter(item: DragRef, pointerX: number, pointerY: number, index?: number): void {\n this._draggingStarted();\n\n // If sorting is disabled, we want the item to return to its starting\n // position if the user is returning it to its initial container.\n if (index == null && this.sortingDisabled) {\n index = this._draggables.indexOf(item);\n }\n\n this._sortStrategy.enter(item, pointerX, pointerY, index);\n\n // Note that this usually happens inside `_draggingStarted` as well, but the dimensions\n // can change when the sort strategy moves the item around inside `enter`.\n this._cacheParentPositions();\n\n // Notify siblings at the end so that the item has been inserted into the `activeDraggables`.\n this._notifyReceivingSiblings();\n this.entered.next({item, container: this, currentIndex: this.getItemIndex(item)});\n }\n\n /**\n * Removes an item from the container after it was dragged into another container by the user.\n * @param item Item that was dragged out.\n */\n exit(item: DragRef): void {\n this._reset();\n this.exited.next({item, container: this});\n }\n\n /**\n * Drops an item into this container.\n * @param item Item being dropped into the container.\n * @param currentIndex Index at which the item should be inserted.\n * @param previousIndex Index of the item when dragging started.\n * @param previousContainer Container from which the item got dragged in.\n * @param isPointerOverContainer Whether the user's pointer was over the\n * container when the item was dropped.\n * @param distance Distance the user has dragged since the start of the dragging sequence.\n * @param event Event that triggered the dropping sequence.\n *\n * @breaking-change 15.0.0 `previousIndex` and `event` parameters to become required.\n */\n drop(\n item: DragRef,\n currentIndex: number,\n previousIndex: number,\n previousContainer: DropListRef,\n isPointerOverContainer: boolean,\n distance: Point,\n dropPoint: Point,\n event: MouseEvent | TouchEvent = {} as any,\n ): void {\n this._reset();\n this.dropped.next({\n item,\n currentIndex,\n previousIndex,\n container: this,\n previousContainer,\n isPointerOverContainer,\n distance,\n dropPoint,\n event,\n });\n }\n\n /**\n * Sets the draggable items that are a part of this list.\n * @param items Items that are a part of this list.\n */\n withItems(items: DragRef[]): this {\n const previousItems = this._draggables;\n this._draggables = items;\n items.forEach(item => item._withDropContainer(this));\n\n if (this.isDragging()) {\n const draggedItems = previousItems.filter(item => item.isDragging());\n\n // If all of the items being dragged were removed\n // from the list, abort the current drag sequence.\n if (draggedItems.every(item => items.indexOf(item) === -1)) {\n this._reset();\n } else {\n this._sortStrategy.withItems(this._draggables);\n }\n }\n\n return this;\n }\n\n /** Sets the layout direction of the drop list. */\n withDirection(direction: Direction): this {\n this._direction = direction;\n if (this._sortStrategy instanceof SingleAxisSortStrategy) {\n this._sortStrategy.direction = direction;\n }\n return this;\n }\n\n /**\n * Sets the containers that are connected to this one. When two or more containers are\n * connected, the user will be allowed to transfer items between them.\n * @param connectedTo Other containers that the current containers should be connected to.\n */\n connectedTo(connectedTo: DropListRef[]): this {\n this._siblings = connectedTo.slice();\n return this;\n }\n\n /**\n * Sets the orientation of the container.\n * @param orientation New orientation for the container.\n */\n withOrientation(orientation: DropListOrientation): this {\n if (orientation === 'mixed') {\n this._sortStrategy = new MixedSortStrategy(this._document, this._dragDropRegistry);\n } else {\n const strategy = new SingleAxisSortStrategy(this._dragDropRegistry);\n strategy.direction = this._direction;\n strategy.orientation = orientation;\n this._sortStrategy = strategy;\n }\n this._sortStrategy.withElementContainer(this._container);\n this._sortStrategy.withSortPredicate((index, item) => this.sortPredicate(index, item, this));\n return this;\n }\n\n /**\n * Sets which parent elements are can be scrolled while the user is dragging.\n * @param elements Elements that can be scrolled.\n */\n withScrollableParents(elements: HTMLElement[]): this {\n const element = this._container;\n\n // We always allow the current element to be scrollable\n // so we need to ensure that it's in the array.\n this._scrollableElements =\n elements.indexOf(element) === -1 ? [element, ...elements] : elements.slice();\n return this;\n }\n\n /**\n * Configures the drop list so that a different element is used as the container for the\n * dragged items. This is useful for the cases when one might not have control over the\n * full DOM that sets up the dragging.\n * Note that the alternate container needs to be a descendant of the drop list.\n * @param container New element container to be assigned.\n */\n withElementContainer(container: HTMLElement): this {\n if (container === this._container) {\n return this;\n }\n\n const element = coerceElement(this.element);\n\n if (\n (typeof ngDevMode === 'undefined' || ngDevMode) &&\n container !== element &&\n !element.contains(container)\n ) {\n throw new Error(\n 'Invalid DOM structure for drop list. Alternate container element must be a descendant of the drop list.',\n );\n }\n\n const oldContainerIndex = this._scrollableElements.indexOf(this._container);\n const newContainerIndex = this._scrollableElements.indexOf(container);\n\n if (oldContainerIndex > -1) {\n this._scrollableElements.splice(oldContainerIndex, 1);\n }\n\n if (newContainerIndex > -1) {\n this._scrollableElements.splice(newContainerIndex, 1);\n }\n\n if (this._sortStrategy) {\n this._sortStrategy.withElementContainer(container);\n }\n\n this._cachedShadowRoot = null;\n this._scrollableElements.unshift(container);\n this._container = container;\n return this;\n }\n\n /** Gets the scrollable parents that are registered with this drop container. */\n getScrollableParents(): readonly HTMLElement[] {\n return this._scrollableElements;\n }\n\n /**\n * Figures out the index of an item in the container.\n * @param item Item whose index should be determined.\n */\n getItemIndex(item: DragRef): number {\n return this._isDragging\n ? this._sortStrategy.getItemIndex(item)\n : this._draggables.indexOf(item);\n }\n\n /**\n * Gets the item at a specific index.\n * @param index Index at which to retrieve the item.\n */\n getItemAtIndex(index: number): DragRef | null {\n return this._isDragging\n ? this._sortStrategy.getItemAtIndex(index)\n : this._draggables[index] || null;\n }\n\n /**\n * Whether the list is able to receive the item that\n * is currently being dragged inside a connected drop list.\n */\n isReceiving(): boolean {\n return this._activeSiblings.size > 0;\n }\n\n /**\n * Sorts an item inside the container based on its position.\n * @param item Item to be sorted.\n * @param pointerX Position of the item along the X axis.\n * @param pointerY Position of the item along the Y axis.\n * @param pointerDelta Direction in which the pointer is moving along each axis.\n */\n _sortItem(\n item: DragRef,\n pointerX: number,\n pointerY: number,\n pointerDelta: {x: number; y: number},\n ): void {\n // Don't sort the item if sorting is disabled or it's out of range.\n if (\n this.sortingDisabled ||\n !this._domRect ||\n !isPointerNearDomRect(this._domRect, DROP_PROXIMITY_THRESHOLD, pointerX, pointerY)\n ) {\n return;\n }\n\n const result = this._sortStrategy.sort(item, pointerX, pointerY, pointerDelta);\n\n if (result) {\n this.sorted.next({\n previousIndex: result.previousIndex,\n currentIndex: result.currentIndex,\n container: this,\n item,\n });\n }\n }\n\n /**\n * Checks whether the user's pointer is close to the edges of either the\n * viewport or the drop list and starts the auto-scroll sequence.\n * @param pointerX User's pointer position along the x axis.\n * @param pointerY User's pointer position along the y axis.\n */\n _startScrollingIfNecessary(pointerX: number, pointerY: number) {\n if (this.autoScrollDisabled) {\n return;\n }\n\n let scrollNode: HTMLElement | Window | undefined;\n let verticalScrollDirection = AutoScrollVerticalDirection.NONE;\n let horizontalScrollDirection = AutoScrollHorizontalDirection.NONE;\n\n // Check whether we should start scrolling any of the parent containers.\n this._parentPositions.positions.forEach((position, element) => {\n // We have special handling for the `document` below. Also this would be\n // nicer with a for...of loop, but it requires changing a compiler flag.\n if (element === this._document || !position.clientRect || scrollNode) {\n return;\n }\n\n if (isPointerNearDomRect(position.clientRect, DROP_PROXIMITY_THRESHOLD, pointerX, pointerY)) {\n [verticalScrollDirection, horizontalScrollDirection] = getElementScrollDirections(\n element as HTMLElement,\n position.clientRect,\n this._direction,\n pointerX,\n pointerY,\n );\n\n if (verticalScrollDirection || horizontalScrollDirection) {\n scrollNode = element as HTMLElement;\n }\n }\n });\n\n // Otherwise check if we can start scrolling the viewport.\n if (!verticalScrollDirection && !horizontalScrollDirection) {\n const {width, height} = this._viewportRuler.getViewportSize();\n const domRect = {\n width,\n height,\n top: 0,\n right: width,\n bottom: height,\n left: 0,\n } as DOMRect;\n verticalScrollDirection = getVerticalScrollDirection(domRect, pointerY);\n horizontalScrollDirection = getHorizontalScrollDirection(domRect, pointerX);\n scrollNode = window;\n }\n\n if (\n scrollNode &&\n (verticalScrollDirection !== this._verticalScrollDirection ||\n horizontalScrollDirection !== this._horizontalScrollDirection ||\n scrollNode !== this._scrollNode)\n ) {\n this._verticalScrollDirection = verticalScrollDirection;\n this._horizontalScrollDirection = horizontalScrollDirection;\n this._scrollNode = scrollNode;\n\n if ((verticalScrollDirection || horizontalScrollDirection) && scrollNode) {\n this._ngZone.runOutsideAngular(this._startScrollInterval);\n } else {\n this._stopScrolling();\n }\n }\n }\n\n /** Stops any currently-running auto-scroll sequences. */\n _stopScrolling() {\n this._stopScrollTimers.next();\n }\n\n /** Starts the dragging sequence within the list. */\n private _draggingStarted() {\n const styles = this._container.style as DragCSSStyleDeclaration;\n this.beforeStarted.next();\n this._isDragging = true;\n\n if (\n (typeof ngDevMode === 'undefined' || ngDevMode) &&\n // Prevent the check from running on apps not using an alternate container. Ideally we\n // would always run it, but introducing it at this stage would be a breaking change.\n this._container !== coerceElement(this.element)\n ) {\n for (const drag of this._draggables) {\n if (!drag.isDragging() && drag.getVisibleElement().parentNode !== this._container) {\n throw new Error(\n 'Invalid DOM structure for drop list. All items must be placed directly inside of the element container.',\n );\n }\n }\n }\n\n // We need to disable scroll snapping while the user is dragging, because it breaks automatic\n // scrolling. The browser seems to round the value based on the snapping points which means\n // that we can't increment/decrement the scroll position.\n this._initialScrollSnap = styles.msScrollSnapType || styles.scrollSnapType || '';\n styles.scrollSnapType = styles.msScrollSnapType = 'none';\n this._sortStrategy.start(this._draggables);\n this._cacheParentPositions();\n this._viewportScrollSubscription.unsubscribe();\n this._listenToScrollEvents();\n }\n\n /** Caches the positions of the configured scrollable parents. */\n private _cacheParentPositions() {\n this._parentPositions.cache(this._scrollableElements);\n\n // The list element is always in the `scrollableElements`\n // so we can take advantage of the cached `DOMRect`.\n this._domRect = this._parentPositions.positions.get(this._container)!.clientRect!;\n }\n\n /** Resets the container to its initial state. */\n private _reset() {\n this._isDragging = false;\n const styles = this._container.style as DragCSSStyleDeclaration;\n styles.scrollSnapType = styles.msScrollSnapType = this._initialScrollSnap;\n\n this._siblings.forEach(sibling => sibling._stopReceiving(this));\n this._sortStrategy.reset();\n this._stopScrolling();\n this._viewportScrollSubscription.unsubscribe();\n this._parentPositions.clear();\n }\n\n /** Starts the interval that'll auto-scroll the element. */\n private _startScrollInterval = () => {\n this._stopScrolling();\n\n interval(0, animationFrameScheduler)\n .pipe(takeUntil(this._stopScrollTimers))\n .subscribe(() => {\n const node = this._scrollNode;\n const scrollStep = this.autoScrollStep;\n\n if (this._verticalScrollDirection === AutoScrollVerticalDirection.UP) {\n node.scrollBy(0, -scrollStep);\n } else if (this._verticalScrollDirection === AutoScrollVerticalDirection.DOWN) {\n node.scrollBy(0, scrollStep);\n }\n\n if (this._horizontalScrollDirection === AutoScrollHorizontalDirection.LEFT) {\n node.scrollBy(-scrollStep, 0);\n } else if (this._horizontalScrollDirection === AutoScrollHorizontalDirection.RIGHT) {\n node.scrollBy(scrollStep, 0);\n }\n });\n };\n\n /**\n * Checks whether the user's pointer is positioned over the container.\n * @param x Pointer position along the X axis.\n * @param y Pointer position along the Y axis.\n */\n _isOverContainer(x: number, y: number): boolean {\n return this._domRect != null && isInsideClientRect(this._domRect, x, y);\n }\n\n /**\n * Figures out whether an item should be moved into a sibling\n * drop container, based on its current position.\n * @param item Drag item that is being moved.\n * @param x Position of the item along the X axis.\n * @param y Position of the item along the Y axis.\n */\n _getSiblingContainerFromPosition(item: DragRef, x: number, y: number): DropListRef | undefined {\n return this._siblings.find(sibling => sibling._canReceive(item, x, y));\n }\n\n /**\n * Checks whether the drop list can receive the passed-in item.\n * @param item Item that is being dragged into the list.\n * @param x Position of the item along the X axis.\n * @param y Position of the item along the Y axis.\n */\n _canReceive(item: DragRef, x: number, y: number): boolean {\n if (\n !this._domRect ||\n !isInsideClientRect(this._domRect, x, y) ||\n !this.enterPredicate(item, this)\n ) {\n return false;\n }\n\n const elementFromPoint = this._getShadowRoot().elementFromPoint(x, y) as HTMLElement | null;\n\n // If there's no element at the pointer position, then\n // the client rect is probably scrolled out of the view.\n if (!elementFromPoint) {\n return false;\n }\n\n // The `DOMRect`, that we're using to find the container over which the user is\n // hovering, doesn't give us any information on whether the element has been scrolled\n // out of the view or whether it's overlapping with other containers. This means that\n // we could end up transferring the item into a container that's invisible or is positioned\n // below another one. We use the result from `elementFromPoint` to get the top-most element\n // at the pointer position and to find whether it's one of the intersecting drop containers.\n return elementFromPoint === this._container || this._container.contains(elementFromPoint);\n }\n\n /**\n * Called by one of the connected drop lists when a dragging sequence has started.\n * @param sibling Sibling in which dragging has started.\n */\n _startReceiving(sibling: DropListRef, items: DragRef[]) {\n const activeSiblings = this._activeSiblings;\n\n if (\n !activeSiblings.has(sibling) &&\n items.every(item => {\n // Note that we have to add an exception to the `enterPredicate` for items that started off\n // in this drop list. The drag ref has logic that allows an item to return to its initial\n // container, if it has left the initial container and none of the connected containers\n // allow it to enter. See `DragRef._updateActiveDropContainer` for more context.\n return this.enterPredicate(item, this) || this._draggables.indexOf(item) > -1;\n })\n ) {\n activeSiblings.add(sibling);\n this._cacheParentPositions();\n this._listenToScrollEvents();\n this.receivingStarted.next({\n initiator: sibling,\n receiver: this,\n items,\n });\n }\n }\n\n /**\n * Called by a connected drop list when dragging has stopped.\n * @param sibling Sibling whose dragging has stopped.\n */\n _stopReceiving(sibling: DropListRef) {\n this._activeSiblings.delete(sibling);\n this._viewportScrollSubscription.unsubscribe();\n this.receivingStopped.next({initiator: sibling, receiver: this});\n }\n\n /**\n * Starts listening to scroll events on the viewport.\n * Used for updating the internal state of the list.\n */\n private _listenToScrollEvents() {\n this._viewportScrollSubscription = this._dragDropRegistry\n .scrolled(this._getShadowRoot())\n .subscribe(event => {\n if (this.isDragging()) {\n const scrollDifference = this._parentPositions.handleScroll(event);\n\n if (scrollDifference) {\n this._sortStrategy.updateOnScroll(scrollDifference.top, scrollDifference.left);\n }\n } else if (this.isReceiving()) {\n this._cacheParentPositions();\n }\n });\n }\n\n /**\n * Lazily resolves and returns the shadow root of the element. We do this in a function, rather\n * than saving it in property directly on init, because we want to resolve it as late as possible\n * in order to ensure that the element has been moved into the shadow DOM. Doing it inside the\n * constructor might be too early if the element is inside of something like `ngFor` or `ngIf`.\n */\n private _getShadowRoot(): DocumentOrShadowRoot {\n if (!this._cachedShadowRoot) {\n const shadowRoot = _getShadowRoot(this._container);\n this._cachedShadowRoot = shadowRoot || this._document;\n }\n\n return this._cachedShadowRoot;\n }\n\n /** Notifies any siblings that may potentially receive the item. */\n private _notifyReceivingSiblings() {\n const draggedItems = this._sortStrategy\n .getActiveItemsSnapshot()\n .filter(item => item.isDragging());\n this._siblings.forEach(sibling => sibling._startReceiving(this, draggedItems));\n }\n}\n\n/**\n * Gets whether the vertical auto-scroll direction of a node.\n * @param clientRect Dimensions of the node.\n * @param pointerY Position of the user's pointer along the y axis.\n */\nfunction getVerticalScrollDirection(clientRect: DOMRect, pointerY: number) {\n const {top, bottom, height} = clientRect;\n const yThreshold = height * SCROLL_PROXIMITY_THRESHOLD;\n\n if (pointerY >= top - yThreshold && pointerY <= top + yThreshold) {\n return AutoScrollVerticalDirection.UP;\n } else if (pointerY >= bottom - yThreshold && pointerY <= bottom + yThreshold) {\n return AutoScrollVerticalDirection.DOWN;\n }\n\n return AutoScrollVerticalDirection.NONE;\n}\n\n/**\n * Gets whether the horizontal auto-scroll direction of a node.\n * @param clientRect Dimensions of the node.\n * @param pointerX Position of the user's pointer along the x axis.\n */\nfunction getHorizontalScrollDirection(clientRect: DOMRect, pointerX: number) {\n const {left, right, width} = clientRect;\n const xThreshold = width * SCROLL_PROXIMITY_THRESHOLD;\n\n if (pointerX >= left - xThreshold && pointerX <= left + xThreshold) {\n return AutoScrollHorizontalDirection.LEFT;\n } else if (pointerX >= right - xThreshold && pointerX <= right + xThreshold) {\n return AutoScrollHorizontalDirection.RIGHT;\n }\n\n return AutoScrollHorizontalDirection.NONE;\n}\n\n/**\n * Gets the directions in which an element node should be scrolled,\n * assuming that the user's pointer is already within it scrollable region.\n * @param element Element for which we should calculate the scroll direction.\n * @param clientRect Bounding client rectangle of the element.\n * @param direction Layout direction of the drop list.\n * @param pointerX Position of the user's pointer along the x axis.\n * @param pointerY Position of the user's pointer along the y axis.\n */\nfunction getElementScrollDirections(\n element: HTMLElement,\n clientRect: DOMRect,\n direction: Direction,\n pointerX: number,\n pointerY: number,\n): [AutoScrollVerticalDirection, AutoScrollHorizontalDirection] {\n const computedVertical = getVerticalScrollDirection(clientRect, pointerY);\n const computedHorizontal = getHorizontalScrollDirection(clientRect, pointerX);\n let verticalScrollDirection = AutoScrollVerticalDirection.NONE;\n let horizontalScrollDirection = AutoScrollHorizontalDirection.NONE;\n\n // Note that we here we do some extra checks for whether the element is actually scrollable in\n // a certain direction and we only assign the scroll direction if it is. We do this so that we\n // can allow other elements to be scrolled, if the current element can't be scrolled anymore.\n // This allows us to handle cases where the scroll regions of two scrollable elements overlap.\n if (computedVertical) {\n const scrollTop = element.scrollTop;\n\n if (computedVertical === AutoScrollVerticalDirection.UP) {\n if (scrollTop > 0) {\n verticalScrollDirection = AutoScrollVerticalDirection.UP;\n }\n } else if (element.scrollHeight - scrollTop > element.clientHeight) {\n verticalScrollDirection = AutoScrollVerticalDirection.DOWN;\n }\n }\n\n if (computedHorizontal) {\n const scrollLeft = element.scrollLeft;\n\n if (direction === 'rtl') {\n if (computedHorizontal === AutoScrollHorizontalDirection.RIGHT) {\n // In RTL `scrollLeft` will be negative when scrolled.\n if (scrollLeft < 0) {\n horizontalScrollDirection = AutoScrollHorizontalDirection.RIGHT;\n }\n } else if (element.scrollWidth + scrollLeft > element.clientWidth) {\n horizontalScrollDirection = AutoScrollHorizontalDirection.LEFT;\n }\n } else {\n if (computedHorizontal === AutoScrollHorizontalDirection.LEFT) {\n if (scrollLeft > 0) {\n horizontalScrollDirection = AutoScrollHorizontalDirection.LEFT;\n }\n } else if (element.scrollWidth - scrollLeft > element.clientWidth) {\n horizontalScrollDirection = AutoScrollHorizontalDirection.RIGHT;\n }\n }\n }\n\n return [verticalScrollDirection, horizontalScrollDirection];\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Injectable, ElementRef, inject, Injector} from '@angular/core';\nimport {createDragRef, DragRef, DragRefConfig} from './drag-ref';\nimport {createDropListRef, DropListRef} from './drop-list-ref';\n\n/**\n * Service that allows for drag-and-drop functionality to be attached to DOM elements.\n * @deprecated Use the `createDragRef` or `createDropListRef` function for better tree shaking.\n * Will be removed in v23.\n * @breaking-change 23.0.0\n */\n@Injectable({providedIn: 'root'})\nexport class DragDrop {\n private _injector = inject(Injector);\n\n constructor(...args: unknown[]);\n constructor() {}\n\n /**\n * Turns an element into a draggable item.\n * @param element Element to which to attach the dragging functionality.\n * @param config Object used to configure the dragging behavior.\n * @deprecated Use the `createDragRef` function that provides better tree shaking.\n * @breaking-change 23.0.0\n */\n createDrag<T = any>(\n element: ElementRef<HTMLElement> | HTMLElement,\n config?: DragRefConfig,\n ): DragRef<T> {\n return createDragRef(this._injector, element, config);\n }\n\n /**\n * Turns an element into a drop list.\n * @param element Element to which to attach the drop list functionality.\n * @deprecated Use the `createDropListRef` function that provides better tree shaking.\n * @breaking-change 23.0.0\n */\n createDropList<T = any>(element: ElementRef<HTMLElement> | HTMLElement): DropListRef<T> {\n return createDropListRef(this._injector, element);\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {InjectionToken} from '@angular/core';\nimport type {CdkDrag} from './directives/drag';\n\n/**\n * Injection token that can be used for a `CdkDrag` to provide itself as a parent to the\n * drag-specific child directive (`CdkDragHandle`, `CdkDragPreview` etc.). Used primarily\n * to avoid circular imports.\n * @docs-private\n */\nexport const CDK_DRAG_PARENT = new InjectionToken<CdkDrag>('CDK_DRAG_PARENT');\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n/**\n * Asserts that a particular node is an element.\n * @param node Node to be checked.\n * @param name Name to attach to the error message.\n */\nexport function assertElementNode(node: Node, name: string): asserts node is HTMLElement {\n if (node.nodeType !== 1) {\n throw Error(\n `${name} must be attached to an element node. ` + `Currently attached to \"${node.nodeName}\".`,\n );\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n AfterViewInit,\n Directive,\n ElementRef,\n InjectionToken,\n Input,\n OnDestroy,\n booleanAttribute,\n inject,\n} from '@angular/core';\nimport {Subject} from 'rxjs';\nimport type {CdkDrag} from './drag';\nimport {CDK_DRAG_PARENT} from '../drag-parent';\nimport {assertElementNode} from './assertions';\nimport {DragDropRegistry} from '../drag-drop-registry';\n\n/**\n * Injection token that can be used to reference instances of `CdkDragHandle`. It serves as\n * alternative token to the actual `CdkDragHandle` class which could cause unnecessary\n * retention of the class and its directive metadata.\n */\nexport const CDK_DRAG_HANDLE = new InjectionToken<CdkDragHandle>('CdkDragHandle');\n\n/** Handle that can be used to drag a CdkDrag instance. */\n@Directive({\n selector: '[cdkDragHandle]',\n host: {\n 'class': 'cdk-drag-handle',\n },\n providers: [{provide: CDK_DRAG_HANDLE, useExisting: CdkDragHandle}],\n})\nexport class CdkDragHandle implements AfterViewInit, OnDestroy {\n element = inject<ElementRef<HTMLElement>>(ElementRef);\n\n private _parentDrag = inject<CdkDrag>(CDK_DRAG_PARENT, {optional: true, skipSelf: true});\n private _dragDropRegistry = inject(DragDropRegistry);\n\n /** Emits when the state of the handle has changed. */\n readonly _stateChanges = new Subject<CdkDragHandle>();\n\n /** Whether starting to drag through this handle is disabled. */\n @Input({alias: 'cdkDragHandleDisabled', transform: booleanAttribute})\n get disabled(): boolean {\n return this._disabled;\n }\n set disabled(value: boolean) {\n this._disabled = value;\n this._stateChanges.next(this);\n }\n private _disabled = false;\n\n constructor(...args: unknown[]);\n\n constructor() {\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n assertElementNode(this.element.nativeElement, 'cdkDragHandle');\n }\n\n this._parentDrag?._addHandle(this);\n }\n\n ngAfterViewInit() {\n if (!this._parentDrag) {\n let parent = this.element.nativeElement.parentElement;\n while (parent) {\n const ref = this._dragDropRegistry.getDragDirectiveForNode(parent);\n if (ref) {\n this._parentDrag = ref;\n ref._addHandle(this);\n break;\n }\n parent = parent.parentElement;\n }\n }\n }\n\n ngOnDestroy() {\n this._parentDrag?._removeHandle(this);\n this._stateChanges.complete();\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {InjectionToken} from '@angular/core';\nimport {DragRefConfig, DragConstrainPosition} from '../drag-ref';\n\n/** Possible values that can be used to configure the drag start delay. */\nexport type DragStartDelay = number | {touch: number; mouse: number};\n\n/** Possible axis along which dragging can be locked. */\nexport type DragAxis = 'x' | 'y';\n\n/** Possible orientations for a drop list. */\nexport type DropListOrientation = 'horizontal' | 'vertical' | 'mixed';\n\n/**\n * Injection token that can be used to configure the\n * behavior of the drag&drop-related components.\n */\nexport const CDK_DRAG_CONFIG = new InjectionToken<DragDropConfig>('CDK_DRAG_CONFIG');\n\n/**\n * Object that can be used to configure the drag\n * items and drop lists within a module or a component.\n */\nexport interface DragDropConfig extends Partial<DragRefConfig> {\n lockAxis?: DragAxis | null;\n dragStartDelay?: DragStartDelay;\n constrainPosition?: DragConstrainPosition;\n previewClass?: string | string[];\n boundaryElement?: string;\n rootElementSelector?: string;\n draggingDisabled?: boolean;\n sortingDisabled?: boolean;\n listAutoScrollDisabled?: boolean;\n listOrientation?: DropListOrientation;\n zIndex?: number;\n previewContainer?: 'global' | 'parent';\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Directionality} from '../../bidi';\nimport {\n Directive,\n ElementRef,\n EventEmitter,\n Input,\n NgZone,\n OnDestroy,\n Output,\n ViewContainerRef,\n OnChanges,\n SimpleChanges,\n ChangeDetectorRef,\n InjectionToken,\n booleanAttribute,\n afterNextRender,\n AfterViewInit,\n inject,\n Injector,\n numberAttribute,\n} from '@angular/core';\nimport {coerceElement, coerceNumberProperty} from '../../coercion';\nimport {BehaviorSubject, Observable, Observer, Subject, merge} from 'rxjs';\nimport {startWith, take, map, takeUntil, switchMap, tap} from 'rxjs/operators';\nimport type {\n CdkDragDrop,\n CdkDragEnd,\n CdkDragEnter,\n CdkDragExit,\n CdkDragMove,\n CdkDragStart,\n CdkDragRelease,\n} from '../drag-events';\nimport {CDK_DRAG_HANDLE, CdkDragHandle} from './drag-handle';\nimport {CdkDragPlaceholder} from './drag-placeholder';\nimport {CdkDragPreview} from './drag-preview';\nimport {CDK_DRAG_PARENT} from '../drag-parent';\nimport {DragRef, Point, PreviewContainer, DragConstrainPosition, createDragRef} from '../drag-ref';\nimport type {CdkDropList} from './drop-list';\nimport {CDK_DRAG_CONFIG, DragDropConfig, DragStartDelay, DragAxis} from './config';\nimport {assertElementNode} from './assertions';\nimport {DragDropRegistry} from '../drag-drop-registry';\n\n/**\n * Injection token that can be used to reference instances of `CdkDropList`. It serves as\n * alternative token to the actual `CdkDropList` class which could cause unnecessary\n * retention of the class and its directive metadata.\n */\nexport const CDK_DROP_LIST = new InjectionToken<CdkDropList>('CdkDropList');\n\n/** Element that can be moved inside a CdkDropList container. */\n@Directive({\n selector: '[cdkDrag]',\n exportAs: 'cdkDrag',\n host: {\n 'class': 'cdk-drag',\n '[class.cdk-drag-disabled]': 'disabled',\n '[class.cdk-drag-dragging]': '_dragRef.isDragging()',\n },\n providers: [{provide: CDK_DRAG_PARENT, useExisting: CdkDrag}],\n})\nexport class CdkDrag<T = any> implements AfterViewInit, OnChanges, OnDestroy {\n element = inject<ElementRef<HTMLElement>>(ElementRef);\n dropContainer = inject<CdkDropList>(CDK_DROP_LIST, {optional: true, skipSelf: true})!;\n private _ngZone = inject(NgZone);\n private _viewContainerRef = inject(ViewContainerRef);\n private _dir = inject(Directionality, {optional: true});\n private _changeDetectorRef = inject(ChangeDetectorRef);\n private _selfHandle = inject<CdkDragHandle>(CDK_DRAG_HANDLE, {optional: true, self: true});\n private _parentDrag = inject<CdkDrag>(CDK_DRAG_PARENT, {optional: true, skipSelf: true});\n private _dragDropRegistry = inject(DragDropRegistry);\n\n private readonly _destroyed = new Subject<void>();\n private _handles = new BehaviorSubject<CdkDragHandle[]>([]);\n private _previewTemplate: CdkDragPreview | null = null;\n private _placeholderTemplate: CdkDragPlaceholder | null = null;\n\n /** Reference to the underlying drag instance. */\n _dragRef: DragRef<CdkDrag<T>>;\n\n /** Arbitrary data to attach to this drag instance. */\n @Input('cdkDragData') data!: T;\n\n /** Locks the position of the dragged element along the specified axis. */\n @Input('cdkDragLockAxis') lockAxis: DragAxis | null = null;\n\n /**\n * Selector that will be used to determine the root draggable element, starting from\n * the `cdkDrag` element and going up the DOM. Passing an alternate root element is useful\n * when trying to enable dragging on an element that you might not have access to.\n */\n @Input('cdkDragRootElement') rootElementSelector!: string;\n\n /**\n * Node or selector that will be used to determine the element to which the draggable's\n * position will be constrained. If a string is passed in, it'll be used as a selector that\n * will be matched starting from the element's parent and going up the DOM until a match\n * has been found.\n */\n @Input('cdkDragBoundary') boundaryElement!: string | ElementRef<HTMLElement> | HTMLElement;\n\n /**\n * Amount of milliseconds to wait after the user has put their\n * pointer down before starting to drag the element.\n */\n @Input('cdkDragStartDelay') dragStartDelay!: DragStartDelay;\n\n /**\n * Sets the position of a `CdkDrag` that is outside of a drop container.\n * Can be used to restore the element's position for a returning user.\n */\n @Input('cdkDragFreeDragPosition') freeDragPosition!: Point;\n\n /** Whether starting to drag this element is disabled. */\n @Input({alias: 'cdkDragDisabled', transform: booleanAttribute})\n get disabled(): boolean {\n return this._disabled || !!(this.dropContainer && this.dropContainer.disabled);\n }\n set disabled(value: boolean) {\n this._disabled = value;\n this._dragRef.disabled = this._disabled;\n }\n private _disabled = false;\n\n /**\n * Function that can be used to customize the logic of how the position of the drag item\n * is limited while it's being dragged. Gets called with a point containing the current position\n * of the user's pointer on the page, a reference to the item being dragged and its dimensions.\n * Should return a point describing where the item should be rendered.\n */\n @Input('cdkDragConstrainPosition') constrainPosition?: DragConstrainPosition;\n\n /** Class to be added to the preview element. */\n @Input('cdkDragPreviewClass') previewClass!: string | string[];\n\n /**\n * Configures the place into which the preview of the item will be inserted. Can be configured\n * globally through `CDK_DROP_LIST`. Possible values:\n * - `global` - Preview will be inserted at the bottom of the `<body>`. The advantage is that\n * you don't have to worry about `overflow: hidden` or `z-index`, but the item won't retain\n * its inherited styles.\n * - `parent` - Preview will be inserted into the parent of the drag item. The advantage is that\n * inherited styles will be preserved, but it may be clipped by `overflow: hidden` or not be\n * visible due to `z-index`. Furthermore, the preview is going to have an effect over selectors\n * like `:nth-child` and some flexbox configurations.\n * - `ElementRef<HTMLElement> | HTMLElement` - Preview will be inserted into a specific element.\n * Same advantages and disadvantages as `parent`.\n */\n @Input('cdkDragPreviewContainer') previewContainer!: PreviewContainer;\n\n /**\n * If the parent of the dragged element has a `scale` transform, it can throw off the\n * positioning when the user starts dragging. Use this input to notify the CDK of the scale.\n */\n @Input({alias: 'cdkDragScale', transform: numberAttribute})\n scale: number = 1;\n\n /** Emits when the user starts dragging the item. */\n @Output('cdkDragStarted') readonly started: EventEmitter<CdkDragStart> =\n new EventEmitter<CdkDragStart>();\n\n /** Emits when the user has released a drag item, before any animations have started. */\n @Output('cdkDragReleased') readonly released: EventEmitter<CdkDragRelease> =\n new EventEmitter<CdkDragRelease>();\n\n /** Emits when the user stops dragging an item in the container. */\n @Output('cdkDragEnded') readonly ended: EventEmitter<CdkDragEnd> = new EventEmitter<CdkDragEnd>();\n\n /** Emits when the user has moved the item into a new container. */\n @Output('cdkDragEntered') readonly entered: EventEmitter<CdkDragEnter<any>> = new EventEmitter<\n CdkDragEnter<any>\n >();\n\n /** Emits when the user removes the item its container by dragging it into another container. */\n @Output('cdkDragExited') readonly exited: EventEmitter<CdkDragExit<any>> = new EventEmitter<\n CdkDragExit<any>\n >();\n\n /** Emits when the user drops the item inside a container. */\n @Output('cdkDragDropped') readonly dropped: EventEmitter<CdkDragDrop<any>> = new EventEmitter<\n CdkDragDrop<any>\n >();\n\n /**\n * Emits as the user is dragging the item. Use with caution,\n * because this event will fire for every pixel that the user has dragged.\n */\n @Output('cdkDragMoved')\n readonly moved: Observable<CdkDragMove<T>> = new Observable(\n (observer: Observer<CdkDragMove<T>>) => {\n const subscription = this._dragRef.moved\n .pipe(\n map(movedEvent => ({\n source: this,\n pointerPosition: movedEvent.pointerPosition,\n event: movedEvent.event,\n delta: movedEvent.delta,\n distance: movedEvent.distance,\n })),\n )\n .subscribe(observer);\n\n return () => {\n subscription.unsubscribe();\n };\n },\n );\n\n private _injector = inject(Injector);\n\n constructor(...args: unknown[]);\n\n constructor() {\n const dropContainer = this.dropContainer;\n const config = inject<DragDropConfig>(CDK_DRAG_CONFIG, {optional: true});\n\n this._dragRef = createDragRef(this._injector, this.element, {\n dragStartThreshold:\n config && config.dragStartThreshold != null ? config.dragStartThreshold : 5,\n pointerDirectionChangeThreshold:\n config && config.pointerDirectionChangeThreshold != null\n ? config.pointerDirectionChangeThreshold\n : 5,\n zIndex: config?.zIndex,\n });\n this._dragRef.data = this;\n this._dragDropRegistry.registerDirectiveNode(this.element.nativeElement, this);\n\n if (config) {\n this._assignDefaults(config);\n }\n\n // Note that usually the container is assigned when the drop list is picks up the item, but in\n // some cases (mainly transplanted views with OnPush, see #18341) we may end up in a situation\n // where there are no items on the first change detection pass, but the items get picked up as\n // soon as the user triggers another pass by dragging. This is a problem, because the item would\n // have to switch from standalone mode to drag mode in the middle of the dragging sequence which\n // is too late since the two modes save different kinds of information. We work around it by\n // assigning the drop container both from here and the list.\n if (dropContainer) {\n dropContainer.addItem(this);\n\n // The drop container reads this so we need to sync it here.\n dropContainer._dropListRef.beforeStarted.pipe(takeUntil(this._destroyed)).subscribe(() => {\n this._dragRef.scale = this.scale;\n });\n }\n\n this._syncInputs(this._dragRef);\n this._handleEvents(this._dragRef);\n }\n\n /**\n * Returns the element that is being used as a placeholder\n * while the current element is being dragged.\n */\n getPlaceholderElement(): HTMLElement {\n return this._dragRef.getPlaceholderElement();\n }\n\n /** Returns the root draggable element. */\n getRootElement(): HTMLElement {\n return this._dragRef.getRootElement();\n }\n\n /** Resets a standalone drag item to its initial position. */\n reset(): void {\n this._dragRef.reset();\n }\n\n /** Resets drag item to end of boundary element. */\n resetToBoundary() {\n this._dragRef.resetToBoundary();\n }\n\n /**\n * Gets the pixel coordinates of the draggable outside of a drop container.\n */\n getFreeDragPosition(): Readonly<Point> {\n return this._dragRef.getFreeDragPosition();\n }\n\n /**\n * Sets the current position in pixels the draggable outside of a drop container.\n * @param value New position to be set.\n */\n setFreeDragPosition(value: Point): void {\n this._dragRef.setFreeDragPosition(value);\n }\n\n ngAfterViewInit() {\n // We need to wait until after render, in order for the reference\n // element to be in the proper place in the DOM. This is mostly relevant\n // for draggable elements inside portals since they get stamped out in\n // their original DOM position, and then they get transferred to the portal.\n afterNextRender(\n () => {\n this._updateRootElement();\n this._setupHandlesListener();\n this._dragRef.scale = this.scale;\n\n if (this.freeDragPosition) {\n this._dragRef.setFreeDragPosition(this.freeDragPosition);\n }\n },\n {injector: this._injector},\n );\n }\n\n ngOnChanges(changes: SimpleChanges) {\n const rootSelectorChange = changes['rootElementSelector'];\n const positionChange = changes['freeDragPosition'];\n\n // We don't have to react to the first change since it's being\n // handled in the `afterNextRender` queued up in the constructor.\n if (rootSelectorChange && !rootSelectorChange.firstChange) {\n this._updateRootElement();\n }\n\n // Scale affects the free drag position so we need to sync it up here.\n this._dragRef.scale = this.scale;\n\n // Skip the first change since it's being handled in the `afterNextRender` queued up in the\n // constructor.\n if (positionChange && !positionChange.firstChange && this.freeDragPosition) {\n this._dragRef.setFreeDragPosition(this.freeDragPosition);\n }\n }\n\n ngOnDestroy() {\n if (this.dropContainer) {\n this.dropContainer.removeItem(this);\n }\n\n this._dragDropRegistry.removeDirectiveNode(this.element.nativeElement);\n\n // Unnecessary in most cases, but used to avoid extra change detections with `zone-paths-rxjs`.\n this._ngZone.runOutsideAngular(() => {\n this._handles.complete();\n this._destroyed.next();\n this._destroyed.complete();\n this._dragRef.dispose();\n });\n }\n\n _addHandle(handle: CdkDragHandle) {\n const handles = this._handles.getValue();\n handles.push(handle);\n this._handles.next(handles);\n }\n\n _removeHandle(handle: CdkDragHandle) {\n const handles = this._handles.getValue();\n const index = handles.indexOf(handle);\n\n if (index > -1) {\n handles.splice(index, 1);\n this._handles.next(handles);\n }\n }\n\n _setPreviewTemplate(preview: CdkDragPreview) {\n this._previewTemplate = preview;\n }\n\n _resetPreviewTemplate(preview: CdkDragPreview) {\n if (preview === this._previewTemplate) {\n this._previewTemplate = null;\n }\n }\n\n _setPlaceholderTemplate(placeholder: CdkDragPlaceholder) {\n this._placeholderTemplate = placeholder;\n }\n\n _resetPlaceholderTemplate(placeholder: CdkDragPlaceholder) {\n if (placeholder === this._placeholderTemplate) {\n this._placeholderTemplate = null;\n }\n }\n\n /** Syncs the root element with the `DragRef`. */\n private _updateRootElement() {\n const element = this.element.nativeElement as HTMLElement;\n let rootElement = element;\n if (this.rootElementSelector) {\n rootElement =\n element.closest !== undefined\n ? (element.closest(this.rootElementSelector) as HTMLElement)\n : // Comment tag doesn't have closest method, so use parent's one.\n (element.parentElement?.closest(this.rootElementSelector) as HTMLElement);\n }\n\n if (rootElement && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n assertElementNode(rootElement, 'cdkDrag');\n }\n\n this._dragRef.withRootElement(rootElement || element);\n }\n\n /** Gets the boundary element, based on the `boundaryElement` value. */\n private _getBoundaryElement() {\n const boundary = this.boundaryElement;\n\n if (!boundary) {\n return null;\n }\n\n if (typeof boundary === 'string') {\n return this.element.nativeElement.closest<HTMLElement>(boundary);\n }\n\n return coerceElement(boundary);\n }\n\n /** Syncs the inputs of the CdkDrag with the options of the underlying DragRef. */\n private _syncInputs(ref: DragRef<CdkDrag<T>>) {\n ref.beforeStarted.subscribe(() => {\n if (!ref.isDragging()) {\n const dir = this._dir;\n const dragStartDelay = this.dragStartDelay;\n const placeholder = this._placeholderTemplate\n ? {\n template: this._placeholderTemplate.templateRef,\n context: this._placeholderTemplate.data,\n viewContainer: this._viewContainerRef,\n }\n : null;\n const preview = this._previewTemplate\n ? {\n template: this._previewTemplate.templateRef,\n context: this._previewTemplate.data,\n matchSize: this._previewTemplate.matchSize,\n viewContainer: this._viewContainerRef,\n }\n : null;\n\n ref.disabled = this.disabled;\n ref.lockAxis = this.lockAxis;\n ref.scale = this.scale;\n ref.dragStartDelay =\n typeof dragStartDelay === 'object' && dragStartDelay\n ? dragStartDelay\n : coerceNumberProperty(dragStartDelay);\n ref.constrainPosition = this.constrainPosition;\n ref.previewClass = this.previewClass;\n ref\n .withBoundaryElement(this._getBoundaryElement())\n .withPlaceholderTemplate(placeholder)\n .withPreviewTemplate(preview)\n .withPreviewContainer(this.previewContainer || 'global');\n\n if (dir) {\n ref.withDirection(dir.value);\n }\n }\n });\n\n // This only needs to be resolved once.\n ref.beforeStarted.pipe(take(1)).subscribe(() => {\n // If we managed to resolve a parent through DI, use it.\n if (this._parentDrag) {\n ref.withParent(this._parentDrag._dragRef);\n return;\n }\n\n // Otherwise fall back to resolving the parent by looking up the DOM. This can happen if\n // the item was projected into another item by something like `ngTemplateOutlet`.\n let parent = this.element.nativeElement.parentElement;\n while (parent) {\n const parentDrag = this._dragDropRegistry.getDragDirectiveForNode(parent);\n if (parentDrag) {\n ref.withParent(parentDrag._dragRef);\n break;\n }\n parent = parent.parentElement;\n }\n });\n }\n\n /** Handles the events from the underlying `DragRef`. */\n private _handleEvents(ref: DragRef<CdkDrag<T>>) {\n ref.started.subscribe(startEvent => {\n this.started.emit({source: this, event: startEvent.event});\n\n // Since all of these events run outside of change detection,\n // we need to ensure that everything is marked correctly.\n this._changeDetectorRef.markForCheck();\n });\n\n ref.released.subscribe(releaseEvent => {\n this.released.emit({source: this, event: releaseEvent.event});\n });\n\n ref.ended.subscribe(endEvent => {\n this.ended.emit({\n source: this,\n distance: endEvent.distance,\n dropPoint: endEvent.dropPoint,\n event: endEvent.event,\n });\n\n // Since all of these events run outside of change detection,\n // we need to ensure that everything is marked correctly.\n this._changeDetectorRef.markForCheck();\n });\n\n ref.entered.subscribe(enterEvent => {\n this.entered.emit({\n container: enterEvent.container.data,\n item: this,\n currentIndex: enterEvent.currentIndex,\n });\n });\n\n ref.exited.subscribe(exitEvent => {\n this.exited.emit({\n container: exitEvent.container.data,\n item: this,\n });\n });\n\n ref.dropped.subscribe(dropEvent => {\n this.dropped.emit({\n previousIndex: dropEvent.previousIndex,\n currentIndex: dropEvent.currentIndex,\n previousContainer: dropEvent.previousContainer.data,\n container: dropEvent.container.data,\n isPointerOverContainer: dropEvent.isPointerOverContainer,\n item: this,\n distance: dropEvent.distance,\n dropPoint: dropEvent.dropPoint,\n event: dropEvent.event,\n });\n });\n }\n\n /** Assigns the default input values based on a provided config object. */\n private _assignDefaults(config: DragDropConfig) {\n const {\n lockAxis,\n dragStartDelay,\n constrainPosition,\n previewClass,\n boundaryElement,\n draggingDisabled,\n rootElementSelector,\n previewContainer,\n } = config;\n\n this.disabled = draggingDisabled == null ? false : draggingDisabled;\n this.dragStartDelay = dragStartDelay || 0;\n this.lockAxis = lockAxis || null;\n\n if (constrainPosition) {\n this.constrainPosition = constrainPosition;\n }\n\n if (previewClass) {\n this.previewClass = previewClass;\n }\n\n if (boundaryElement) {\n this.boundaryElement = boundaryElement;\n }\n\n if (rootElementSelector) {\n this.rootElementSelector = rootElementSelector;\n }\n\n if (previewContainer) {\n this.previewContainer = previewContainer;\n }\n }\n\n /** Sets up the listener that syncs the handles with the drag ref. */\n private _setupHandlesListener() {\n // Listen for any newly-added handles.\n this._handles\n .pipe(\n // Sync the new handles with the DragRef.\n tap(handles => {\n const handleElements = handles.map(handle => handle.element);\n\n // Usually handles are only allowed to be a descendant of the drag element, but if\n // the consumer defined a different drag root, we should allow the drag element\n // itself to be a handle too.\n if (this._selfHandle && this.rootElementSelector) {\n handleElements.push(this.element);\n }\n\n this._dragRef.withHandles(handleElements);\n }),\n // Listen if the state of any of the handles changes.\n switchMap((handles: CdkDragHandle[]) => {\n return merge(\n ...handles.map(item => item._stateChanges.pipe(startWith(item))),\n ) as Observable<CdkDragHandle>;\n }),\n takeUntil(this._destroyed),\n )\n .subscribe(handleInstance => {\n // Enabled/disable the handle that changed in the DragRef.\n const dragRef = this._dragRef;\n const handle = handleInstance.element.nativeElement;\n handleInstance.disabled ? dragRef.disableHandle(handle) : dragRef.enableHandle(handle);\n });\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Directive, OnDestroy, Input, InjectionToken, booleanAttribute} from '@angular/core';\n\n/**\n * Injection token that can be used to reference instances of `CdkDropListGroup`. It serves as\n * alternative token to the actual `CdkDropListGroup` class which could cause unnecessary\n * retention of the class and its directive metadata.\n */\nexport const CDK_DROP_LIST_GROUP = new InjectionToken<CdkDropListGroup<unknown>>(\n 'CdkDropListGroup',\n);\n\n/**\n * Declaratively connects sibling `cdkDropList` instances together. All of the `cdkDropList`\n * elements that are placed inside a `cdkDropListGroup` will be connected to each other\n * automatically. Can be used as an alternative to the `cdkDropListConnectedTo` input\n * from `cdkDropList`.\n */\n@Directive({\n selector: '[cdkDropListGroup]',\n exportAs: 'cdkDropListGroup',\n providers: [{provide: CDK_DROP_LIST_GROUP, useExisting: CdkDropListGroup}],\n})\nexport class CdkDropListGroup<T> implements OnDestroy {\n /** Drop lists registered inside the group. */\n readonly _items = new Set<T>();\n\n /** Whether starting a dragging sequence from inside this group is disabled. */\n @Input({alias: 'cdkDropListGroupDisabled', transform: booleanAttribute})\n disabled: boolean = false;\n\n ngOnDestroy() {\n this._items.clear();\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {NumberInput, coerceArray, coerceNumberProperty} from '../../coercion';\nimport {\n ElementRef,\n EventEmitter,\n Input,\n OnDestroy,\n Output,\n Directive,\n ChangeDetectorRef,\n booleanAttribute,\n inject,\n Injector,\n} from '@angular/core';\nimport {Directionality} from '../../bidi';\nimport {_IdGenerator} from '../../a11y';\nimport {ScrollDispatcher} from '../../scrolling';\nimport {CDK_DROP_LIST, CdkDrag} from './drag';\nimport {CdkDragDrop, CdkDragEnter, CdkDragExit, CdkDragSortEvent} from '../drag-events';\nimport {CDK_DROP_LIST_GROUP, CdkDropListGroup} from './drop-list-group';\nimport {createDropListRef, DropListRef} from '../drop-list-ref';\nimport {DragRef} from '../drag-ref';\nimport {DropListOrientation, DragAxis, DragDropConfig, CDK_DRAG_CONFIG} from './config';\nimport {merge, Subject} from 'rxjs';\nimport {startWith, takeUntil} from 'rxjs/operators';\nimport {assertElementNode} from './assertions';\n\n/** Container that wraps a set of draggable items. */\n@Directive({\n selector: '[cdkDropList], cdk-drop-list',\n exportAs: 'cdkDropList',\n providers: [\n // Prevent child drop lists from picking up the same group as their parent.\n {provide: CDK_DROP_LIST_GROUP, useValue: undefined},\n {provide: CDK_DROP_LIST, useExisting: CdkDropList},\n ],\n host: {\n 'class': 'cdk-drop-list',\n '[attr.id]': 'id',\n '[class.cdk-drop-list-disabled]': 'disabled',\n '[class.cdk-drop-list-dragging]': '_dropListRef.isDragging()',\n '[class.cdk-drop-list-receiving]': '_dropListRef.isReceiving()',\n },\n})\nexport class CdkDropList<T = any> implements OnDestroy {\n element = inject<ElementRef<HTMLElement>>(ElementRef);\n private _changeDetectorRef = inject(ChangeDetectorRef);\n private _scrollDispatcher = inject(ScrollDispatcher);\n private _dir = inject(Directionality, {optional: true});\n private _group = inject<CdkDropListGroup<CdkDropList>>(CDK_DROP_LIST_GROUP, {\n optional: true,\n skipSelf: true,\n });\n\n /** Refs that have been synced with the drop ref most recently. */\n private _latestSortedRefs: DragRef[] | undefined;\n\n /** Emits when the list has been destroyed. */\n private readonly _destroyed = new Subject<void>();\n\n /** Whether the element's scrollable parents have been resolved. */\n private _scrollableParentsResolved = false;\n\n /** Keeps track of the drop lists that are currently on the page. */\n private static _dropLists: CdkDropList[] = [];\n\n /** Reference to the underlying drop list instance. */\n _dropListRef: DropListRef<CdkDropList<T>>;\n\n /**\n * Other draggable containers that this container is connected to and into which the\n * container's items can be transferred. Can either be references to other drop containers,\n * or their unique IDs.\n */\n @Input('cdkDropListConnectedTo')\n connectedTo: (CdkDropList | string)[] | CdkDropList | string = [];\n\n /** Arbitrary data to attach to this container. */\n @Input('cdkDropListData') data!: T;\n\n /** Direction in which the list is oriented. */\n @Input('cdkDropListOrientation') orientation: DropListOrientation = 'vertical';\n\n /**\n * Unique ID for the drop zone. Can be used as a reference\n * in the `connectedTo` of another `CdkDropList`.\n */\n @Input() id: string = inject(_IdGenerator).getId('cdk-drop-list-');\n\n /** Locks the position of the draggable elements inside the container along the specified axis. */\n @Input('cdkDropListLockAxis') lockAxis: DragAxis | null = null;\n\n /** Whether starting a dragging sequence from this container is disabled. */\n @Input({alias: 'cdkDropListDisabled', transform: booleanAttribute})\n get disabled(): boolean {\n return this._disabled || (!!this._group && this._group.disabled);\n }\n set disabled(value: boolean) {\n // Usually we sync the directive and ref state right before dragging starts, in order to have\n // a single point of failure and to avoid having to use setters for everything. `disabled` is\n // a special case, because it can prevent the `beforeStarted` event from firing, which can lock\n // the user in a disabled state, so we also need to sync it as it's being set.\n this._dropListRef.disabled = this._disabled = value;\n }\n private _disabled = false;\n\n /** Whether sorting within this drop list is disabled. */\n @Input({alias: 'cdkDropListSortingDisabled', transform: booleanAttribute})\n sortingDisabled: boolean = false;\n\n /**\n * Function that is used to determine whether an item\n * is allowed to be moved into a drop container.\n */\n @Input('cdkDropListEnterPredicate')\n enterPredicate: (drag: CdkDrag, drop: CdkDropList) => boolean = () => true;\n\n /** Functions that is used to determine whether an item can be sorted into a particular index. */\n @Input('cdkDropListSortPredicate')\n sortPredicate: (index: number, drag: CdkDrag, drop: CdkDropList) => boolean = () => true;\n\n /** Whether to auto-scroll the view when the user moves their pointer close to the edges. */\n @Input({alias: 'cdkDropListAutoScrollDisabled', transform: booleanAttribute})\n autoScrollDisabled: boolean = false;\n\n /** Number of pixels to scroll for each frame when auto-scrolling an element. */\n @Input('cdkDropListAutoScrollStep')\n autoScrollStep: NumberInput;\n\n /**\n * Selector that will be used to resolve an alternate element container for the drop list.\n * Passing an alternate container is useful for the cases where one might not have control\n * over the parent node of the draggable items within the list (e.g. due to content projection).\n * This allows for usages like:\n *\n * ```\n * <div cdkDropList cdkDropListElementContainer=\".inner\">\n * <div class=\"inner\">\n * <div cdkDrag></div>\n * </div>\n * </div>\n * ```\n */\n @Input('cdkDropListElementContainer') elementContainerSelector: string | null = null;\n\n /**\n * By default when an item leaves its initial container, its placeholder will be transferred\n * to the new container. If that's not desirable for your use case, you can enable this option\n * which will clone the placeholder and leave it inside the original container. If the item is\n * returned to the initial container, the anchor element will be removed automatically.\n *\n * The cloned placeholder can be styled by targeting the `cdk-drag-anchor` class.\n *\n * This option is useful in combination with `cdkDropListSortingDisabled` to implement copying\n * behavior in a drop list.\n */\n @Input({alias: 'cdkDropListHasAnchor', transform: booleanAttribute})\n hasAnchor: boolean = false;\n\n /** Emits when the user drops an item inside the container. */\n @Output('cdkDropListDropped')\n readonly dropped: EventEmitter<CdkDragDrop<T, any>> = new EventEmitter<CdkDragDrop<T, any>>();\n\n /**\n * Emits when the user has moved a new drag item into this container.\n */\n @Output('cdkDropListEntered')\n readonly entered: EventEmitter<CdkDragEnter<T>> = new EventEmitter<CdkDragEnter<T>>();\n\n /**\n * Emits when the user removes an item from the container\n * by dragging it into another container.\n */\n @Output('cdkDropListExited')\n readonly exited: EventEmitter<CdkDragExit<T>> = new EventEmitter<CdkDragExit<T>>();\n\n /** Emits as the user is swapping items while actively dragging. */\n @Output('cdkDropListSorted')\n readonly sorted: EventEmitter<CdkDragSortEvent<T>> = new EventEmitter<CdkDragSortEvent<T>>();\n\n /**\n * Keeps track of the items that are registered with this container. Historically we used to\n * do this with a `ContentChildren` query, however queries don't handle transplanted views very\n * well which means that we can't handle cases like dragging the headers of a `mat-table`\n * correctly. What we do instead is to have the items register themselves with the container\n * and then we sort them based on their position in the DOM.\n */\n private _unsortedItems = new Set<CdkDrag>();\n\n constructor(...args: unknown[]);\n\n constructor() {\n const config = inject<DragDropConfig>(CDK_DRAG_CONFIG, {optional: true});\n const injector = inject(Injector);\n\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n assertElementNode(this.element.nativeElement, 'cdkDropList');\n }\n\n this._dropListRef = createDropListRef(injector, this.element);\n this._dropListRef.data = this;\n\n if (config) {\n this._assignDefaults(config);\n }\n\n this._dropListRef.enterPredicate = (drag: DragRef<CdkDrag>, drop: DropListRef<CdkDropList>) => {\n return this.enterPredicate(drag.data, drop.data);\n };\n\n this._dropListRef.sortPredicate = (\n index: number,\n drag: DragRef<CdkDrag>,\n drop: DropListRef<CdkDropList>,\n ) => {\n return this.sortPredicate(index, drag.data, drop.data);\n };\n\n this._setupInputSyncSubscription(this._dropListRef);\n this._handleEvents(this._dropListRef);\n CdkDropList._dropLists.push(this);\n\n if (this._group) {\n this._group._items.add(this);\n }\n }\n\n /** Registers an items with the drop list. */\n addItem(item: CdkDrag): void {\n this._unsortedItems.add(item);\n item._dragRef._withDropContainer(this._dropListRef);\n\n // Only sync the items while dragging since this method is\n // called when items are being initialized one-by-one.\n if (this._dropListRef.isDragging()) {\n this._syncItemsWithRef(this.getSortedItems().map(item => item._dragRef));\n }\n }\n\n /** Removes an item from the drop list. */\n removeItem(item: CdkDrag): void {\n this._unsortedItems.delete(item);\n\n // This method might be called on destroy so we always want to sync with the ref.\n // Note that we reuse the last set of synced items, rather than re-sorting the whole\n // list, because it can slow down re-renders of large lists (see #30737).\n if (this._latestSortedRefs) {\n const index = this._latestSortedRefs.indexOf(item._dragRef);\n\n if (index > -1) {\n this._latestSortedRefs.splice(index, 1);\n this._syncItemsWithRef(this._latestSortedRefs);\n }\n }\n }\n\n /** Gets the registered items in the list, sorted by their position in the DOM. */\n getSortedItems(): CdkDrag[] {\n return Array.from(this._unsortedItems).sort((a: CdkDrag, b: CdkDrag) => {\n const documentPosition = a._dragRef\n .getVisibleElement()\n .compareDocumentPosition(b._dragRef.getVisibleElement());\n\n // `compareDocumentPosition` returns a bitmask so we have to use a bitwise operator.\n // https://developer.mozilla.org/en-US/docs/Web/API/Node/compareDocumentPosition\n // tslint:disable-next-line:no-bitwise\n return documentPosition & Node.DOCUMENT_POSITION_FOLLOWING ? -1 : 1;\n });\n }\n\n ngOnDestroy() {\n const index = CdkDropList._dropLists.indexOf(this);\n\n if (index > -1) {\n CdkDropList._dropLists.splice(index, 1);\n }\n\n if (this._group) {\n this._group._items.delete(this);\n }\n\n this._latestSortedRefs = undefined;\n this._unsortedItems.clear();\n this._dropListRef.dispose();\n this._destroyed.next();\n this._destroyed.complete();\n }\n\n /** Syncs the inputs of the CdkDropList with the options of the underlying DropListRef. */\n private _setupInputSyncSubscription(ref: DropListRef<CdkDropList>) {\n if (this._dir) {\n this._dir.change\n .pipe(startWith(this._dir.value), takeUntil(this._destroyed))\n .subscribe(value => ref.withDirection(value));\n }\n\n ref.beforeStarted.subscribe(() => {\n const siblings = coerceArray(this.connectedTo).map(drop => {\n if (typeof drop === 'string') {\n const correspondingDropList = CdkDropList._dropLists.find(list => list.id === drop);\n\n if (!correspondingDropList && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n console.warn(`CdkDropList could not find connected drop list with id \"${drop}\"`);\n }\n\n return correspondingDropList!;\n }\n\n return drop;\n });\n\n if (this._group) {\n this._group._items.forEach(drop => {\n if (siblings.indexOf(drop) === -1) {\n siblings.push(drop);\n }\n });\n }\n\n // Note that we resolve the scrollable parents here so that we delay the resolution\n // as long as possible, ensuring that the element is in its final place in the DOM.\n if (!this._scrollableParentsResolved) {\n const scrollableParents = this._scrollDispatcher\n .getAncestorScrollContainers(this.element)\n .map(scrollable => scrollable.getElementRef().nativeElement);\n this._dropListRef.withScrollableParents(scrollableParents);\n\n // Only do this once since it involves traversing the DOM and the parents\n // shouldn't be able to change without the drop list being destroyed.\n this._scrollableParentsResolved = true;\n }\n\n if (this.elementContainerSelector) {\n const container = this.element.nativeElement.querySelector(this.elementContainerSelector);\n\n if (!container && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw new Error(\n `CdkDropList could not find an element container matching the selector \"${this.elementContainerSelector}\"`,\n );\n }\n\n ref.withElementContainer(container as HTMLElement);\n }\n\n ref.disabled = this.disabled;\n ref.lockAxis = this.lockAxis;\n ref.sortingDisabled = this.sortingDisabled;\n ref.autoScrollDisabled = this.autoScrollDisabled;\n ref.autoScrollStep = coerceNumberProperty(this.autoScrollStep, 2);\n ref.hasAnchor = this.hasAnchor;\n ref\n .connectedTo(siblings.filter(drop => drop && drop !== this).map(list => list._dropListRef))\n .withOrientation(this.orientation);\n });\n }\n\n /** Handles events from the underlying DropListRef. */\n private _handleEvents(ref: DropListRef<CdkDropList>) {\n ref.beforeStarted.subscribe(() => {\n this._syncItemsWithRef(this.getSortedItems().map(item => item._dragRef));\n this._changeDetectorRef.markForCheck();\n });\n\n ref.entered.subscribe(event => {\n this.entered.emit({\n container: this,\n item: event.item.data,\n currentIndex: event.currentIndex,\n });\n });\n\n ref.exited.subscribe(event => {\n this.exited.emit({\n container: this,\n item: event.item.data,\n });\n this._changeDetectorRef.markForCheck();\n });\n\n ref.sorted.subscribe(event => {\n this.sorted.emit({\n previousIndex: event.previousIndex,\n currentIndex: event.currentIndex,\n container: this,\n item: event.item.data,\n });\n });\n\n ref.dropped.subscribe(dropEvent => {\n this.dropped.emit({\n previousIndex: dropEvent.previousIndex,\n currentIndex: dropEvent.currentIndex,\n previousContainer: dropEvent.previousContainer.data,\n container: dropEvent.container.data,\n item: dropEvent.item.data,\n isPointerOverContainer: dropEvent.isPointerOverContainer,\n distance: dropEvent.distance,\n dropPoint: dropEvent.dropPoint,\n event: dropEvent.event,\n });\n\n // Mark for check since all of these events run outside of change\n // detection and we're not guaranteed for something else to have triggered it.\n this._changeDetectorRef.markForCheck();\n });\n\n merge(ref.receivingStarted, ref.receivingStopped).subscribe(() =>\n this._changeDetectorRef.markForCheck(),\n );\n }\n\n /** Assigns the default input values based on a provided config object. */\n private _assignDefaults(config: DragDropConfig) {\n const {lockAxis, draggingDisabled, sortingDisabled, listAutoScrollDisabled, listOrientation} =\n config;\n\n this.disabled = draggingDisabled == null ? false : draggingDisabled;\n this.sortingDisabled = sortingDisabled == null ? false : sortingDisabled;\n this.autoScrollDisabled = listAutoScrollDisabled == null ? false : listAutoScrollDisabled;\n this.orientation = listOrientation || 'vertical';\n this.lockAxis = lockAxis || null;\n }\n\n /** Syncs up the registered drag items with underlying drop list ref. */\n private _syncItemsWithRef(items: DragRef[]) {\n this._latestSortedRefs = items;\n this._dropListRef.withItems(items);\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n Directive,\n InjectionToken,\n Input,\n OnDestroy,\n TemplateRef,\n booleanAttribute,\n inject,\n} from '@angular/core';\nimport {CDK_DRAG_PARENT} from '../drag-parent';\n\n/**\n * Injection token that can be used to reference instances of `CdkDragPreview`. It serves as\n * alternative token to the actual `CdkDragPreview` class which could cause unnecessary\n * retention of the class and its directive metadata.\n */\nexport const CDK_DRAG_PREVIEW = new InjectionToken<CdkDragPreview>('CdkDragPreview');\n\n/**\n * Element that will be used as a template for the preview\n * of a CdkDrag when it is being dragged.\n */\n@Directive({\n selector: 'ng-template[cdkDragPreview]',\n providers: [{provide: CDK_DRAG_PREVIEW, useExisting: CdkDragPreview}],\n})\nexport class CdkDragPreview<T = any> implements OnDestroy {\n templateRef = inject<TemplateRef<T>>(TemplateRef);\n\n private _drag = inject(CDK_DRAG_PARENT, {optional: true});\n\n /** Context data to be added to the preview template instance. */\n @Input() data!: T;\n\n /** Whether the preview should preserve the same size as the item that is being dragged. */\n @Input({transform: booleanAttribute}) matchSize: boolean = false;\n\n constructor(...args: unknown[]);\n\n constructor() {\n this._drag?._setPreviewTemplate(this);\n }\n\n ngOnDestroy(): void {\n this._drag?._resetPreviewTemplate(this);\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Directive, TemplateRef, Input, InjectionToken, inject, OnDestroy} from '@angular/core';\nimport {CDK_DRAG_PARENT} from '../drag-parent';\n\n/**\n * Injection token that can be used to reference instances of `CdkDragPlaceholder`. It serves as\n * alternative token to the actual `CdkDragPlaceholder` class which could cause unnecessary\n * retention of the class and its directive metadata.\n */\nexport const CDK_DRAG_PLACEHOLDER = new InjectionToken<CdkDragPlaceholder>('CdkDragPlaceholder');\n\n/**\n * Element that will be used as a template for the placeholder of a CdkDrag when\n * it is being dragged. The placeholder is displayed in place of the element being dragged.\n */\n@Directive({\n selector: 'ng-template[cdkDragPlaceholder]',\n providers: [{provide: CDK_DRAG_PLACEHOLDER, useExisting: CdkDragPlaceholder}],\n})\nexport class CdkDragPlaceholder<T = any> implements OnDestroy {\n templateRef = inject<TemplateRef<T>>(TemplateRef);\n\n private _drag = inject(CDK_DRAG_PARENT, {optional: true});\n\n /** Context data to be added to the placeholder template instance. */\n @Input() data!: T;\n\n constructor(...args: unknown[]);\n\n constructor() {\n this._drag?._setPlaceholderTemplate(this);\n }\n\n ngOnDestroy(): void {\n this._drag?._resetPlaceholderTemplate(this);\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {NgModule} from '@angular/core';\nimport {CdkScrollableModule} from '../scrolling';\nimport {CdkDropList} from './directives/drop-list';\nimport {CdkDropListGroup} from './directives/drop-list-group';\nimport {CdkDrag} from './directives/drag';\nimport {CdkDragHandle} from './directives/drag-handle';\nimport {CdkDragPreview} from './directives/drag-preview';\nimport {CdkDragPlaceholder} from './directives/drag-placeholder';\nimport {DragDrop} from './drag-drop';\n\nconst DRAG_DROP_DIRECTIVES = [\n CdkDropList,\n CdkDropListGroup,\n CdkDrag,\n CdkDragHandle,\n CdkDragPreview,\n CdkDragPlaceholder,\n];\n\n@NgModule({\n imports: DRAG_DROP_DIRECTIVES,\n exports: [CdkScrollableModule, ...DRAG_DROP_DIRECTIVES],\n providers: [DragDrop],\n})\nexport class DragDropModule {}\n\n// Re-export needed by the Angular compiler.\n// See: https://github.com/angular/components/issues/30663.\n// Note: These exports need to be stable and shouldn't be renamed unnecessarily because\n// consuming libraries might have references to them in their own partial compilation output.\nexport {CdkScrollable as ɵɵCdkScrollable} from '../scrolling';\n"],"names":["deepCloneNode","node","clone","cloneNode","descendantsWithId","querySelectorAll","nodeName","toLowerCase","removeAttribute","i","length","transferCanvasData","transferInputData","transferData","selector","callback","descendantElements","cloneElements","cloneUniqueId","source","type","value","name","context","getContext","drawImage","getMutableClientRect","element","rect","getBoundingClientRect","top","right","bottom","left","width","height","x","y","isInsideClientRect","clientRect","isOverflowingParent","parentRect","childRect","isLeftOverflowing","isRightOverflowing","isTopOverflowing","isBottomOverflowing","adjustDomRect","domRect","isPointerNearDomRect","threshold","pointerX","pointerY","xThreshold","yThreshold","ParentPositionTracker","_document","positions","Map","constructor","clear","cache","elements","set","scrollPosition","getViewportScrollPosition","forEach","scrollTop","scrollLeft","handleScroll","event","target","_getEventTarget","cachedPosition","get","newTop","newLeft","viewportScrollPosition","topDifference","leftDifference","position","contains","window","scrollY","scrollX","getRootNode","viewRef","rootNodes","nodeType","ELEMENT_NODE","wrapper","createElement","appendChild","extendStyles","dest","importantProperties","key","hasOwnProperty","setProperty","has","removeProperty","toggleNativeDragInteractions","enable","userSelect","style","toggleVisibility","opacity","combineTransforms","transform","initialTransform","matchElementSize","sourceRect","getTransform","Math","round","capturingEventOptions","capture","activeCapturingEventOptions","passive","_ResetsLoader","deps","i0","ɵɵFactoryTarget","Component","ɵcmp","ɵɵngDeclareComponent","minVersion","version","isInline","styles","changeDetection","ChangeDetectionStrategy","OnPush","encapsulation","ViewEncapsulation","None","decorators","args","template","host","DragDropRegistry","_ngZone","inject","NgZone","DOCUMENT","_styleLoader","_CdkPrivateStyleLoader","_renderer","RendererFactory2","createRenderer","_cleanupDocumentTouchmove","_scroll","Subject","_dropInstances","Set","_dragInstances","_activeDragInstances","signal","_globalListeners","_draggingPredicate","item","isDragging","_domNodesToDirectives","pointerMove","pointerUp","registerDropContainer","drop","add","registerDragItem","drag","size","runOutsideAngular","listen","_persistentTouchmoveListener","removeDropContainer","delete","removeDragItem","stopDragging","startDragging","indexOf","load","update","instances","isTouchEvent","startsWith","endEventHandler","e","next","toBind","_preventDefaultWhileDragging","push","map","handler","options","index","splice","_clearGlobalListeners","scrolled","shadowRoot","streams","Observable","observer","cleanup","merge","registerDirectiveNode","dragRef","WeakMap","removeDirectiveNode","getDragDirectiveForNode","ngOnDestroy","instance","complete","preventDefault","some","undefined","Injectable","ɵprov","ɵɵngDeclareInjectable","ngImport","providedIn","parseCssTimeUnitsToMs","multiplier","parseFloat","getTransformTransitionDurationInMs","computedStyle","getComputedStyle","transitionedProperties","parseCssPropertyValue","property","find","prop","propertyIndex","rawDurations","rawDelays","getPropertyValue","split","part","trim","PreviewRef","_rootElement","_direction","_initialDomRect","_previewTemplate","_previewClass","_pickupPositionOnPage","_initialTransform","_zIndex","_previewEmbeddedView","_preview","attach","parent","_createPreview","supportsPopover","destroy","remove","setTransform","addClass","className","classList","getTransitionDuration","addEventListener","previewConfig","previewClass","previewTemplate","preview","rootRect","matchSize","viewContainer","createEmbeddedView","detectChanges","setAttribute","Array","isArray","passiveEventListenerOptions","activeEventListenerOptions","MOUSE_EVENT_IGNORE_TIME","PLACEHOLDER_CLASS","dragImportantProperties","createDragRef","injector","config","dragStartThreshold","pointerDirectionChangeThreshold","renderer","Renderer2","optional","DragRef","ViewportRuler","_config","_viewportRuler","_dragDropRegistry","_rootElementCleanups","_cleanupShadowRootSelectStart","_previewContainer","_placeholderRef","_placeholder","_pickupPositionInElement","_marker","_anchor","_passiveTransform","_activeTransform","_hasStartedDragging","_hasMoved","_initialContainer","_initialIndex","_parentPositions","_moveEvents","_pointerDirectionDelta","_pointerPositionAtLastDirectionChange","_lastKnownPointerPosition","_ownerSVGElement","_rootElementTapHighlight","_pointerMoveSubscription","Subscription","EMPTY","_pointerUpSubscription","_scrollSubscription","_resizeSubscription","_lastTouchEventTime","_dragStartTime","_boundaryElement","_nativeInteractionsEnabled","_previewRect","_boundaryRect","_placeholderTemplate","_handles","_disabledHandles","_dropContainer","_parentDragRef","_cachedShadowRoot","lockAxis","dragStartDelay","scale","disabled","_disabled","_toggleNativeDragInteractions","handle","beforeStarted","started","released","ended","entered","exited","dropped","moved","data","constrainPosition","withRootElement","withParent","parentDragRef","getPlaceholderElement","getRootElement","getVisibleElement","withHandles","handles","coerceElement","disabledHandles","withPreviewTemplate","withPlaceholderTemplate","rootElement","_removeRootElementListeners","_pointerDown","_nativeDragStart","SVGElement","ownerSVGElement","withBoundaryElement","boundaryElement","unsubscribe","change","subscribe","_containInsideBoundaryOnResize","dispose","_destroyPreview","_destroyPlaceholder","_removeListeners","reset","resetToBoundary","offsetX","offsetY","currentLeft","currentTop","disableHandle","enableHandle","withDirection","direction","_withDropContainer","container","getFreeDragPosition","setFreeDragPosition","_applyRootElementTransform","withPreviewContainer","_sortFromLastPointerPosition","_updateActiveDropContainer","_getConstrainedPointerPosition","targetHandle","_getTargetHandle","_initializeDragSequence","_pointerMove","pointerPosition","_getPointerPositionOnPage","distanceX","abs","distanceY","isOverThreshold","isDelayElapsed","Date","now","_getDragStartDelay","_endDragSequence","isReceiving","cancelable","run","_startDragSequence","constrainedPointerPosition","_updatePointerDirectionDelta","offset","activeTransform","observers","distance","_getDragDistance","delta","_pointerUp","webkitTapHighlightColor","_stopScrolling","_animatePreviewToPlaceholder","then","_cleanupDragArtifacts","_cleanupCachedDimensions","dropPoint","_getShadowRoot","dropContainer","shadowDomSelectStart","parentNode","placeholder","_createPlaceholderElement","marker","createComment","ngDevMode","insertBefore","zIndex","_getPreviewInsertionPoint","body","replaceChild","start","getItemIndex","getScrollableParents","referenceElement","stopPropagation","isTouchSequence","isAuxiliaryMouseButton","button","isSyntheticEvent","isFakeEvent","isFakeTouchstartFromScreenReader","isFakeMousedownFromScreenReader","draggable","rootStyles","scrollEvent","_updateOnScroll","_getPointerPositionInElement","currentIndex","isPointerOverContainer","_isOverContainer","previousIndex","previousContainer","rawX","rawY","newContainer","_getSiblingContainerFromPosition","exitIndex","nextItemElement","getItemAtIndex","exit","_conditionallyInsertAnchor","enter","sortingDisabled","_startScrollingIfNecessary","_sortItem","_applyPreviewTransform","Promise","resolve","placeholderRect","duration","propertyName","cleanupListener","clearTimeout","timeout","setTimeout","placeholderConfig","placeholderTemplate","pointerEvents","elementRect","handleElement","referenceRect","point","targetTouches","_getViewportScrollPosition","pageX","pageY","touches","changedTouches","svgMatrix","getScreenCTM","svgPoint","createSVGPoint","matrixTransform","inverse","dropContainerLock","pickupX","pickupY","boundaryRect","previewWidth","previewHeight","_getPreviewRect","minY","maxY","minX","maxX","clamp","pointerPositionOnPage","positionSinceLastChange","changeX","changeY","shouldEnable","currentPosition","pickupPosition","leftOverflow","rightOverflow","topOverflow","bottomOverflow","touch","mouse","scrollDifference","initialParent","previewContainer","documentRef","fullscreenElement","webkitFullscreenElement","mozFullScreenElement","msFullscreenElement","exitContainer","hasAnchor","anchor","before","min","max","moveItemInArray","array","fromIndex","toIndex","from","to","transferArrayItem","currentArray","targetArray","targetIndex","copyArrayItem","SingleAxisSortStrategy","_element","_sortPredicate","_itemPositions","_activeDraggables","orientation","_previousSwap","overlaps","items","withItems","sort","pointerDelta","siblings","newIndex","_getItemIndexFromPointerPosition","isHorizontal","findIndex","currentItem","siblingAtNewPosition","newPosition","itemOffset","_getItemOffsetPx","siblingOffset","_getSiblingOffsetPx","oldOrder","slice","sibling","isDraggedItem","elementToOffset","transformAmount","activeDraggables","newPositionReference","_shouldEnterAsFirstChild","parentElement","_cacheItemPositions","withSortPredicate","predicate","p","getActiveItemsSnapshot","_getVisualItemPositions","updateOnScroll","withElementContainer","elementToMeasure","a","b","reverse","immediateSibling","end","itemPositions","reversed","lastItemRect","firstItemRect","floor","MixedSortStrategy","_rootNode","_activeItems","deltaX","deltaY","_relatedNodes","childNodes","nextSibling","previousSwap","toSwapWith","current","overlapElement","after","newOverlapElement","_getRootNode","elementFromPoint","enterIndex","_getClosestItemIndexToPointer","targetItem","root","elementAtPoint","minDistance","Infinity","minIndex","hypot","DROP_PROXIMITY_THRESHOLD","SCROLL_PROXIMITY_THRESHOLD","AutoScrollVerticalDirection","AutoScrollHorizontalDirection","createDropListRef","DropListRef","autoScrollDisabled","autoScrollStep","enterPredicate","sortPredicate","sorted","receivingStarted","receivingStopped","_container","_isDragging","_sortStrategy","_domRect","_draggables","_siblings","_activeSiblings","_viewportScrollSubscription","_verticalScrollDirection","NONE","_horizontalScrollDirection","_scrollNode","_stopScrollTimers","_scrollableElements","_initialScrollSnap","coercedElement","withOrientation","_draggingStarted","_notifyReceivingSiblings","_cacheParentPositions","_reset","previousItems","draggedItems","filter","every","connectedTo","strategy","withScrollableParents","Error","oldContainerIndex","newContainerIndex","unshift","result","scrollNode","verticalScrollDirection","horizontalScrollDirection","getElementScrollDirections","getViewportSize","getVerticalScrollDirection","getHorizontalScrollDirection","_startScrollInterval","msScrollSnapType","scrollSnapType","_listenToScrollEvents","_stopReceiving","interval","animationFrameScheduler","pipe","takeUntil","scrollStep","UP","scrollBy","DOWN","LEFT","RIGHT","_canReceive","_startReceiving","activeSiblings","initiator","receiver","computedVertical","computedHorizontal","scrollHeight","clientHeight","scrollWidth","clientWidth","DragDrop","_injector","Injector","createDrag","createDropList","CDK_DRAG_PARENT","InjectionToken","assertElementNode","CDK_DRAG_HANDLE","CdkDragHandle","ElementRef","_parentDrag","skipSelf","_stateChanges","nativeElement","_addHandle","ngAfterViewInit","ref","_removeHandle","Directive","ɵdir","ɵɵngDeclareDirective","isStandalone","inputs","booleanAttribute","classAttribute","providers","provide","useExisting","Input","alias","CDK_DRAG_CONFIG","CDK_DROP_LIST","CdkDrag","_viewContainerRef","ViewContainerRef","_dir","Directionality","_changeDetectorRef","ChangeDetectorRef","_selfHandle","self","_destroyed","BehaviorSubject","_dragRef","rootElementSelector","freeDragPosition","EventEmitter","subscription","movedEvent","_assignDefaults","addItem","_dropListRef","_syncInputs","_handleEvents","afterNextRender","_updateRootElement","_setupHandlesListener","ngOnChanges","changes","rootSelectorChange","positionChange","firstChange","removeItem","getValue","_setPreviewTemplate","_resetPreviewTemplate","_setPlaceholderTemplate","_resetPlaceholderTemplate","closest","_getBoundaryElement","boundary","dir","templateRef","coerceNumberProperty","take","parentDrag","startEvent","emit","markForCheck","releaseEvent","endEvent","enterEvent","exitEvent","dropEvent","draggingDisabled","tap","handleElements","switchMap","startWith","handleInstance","numberAttribute","exportAs","usesOnChanges","Output","CDK_DROP_LIST_GROUP","CdkDropListGroup","_items","CdkDropList","_scrollDispatcher","ScrollDispatcher","_group","_latestSortedRefs","_scrollableParentsResolved","_dropLists","id","_IdGenerator","getId","elementContainerSelector","_unsortedItems","_setupInputSyncSubscription","_syncItemsWithRef","getSortedItems","documentPosition","compareDocumentPosition","Node","DOCUMENT_POSITION_FOLLOWING","coerceArray","correspondingDropList","list","console","warn","scrollableParents","getAncestorScrollContainers","scrollable","getElementRef","querySelector","listAutoScrollDisabled","listOrientation","outputs","properties","useValue","CDK_DRAG_PREVIEW","CdkDragPreview","TemplateRef","_drag","CDK_DRAG_PLACEHOLDER","CdkDragPlaceholder","DRAG_DROP_DIRECTIVES","DragDropModule","NgModule","ɵmod","ɵɵngDeclareNgModule","exports","CdkScrollableModule","ɵinj","ɵɵngDeclareInjector","imports"],"mappings":"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"}
|