|
1 | 1 | const heroAnimation = async () => {
|
2 |
| - const reduceMotion = document.body.classList.contains('reduced-motion') |
| 2 | + const isReduceMotionEnabled = window.matchMedia('(prefers-reduced-motion: reduce)').matches; |
3 | 3 | const urlParams = new URLSearchParams(location.search)
|
4 | 4 | const hasDebugParam = urlParams.has('debug')
|
5 | 5 |
|
@@ -135,18 +135,45 @@ const heroAnimation = async () => {
|
135 | 135 | logo.image = logoImage
|
136 | 136 | // init canvas for each swoop layer
|
137 | 137 | 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 | + }); |
143 | 143 | // init logo canvas
|
144 | 144 | logo.ctx = initLogo(logo)
|
145 | 145 | } catch (error) {
|
146 | 146 | console.error('Error loading images:', error)
|
147 | 147 | throw error
|
148 | 148 | }
|
149 | 149 |
|
| 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 | + |
150 | 177 | const DURATION = 1000
|
151 | 178 |
|
152 | 179 | const tl = anime.createTimeline({
|
|
0 commit comments