64 lines
1.9 KiB
JavaScript
64 lines
1.9 KiB
JavaScript
import { PLUGIN_ELEMENT_ATTR } from "./utils.js";
|
|
function elementFromEventTarget(target) {
|
|
if (target instanceof Element)
|
|
return target;
|
|
if (target instanceof Node)
|
|
return target.parentElement;
|
|
return null;
|
|
}
|
|
function isPluginOwnedTarget(target) {
|
|
return elementFromEventTarget(target)?.closest(`[${PLUGIN_ELEMENT_ATTR}]`) != null;
|
|
}
|
|
export function createCanvasWheelZoomBridgeController() {
|
|
let isEnabled = false;
|
|
const onWheel = (event) => {
|
|
if (isPluginOwnedTarget(event.target))
|
|
return;
|
|
event.preventDefault();
|
|
if (event.ctrlKey || event.metaKey) {
|
|
window.parent.postMessage({
|
|
type: "canvas-wheel-zoom",
|
|
data: {
|
|
deltaY: event.deltaY,
|
|
deltaMode: event.deltaMode,
|
|
clientX: event.clientX,
|
|
clientY: event.clientY,
|
|
ctrlKey: event.ctrlKey,
|
|
metaKey: event.metaKey,
|
|
},
|
|
}, "*");
|
|
return;
|
|
}
|
|
const panData = {
|
|
deltaX: event.deltaX,
|
|
deltaY: event.deltaY,
|
|
deltaMode: event.deltaMode,
|
|
clientX: event.clientX,
|
|
clientY: event.clientY,
|
|
shiftKey: event.shiftKey,
|
|
ctrlKey: false,
|
|
metaKey: false,
|
|
};
|
|
window.parent.postMessage({
|
|
type: "canvas-wheel-pan",
|
|
data: panData,
|
|
}, "*");
|
|
};
|
|
const enable = () => {
|
|
if (isEnabled)
|
|
return;
|
|
isEnabled = true;
|
|
window.addEventListener("wheel", onWheel, { capture: true, passive: false });
|
|
};
|
|
const disable = () => {
|
|
if (!isEnabled)
|
|
return;
|
|
isEnabled = false;
|
|
window.removeEventListener("wheel", onWheel, true);
|
|
};
|
|
return {
|
|
enable,
|
|
disable,
|
|
};
|
|
}
|
|
//# sourceMappingURL=canvas-wheel-zoom-bridge.js.map
|