evalstate HF Staff commited on
Commit
d41f9bc
·
verified ·
1 Parent(s): 0f1404e

Cap canvas auto-scale to 1x to prevent oversized embedded animations

Browse files
Files changed (1) hide show
  1. animations/shared/canvas-scale.js +44 -0
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
+ }