Spaces:
Running
Running
Cap canvas auto-scale to 1x to prevent oversized embedded animations
Browse files
animations/shared/canvas-scale.js
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
function scaleCanvas({ selector = '.canvas-root', minScale = 0.25, maxScale = 1 } = {}) {
|
| 2 |
+
const canvases = Array.from(document.querySelectorAll(selector));
|
| 3 |
+
if (canvases.length === 0) {
|
| 4 |
+
return;
|
| 5 |
+
}
|
| 6 |
+
|
| 7 |
+
function updateBaseSize(canvas) {
|
| 8 |
+
if (canvas.dataset.baseWidth && canvas.dataset.baseHeight) {
|
| 9 |
+
return;
|
| 10 |
+
}
|
| 11 |
+
|
| 12 |
+
const { width, height } = canvas.getBoundingClientRect();
|
| 13 |
+
if (width && height) {
|
| 14 |
+
canvas.dataset.baseWidth = width;
|
| 15 |
+
canvas.dataset.baseHeight = height;
|
| 16 |
+
}
|
| 17 |
+
}
|
| 18 |
+
|
| 19 |
+
function updateScale() {
|
| 20 |
+
canvases.forEach((canvas) => {
|
| 21 |
+
updateBaseSize(canvas);
|
| 22 |
+
const baseWidth = parseFloat(canvas.dataset.baseWidth || '0');
|
| 23 |
+
const baseHeight = parseFloat(canvas.dataset.baseHeight || '0');
|
| 24 |
+
if (!baseWidth || !baseHeight) {
|
| 25 |
+
return;
|
| 26 |
+
}
|
| 27 |
+
|
| 28 |
+
const scale = Math.min(window.innerWidth / baseWidth, window.innerHeight / baseHeight);
|
| 29 |
+
const clamped = Math.max(minScale, Math.min(scale, maxScale));
|
| 30 |
+
canvas.style.transform = `scale(${clamped})`;
|
| 31 |
+
canvas.style.transformOrigin = 'center';
|
| 32 |
+
});
|
| 33 |
+
}
|
| 34 |
+
|
| 35 |
+
const observer = new ResizeObserver(() => updateScale());
|
| 36 |
+
canvases.forEach((canvas) => {
|
| 37 |
+
observer.observe(canvas);
|
| 38 |
+
updateBaseSize(canvas);
|
| 39 |
+
});
|
| 40 |
+
|
| 41 |
+
window.addEventListener('resize', updateScale);
|
| 42 |
+
window.addEventListener('load', () => requestAnimationFrame(updateScale));
|
| 43 |
+
requestAnimationFrame(updateScale);
|
| 44 |
+
}
|