diff --git a/frontend/src/components/DynamicBanner.tsx b/frontend/src/components/DynamicBanner.tsx index 29c04a8..3c7d9ed 100644 --- a/frontend/src/components/DynamicBanner.tsx +++ b/frontend/src/components/DynamicBanner.tsx @@ -43,7 +43,7 @@ const MatrixBanner: React.FC = ({ username, palette, se const mouse = { x: -1000, y: -1000 }; const handleMouseMove = (e: MouseEvent) => { const rect = canvas.getBoundingClientRect(); - mouse.x = e.clientX - rect.left; - mouse.y = e.clientY - rect.top; - }; - - const parent = canvas.parentElement; - if (parent) { - parent.addEventListener('mousemove', handleMouseMove); - parent.addEventListener('mouseleave', () => { + const x = e.clientX - rect.left; + const y = e.clientY - rect.top; + if (x < 0 || y < 0 || x > rect.width || y > rect.height) { mouse.x = -1000; mouse.y = -1000; - }); - } + } else { + mouse.x = x; + mouse.y = y; + } + }; + window.addEventListener('mousemove', handleMouseMove); let time = 0; const draw = (now = 0) => { @@ -252,9 +251,7 @@ const FirefliesBanner: React.FC = ({ username, palette, se return () => { resizeObserver.disconnect(); - if (parent) { - parent.removeEventListener('mousemove', handleMouseMove); - } + window.removeEventListener('mousemove', handleMouseMove); cancelAnimationFrame(animationFrameId); }; }, [ @@ -280,7 +277,7 @@ const FirefliesBanner: React.FC = ({ username, palette, se width: '100%', height: '100%', pointerEvents: 'none', - zIndex: 1, + zIndex: 0, }} /> ); diff --git a/frontend/src/components/GenerativeBanner.tsx b/frontend/src/components/GenerativeBanner.tsx index e939f0a..133bc28 100644 --- a/frontend/src/components/GenerativeBanner.tsx +++ b/frontend/src/components/GenerativeBanner.tsx @@ -113,44 +113,57 @@ const GenerativeBanner: React.FC = ({ const mouse = { x: -1000, y: -1000, down: false }; - const handleMouseMove = (e: MouseEvent) => { + const updateMouseFromCoords = (clientX: number, clientY: number) => { const rect = canvas.getBoundingClientRect(); - mouse.x = e.clientX - rect.left; - mouse.y = e.clientY - rect.top; + const x = clientX - rect.left; + const y = clientY - rect.top; + if (x < 0 || y < 0 || x > rect.width || y > rect.height) { + mouse.x = -1000; + mouse.y = -1000; + return false; + } + mouse.x = x; + mouse.y = y; + return true; + }; + + const handleMouseMove = (e: MouseEvent) => { + if (!updateMouseFromCoords(e.clientX, e.clientY)) { + mouse.down = false; + } }; const handleTouchMove = (e: TouchEvent) => { if (e.touches.length > 0) { - const rect = canvas.getBoundingClientRect(); - mouse.x = e.touches[0].clientX - rect.left; - mouse.y = e.touches[0].clientY - rect.top; + updateMouseFromCoords(e.touches[0].clientX, e.touches[0].clientY); } }; - const handleMouseDown = () => { - mouse.down = true; + const handleMouseDown = (e: MouseEvent) => { + const rect = canvas.getBoundingClientRect(); + const x = e.clientX - rect.left; + const y = e.clientY - rect.top; + if (x >= 0 && y >= 0 && x <= rect.width && y <= rect.height) { + mouse.down = true; + } }; const handleMouseUp = () => { mouse.down = false; }; + const handleTouchStart = (e: TouchEvent) => { + if (e.touches.length > 0) { + if (updateMouseFromCoords(e.touches[0].clientX, e.touches[0].clientY)) { + mouse.down = true; + } + } + }; - const parent = canvas.parentElement; - if (parent) { - parent.addEventListener('mousemove', handleMouseMove); - parent.addEventListener('touchmove', handleTouchMove, { passive: false }); - parent.addEventListener('mousedown', handleMouseDown); - parent.addEventListener('mouseup', handleMouseUp); - parent.addEventListener('touchstart', (e) => { - mouse.down = true; - handleTouchMove(e); - }); - parent.addEventListener('touchend', handleMouseUp); - parent.addEventListener('mouseleave', () => { - mouse.x = -1000; - mouse.y = -1000; - mouse.down = false; - }); - } + window.addEventListener('mousemove', handleMouseMove); + window.addEventListener('touchmove', handleTouchMove, { passive: false }); + window.addEventListener('mousedown', handleMouseDown); + window.addEventListener('mouseup', handleMouseUp); + window.addEventListener('touchstart', handleTouchStart); + window.addEventListener('touchend', handleMouseUp); const draw = (now = 0) => { const decision = gate(now); @@ -282,14 +295,12 @@ const GenerativeBanner: React.FC = ({ return () => { resizeObserver.disconnect(); - if (parent) { - parent.removeEventListener('mousemove', handleMouseMove); - parent.removeEventListener('touchmove', handleTouchMove); - parent.removeEventListener('mousedown', handleMouseDown); - parent.removeEventListener('mouseup', handleMouseUp); - parent.removeEventListener('touchstart', handleMouseDown); - parent.removeEventListener('touchend', handleMouseUp); - } + window.removeEventListener('mousemove', handleMouseMove); + window.removeEventListener('touchmove', handleTouchMove); + window.removeEventListener('mousedown', handleMouseDown); + window.removeEventListener('mouseup', handleMouseUp); + window.removeEventListener('touchstart', handleTouchStart); + window.removeEventListener('touchend', handleMouseUp); cancelAnimationFrame(animationFrameId); }; }, [ @@ -315,7 +326,7 @@ const GenerativeBanner: React.FC = ({ width: '100%', height: '100%', pointerEvents: 'none', - zIndex: 1, + zIndex: 0, mixBlendMode: theme.palette.mode === 'light' ? 'multiply' : 'screen', }} /> diff --git a/frontend/src/components/GenerativeFlowBanner.tsx b/frontend/src/components/GenerativeFlowBanner.tsx index f06727c..98476e3 100644 --- a/frontend/src/components/GenerativeFlowBanner.tsx +++ b/frontend/src/components/GenerativeFlowBanner.tsx @@ -124,18 +124,17 @@ const GenerativeFlowBanner: React.FC = ({ username, palette const mouse = { x: -1000, y: -1000 }; const handleMouseMove = (e: MouseEvent) => { const rect = canvas.getBoundingClientRect(); - mouse.x = e.clientX - rect.left; - mouse.y = e.clientY - rect.top; - }; - - const parent = canvas.parentElement; - if (parent) { - parent.addEventListener('mousemove', handleMouseMove); - parent.addEventListener('mouseleave', () => { + const x = e.clientX - rect.left; + const y = e.clientY - rect.top; + if (x < 0 || y < 0 || x > rect.width || y > rect.height) { mouse.x = -1000; mouse.y = -1000; - }); - } + } else { + mouse.x = x; + mouse.y = y; + } + }; + window.addEventListener('mousemove', handleMouseMove); const draw = (now = 0) => { const decision = gate(now); @@ -227,9 +226,7 @@ const GenerativeFlowBanner: React.FC = ({ username, palette return () => { resizeObserver.disconnect(); - if (parent) { - parent.removeEventListener('mousemove', handleMouseMove); - } + window.removeEventListener('mousemove', handleMouseMove); cancelAnimationFrame(animationFrameId); }; }, [ @@ -254,7 +251,7 @@ const GenerativeFlowBanner: React.FC = ({ username, palette width: '100%', height: '100%', pointerEvents: 'none', - zIndex: 1, + zIndex: 0, }} /> ); diff --git a/frontend/src/components/HextechBanner.tsx b/frontend/src/components/HextechBanner.tsx index 263af8d..ebcfe64 100644 --- a/frontend/src/components/HextechBanner.tsx +++ b/frontend/src/components/HextechBanner.tsx @@ -122,27 +122,32 @@ const HextechBanner: React.FC = ({ username, palette, settin const mouse = { x: -1000, y: -1000, down: false }; const handleMouseMove = (e: MouseEvent) => { const rect = canvas.getBoundingClientRect(); - mouse.x = e.clientX - rect.left; - mouse.y = e.clientY - rect.top; + const x = e.clientX - rect.left; + const y = e.clientY - rect.top; + if (x < 0 || y < 0 || x > rect.width || y > rect.height) { + mouse.x = -1000; + mouse.y = -1000; + mouse.down = false; + } else { + mouse.x = x; + mouse.y = y; + } }; - const handleMouseDown = () => { - mouse.down = true; + const handleMouseDown = (e: MouseEvent) => { + const rect = canvas.getBoundingClientRect(); + const x = e.clientX - rect.left; + const y = e.clientY - rect.top; + if (x >= 0 && y >= 0 && x <= rect.width && y <= rect.height) { + mouse.down = true; + } }; const handleMouseUp = () => { mouse.down = false; }; - const parent = canvas.parentElement; - if (parent) { - parent.addEventListener('mousemove', handleMouseMove); - parent.addEventListener('mousedown', handleMouseDown); - parent.addEventListener('mouseup', handleMouseUp); - parent.addEventListener('mouseleave', () => { - mouse.x = -1000; - mouse.y = -1000; - mouse.down = false; - }); - } + window.addEventListener('mousemove', handleMouseMove); + window.addEventListener('mousedown', handleMouseDown); + window.addEventListener('mouseup', handleMouseUp); const draw = (now = 0) => { const decision = gate(now); @@ -269,11 +274,9 @@ const HextechBanner: React.FC = ({ username, palette, settin return () => { resizeObserver.disconnect(); - if (parent) { - parent.removeEventListener('mousemove', handleMouseMove); - parent.removeEventListener('mousedown', handleMouseDown); - parent.removeEventListener('mouseup', handleMouseUp); - } + window.removeEventListener('mousemove', handleMouseMove); + window.removeEventListener('mousedown', handleMouseDown); + window.removeEventListener('mouseup', handleMouseUp); cancelAnimationFrame(animationFrameId); }; }, [ @@ -298,7 +301,7 @@ const HextechBanner: React.FC = ({ username, palette, settin width: '100%', height: '100%', pointerEvents: 'none', - zIndex: 1, + zIndex: 0, }} /> ); diff --git a/frontend/src/components/HextechCorruptionBanner.tsx b/frontend/src/components/HextechCorruptionBanner.tsx index c424575..9ff39ad 100644 --- a/frontend/src/components/HextechCorruptionBanner.tsx +++ b/frontend/src/components/HextechCorruptionBanner.tsx @@ -124,27 +124,32 @@ const HextechCorruptionBanner: React.FC = ({ const mouse = { x: -1000, y: -1000, down: false }; const handleMouseMove = (e: MouseEvent) => { const rect = canvas.getBoundingClientRect(); - mouse.x = e.clientX - rect.left; - mouse.y = e.clientY - rect.top; + const x = e.clientX - rect.left; + const y = e.clientY - rect.top; + if (x < 0 || y < 0 || x > rect.width || y > rect.height) { + mouse.x = -1000; + mouse.y = -1000; + mouse.down = false; + } else { + mouse.x = x; + mouse.y = y; + } }; - const handleMouseDown = () => { - mouse.down = true; + const handleMouseDown = (e: MouseEvent) => { + const rect = canvas.getBoundingClientRect(); + const x = e.clientX - rect.left; + const y = e.clientY - rect.top; + if (x >= 0 && y >= 0 && x <= rect.width && y <= rect.height) { + mouse.down = true; + } }; const handleMouseUp = () => { mouse.down = false; }; - const parent = canvas.parentElement; - if (parent) { - parent.addEventListener('mousemove', handleMouseMove); - parent.addEventListener('mousedown', handleMouseDown); - parent.addEventListener('mouseup', handleMouseUp); - parent.addEventListener('mouseleave', () => { - mouse.x = -1000; - mouse.y = -1000; - mouse.down = false; - }); - } + window.addEventListener('mousemove', handleMouseMove); + window.addEventListener('mousedown', handleMouseDown); + window.addEventListener('mouseup', handleMouseUp); const draw = (now = 0) => { const decision = gate(now); @@ -259,11 +264,9 @@ const HextechCorruptionBanner: React.FC = ({ return () => { resizeObserver.disconnect(); - if (parent) { - parent.removeEventListener('mousemove', handleMouseMove); - parent.removeEventListener('mousedown', handleMouseDown); - parent.removeEventListener('mouseup', handleMouseUp); - } + window.removeEventListener('mousemove', handleMouseMove); + window.removeEventListener('mousedown', handleMouseDown); + window.removeEventListener('mouseup', handleMouseUp); cancelAnimationFrame(animationFrameId); }; }, [ @@ -288,7 +291,7 @@ const HextechCorruptionBanner: React.FC = ({ width: '100%', height: '100%', pointerEvents: 'none', - zIndex: 1, + zIndex: 0, }} /> ); diff --git a/frontend/src/components/NebulaBanner.tsx b/frontend/src/components/NebulaBanner.tsx index 54e34b7..b6cc25b 100644 --- a/frontend/src/components/NebulaBanner.tsx +++ b/frontend/src/components/NebulaBanner.tsx @@ -158,29 +158,34 @@ const NebulaBanner: React.FC = ({ const mouse = { x: -1000, y: -1000, px: -1000, py: -1000, down: false }; const handleMouseMove = (e: MouseEvent) => { const rect = canvas.getBoundingClientRect(); + const x = e.clientX - rect.left; + const y = e.clientY - rect.top; mouse.px = mouse.x; mouse.py = mouse.y; - mouse.x = e.clientX - rect.left; - mouse.y = e.clientY - rect.top; + if (x < 0 || y < 0 || x > rect.width || y > rect.height) { + mouse.x = -1000; + mouse.y = -1000; + mouse.down = false; + } else { + mouse.x = x; + mouse.y = y; + } }; - const handleMouseDown = () => { - mouse.down = true; + const handleMouseDown = (e: MouseEvent) => { + const rect = canvas.getBoundingClientRect(); + const x = e.clientX - rect.left; + const y = e.clientY - rect.top; + if (x >= 0 && y >= 0 && x <= rect.width && y <= rect.height) { + mouse.down = true; + } }; const handleMouseUp = () => { mouse.down = false; }; - const parent = canvas.parentElement; - if (parent) { - parent.addEventListener('mousemove', handleMouseMove); - parent.addEventListener('mousedown', handleMouseDown); - parent.addEventListener('mouseup', handleMouseUp); - parent.addEventListener('mouseleave', () => { - mouse.x = -1000; - mouse.y = -1000; - mouse.down = false; - }); - } + window.addEventListener('mousemove', handleMouseMove); + window.addEventListener('mousedown', handleMouseDown); + window.addEventListener('mouseup', handleMouseUp); let time = 0; const draw = (now = 0) => { @@ -302,11 +307,9 @@ const NebulaBanner: React.FC = ({ return () => { resizeObserver.disconnect(); - if (parent) { - parent.removeEventListener('mousemove', handleMouseMove); - parent.removeEventListener('mousedown', handleMouseDown); - parent.removeEventListener('mouseup', handleMouseUp); - } + window.removeEventListener('mousemove', handleMouseMove); + window.removeEventListener('mousedown', handleMouseDown); + window.removeEventListener('mouseup', handleMouseUp); cancelAnimationFrame(animationFrameId); }; }, [ @@ -335,7 +338,7 @@ const NebulaBanner: React.FC = ({ width: '100%', height: '100%', pointerEvents: 'none', - zIndex: 1, + zIndex: 0, }} /> );