You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
svelte/documentation/examples/13-actions/03-actions-pannable/pannable.js

54 lines
1000 B

export function pannable(node) {
let x;
let y;
function handleMousedown(event) {
x = event.clientX;
y = event.clientY;
node.dispatchEvent(
new CustomEvent('panstart', {
detail: { x, y }
})
);
window.addEventListener('mousemove', handleMousemove);
window.addEventListener('mouseup', handleMouseup);
}
function handleMousemove(event) {
const dx = event.clientX - x;
const dy = event.clientY - y;
x = event.clientX;
y = event.clientY;
node.dispatchEvent(
new CustomEvent('panmove', {
detail: { x, y, dx, dy }
})
);
}
function handleMouseup(event) {
x = event.clientX;
y = event.clientY;
node.dispatchEvent(
new CustomEvent('panend', {
detail: { x, y }
})
);
window.removeEventListener('mousemove', handleMousemove);
window.removeEventListener('mouseup', handleMouseup);
}
node.addEventListener('mousedown', handleMousedown);
return {
destroy() {
node.removeEventListener('mousedown', handleMousedown);
}
};
}