UNPKG

vue-move-directives

Version:

A set of Vue 3 directives to animate elements moving to other elements.

63 lines (62 loc) 2.51 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.mover = void 0; const nanoid_1 = require("nanoid"); ; const mover = (emitter) => ({ mounted(el, binding) { var _a, _b, _c; const transitionDurationSec = (((_a = binding.value.transition) === null || _a === void 0 ? void 0 : _a.durationMs) || 300) / 1000; const timingFunction = ((_b = binding.value.transition) === null || _b === void 0 ? void 0 : _b.timingFunction) || 'ease-out'; const zIndex = (_c = binding.value.transition) === null || _c === void 0 ? void 0 : _c.zIndex; const moveCallbackListener = (event) => { if (event.elementId === elementId) { const { x: fromX, y: fromY } = el.getBoundingClientRect(); const { x: toX, y: toY } = event; const translateX = toX - fromX; const translateY = toY - fromY; position = { x: translateX, y: translateY }; if (zIndex) { el.style.zIndex = String(zIndex); } el.style.transition = `transform ${transitionDurationSec}s ${timingFunction}`; el.style.transform = `translate(${translateX}px, ${translateY}px)`; setTimeout(() => { if (binding.value.afterClick) { binding.value.afterClick(clickEvent); } if (binding.value.deleteAfterFinish) { el.remove(); } }, transitionDurationSec * 1000); } }; const elementId = (0, nanoid_1.nanoid)(); let position = { x: 0, y: 0 }; let clickEvent = null; emitter.on('moveElementCallback', moveCallbackListener); el._cleanup = () => { emitter.off('moveElementCallback', moveCallbackListener); }; el.addEventListener('click', (e) => { clickEvent = e; let targetId = ''; if (typeof binding.value.target === 'function') { targetId = binding.value.target(e); } else { targetId = binding.value.target; } emitter.emit('moveElement', { elementId: elementId, targetId: targetId, }); }); }, beforeUnmount(el) { if (el._cleanup) { el._cleanup(); } } }); exports.mover = mover;