Spaces:
Running
Running
| function scaleCanvas({ selector = '.canvas-root', minScale = 0.25, maxScale = 1 } = {}) { | |
| const canvases = Array.from(document.querySelectorAll(selector)); | |
| if (canvases.length === 0) { | |
| return; | |
| } | |
| function updateBaseSize(canvas) { | |
| if (canvas.dataset.baseWidth && canvas.dataset.baseHeight) { | |
| return; | |
| } | |
| const { width, height } = canvas.getBoundingClientRect(); | |
| if (width && height) { | |
| canvas.dataset.baseWidth = width; | |
| canvas.dataset.baseHeight = height; | |
| } | |
| } | |
| function updateScale() { | |
| canvases.forEach((canvas) => { | |
| updateBaseSize(canvas); | |
| const baseWidth = parseFloat(canvas.dataset.baseWidth || '0'); | |
| const baseHeight = parseFloat(canvas.dataset.baseHeight || '0'); | |
| if (!baseWidth || !baseHeight) { | |
| return; | |
| } | |
| const scale = Math.min(window.innerWidth / baseWidth, window.innerHeight / baseHeight); | |
| const clamped = Math.max(minScale, Math.min(scale, maxScale)); | |
| canvas.style.transform = `scale(${clamped})`; | |
| canvas.style.transformOrigin = 'center'; | |
| }); | |
| } | |
| const observer = new ResizeObserver(() => updateScale()); | |
| canvases.forEach((canvas) => { | |
| observer.observe(canvas); | |
| updateBaseSize(canvas); | |
| }); | |
| window.addEventListener('resize', updateScale); | |
| window.addEventListener('load', () => requestAnimationFrame(updateScale)); | |
| requestAnimationFrame(updateScale); | |
| } | |