mirror of
https://github.com/stack-auth/stack.git
synced 2026-06-04 21:04:37 +08:00
prefers-reduced-motion added to top waves
This commit is contained in:
parent
b35d2bf829
commit
516c9130ef
@ -3,7 +3,7 @@
|
||||
*/
|
||||
'use client';
|
||||
|
||||
import React, { CSSProperties, useEffect, useRef } from "react";
|
||||
import React, { CSSProperties, useEffect, useRef, useState } from "react";
|
||||
|
||||
class Grad {
|
||||
x: number;
|
||||
@ -207,6 +207,28 @@ const Waves: React.FC<WavesProps> = ({
|
||||
|
||||
const frameIdRef = useRef<number | null>(null);
|
||||
|
||||
// Add prefers-reduced-motion detection
|
||||
const [prefersReducedMotion, setPrefersReducedMotion] = useState(false);
|
||||
|
||||
// Check for prefers-reduced-motion preference
|
||||
useEffect(() => {
|
||||
const mediaQuery = window.matchMedia('(prefers-reduced-motion: reduce)');
|
||||
|
||||
// Set initial value
|
||||
setPrefersReducedMotion(mediaQuery.matches);
|
||||
|
||||
// Listen for changes
|
||||
const handleChange = (e: MediaQueryListEvent) => {
|
||||
setPrefersReducedMotion(e.matches);
|
||||
};
|
||||
|
||||
mediaQuery.addEventListener('change', handleChange);
|
||||
|
||||
return () => {
|
||||
mediaQuery.removeEventListener('change', handleChange);
|
||||
};
|
||||
}, []);
|
||||
|
||||
useEffect(() => {
|
||||
configRef.current = {
|
||||
lineColor,
|
||||
@ -277,6 +299,9 @@ const Waves: React.FC<WavesProps> = ({
|
||||
}
|
||||
|
||||
function movePoints(time: number) {
|
||||
// Skip all motion if user prefers reduced motion
|
||||
if (prefersReducedMotion) return;
|
||||
|
||||
const lines = linesRef.current;
|
||||
const mouse = mouseRef.current;
|
||||
const noise = noiseRef.current;
|
||||
@ -329,8 +354,9 @@ const Waves: React.FC<WavesProps> = ({
|
||||
}
|
||||
|
||||
function moved(point: Point, withCursor = true): { x: number, y: number } {
|
||||
const x = point.x + point.wave.x + (withCursor ? point.cursor.x : 0);
|
||||
const y = point.y + point.wave.y + (withCursor ? point.cursor.y : 0);
|
||||
// If reduced motion is preferred, only use the base position
|
||||
const x = point.x + (prefersReducedMotion ? 0 : point.wave.x) + (withCursor && !prefersReducedMotion ? point.cursor.x : 0);
|
||||
const y = point.y + (prefersReducedMotion ? 0 : point.wave.y) + (withCursor && !prefersReducedMotion ? point.cursor.y : 0);
|
||||
return { x: Math.round(x * 10) / 10, y: Math.round(y * 10) / 10 };
|
||||
}
|
||||
|
||||
@ -360,22 +386,27 @@ const Waves: React.FC<WavesProps> = ({
|
||||
|
||||
function tick(t: number) {
|
||||
if (!container) return;
|
||||
const mouse = mouseRef.current;
|
||||
mouse.sx += (mouse.x - mouse.sx) * 0.1;
|
||||
mouse.sy += (mouse.y - mouse.sy) * 0.1;
|
||||
const dx = mouse.x - mouse.lx,
|
||||
dy = mouse.y - mouse.ly;
|
||||
const d = Math.hypot(dx, dy);
|
||||
mouse.v = d;
|
||||
mouse.vs += (d - mouse.vs) * 0.1;
|
||||
mouse.vs = Math.min(100, mouse.vs);
|
||||
mouse.lx = mouse.x;
|
||||
mouse.ly = mouse.y;
|
||||
mouse.a = Math.atan2(dy, dx);
|
||||
container.style.setProperty("--x", `${mouse.sx}px`);
|
||||
container.style.setProperty("--y", `${mouse.sy}px`);
|
||||
|
||||
movePoints(t);
|
||||
// Only update mouse tracking and motion if reduced motion is not preferred
|
||||
if (!prefersReducedMotion) {
|
||||
const mouse = mouseRef.current;
|
||||
mouse.sx += (mouse.x - mouse.sx) * 0.1;
|
||||
mouse.sy += (mouse.y - mouse.sy) * 0.1;
|
||||
const dx = mouse.x - mouse.lx,
|
||||
dy = mouse.y - mouse.ly;
|
||||
const d = Math.hypot(dx, dy);
|
||||
mouse.v = d;
|
||||
mouse.vs += (d - mouse.vs) * 0.1;
|
||||
mouse.vs = Math.min(100, mouse.vs);
|
||||
mouse.lx = mouse.x;
|
||||
mouse.ly = mouse.y;
|
||||
mouse.a = Math.atan2(dy, dx);
|
||||
container.style.setProperty("--x", `${mouse.sx}px`);
|
||||
container.style.setProperty("--y", `${mouse.sy}px`);
|
||||
|
||||
movePoints(t);
|
||||
}
|
||||
|
||||
drawLines();
|
||||
frameIdRef.current = requestAnimationFrame(tick);
|
||||
}
|
||||
@ -385,11 +416,17 @@ const Waves: React.FC<WavesProps> = ({
|
||||
setLines();
|
||||
}
|
||||
function onMouseMove(e: MouseEvent) {
|
||||
updateMouse(e.clientX, e.clientY);
|
||||
// Don't track mouse if reduced motion is preferred
|
||||
if (!prefersReducedMotion) {
|
||||
updateMouse(e.clientX, e.clientY);
|
||||
}
|
||||
}
|
||||
function onTouchMove(e: TouchEvent) {
|
||||
const touch = e.touches[0];
|
||||
updateMouse(touch.clientX, touch.clientY);
|
||||
// Don't track touch if reduced motion is preferred
|
||||
if (!prefersReducedMotion) {
|
||||
const touch = e.touches[0];
|
||||
updateMouse(touch.clientX, touch.clientY);
|
||||
}
|
||||
}
|
||||
function updateMouse(x: number, y: number) {
|
||||
const mouse = mouseRef.current;
|
||||
@ -420,7 +457,7 @@ const Waves: React.FC<WavesProps> = ({
|
||||
cancelAnimationFrame(frameIdRef.current);
|
||||
}
|
||||
};
|
||||
}, []);
|
||||
}, [prefersReducedMotion]);
|
||||
|
||||
return (
|
||||
<div
|
||||
|
||||
Loading…
Reference in New Issue
Block a user