index.js 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
  2. const require_style = require("../../utils/dom/style.js");
  3. let lodash_unified = require("lodash-unified");
  4. let vue = require("vue");
  5. //#region ../../packages/hooks/use-draggable/index.ts
  6. const useDraggable = (targetRef, dragRef, draggable, overflow) => {
  7. const transform = {
  8. offsetX: 0,
  9. offsetY: 0
  10. };
  11. const isDragging = (0, vue.ref)(false);
  12. const adjustPosition = (moveX, moveY) => {
  13. if (targetRef.value) {
  14. const { offsetX, offsetY } = transform;
  15. const targetRect = targetRef.value.getBoundingClientRect();
  16. const targetLeft = Math.max(targetRect.left, 0);
  17. const targetTop = Math.max(targetRect.top, 0);
  18. const targetWidth = targetRect.width;
  19. const targetHeight = targetRect.height;
  20. const clientWidth = document.documentElement.clientWidth;
  21. const clientHeight = document.documentElement.clientHeight;
  22. const minLeft = -targetLeft + offsetX;
  23. const minTop = -targetTop + offsetY;
  24. const maxLeft = clientWidth - targetLeft - targetWidth + offsetX;
  25. const maxTop = clientHeight - targetTop - (targetHeight < clientHeight ? targetHeight : 0) + offsetY;
  26. if (!overflow?.value) {
  27. moveX = (0, lodash_unified.clamp)(moveX, minLeft, maxLeft);
  28. moveY = (0, lodash_unified.clamp)(moveY, minTop, maxTop);
  29. }
  30. transform.offsetX = moveX;
  31. transform.offsetY = moveY;
  32. targetRef.value.style.transform = `translate(${require_style.addUnit(moveX)}, ${require_style.addUnit(moveY)})`;
  33. }
  34. };
  35. const onMousedown = (e) => {
  36. const downX = e.clientX;
  37. const downY = e.clientY;
  38. const { offsetX, offsetY } = transform;
  39. const onMousemove = (e) => {
  40. if (!isDragging.value) isDragging.value = true;
  41. const moveX = offsetX + e.clientX - downX;
  42. const moveY = offsetY + e.clientY - downY;
  43. adjustPosition(moveX, moveY);
  44. };
  45. const onMouseup = () => {
  46. isDragging.value = false;
  47. document.removeEventListener("mousemove", onMousemove);
  48. document.removeEventListener("mouseup", onMouseup);
  49. };
  50. document.addEventListener("mousemove", onMousemove);
  51. document.addEventListener("mouseup", onMouseup);
  52. };
  53. const onDraggable = () => {
  54. if (dragRef.value && targetRef.value) {
  55. dragRef.value.addEventListener("mousedown", onMousedown);
  56. window.addEventListener("resize", updatePosition);
  57. }
  58. };
  59. const offDraggable = () => {
  60. if (dragRef.value && targetRef.value) {
  61. dragRef.value.removeEventListener("mousedown", onMousedown);
  62. window.removeEventListener("resize", updatePosition);
  63. }
  64. };
  65. const resetPosition = () => {
  66. transform.offsetX = 0;
  67. transform.offsetY = 0;
  68. if (targetRef.value) targetRef.value.style.transform = "";
  69. };
  70. const updatePosition = () => {
  71. const { offsetX, offsetY } = transform;
  72. adjustPosition(offsetX, offsetY);
  73. };
  74. (0, vue.onMounted)(() => {
  75. (0, vue.watchEffect)(() => {
  76. if (draggable.value) onDraggable();
  77. else offDraggable();
  78. });
  79. });
  80. (0, vue.onBeforeUnmount)(() => {
  81. offDraggable();
  82. });
  83. return {
  84. isDragging,
  85. resetPosition,
  86. updatePosition
  87. };
  88. };
  89. //#endregion
  90. exports.useDraggable = useDraggable;
  91. //# sourceMappingURL=index.js.map