import React, { useEffect, useLayoutEffect, useRef, useState } from 'react'; import { motion, useMotionTemplate, useMotionValue, useReducedMotion } from 'framer-motion'; import gsap from 'gsap'; import { ScrollTrigger } from 'gsap/ScrollTrigger'; import heroBg from '../src/assets/hero-bg.webp'; gsap.registerPlugin(ScrollTrigger); const Hero: React.FC = () => { const containerRef = useRef(null); const parallaxWrapperRef = useRef(null); const mouseX = useMotionValue(0); const mouseY = useMotionValue(0); const prefersReducedMotion = useReducedMotion(); const [isInteractive, setIsInteractive] = useState(false); const maskImage = useMotionTemplate`radial-gradient(100px circle at ${mouseX}px ${mouseY}px, black, transparent)`; const webkitMaskImage = useMotionTemplate`radial-gradient(100px circle at ${mouseX}px ${mouseY}px, black, transparent)`; useEffect(() => { if (prefersReducedMotion || typeof window === 'undefined') { setIsInteractive(false); return; } const mediaQuery = window.matchMedia('(pointer: fine) and (hover: hover)'); const updateState = () => setIsInteractive(mediaQuery.matches); updateState(); if (typeof mediaQuery.addEventListener === 'function') { mediaQuery.addEventListener('change', updateState); return () => mediaQuery.removeEventListener('change', updateState); } mediaQuery.addListener(updateState); return () => mediaQuery.removeListener(updateState); }, [prefersReducedMotion]); const handleMouseMove = ({ currentTarget, clientX, clientY }: React.MouseEvent) => { if (!isInteractive) return; const { left, top } = currentTarget.getBoundingClientRect(); mouseX.set(clientX - left); mouseY.set(clientY - top + 75); }; useLayoutEffect(() => { if (!isInteractive) { return; } const ctx = gsap.context(() => { // Parallax Background gsap.to(parallaxWrapperRef.current, { yPercent: 30, ease: "none", scrollTrigger: { trigger: containerRef.current, start: "top top", end: "bottom top", scrub: true } }); // Text Stagger Animation gsap.fromTo(".hero-stagger", { y: 50, opacity: 0 }, { y: 0, opacity: 1, duration: 1, stagger: 0.2, ease: "power3.out", delay: 0.2 } ); }, containerRef); return () => ctx.revert(); }, [isInteractive]); return (
{/* Base Layer - Slightly Brighter */} Abstract dark technology background {isInteractive && (
Serving the Coastal Bend since 2000

Reliable IT Services
for Over 25 Years

Local IT support, help desk coverage, networking, email, and practical technology support for Coastal Bend businesses.

IT Services Get in Touch
); }; export default Hero;