Skip to content

Commit 690507a

Browse files
Handle reduce motion
1 parent 6aaaa76 commit 690507a

File tree

1 file changed

+33
-6
lines changed
  • assets/javascripts/new-javascripts

1 file changed

+33
-6
lines changed

assets/javascripts/new-javascripts/hero.js

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
const heroAnimation = async () => {
2-
const reduceMotion = document.body.classList.contains('reduced-motion')
2+
const isReduceMotionEnabled = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
33
const urlParams = new URLSearchParams(location.search)
44
const hasDebugParam = urlParams.has('debug')
55

@@ -135,18 +135,45 @@ const heroAnimation = async () => {
135135
logo.image = logoImage
136136
// init canvas for each swoop layer
137137
heroSwoops.forEach((swoop, i) => {
138-
swoop.image = swoopImages[i]
139-
const canvasData = initSwoops(swoop)
140-
swoop.ctx = canvasData.ctx
141-
swoop.pathInstance = canvasData.pathInstance
142-
})
138+
swoop.image = swoopImages[i];
139+
const canvasData = initSwoops(swoop);
140+
swoop.ctx = canvasData.ctx;
141+
swoop.pathInstance = canvasData.pathInstance;
142+
});
143143
// init logo canvas
144144
logo.ctx = initLogo(logo)
145145
} catch (error) {
146146
console.error('Error loading images:', error)
147147
throw error
148148
}
149149

150+
if (isReduceMotionEnabled) {
151+
// Render final state immediately
152+
heroSwoops.forEach((swoop) => {
153+
const { ctx, pathInstance, image, canvas } = swoop;
154+
ctx.clearRect(0, 0, canvas.width, canvas.height);
155+
ctx.lineDashOffset = 0;
156+
ctx.stroke(pathInstance);
157+
ctx.globalCompositeOperation = 'source-in';
158+
ctx.drawImage(image, 0, 0);
159+
ctx.globalCompositeOperation = 'source-over';
160+
});
161+
162+
const {
163+
ctx,
164+
image,
165+
canvas,
166+
positionStart: [startX, startY],
167+
positionEnd: [endX, endY],
168+
} = logo;
169+
ctx.clearRect(0, 0, canvas.width, canvas.height);
170+
ctx.globalAlpha = 1;
171+
const deltaX = endX - startX;
172+
const deltaY = endY - startY;
173+
ctx.drawImage(image, deltaX, deltaY);
174+
return;
175+
}
176+
150177
const DURATION = 1000
151178

152179
const tl = anime.createTimeline({

0 commit comments

Comments
 (0)