/* Testimonials — 3D coverflow stack with avatar filmstrip tabs and a progress ring. */ const QUOTES = [ { q: "I was stuck trying to make my startup fashion brand look distinctive — we could not settle on a logo or a palette that showed our vibe. The team at ZaviFx built the whole visual identity and the graphic assets that go with it.", n: 'Emilia Clarke', r: 'Manager · Fashion label', m: 'Brand identity', a: 'avatars/a1.png' }, { q: "Really happy with the website ZaviFx made for my business. Their designers gave us a proper visual brand with a clean logo and colours that show customers who we are. Fast service, top notch results.", n: 'Cristian Torres', r: 'Founder · Interiors studio', m: 'WordPress build', a: 'avatars/a2.png' }, { q: "ZaviFx know their stuff. Since working with their team our traffic and sales have noticeably gone up. What stands out is that they learn your business goals before touching a campaign.", n: 'Michael Terry', r: 'Director · B2B services', m: 'Performance marketing', a: 'avatars/a3.png' }, { q: "The SEO audit was the first one we have received that our developers could actually action. Every issue had a file, a fix and a priority — and the rankings followed.", n: 'Priya Nair', r: 'Marketing lead · SaaS', m: 'Technical SEO' }, { q: "We came for a WordPress rebuild and left with a documented design system. Page speed went from painful to instant, and the enquiry form finally converts on mobile.", n: 'Rahul Menon', r: 'Owner · Manufacturing', m: 'Website rebuild' }, { q: "One brief, one team. We used to brief three vendors and reconcile three reports. Now the strategy, the build and the ads sit in one conversation.", n: 'Sana Fatima', r: 'Head of growth · E-commerce', m: 'Growth retainer' }, { q: "Their content calendar is built around search demand and the objections our sales team actually hears. That alone changed the quality of our inbound leads.", n: 'Daniel Roy', r: 'Co-founder · Fintech', m: 'Content strategy' }, { q: "Handover was the best part. Accounts, code, design files and the tracking plan were all ours from day one, documented. No lock-in, no mystery.", n: 'Aisha Khan', r: 'COO · Healthcare group', m: 'Handover' }, { q: "Reporting is one page and it answers the only question my board asks: what did this cost, and what did it return.", n: 'Vikram Shetty', r: 'MD · Logistics', m: 'Reporting' }, ]; function TFace({ t, cls }) { if (t.a) return ; return ; } function Testimonials() { const [i, setI] = React.useState(0); const [paused, setPaused] = React.useState(false); const reduce = window.matchMedia('(prefers-reduced-motion: reduce)').matches; const N = QUOTES.length; const step = (d) => setI((n) => (n + d + N) % N); React.useEffect(() => { if (reduce || paused) return; const t = setInterval(() => setI((n) => (n + 1) % N), 6000); return () => clearInterval(t); }, [paused, reduce, N]); const tilt = (e) => { const el = e.currentTarget, r = el.getBoundingClientRect(); el.style.setProperty('--tx', (((e.clientX - r.left) / r.width - 0.5) * 9).toFixed(2) + 'deg'); el.style.setProperty('--ty', (((e.clientY - r.top) / r.height - 0.5) * -7).toFixed(2) + 'deg'); el.style.setProperty('--lx', (((e.clientX - r.left) / r.width) * 100).toFixed(1) + '%'); el.style.setProperty('--ly', (((e.clientY - r.top) / r.height) * 100).toFixed(1) + '%'); }; const untilt = (e) => { const s = e.currentTarget.style; s.setProperty('--tx', '0deg'); s.setProperty('--ty', '0deg'); }; return (
setPaused(true)} onMouseLeave={() => setPaused(false)}>