No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.
 
 
 
 

119 líneas
4.0 KiB

  1. 'use strict';
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.getNodeClientOffset = getNodeClientOffset;
  6. exports.getEventClientOffset = getEventClientOffset;
  7. exports.getDragPreviewOffset = getDragPreviewOffset;
  8. var _BrowserDetector = require('./BrowserDetector');
  9. var _MonotonicInterpolant = require('./MonotonicInterpolant');
  10. var _MonotonicInterpolant2 = _interopRequireDefault(_MonotonicInterpolant);
  11. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  12. /* eslint
  13. no-mixed-operators: off
  14. */
  15. var ELEMENT_NODE = 1;
  16. function getNodeClientOffset(node) {
  17. var el = node.nodeType === ELEMENT_NODE ? node : node.parentElement;
  18. if (!el) {
  19. return null;
  20. }
  21. var _el$getBoundingClient = el.getBoundingClientRect(),
  22. top = _el$getBoundingClient.top,
  23. left = _el$getBoundingClient.left;
  24. return { x: left, y: top };
  25. }
  26. function getEventClientOffset(e) {
  27. return {
  28. x: e.clientX,
  29. y: e.clientY
  30. };
  31. }
  32. function isImageNode(node) {
  33. return node.nodeName === 'IMG' && ((0, _BrowserDetector.isFirefox)() || !document.documentElement.contains(node));
  34. }
  35. function getDragPreviewSize(isImage, dragPreview, sourceWidth, sourceHeight) {
  36. var dragPreviewWidth = isImage ? dragPreview.width : sourceWidth;
  37. var dragPreviewHeight = isImage ? dragPreview.height : sourceHeight;
  38. // Work around @2x coordinate discrepancies in browsers
  39. if ((0, _BrowserDetector.isSafari)() && isImage) {
  40. dragPreviewHeight /= window.devicePixelRatio;
  41. dragPreviewWidth /= window.devicePixelRatio;
  42. }
  43. return { dragPreviewWidth: dragPreviewWidth, dragPreviewHeight: dragPreviewHeight };
  44. }
  45. function getDragPreviewOffset(sourceNode, dragPreview, clientOffset, anchorPoint, offsetPoint) {
  46. // The browsers will use the image intrinsic size under different conditions.
  47. // Firefox only cares if it's an image, but WebKit also wants it to be detached.
  48. var isImage = isImageNode(dragPreview);
  49. var dragPreviewNode = isImage ? sourceNode : dragPreview;
  50. var dragPreviewNodeOffsetFromClient = getNodeClientOffset(dragPreviewNode);
  51. var offsetFromDragPreview = {
  52. x: clientOffset.x - dragPreviewNodeOffsetFromClient.x,
  53. y: clientOffset.y - dragPreviewNodeOffsetFromClient.y
  54. };
  55. var sourceWidth = sourceNode.offsetWidth,
  56. sourceHeight = sourceNode.offsetHeight;
  57. var anchorX = anchorPoint.anchorX,
  58. anchorY = anchorPoint.anchorY;
  59. var _getDragPreviewSize = getDragPreviewSize(isImage, dragPreview, sourceWidth, sourceHeight),
  60. dragPreviewWidth = _getDragPreviewSize.dragPreviewWidth,
  61. dragPreviewHeight = _getDragPreviewSize.dragPreviewHeight;
  62. var calculateYOffset = function calculateYOffset() {
  63. var interpolantY = new _MonotonicInterpolant2.default([0, 0.5, 1], [
  64. // Dock to the top
  65. offsetFromDragPreview.y,
  66. // Align at the center
  67. offsetFromDragPreview.y / sourceHeight * dragPreviewHeight,
  68. // Dock to the bottom
  69. offsetFromDragPreview.y + dragPreviewHeight - sourceHeight]);
  70. var y = interpolantY.interpolate(anchorY);
  71. // Work around Safari 8 positioning bug
  72. if ((0, _BrowserDetector.isSafari)() && isImage) {
  73. // We'll have to wait for @3x to see if this is entirely correct
  74. y += (window.devicePixelRatio - 1) * dragPreviewHeight;
  75. }
  76. return y;
  77. };
  78. var calculateXOffset = function calculateXOffset() {
  79. // Interpolate coordinates depending on anchor point
  80. // If you know a simpler way to do this, let me know
  81. var interpolantX = new _MonotonicInterpolant2.default([0, 0.5, 1], [
  82. // Dock to the left
  83. offsetFromDragPreview.x,
  84. // Align at the center
  85. offsetFromDragPreview.x / sourceWidth * dragPreviewWidth,
  86. // Dock to the right
  87. offsetFromDragPreview.x + dragPreviewWidth - sourceWidth]);
  88. return interpolantX.interpolate(anchorX);
  89. };
  90. // Force offsets if specified in the options.
  91. var offsetX = offsetPoint.offsetX,
  92. offsetY = offsetPoint.offsetY;
  93. var isManualOffsetX = offsetX === 0 || offsetX;
  94. var isManualOffsetY = offsetY === 0 || offsetY;
  95. return {
  96. x: isManualOffsetX ? offsetX : calculateXOffset(),
  97. y: isManualOffsetY ? offsetY : calculateYOffset()
  98. };
  99. }