94 lines
2.4 KiB
JavaScript
94 lines
2.4 KiB
JavaScript
|
let zoomLevel = 1;
|
||
|
let lastGestureTime = 0;
|
||
|
let lastGestureScale = 1;
|
||
|
const minZoom = 0.1;
|
||
|
const maxZoom = 5;
|
||
|
let accelerationCurve = [1, 1, 1, 1, 1];
|
||
|
|
||
|
function interpolateAcceleration(speed) {
|
||
|
const index = Math.min(
|
||
|
Math.floor((speed * (accelerationCurve.length - 1)) / 2),
|
||
|
accelerationCurve.length - 2,
|
||
|
);
|
||
|
const t = ((speed * (accelerationCurve.length - 1)) / 2) % 1;
|
||
|
return accelerationCurve[index] * (1 - t) + accelerationCurve[index + 1] * t;
|
||
|
}
|
||
|
|
||
|
function applyZoom(delta, speed) {
|
||
|
const accelerationMultiplier = interpolateAcceleration(speed);
|
||
|
const zoomChange = delta * accelerationMultiplier;
|
||
|
zoomLevel *= 1 + zoomChange;
|
||
|
zoomLevel = Math.min(Math.max(zoomLevel, minZoom), maxZoom);
|
||
|
|
||
|
document.body.style.transform = `scale(${zoomLevel})`;
|
||
|
document.body.style.transformOrigin = "center top";
|
||
|
|
||
|
// Update Icon via Messages
|
||
|
chrome.runtime.sendMessage({
|
||
|
action: "updateZoomInfo",
|
||
|
zoomLevel: zoomLevel,
|
||
|
accelerationMultiplier: accelerationMultiplier,
|
||
|
});
|
||
|
}
|
||
|
|
||
|
window.addEventListener(
|
||
|
"wheel",
|
||
|
(event) => {
|
||
|
if (event.ctrlKey || event.metaKey) {
|
||
|
event.preventDefault();
|
||
|
const currentTime = performance.now();
|
||
|
const timeDiff = (currentTime - lastGestureTime) / 1000;
|
||
|
const delta = event.deltaY * -0.001;
|
||
|
const speed = Math.abs(delta / timeDiff);
|
||
|
applyZoom(delta, speed);
|
||
|
lastGestureTime = currentTime;
|
||
|
}
|
||
|
},
|
||
|
{ passive: false },
|
||
|
);
|
||
|
|
||
|
window.addEventListener(
|
||
|
"gesturestart",
|
||
|
(event) => {
|
||
|
event.preventDefault();
|
||
|
lastGestureScale = 1;
|
||
|
lastGestureTime = performance.now();
|
||
|
},
|
||
|
{ passive: false },
|
||
|
);
|
||
|
|
||
|
window.addEventListener(
|
||
|
"gesturechange",
|
||
|
(event) => {
|
||
|
event.preventDefault();
|
||
|
const currentTime = performance.now();
|
||
|
const timeDiff = (currentTime - lastGestureTime) / 1000;
|
||
|
const delta = event.scale - lastGestureScale;
|
||
|
const speed = Math.abs(delta / timeDiff);
|
||
|
applyZoom(delta, speed);
|
||
|
lastGestureScale = event.scale;
|
||
|
lastGestureTime = currentTime;
|
||
|
},
|
||
|
{ passive: false },
|
||
|
);
|
||
|
|
||
|
window.addEventListener(
|
||
|
"gestureend",
|
||
|
(event) => {
|
||
|
event.preventDefault();
|
||
|
},
|
||
|
{ passive: false },
|
||
|
);
|
||
|
|
||
|
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
|
||
|
if (request.action === "updateSettings") {
|
||
|
accelerationCurve = request.settings;
|
||
|
}
|
||
|
});
|
||
|
|
||
|
chrome.storage.sync.get("accelerationCurve", (data) => {
|
||
|
if (data.accelerationCurve) {
|
||
|
accelerationCurve = data.accelerationCurve;
|
||
|
}
|
||
|
});
|