{"version":3,"file":"ngx-drag-drop.mjs","sources":["../../../projects/dnd/src/lib/dnd-utils.ts","../../../projects/dnd/src/lib/dnd-state.ts","../../../projects/dnd/src/lib/dnd-draggable.directive.ts","../../../projects/dnd/src/lib/dnd-dropzone.directive.ts","../../../projects/dnd/src/lib/dnd-handle.directive.ts","../../../projects/dnd/src/lib/dnd.module.ts","../../../projects/dnd/src/public-api.ts","../../../projects/dnd/src/ngx-drag-drop.ts"],"sourcesContent":["import { DropEffect, EffectAllowed } from './dnd-types';\n\nexport interface DragDropData {\n  data?: any;\n  type?: string;\n}\n\nexport interface DndEvent extends DragEvent {\n  _dndUsingHandle?: boolean;\n  _dndDropzoneActive?: true;\n}\n\nexport type DndDragImageOffsetFunction = (\n  event: DragEvent,\n  dragImage: Element\n) => { x: number; y: number };\n\nexport const DROP_EFFECTS = ['move', 'copy', 'link'] as DropEffect[];\n\nexport const CUSTOM_MIME_TYPE = 'application/x-dnd';\n\nfunction mimeTypeIsCustom(mimeType: string) {\n  return mimeType.substring(0, CUSTOM_MIME_TYPE.length) === CUSTOM_MIME_TYPE;\n}\n\nexport function getWellKnownMimeType(event: DragEvent): string | null {\n  if (event.dataTransfer) {\n    const types = event.dataTransfer.types;\n\n    for (let i = 0; i < types.length; i++) {\n      if (mimeTypeIsCustom(types[i])) {\n        return types[i];\n      }\n    }\n  }\n\n  return null;\n}\n\nexport function setDragData(\n  event: DragEvent,\n  data: DragDropData,\n  effectAllowed: EffectAllowed\n): void {\n  const mimeType = CUSTOM_MIME_TYPE + (data.type ? '-' + data.type : '');\n\n  const dataString = JSON.stringify(data);\n\n  event.dataTransfer?.setData(mimeType, dataString);\n}\n\nexport function getDropData(\n  event: DragEvent,\n  dragIsExternal: boolean\n): DragDropData {\n  const mimeType = getWellKnownMimeType(event);\n\n  if (dragIsExternal === true) {\n    if (mimeType !== null && mimeTypeIsCustom(mimeType)) {\n      return JSON.parse(event.dataTransfer?.getData(mimeType) ?? '{}');\n    }\n\n    return {};\n  }\n\n  if (mimeType !== null) {\n    return JSON.parse(event.dataTransfer?.getData(mimeType) ?? '{}');\n  }\n\n  return {};\n}\n\nexport function filterEffects(\n  effects: DropEffect[],\n  allowed: EffectAllowed | DropEffect\n): DropEffect[] {\n  if (allowed === 'all' || allowed === 'uninitialized') {\n    return effects;\n  }\n\n  return effects.filter(function (effect) {\n    return allowed.toLowerCase().indexOf(effect) !== -1;\n  });\n}\n\nexport function getDirectChildElement(\n  parentElement: Element,\n  childElement: Element\n): Element | null {\n  let directChild: Node = childElement;\n\n  while (directChild.parentNode !== parentElement) {\n    // reached root node without finding given parent\n    if (!directChild.parentNode) {\n      return null;\n    }\n\n    directChild = directChild.parentNode;\n  }\n\n  return directChild as Element;\n}\n\nexport function shouldPositionPlaceholderBeforeElement(\n  event: DragEvent,\n  element: Element,\n  horizontal: boolean\n) {\n  const bounds = element.getBoundingClientRect();\n\n  // If the pointer is in the upper half of the list item element,\n  // we position the placeholder before the list item, otherwise after it.\n  if (horizontal) {\n    return event.clientX < bounds.left + bounds.width / 2;\n  }\n\n  return event.clientY < bounds.top + bounds.height / 2;\n}\n\nexport function calculateDragImageOffset(\n  event: DragEvent,\n  dragImage: Element\n): { x: number; y: number } {\n  const dragImageComputedStyle = window.getComputedStyle(dragImage);\n  const paddingTop = parseFloat(dragImageComputedStyle.paddingTop) || 0;\n  const paddingLeft = parseFloat(dragImageComputedStyle.paddingLeft) || 0;\n  const borderTop = parseFloat(dragImageComputedStyle.borderTopWidth) || 0;\n  const borderLeft = parseFloat(dragImageComputedStyle.borderLeftWidth) || 0;\n\n  return {\n    x: event.offsetX + paddingLeft + borderLeft,\n    y: event.offsetY + paddingTop + borderTop,\n  };\n}\n\nexport function setDragImage(\n  event: DragEvent,\n  dragImage: Element,\n  offsetFunction: DndDragImageOffsetFunction\n): void {\n  const offset = offsetFunction(event, dragImage) || { x: 0, y: 0 };\n\n  (event.dataTransfer as any).setDragImage(dragImage, offset.x, offset.y);\n}\n","import { DropEffect, EffectAllowed } from './dnd-types';\nimport {\n  CUSTOM_MIME_TYPE,\n  DROP_EFFECTS,\n  filterEffects,\n  getWellKnownMimeType,\n} from './dnd-utils';\n\nexport interface DndState {\n  isDragging: boolean;\n  dropEffect?: DropEffect;\n  effectAllowed?: EffectAllowed;\n  type?: string;\n}\n\nconst _dndState: DndState = {\n  isDragging: false,\n  dropEffect: 'none',\n  effectAllowed: 'all',\n  type: undefined,\n};\n\nexport function startDrag(\n  event: DragEvent,\n  effectAllowed: EffectAllowed,\n  type: string | undefined\n) {\n  _dndState.isDragging = true;\n  _dndState.dropEffect = 'none';\n  _dndState.effectAllowed = effectAllowed;\n  _dndState.type = type;\n\n  if (event.dataTransfer) {\n    event.dataTransfer.effectAllowed = effectAllowed;\n  }\n}\n\nexport function endDrag() {\n  _dndState.isDragging = false;\n  _dndState.dropEffect = undefined;\n  _dndState.effectAllowed = undefined;\n  _dndState.type = undefined;\n}\n\nexport function setDropEffect(event: DragEvent, dropEffect: DropEffect) {\n  if (_dndState.isDragging === true) {\n    _dndState.dropEffect = dropEffect;\n  }\n\n  if (event.dataTransfer) {\n    event.dataTransfer.dropEffect = dropEffect;\n  }\n}\n\nexport function getDropEffect(\n  event: DragEvent,\n  effectAllowed?: EffectAllowed | DropEffect\n): DropEffect {\n  const dataTransferEffectAllowed: EffectAllowed = event.dataTransfer\n    ? (event.dataTransfer.effectAllowed as EffectAllowed)\n    : 'uninitialized';\n\n  let effects = filterEffects(DROP_EFFECTS, dataTransferEffectAllowed);\n\n  if (_dndState.isDragging === true) {\n    effects = filterEffects(effects, _dndState.effectAllowed!);\n  }\n\n  if (effectAllowed) {\n    effects = filterEffects(effects, effectAllowed);\n  }\n\n  // MacOS automatically filters dataTransfer.effectAllowed depending on the modifier keys,\n  // therefore the following modifier keys will only affect other operating systems.\n  if (effects.length === 0) {\n    return 'none';\n  }\n\n  if (event.ctrlKey && effects.indexOf('copy') !== -1) {\n    return 'copy';\n  }\n\n  if (event.altKey && effects.indexOf('link') !== -1) {\n    return 'link';\n  }\n\n  return effects[0] as DropEffect;\n}\n\nexport function getDndType(event: DragEvent): string | undefined {\n  if (_dndState.isDragging === true) {\n    return _dndState.type;\n  }\n\n  const mimeType = getWellKnownMimeType(event);\n\n  if (mimeType === null) {\n    return undefined;\n  }\n\n  return mimeType.substring(CUSTOM_MIME_TYPE.length + 1) || undefined;\n}\n\nexport function isExternalDrag(): boolean {\n  return _dndState.isDragging === false;\n}\n\nexport const dndState: Readonly<DndState> = _dndState as Readonly<DndState>;\n","import {\n  AfterViewInit,\n  Directive,\n  ElementRef,\n  EventEmitter,\n  forwardRef,\n  HostBinding,\n  HostListener,\n  inject,\n  Input,\n  NgZone,\n  OnDestroy,\n  OnInit,\n  Output,\n  Renderer2,\n} from '@angular/core';\nimport { DndHandleDirective } from './dnd-handle.directive';\nimport { dndState, endDrag, startDrag } from './dnd-state';\nimport { EffectAllowed } from './dnd-types';\nimport {\n  calculateDragImageOffset,\n  DndDragImageOffsetFunction,\n  DndEvent,\n  setDragData,\n  setDragImage,\n} from './dnd-utils';\n\n@Directive({ selector: '[dndDragImageRef]', standalone: true })\nexport class DndDragImageRefDirective implements OnInit {\n  dndDraggableDirective = inject(forwardRef(() => DndDraggableDirective));\n  elementRef: ElementRef<HTMLElement> = inject(ElementRef);\n\n  ngOnInit() {\n    this.dndDraggableDirective.registerDragImage(this.elementRef);\n  }\n}\n\n@Directive({ selector: '[dndDraggable]', standalone: true })\nexport class DndDraggableDirective implements AfterViewInit, OnDestroy {\n  @Input() dndDraggable: any;\n  @Input() dndEffectAllowed: EffectAllowed = 'copy';\n  @Input() dndType?: string;\n  @Input() dndDraggingClass = 'dndDragging';\n  @Input() dndDraggingSourceClass = 'dndDraggingSource';\n  @Input() dndDraggableDisabledClass = 'dndDraggableDisabled';\n  @Input() dndDragImageOffsetFunction: DndDragImageOffsetFunction =\n    calculateDragImageOffset;\n\n  @Output() readonly dndStart: EventEmitter<DragEvent> =\n    new EventEmitter<DragEvent>();\n  @Output() readonly dndDrag: EventEmitter<DragEvent> =\n    new EventEmitter<DragEvent>();\n  @Output() readonly dndEnd: EventEmitter<DragEvent> =\n    new EventEmitter<DragEvent>();\n  @Output() readonly dndMoved: EventEmitter<DragEvent> =\n    new EventEmitter<DragEvent>();\n  @Output() readonly dndCopied: EventEmitter<DragEvent> =\n    new EventEmitter<DragEvent>();\n  @Output() readonly dndLinked: EventEmitter<DragEvent> =\n    new EventEmitter<DragEvent>();\n  @Output() readonly dndCanceled: EventEmitter<DragEvent> =\n    new EventEmitter<DragEvent>();\n\n  @HostBinding('attr.draggable') draggable = true;\n\n  private dndHandle?: DndHandleDirective;\n  private dndDragImageElementRef?: ElementRef;\n  private dragImage: Element | undefined;\n  private isDragStarted: boolean = false;\n\n  private elementRef: ElementRef<HTMLElement> = inject(ElementRef);\n  private renderer = inject(Renderer2);\n  private ngZone = inject(NgZone);\n\n  @Input() set dndDisableIf(value: boolean) {\n    this.draggable = !value;\n\n    if (this.draggable) {\n      this.renderer.removeClass(\n        this.elementRef.nativeElement,\n        this.dndDraggableDisabledClass\n      );\n    } else {\n      this.renderer.addClass(\n        this.elementRef.nativeElement,\n        this.dndDraggableDisabledClass\n      );\n    }\n  }\n\n  @Input() set dndDisableDragIf(value: boolean) {\n    this.dndDisableIf = value;\n  }\n\n  ngAfterViewInit(): void {\n    this.ngZone.runOutsideAngular(() => {\n      this.elementRef.nativeElement.addEventListener(\n        'drag',\n        this.dragEventHandler\n      );\n    });\n  }\n\n  ngOnDestroy(): void {\n    this.elementRef.nativeElement.removeEventListener(\n      'drag',\n      this.dragEventHandler\n    );\n    if (this.isDragStarted) {\n      endDrag();\n    }\n  }\n\n  @HostListener('dragstart', ['$event']) onDragStart(event: DndEvent): boolean {\n    if (!this.draggable) {\n      return false;\n    }\n\n    // check if there is dnd handle and if the dnd handle was used to start the drag\n    if (this.dndHandle != null && event._dndUsingHandle == null) {\n      event.stopPropagation();\n      return false;\n    }\n\n    // initialize global state\n    startDrag(event, this.dndEffectAllowed, this.dndType);\n\n    this.isDragStarted = true;\n\n    setDragData(\n      event,\n      { data: this.dndDraggable, type: this.dndType },\n      dndState.effectAllowed!\n    );\n\n    this.dragImage = this.determineDragImage();\n\n    // set dragging css class prior to setDragImage so styles are applied before\n    // TODO breaking change: add class to elementRef rather than drag image which could be another element\n    this.renderer.addClass(this.dragImage, this.dndDraggingClass);\n\n    // set custom dragimage if present\n    // set dragimage if drag is started from dndHandle\n    if (this.dndDragImageElementRef != null || event._dndUsingHandle != null) {\n      setDragImage(event, this.dragImage, this.dndDragImageOffsetFunction);\n    }\n\n    // add dragging source css class on first drag event\n    const unregister = this.renderer.listen(\n      this.elementRef.nativeElement,\n      'drag',\n      () => {\n        this.renderer.addClass(\n          this.elementRef.nativeElement,\n          this.dndDraggingSourceClass\n        );\n        unregister();\n      }\n    );\n\n    this.dndStart.emit(event);\n\n    event.stopPropagation();\n\n    setTimeout(() => {\n      if (this.isDragStarted) {\n        this.renderer.setStyle(this.dragImage, 'pointer-events', 'none');\n      }\n    }, 100);\n\n    return true;\n  }\n\n  onDrag(event: DragEvent) {\n    this.dndDrag.emit(event);\n  }\n\n  @HostListener('dragend', ['$event']) onDragEnd(event: DragEvent) {\n    if (!this.draggable || !this.isDragStarted) {\n      return;\n    }\n    // get drop effect from custom stored state as its not reliable across browsers\n    const dropEffect = dndState.dropEffect;\n\n    this.renderer.setStyle(this.dragImage, 'pointer-events', 'unset');\n\n    let dropEffectEmitter: EventEmitter<DragEvent>;\n\n    switch (dropEffect) {\n      case 'copy':\n        dropEffectEmitter = this.dndCopied;\n        break;\n\n      case 'link':\n        dropEffectEmitter = this.dndLinked;\n        break;\n\n      case 'move':\n        dropEffectEmitter = this.dndMoved;\n        break;\n\n      default:\n        dropEffectEmitter = this.dndCanceled;\n        break;\n    }\n\n    dropEffectEmitter.emit(event);\n    this.dndEnd.emit(event);\n\n    // reset global state\n    endDrag();\n\n    this.isDragStarted = false;\n\n    this.renderer.removeClass(this.dragImage, this.dndDraggingClass);\n\n    // IE9 special hammering\n    window.setTimeout(() => {\n      this.renderer.removeClass(\n        this.elementRef.nativeElement,\n        this.dndDraggingSourceClass\n      );\n    }, 0);\n\n    event.stopPropagation();\n  }\n\n  registerDragHandle(handle: DndHandleDirective | undefined) {\n    this.dndHandle = handle;\n  }\n\n  registerDragImage(elementRef: ElementRef | undefined) {\n    this.dndDragImageElementRef = elementRef;\n  }\n\n  private readonly dragEventHandler: (event: DragEvent) => void = (\n    event: DragEvent\n  ) => this.onDrag(event);\n\n  private determineDragImage(): Element {\n    // evaluate custom drag image existence\n    if (typeof this.dndDragImageElementRef !== 'undefined') {\n      return this.dndDragImageElementRef.nativeElement as Element;\n    } else {\n      return this.elementRef.nativeElement;\n    }\n  }\n}\n","import {\n  AfterViewInit,\n  ContentChild,\n  Directive,\n  ElementRef,\n  EventEmitter,\n  HostListener,\n  inject,\n  Input,\n  NgZone,\n  OnDestroy,\n  OnInit,\n  Output,\n  Renderer2,\n} from '@angular/core';\nimport {\n  getDndType,\n  getDropEffect,\n  isExternalDrag,\n  setDropEffect,\n} from './dnd-state';\nimport { DropEffect, EffectAllowed } from './dnd-types';\nimport {\n  DndEvent,\n  DragDropData,\n  getDirectChildElement,\n  getDropData,\n  shouldPositionPlaceholderBeforeElement,\n} from './dnd-utils';\n\nexport interface DndDropEvent {\n  event: DragEvent;\n  dropEffect: DropEffect;\n  isExternal: boolean;\n  data?: any;\n  index?: number;\n  type?: any;\n}\n\n@Directive({ selector: '[dndPlaceholderRef]', standalone: true })\nexport class DndPlaceholderRefDirective implements OnInit {\n  readonly elementRef: ElementRef<HTMLElement> = inject(ElementRef);\n\n  ngOnInit() {\n    // placeholder has to be \"invisible\" to the cursor, or it would interfere with the dragover detection for the same dropzone\n    this.elementRef.nativeElement.style.pointerEvents = 'none';\n  }\n}\n\n@Directive({ selector: '[dndDropzone]', standalone: true })\nexport class DndDropzoneDirective implements AfterViewInit, OnDestroy {\n  @Input() dndDropzone?: string[] | '' = '';\n\n  @Input() dndEffectAllowed: EffectAllowed = 'uninitialized';\n\n  @Input() dndAllowExternal: boolean = false;\n\n  @Input() dndHorizontal: boolean = false;\n\n  @Input() dndDragoverClass: string = 'dndDragover';\n\n  @Input() dndDropzoneDisabledClass = 'dndDropzoneDisabled';\n\n  @Output() readonly dndDragover: EventEmitter<DragEvent> =\n    new EventEmitter<DragEvent>();\n\n  @Output() readonly dndDrop: EventEmitter<DndDropEvent> =\n    new EventEmitter<DndDropEvent>();\n\n  @ContentChild(DndPlaceholderRefDirective)\n  private readonly dndPlaceholderRef?: DndPlaceholderRefDirective;\n\n  private placeholder: Element | null = null;\n\n  private disabled: boolean = false;\n\n  private enterCount: number = 0;\n\n  private ngZone = inject(NgZone);\n  private elementRef: ElementRef = inject(ElementRef);\n  private renderer = inject(Renderer2);\n\n  @Input() set dndDisableIf(value: boolean) {\n    this.disabled = value;\n\n    if (this.disabled) {\n      this.renderer.addClass(\n        this.elementRef.nativeElement,\n        this.dndDropzoneDisabledClass\n      );\n    } else {\n      this.renderer.removeClass(\n        this.elementRef.nativeElement,\n        this.dndDropzoneDisabledClass\n      );\n    }\n  }\n\n  @Input() set dndDisableDropIf(value: boolean) {\n    this.dndDisableIf = value;\n  }\n\n  ngAfterViewInit(): void {\n    this.placeholder = this.tryGetPlaceholder();\n\n    this.removePlaceholderFromDOM();\n\n    this.ngZone.runOutsideAngular(() => {\n      this.elementRef.nativeElement.addEventListener(\n        'dragenter',\n        this.dragEnterEventHandler\n      );\n      this.elementRef.nativeElement.addEventListener(\n        'dragover',\n        this.dragOverEventHandler\n      );\n      this.elementRef.nativeElement.addEventListener(\n        'dragleave',\n        this.dragLeaveEventHandler\n      );\n    });\n  }\n\n  ngOnDestroy(): void {\n    this.elementRef.nativeElement.removeEventListener(\n      'dragenter',\n      this.dragEnterEventHandler\n    );\n    this.elementRef.nativeElement.removeEventListener(\n      'dragover',\n      this.dragOverEventHandler\n    );\n    this.elementRef.nativeElement.removeEventListener(\n      'dragleave',\n      this.dragLeaveEventHandler\n    );\n  }\n\n  onDragEnter(event: DndEvent) {\n    this.enterCount++;\n\n    // check if another dropzone is activated\n    if (event._dndDropzoneActive === true) {\n      this.removePlaceholderFromDOM();\n      this.renderer.removeClass(\n        this.elementRef.nativeElement,\n        this.dndDragoverClass\n      );\n      return;\n    }\n\n    // set as active if the target element is inside this dropzone\n    if (event._dndDropzoneActive == null) {\n      if (this.elementRef.nativeElement.contains(event.target)) {\n        event._dndDropzoneActive = true;\n      }\n    }\n\n    // check if this drag event is allowed to drop on this dropzone\n    const type = getDndType(event);\n    if (!this.isDropAllowed(type)) {\n      return;\n    }\n\n    // allow the dragenter\n    event.preventDefault();\n  }\n\n  onDragOver(event: DragEvent) {\n    // With nested dropzones, we want to ignore this event if a child dropzone\n    // has already handled a dragover.  Historically, event.stopPropagation() was\n    // used to prevent this bubbling, but that prevents any dragovers outside the\n    // ngx-drag-drop component, and stops other use cases such as scrolling on drag.\n    // Instead, we can check if the event was already prevented by a child and bail early.\n    if (event.defaultPrevented) {\n      return;\n    }\n\n    // check if this drag event is allowed to drop on this dropzone\n    const type = getDndType(event);\n    if (!this.isDropAllowed(type)) {\n      return;\n    }\n\n    this.checkAndUpdatePlaceholderPosition(event);\n\n    const dropEffect = getDropEffect(event, this.dndEffectAllowed);\n\n    if (dropEffect === 'none') {\n      this.cleanupDragoverState();\n      return;\n    }\n\n    // allow the dragover\n    event.preventDefault();\n\n    // set the drop effect\n    setDropEffect(event, dropEffect);\n\n    this.dndDragover.emit(event);\n\n    this.renderer.addClass(\n      this.elementRef.nativeElement,\n      this.dndDragoverClass\n    );\n  }\n\n  @HostListener('drop', ['$event']) onDrop(event: DragEvent) {\n    try {\n      // check if this drag event is allowed to drop on this dropzone\n      const type = getDndType(event);\n      if (!this.isDropAllowed(type)) {\n        return;\n      }\n\n      const data: DragDropData = getDropData(event, isExternalDrag());\n\n      if (!this.isDropAllowed(data.type)) {\n        return;\n      }\n\n      // signal custom drop handling\n      event.preventDefault();\n\n      const dropEffect = getDropEffect(event, this.dndEffectAllowed);\n\n      setDropEffect(event, dropEffect);\n\n      if (dropEffect === 'none') {\n        return;\n      }\n\n      const dropIndex = this.getPlaceholderIndex();\n\n      // if for whatever reason the placeholder is not present in the DOM but it should be there\n      // we don't allow/emit the drop event since it breaks the contract\n      // seems to only happen if drag and drop is executed faster than the DOM updates\n      if (dropIndex === -1) {\n        return;\n      }\n\n      this.dndDrop.emit({\n        event: event,\n        dropEffect: dropEffect,\n        isExternal: isExternalDrag(),\n        data: data.data,\n        index: dropIndex,\n        type: type,\n      });\n\n      event.stopPropagation();\n    } finally {\n      this.cleanupDragoverState();\n    }\n  }\n\n  onDragLeave(event: DndEvent) {\n    this.enterCount--;\n\n    // only clean up when all enter/leave pairs are balanced (cursor has truly left)\n    if (this.enterCount > 0) {\n      return;\n    }\n\n    this.cleanupDragoverState();\n\n    // cleanup drop effect when leaving dropzone\n    setDropEffect(event, 'none');\n  }\n\n  private readonly dragEnterEventHandler: (event: DragEvent) => void = (\n    event: DragEvent\n  ) => this.onDragEnter(event);\n\n  private readonly dragOverEventHandler: (event: DragEvent) => void = (\n    event: DragEvent\n  ) => this.onDragOver(event);\n\n  private readonly dragLeaveEventHandler: (event: DragEvent) => void = (\n    event: DragEvent\n  ) => this.onDragLeave(event);\n\n  private isDropAllowed(type?: string): boolean {\n    // dropzone is disabled -> deny it\n    if (this.disabled) {\n      return false;\n    }\n\n    // if drag did not start from our directive\n    // and external drag sources are not allowed -> deny it\n    if (isExternalDrag() && !this.dndAllowExternal) {\n      return false;\n    }\n\n    // no filtering by types -> allow it\n    if (!this.dndDropzone) {\n      return true;\n    }\n\n    // no type set -> allow it\n    if (!type) {\n      return true;\n    }\n\n    if (!Array.isArray(this.dndDropzone)) {\n      throw new Error(\n        'dndDropzone: bound value to [dndDropzone] must be an array!'\n      );\n    }\n\n    // if dropzone contains type -> allow it\n    return this.dndDropzone.indexOf(type) !== -1;\n  }\n\n  private tryGetPlaceholder(): Element | null {\n    if (typeof this.dndPlaceholderRef !== 'undefined') {\n      return this.dndPlaceholderRef.elementRef.nativeElement as Element;\n    }\n\n    // TODO nasty workaround needed because if ng-container / template is used @ContentChild() or DI will fail because\n    // of wrong context see angular bug https://github.com/angular/angular/issues/13517\n    return this.elementRef.nativeElement.querySelector('[dndPlaceholderRef]');\n  }\n\n  private removePlaceholderFromDOM() {\n    if (this.placeholder !== null && this.placeholder.parentNode !== null) {\n      this.placeholder.parentNode.removeChild(this.placeholder);\n    }\n  }\n\n  private checkAndUpdatePlaceholderPosition(event: DragEvent): void {\n    if (this.placeholder === null) {\n      return;\n    }\n\n    // make sure the placeholder is in the DOM\n    if (this.placeholder.parentNode !== this.elementRef.nativeElement) {\n      this.renderer.appendChild(\n        this.elementRef.nativeElement,\n        this.placeholder\n      );\n    }\n\n    // update the position if the event originates from a child element of the dropzone\n    const directChild = getDirectChildElement(\n      this.elementRef.nativeElement,\n      event.target as Element\n    );\n\n    // early exit if no direct child or direct child is placeholder\n    if (directChild === null || directChild === this.placeholder) {\n      return;\n    }\n\n    const positionPlaceholderBeforeDirectChild =\n      shouldPositionPlaceholderBeforeElement(\n        event,\n        directChild,\n        this.dndHorizontal\n      );\n\n    if (positionPlaceholderBeforeDirectChild) {\n      // do insert before only if necessary\n      if (directChild.previousSibling !== this.placeholder) {\n        this.renderer.insertBefore(\n          this.elementRef.nativeElement,\n          this.placeholder,\n          directChild\n        );\n      }\n    } else {\n      // do insert after only if necessary\n      if (directChild.nextSibling !== this.placeholder) {\n        this.renderer.insertBefore(\n          this.elementRef.nativeElement,\n          this.placeholder,\n          directChild.nextSibling\n        );\n      }\n    }\n  }\n\n  private getPlaceholderIndex(): number | undefined {\n    if (this.placeholder === null) {\n      return undefined;\n    }\n\n    const element = this.elementRef.nativeElement as HTMLElement;\n\n    return Array.prototype.indexOf.call(element.children, this.placeholder);\n  }\n\n  private cleanupDragoverState() {\n    this.renderer.removeClass(\n      this.elementRef.nativeElement,\n      this.dndDragoverClass\n    );\n\n    this.enterCount = 0;\n    this.removePlaceholderFromDOM();\n  }\n}\n","import {\n  Directive,\n  HostBinding,\n  HostListener,\n  inject,\n  OnDestroy,\n  OnInit,\n} from '@angular/core';\nimport { DndDraggableDirective } from './dnd-draggable.directive';\nimport { DndEvent } from './dnd-utils';\n\n@Directive({ selector: '[dndHandle]', standalone: true })\nexport class DndHandleDirective implements OnInit, OnDestroy {\n  @HostBinding('attr.draggable') draggable = true;\n\n  dndDraggableDirective = inject(DndDraggableDirective);\n\n  ngOnInit() {\n    this.dndDraggableDirective.registerDragHandle(this);\n  }\n\n  ngOnDestroy(): void {\n    this.dndDraggableDirective.registerDragHandle(undefined);\n  }\n\n  @HostListener('dragstart', ['$event'])\n  @HostListener('dragend', ['$event'])\n  onDragEvent(event: DndEvent) {\n    event._dndUsingHandle = true;\n  }\n}\n","import { NgModule } from '@angular/core';\nimport {\n  DndDraggableDirective,\n  DndDragImageRefDirective,\n} from './dnd-draggable.directive';\nimport {\n  DndDropzoneDirective,\n  DndPlaceholderRefDirective,\n} from './dnd-dropzone.directive';\nimport { DndHandleDirective } from './dnd-handle.directive';\n\n@NgModule({\n  exports: [\n    DndDraggableDirective,\n    DndDropzoneDirective,\n    DndHandleDirective,\n    DndPlaceholderRefDirective,\n    DndDragImageRefDirective,\n  ],\n  imports: [\n    DndDragImageRefDirective,\n    DndDropzoneDirective,\n    DndHandleDirective,\n    DndPlaceholderRefDirective,\n    DndDraggableDirective,\n  ],\n})\nexport class DndModule {}\n","/*\n * Public API Surface of dnd\n */\n\nexport * from './lib/dnd-draggable.directive';\nexport * from './lib/dnd-dropzone.directive';\nexport * from './lib/dnd-handle.directive';\nexport * from './lib/dnd-types';\nexport { DndDragImageOffsetFunction } from './lib/dnd-utils';\nexport * from './lib/dnd.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}