{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-portal/src/components/halo/lively-halo-grab-item.js"],"names":["HaloItem","nodes","events","pt","Preferences","Grid","HaloGrabItem","droppingBlacklist","initialize","registerMouseEvents","startCustomDragging","start","evt","isDragging","console","log","grabTarget","window","that","lively","notify","ensureID","grabStartEventPosition","globalPosition","grabOffset","subPt","getGlobalPosition","preventDefault","move","noticableDistanceTo","haloGrabStart","initGrabShadow","prepareGrabTarget","haloGrabMove","moveGrabbedNodeToEvent","stop","haloGrabStop","stopGrabbingAtEvent","grabShadow","document","body","appendChild","classList","add","style","position","removeProperty","cloneNode","isMetaNode","opacity","eventPosition","clientX","clientY","pos","dropAtEvent","setGlobalPosition","optSnapPosition","dropIndicator","remove","dropTargetIndicator","insertGrabTargetBeforeShadow","removeGrabShadow","setPosition","getPosition","parentElement","parentNode","removeChild","dropTargetDescription","droptarget","id","host","findWorldContextHost","localName","elementToCSSName","droptargetAtEvent","moveGrabShadowToTargetAtEvent","showElement","color","textContent","border","SVGElement","element","foreignObject","createElementNS","insertBefore","node","elementsUnderCursor","allElementsFromPoint","filter","elementUnder","isInElement","halo","i","length","targetNode","canDropInto","contentRoot","root","getContentRoot","markdown","querySelector","get","children","childNodes","nextChild","Array","from","find","child","nodeType","nodeComesBehind","shiftKey","dist","targetTag","tagName","toLowerCase","worldContext","findWorldContext","parents","allParents","ea","isHaloItem","result","includes","livelyAcceptsDrop","ShadowRoot","bounds","getBoundingClientRect","toTheRight","top","y","bottom","left","x","below","livelyUpdate"],"mappings":"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","file":"lively-halo-grab-item.js","sourcesContent":["/*\n * # LivelyHaloGrabItem\n * The GrabHaloItem removes the selected node from its parent element\n * drags it to a new position and places it relative or aboslute \n * (distance or holding shift pressed) into another node. \n */\n \nimport HaloItem from 'src/components/halo/lively-halo-item.js';\nimport * as nodes from 'src/client/morphic/node-helpers.js';\nimport * as events from 'src/client/morphic/event-helpers.js';\nimport {pt} from 'src/client/graphics.js';\nimport Preferences from 'src/client/preferences.js';\nimport {Grid} from 'src/client/morphic/snapping.js';\n\n\nexport default class HaloGrabItem extends HaloItem {\n \n static get droppingBlacklist() {\n      return {\"*\": \n        [\"h1\",\"h2\",\"h3\",\"h4\",\"h5\", \"lively-window\", \"button\", \"input\", \"lively-halo\", \"html\",  \"lively-selection\", \"lively-connector\", \"lively-code-mirror\",  \"lively-presentation\"] // \"lively-markdown\",\n      }\n  }\n \n  initialize() {\n    this.registerMouseEvents()\n    this.startCustomDragging();\n  }\n\n  // DRAG API\n\n  start(evt) {\n    if (this.isDragging) {\n      console.log(\"isDragging \" + this.isDragging)\n      return;\n    }\n    this.grabTarget = window.that;\n    if (this.grabTarget) {\n      lively.notify(\"GRAB \" + lively.ensureID(this.grabTarget))\n      this.grabStartEventPosition = events.globalPosition(evt);\n      this.grabOffset =  events.globalPosition(evt).subPt(lively.getGlobalPosition(this.grabTarget));\n\n      evt.preventDefault();\n    }\n  }\n\n  \n  move(evt) {\n    if (this.grabTarget && !this.isDragging && \n      events.noticableDistanceTo(evt, this.grabStartEventPosition)) {\n      // drag detected\n        if (this.grabTarget.haloGrabStart) {\n          this.grabTarget.haloGrabStart(evt, this, this.grabStartEventPosition)\n        } else {\n          this.initGrabShadow();\n          this.prepareGrabTarget();\n        }\n        this.isDragging = true;\n    }\n    if (this.isDragging && this.grabTarget) {\n      if (this.grabTarget.haloGrabMove) {\n        this.grabTarget.haloGrabMove(evt, this)\n      } else {\n        this.moveGrabbedNodeToEvent(evt);\n      }\n    }\n  }\n  \n  stop(evt) {\n    try {\n    if (this.isDragging && this.grabTarget) {\n      if (this.grabTarget.haloGrabStop) {\n        this.grabTarget.haloGrabStop(evt, this)\n      } else {\n        this.stopGrabbingAtEvent(evt);\n      }\n    }\n    } finally {\n      this.isDragging = false;\n      this.grabTarget = null;\n      this.grabStartEventPosition = null;\n      this.grabShadow = null;\n    }\n  }\n  \n  // HELPERS\n  \n  prepareGrabTarget() {\n    document.body.appendChild(this.grabTarget);\n    this.grabTarget.classList.add(\"lively4-grabbed\")\n    this.grabTarget.style.position = 'absolute';\n    this.grabTarget.style.removeProperty('top');\n    this.grabTarget.style.removeProperty('left');\n  }\n  \n  initGrabShadow() {\n    this.grabShadow = this.grabTarget.cloneNode(true);\n    this.grabShadow.isMetaNode = true\n    this.grabShadow.classList.add(\"grabshadow\")\n    this.grabShadow.style.opacity = '0.5';\n    this.grabShadow.style.position = 'relative';\n    this.grabShadow.style.removeProperty('top');\n    this.grabShadow.style.removeProperty('left');\n  }\n  \n  moveGrabbedNodeToEvent(evt) {\n    var eventPosition = pt(evt.clientX, evt.clientY);\n    var pos = eventPosition.subPt(this.grabOffset)\n    \n    this.dropAtEvent(this.grabShadow, evt);\n    lively.setGlobalPosition(this.grabTarget, Grid.optSnapPosition(pos, evt))\n    evt.preventDefault();\n  }\n  \n  stopGrabbingAtEvent(evt) {\n    if (this.dropIndicator) this.dropIndicator.remove()\n    if (this.dropTargetIndicator) this.dropTargetIndicator.remove()\n      \n    this.grabTarget.classList.remove(\"lively4-grabbed\")\n    if (this.grabShadow.style.position == 'absolute') {\n\n        this.insertGrabTargetBeforeShadow();\n        this.removeGrabShadow();\n        lively.setPosition(this.grabTarget, lively.getPosition(this.grabShadow))\n    } else {    \n      this.insertGrabTargetBeforeShadow();\n      this.removeGrabShadow();\n    \n      this.grabTarget.style.position = 'relative';\n      this.grabTarget.style.removeProperty('top');\n      this.grabTarget.style.removeProperty('left');\n    }\n    evt.preventDefault();\n    this.isDragging = false;\n    \n    if (this.grabTarget.parentElement == document.body) {\n      this.grabTarget.classList.add(\"lively-content\"); // \"desktop content will be preserved\"\n    }\n    \n  }\n  \n  removeGrabShadow() {\n    this.grabShadow.parentNode.removeChild(this.grabShadow);\n  }\n  \n  dropTargetDescription(droptarget) {\n    if (droptarget.id === \"container-root\") {\n      var host = lively.findWorldContextHost(droptarget)\n      if (host) return host.localName\n    }\n    \n    return lively.elementToCSSName(droptarget)\n  }\n  \n  dropAtEvent(grabShadow, evt) {\n    var droptarget = this.droptargetAtEvent(grabShadow, evt);\n    if (droptarget) {      \n      this.moveGrabShadowToTargetAtEvent(droptarget, evt);\n      \n      if (this.dropIndicator) this.dropIndicator.remove()\n      this.dropIndicator = lively.showElement(droptarget)      \n      this.dropIndicator.style.color = \"gray\"\n      this.dropIndicator.textContent = this.dropTargetDescription(droptarget)\n      this.dropIndicator.style.border = \"1px dashed lightgray\"\n      this.dropIndicator.classList.add(\"no\")\n      \n      if (this.dropTargetIndicator) this.dropTargetIndicator.remove()\n      this.dropTargetIndicator = lively.showElement(grabShadow)\n      this.dropTargetIndicator.textContent = \"\"\n\n      this.dropTargetIndicator.style.border = \"1px dashed gray\"\n      // lively.showPoint(lively.getGlobalPosition(grabShadow))\n      lively.setGlobalPosition(this.dropTargetIndicator, \n        lively.getGlobalPosition(grabShadow))\n    }\n  }\n  \n  insertGrabTargetBeforeShadow() {\n    if (this.grabShadow && this.grabTarget) {\n      \n      if (this.grabShadow.parentNode instanceof SVGElement) {\n        var element = this.grabTarget\n        var foreignObject = document.createElementNS(\"http://www.w3.org/2000/svg\", \"foreignObject\")\n        foreignObject.appendChild(element)\n        lively.setPosition(foreignObject, pt(0,0))\n        this.grabShadow.parentNode.insertBefore(foreignObject, this.grabShadow);        \n      } else {\n        this.grabShadow.parentNode.insertBefore(this.grabTarget, this.grabShadow);\n      }\n      \n      \n      \n    }\n  }\n  \n  // #important\n  droptargetAtEvent(node, evt) {   \n    // var elementsUnderCursor = Array.from(events.elementsUnder(evt)).filter( (elementUnder) => {\n    var elementsUnderCursor = lively.allElementsFromPoint(lively.getPosition(evt)).filter( (elementUnder) => {\n      return this.grabTarget !== elementUnder && \n        !lively.isInElement(elementUnder, this.grabTarget) && \n        this.grabShadow !== elementUnder && \n        !lively.isInElement(elementUnder, this.grabShadow) && \n        lively.halo !== elementUnder && \n        !lively.isInElement(elementUnder, lively.halo) \n    });\n    \n    // lively.removeHighlights()\n    // elementsUnderCursor.forEach(ea => lively.showElement(ea))\n    \n    // return document.body // for debugging\n    \n    for (var i = 0; i < elementsUnderCursor.length; i++) {\n      var targetNode = elementsUnderCursor[i];\n      if (HaloGrabItem.canDropInto(node, targetNode) ) {\n        \n        // #TODO redirect drops into components... that want their drops go into the shadow\n        \n        if (targetNode.localName == \"persistent-code-widget\") {\n          return targetNode.contentRoot\n        } else  if (targetNode.localName == \"lively-container\") {\n          var root = targetNode.getContentRoot() \n          // we could still be in markdown...\n          var markdown = root.querySelector(\"lively-markdown\")\n          if (markdown) {\n            return markdown.get(\"#content\")   \n          }\n          return root\n        } else if (targetNode.localName == \"lively-markdown\") {\n          return targetNode.get(\"#content\") \n        } else {\n          return targetNode;\n        }\n      }\n    }\n    return document.body;\n  }\n  \n  moveGrabShadowToTargetAtEvent(targetNode, evt) {\n    var pos = pt(evt.clientX, evt.clientY)    \n    var children = targetNode.childNodes;\n    var nextChild = Array.from(children).find(child => {\n      return child !== this.grabShadow && child !== this.grabTarget &&\n        child.nodeType === 1 && this.nodeComesBehind(child, pos);\n    });\n    \n    targetNode.insertBefore(this.grabShadow, nextChild);\n    this.grabShadow.style.position = 'relative';\n    this.grabShadow.style.removeProperty('top');\n    this.grabShadow.style.removeProperty('left'); \n\n    if (evt.shiftKey || \n      lively.getGlobalPosition(this.grabShadow).dist(lively.getGlobalPosition(this.grabTarget)) > 100) {\n      this.grabShadow.parentElement.appendChild(this.grabShadow)\n      this.grabShadow.style.opacity = 0;\n      lively.setPosition(this.grabShadow, pt(0,0))\n      \n      pos = lively.getGlobalPosition(this.grabTarget);\n      // lively.showPoint(pos)\n      // lively.showElement(this.grabTarget)\n\n\n      // console.log(\"set global position: \" + pos)\n      lively.setGlobalPosition(this.grabShadow, pos); // localize\n      // lively.setGlobalPosition(this.grabShadow, pos); // localize\n\n\n      // var mysteriousOffset = pos.subPt(lively.getGlobalPosition(this.grabShadow))\n      // lively.moveBy(this.grabShadow,mysteriousOffset )\n      \n      // lively.showPoint(lively.getGlobalPosition(this.grabShadow))\n    } else {\n      // drag position is near enough to relative position, so SNAP  \n      this.grabShadow.style.opacity = 0.5;\n    }\n  }\n  \n  static canDropInto(node, targetNode) {\n    if (!targetNode || !node) return false\n    var targetTag = targetNode.tagName.toLowerCase();  \n    \n    if (lively.isInElement(targetNode, node)) return false; // prevent cycles...\n  \n    var worldContext = lively.findWorldContext(targetNode);    \n    \n    if (node === targetNode) return false\n    var parents = lively.allParents(targetNode, [], true)\n    if (parents.find(ea => ea.isHaloItem )) return false\n    \n    if (parents.find(ea => ea === node)) return false\n    \n    if (!worldContext) return\n    if (worldContext == node) return\n    \n    // if (!(worldContext === document.body)) return false;\n    \n    var result = node !== targetNode &&\n                  !targetNode.isMetaNode &&\n                  !(this.droppingBlacklist[node.tagName.toLowerCase()] || []).includes(targetTag) &&\n                  !(this.droppingBlacklist['*'] || []).includes(targetTag) && \n                  (!targetNode.livelyAcceptsDrop || targetNode.livelyAcceptsDrop(node))\n\n    \n    // a plain shadow root is always a bad sign... \n    // usually there is an explicit content-root or something...    \n    if (worldContext instanceof ShadowRoot) {\n      if (targetNode.localName == \"persistent-code-widget\") {\n        return targetNode\n      }  \n      return \n    }\n    // console.log(\"canDropInto \" + lively.elementToCSSName(targetNode)  \n    //               + \" worldContext \" + worldContext + \" -> \" + result)\n    return result\n  }\n  \n  nodeComesBehind(node, pos) {\n    var bounds = node.getBoundingClientRect()\n    var toTheRight = \n      (bounds.top <= pos.y <= bounds.bottom) && (bounds.left > pos.x);\n    var below = bounds.top > pos.y;\n    return toTheRight || below;\n  }\n  \n  // called after code changes...\n  livelyUpdate() {\n    // this.style.backgroundColor = \"\"\n  }\n  \n}\n\n\n"]}