{
  "version": 3,
  "sources": ["../../src/draggable/index.tsx"],
  "sourcesContent": ["/**\n * External dependencies\n */\n\n/**\n * WordPress dependencies\n */\nimport { throttle } from '@wordpress/compose';\nimport { useEffect, useRef } from '@wordpress/element';\n\n/**\n * Internal dependencies\n */\nimport { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from \"react/jsx-runtime\";\nconst dragImageClass = 'components-draggable__invisible-drag-image';\nconst cloneWrapperClass = 'components-draggable__clone';\nconst clonePadding = 0;\nconst bodyClass = 'is-dragging-components-draggable';\n\n/**\n * `Draggable` is a Component that provides a way to set up a cross-browser\n * (including IE) customizable drag image and the transfer data for the drag\n * event. It decouples the drag handle and the element to drag: use it by\n * wrapping the component that will become the drag handle and providing the DOM\n * ID of the element to drag.\n *\n * Note that the drag handle needs to declare the `draggable=\"true\"` property\n * and bind the `Draggable`s `onDraggableStart` and `onDraggableEnd` event\n * handlers to its own `onDragStart` and `onDragEnd` respectively. `Draggable`\n * takes care of the logic to setup the drag image and the transfer data, but is\n * not concerned with creating an actual DOM element that is draggable.\n *\n * ```jsx\n * import { Draggable, Panel, PanelBody } from '@wordpress/components';\n * import { Icon, more } from '@wordpress/icons';\n *\n * const MyDraggable = () => (\n *   <div id=\"draggable-panel\">\n *     <Panel header=\"Draggable panel\">\n *       <PanelBody>\n *         <Draggable elementId=\"draggable-panel\" transferData={ {} }>\n *           { ( { onDraggableStart, onDraggableEnd } ) => (\n *             <div\n *               className=\"example-drag-handle\"\n *               draggable\n *               onDragStart={ onDraggableStart }\n *               onDragEnd={ onDraggableEnd }\n *             >\n *               <Icon icon={ more } />\n *             </div>\n *           ) }\n *         </Draggable>\n *       </PanelBody>\n *     </Panel>\n *   </div>\n * );\n * ```\n */\nexport function Draggable({\n  children,\n  onDragStart,\n  onDragOver,\n  onDragEnd,\n  appendToOwnerDocument = false,\n  cloneClassname,\n  elementId,\n  transferData,\n  __experimentalTransferDataType: transferDataType = 'text',\n  __experimentalDragComponent: dragComponent\n}) {\n  const dragComponentRef = useRef(null);\n  const cleanupRef = useRef(() => {});\n\n  /**\n   * Removes the element clone, resets cursor, and removes drag listener.\n   *\n   * @param event The non-custom DragEvent.\n   */\n  function end(event) {\n    event.preventDefault();\n    cleanupRef.current();\n    if (onDragEnd) {\n      onDragEnd(event);\n    }\n  }\n\n  /**\n   * This method does a couple of things:\n   *\n   * - Clones the current element and spawns clone over original element.\n   * - Adds a fake temporary drag image to avoid browser defaults.\n   * - Sets transfer data.\n   * - Adds dragover listener.\n   *\n   * @param event The non-custom DragEvent.\n   */\n  function start(event) {\n    const {\n      ownerDocument\n    } = event.target;\n    event.dataTransfer.setData(transferDataType, JSON.stringify(transferData));\n    const cloneWrapper = ownerDocument.createElement('div');\n    // Reset position to 0,0. Natural stacking order will position this lower, even with a transform otherwise.\n    cloneWrapper.style.top = '0';\n    cloneWrapper.style.left = '0';\n    const dragImage = ownerDocument.createElement('div');\n\n    // Set a fake drag image to avoid browser defaults. Remove from DOM\n    // right after. event.dataTransfer.setDragImage is not supported yet in\n    // IE, we need to check for its existence first.\n    if ('function' === typeof event.dataTransfer.setDragImage) {\n      dragImage.classList.add(dragImageClass);\n      ownerDocument.body.appendChild(dragImage);\n      event.dataTransfer.setDragImage(dragImage, 0, 0);\n    }\n    cloneWrapper.classList.add(cloneWrapperClass);\n    if (cloneClassname) {\n      cloneWrapper.classList.add(cloneClassname);\n    }\n    let x = 0;\n    let y = 0;\n    // If a dragComponent is defined, the following logic will clone the\n    // HTML node and inject it into the cloneWrapper.\n    if (dragComponentRef.current) {\n      // Position dragComponent at the same position as the cursor.\n      x = event.clientX;\n      y = event.clientY;\n      cloneWrapper.style.transform = `translate( ${x}px, ${y}px )`;\n      const clonedDragComponent = ownerDocument.createElement('div');\n      clonedDragComponent.innerHTML = dragComponentRef.current.innerHTML;\n      cloneWrapper.appendChild(clonedDragComponent);\n\n      // Inject the cloneWrapper into the DOM.\n      ownerDocument.body.appendChild(cloneWrapper);\n    } else {\n      const element = ownerDocument.getElementById(elementId);\n\n      // Prepare element clone and append to element wrapper.\n      const elementRect = element.getBoundingClientRect();\n      const elementWrapper = element.parentNode;\n      const elementTopOffset = elementRect.top;\n      const elementLeftOffset = elementRect.left;\n      cloneWrapper.style.width = `${elementRect.width + clonePadding * 2}px`;\n      const clone = element.cloneNode(true);\n      clone.id = `clone-${elementId}`;\n\n      // Position clone right over the original element (20px padding).\n      x = elementLeftOffset - clonePadding;\n      y = elementTopOffset - clonePadding;\n      cloneWrapper.style.transform = `translate( ${x}px, ${y}px )`;\n\n      // Hack: Remove iFrames as it's causing the embeds drag clone to freeze.\n      Array.from(clone.querySelectorAll('iframe')).forEach(child => child.parentNode?.removeChild(child));\n      cloneWrapper.appendChild(clone);\n\n      // Inject the cloneWrapper into the DOM.\n      if (appendToOwnerDocument) {\n        ownerDocument.body.appendChild(cloneWrapper);\n      } else {\n        elementWrapper?.appendChild(cloneWrapper);\n      }\n    }\n\n    // Mark the current cursor coordinates.\n    let cursorLeft = event.clientX;\n    let cursorTop = event.clientY;\n    function over(e) {\n      // Skip doing any work if mouse has not moved.\n      if (cursorLeft === e.clientX && cursorTop === e.clientY) {\n        return;\n      }\n      const nextX = x + e.clientX - cursorLeft;\n      const nextY = y + e.clientY - cursorTop;\n      cloneWrapper.style.transform = `translate( ${nextX}px, ${nextY}px )`;\n      cursorLeft = e.clientX;\n      cursorTop = e.clientY;\n      x = nextX;\n      y = nextY;\n      if (onDragOver) {\n        onDragOver(e);\n      }\n    }\n\n    // Aim for 60fps (16 ms per frame) for now. We can potentially use requestAnimationFrame (raf) instead,\n    // note that browsers may throttle raf below 60fps in certain conditions.\n    // @ts-ignore\n    const throttledDragOver = throttle(over, 16);\n    ownerDocument.addEventListener('dragover', throttledDragOver);\n\n    // Update cursor to 'grabbing', document wide.\n    ownerDocument.body.classList.add(bodyClass);\n    if (onDragStart) {\n      onDragStart(event);\n    }\n    cleanupRef.current = () => {\n      // Remove drag clone.\n      if (cloneWrapper && cloneWrapper.parentNode) {\n        cloneWrapper.parentNode.removeChild(cloneWrapper);\n      }\n      if (dragImage && dragImage.parentNode) {\n        dragImage.parentNode.removeChild(dragImage);\n      }\n\n      // Reset cursor.\n      ownerDocument.body.classList.remove(bodyClass);\n      ownerDocument.removeEventListener('dragover', throttledDragOver);\n    };\n  }\n  useEffect(() => () => {\n    cleanupRef.current();\n  }, []);\n  return /*#__PURE__*/_jsxs(_Fragment, {\n    children: [children({\n      onDraggableStart: start,\n      onDraggableEnd: end\n    }), dragComponent && /*#__PURE__*/_jsx(\"div\", {\n      className: \"components-draggable-drag-component-root\",\n      style: {\n        display: 'none'\n      },\n      ref: dragComponentRef,\n      children: dragComponent\n    })]\n  });\n}\nexport default Draggable;"],
  "mappings": "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",
  "names": ["_jsxs", "_Fragment", "_jsx"]
}
