index.js 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
  2. const require_runtime = require('../../_virtual/_rolldown/runtime.js');
  3. const require_style = require('../../utils/dom/style.js');
  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 = targetRect.left;
  17. const targetTop = targetRect.top;
  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 = Math.min(Math.max(moveX, minLeft), maxLeft);
  28. moveY = Math.min(Math.max(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. adjustPosition(offsetX + e.clientX - downX, offsetY + e.clientY - downY);
  42. };
  43. const onMouseup = () => {
  44. isDragging.value = false;
  45. document.removeEventListener("mousemove", onMousemove);
  46. document.removeEventListener("mouseup", onMouseup);
  47. };
  48. document.addEventListener("mousemove", onMousemove);
  49. document.addEventListener("mouseup", onMouseup);
  50. };
  51. const onDraggable = () => {
  52. if (dragRef.value && targetRef.value) {
  53. dragRef.value.addEventListener("mousedown", onMousedown);
  54. window.addEventListener("resize", updatePosition);
  55. }
  56. };
  57. const offDraggable = () => {
  58. if (dragRef.value && targetRef.value) {
  59. dragRef.value.removeEventListener("mousedown", onMousedown);
  60. window.removeEventListener("resize", updatePosition);
  61. }
  62. };
  63. const resetPosition = () => {
  64. transform.offsetX = 0;
  65. transform.offsetY = 0;
  66. if (targetRef.value) targetRef.value.style.transform = "";
  67. };
  68. const updatePosition = () => {
  69. const { offsetX, offsetY } = transform;
  70. adjustPosition(offsetX, offsetY);
  71. };
  72. (0, vue.onMounted)(() => {
  73. (0, vue.watchEffect)(() => {
  74. if (draggable.value) onDraggable();
  75. else offDraggable();
  76. });
  77. });
  78. (0, vue.onBeforeUnmount)(() => {
  79. offDraggable();
  80. });
  81. return {
  82. isDragging,
  83. resetPosition,
  84. updatePosition
  85. };
  86. };
  87. //#endregion
  88. exports.useDraggable = useDraggable;
  89. //# sourceMappingURL=index.js.map