|
251 | 251 | var ctx = canvas.getContext("2d"); |
252 | 252 | if (!ctx) return; |
253 | 253 |
|
254 | | - var pageBg = canvas.classList.contains("matrix-canvas--page-bg"); |
| 254 | + var inHero = canvas.classList.contains("matrix-canvas--hero"); |
255 | 255 | var cell = 16; |
256 | 256 | var dpr = Math.max(1, Math.min(2.25, window.devicePixelRatio || 1)); |
257 | 257 | var cols = 0; |
258 | 258 | var drops = []; |
259 | 259 | var raf = 0; |
260 | 260 |
|
261 | | - function viewportSize() { |
262 | | - return { |
263 | | - w: window.innerWidth || document.documentElement.clientWidth || 800, |
264 | | - h: window.innerHeight || document.documentElement.clientHeight || 600, |
265 | | - }; |
266 | | - } |
267 | | - |
268 | 261 | function resize() { |
| 262 | + var par = canvas.parentElement; |
269 | 263 | var w; |
270 | 264 | var h; |
271 | | - if (pageBg) { |
272 | | - var v = viewportSize(); |
273 | | - w = v.w; |
274 | | - h = v.h; |
| 265 | + if (inHero && par) { |
| 266 | + w = par.clientWidth || 800; |
| 267 | + h = par.clientHeight || 400; |
275 | 268 | canvas.style.width = w + "px"; |
276 | 269 | canvas.style.height = h + "px"; |
277 | 270 | } else { |
278 | | - w = canvas.clientWidth || canvas.parentElement.clientWidth || window.innerWidth; |
279 | | - h = canvas.clientHeight || canvas.parentElement.clientHeight || 420; |
| 271 | + w = canvas.clientWidth || (par && par.clientWidth) || window.innerWidth; |
| 272 | + h = canvas.clientHeight || (par && par.clientHeight) || 420; |
280 | 273 | } |
281 | 274 | canvas.width = Math.floor(w * dpr); |
282 | 275 | canvas.height = Math.floor(h * dpr); |
|
292 | 285 | } |
293 | 286 |
|
294 | 287 | function step() { |
295 | | - var v = viewportSize(); |
296 | | - var w = pageBg ? v.w : canvas.clientWidth || v.w; |
297 | | - var h = pageBg ? v.h : canvas.clientHeight || 420; |
298 | | - /* Dark trail so white glyphs stay readable with screen blend on dark body */ |
299 | | - ctx.fillStyle = pageBg ? "rgba(2, 6, 14, 0.17)" : "rgba(3, 7, 18, 0.07)"; |
| 288 | + var w = canvas.clientWidth || 800; |
| 289 | + var h = canvas.clientHeight || 400; |
| 290 | + /* Dark trail so white glyphs stay readable with screen blend on hero gradient */ |
| 291 | + ctx.fillStyle = inHero ? "rgba(2, 6, 14, 0.17)" : "rgba(3, 7, 18, 0.07)"; |
300 | 292 | ctx.fillRect(0, 0, w, h); |
301 | 293 |
|
302 | 294 | ctx.font = |
|
319 | 311 | step(); |
320 | 312 |
|
321 | 313 | window.addEventListener("resize", resize, { passive: true }); |
| 314 | + if (inHero && canvas.parentElement && typeof ResizeObserver !== "undefined") { |
| 315 | + var ro = new ResizeObserver(function () { |
| 316 | + resize(); |
| 317 | + }); |
| 318 | + ro.observe(canvas.parentElement); |
| 319 | + } |
322 | 320 | return function stop() { |
323 | 321 | window.cancelAnimationFrame(raf); |
324 | 322 | }; |
|
0 commit comments