const TESTIMONIALS_I18N = { EN: { eyebrow: 'Testimonials', items: [ { quote: 'Grey Space IT delivered our client\u2019s ERP solution in the UAE on time and to an exceptional standard. Professional, responsive, and technically sharp throughout \u2014 exactly the partner you want on a critical project. Future Sphere wholeheartedly recommends them.', name: 'Fatima', title: 'Operations Manager, Future Sphere', location: 'UAE', metric: { v: '100%', l: 'On-time delivery' } }, { quote: 'GPU CFD that used to take a week now finishes overnight. Our engineers iterate on geometries we wouldn\u2019t have tried before.', name: 'Dr. Mateus Vega', title: 'Head of Simulation, Forge Industrial', location: 'Stuttgart · DE', metric: { v: '6.4×', l: 'Faster simulation cycle' } }, { quote: 'A German-speaking desk that actually understands SAP HANA — we stopped escalating tickets and started closing them.', name: 'Lena Hoffmann', title: 'Head of IT Operations, Nordstern', location: 'Hamburg · DE', metric: { v: '38%', l: 'Avg. ticket time' } }, { quote: 'Their ServiceNow team turned a stalled rollout into a working CMDB and HRSD portal in one quarter. Adoption took care of itself.', name: 'Priya Subramanian', title: 'VP Digital, Atlas Health', location: 'Frankfurt · DE', metric: { v: '94%', l: 'Employee adoption' } }, ], }, DE: { eyebrow: 'Stimmen', items: [ { quote: 'Grey Space IT hat die ERP-Lösung für unseren Kunden in den VAE termingerecht und auf außergewöhnlich hohem Niveau geliefert. Professionell, reaktionsschnell und technisch versiert \u2014 genau der Partner, den man bei einem kritischen Projekt an seiner Seite haben möchte. Future Sphere spricht eine uneingeschränkte Empfehlung aus.', name: 'Fatima', title: 'Operations Manager, Future Sphere', location: 'VAE', metric: { v: '100%', l: 'Termingerechte Lieferung' } }, { quote: 'GPU-CFD, das früher eine Woche dauerte, läuft jetzt über Nacht. Unsere Ingenieure iterieren über Geometrien, die wir vorher nie probiert hätten.', name: 'Dr. Mateus Vega', title: 'Leiter Simulation, Forge Industrial', location: 'Stuttgart · DE', metric: { v: '6.4×', l: 'Schnellerer Simulationszyklus' } }, { quote: 'Ein deutschsprachiger Desk, der SAP HANA wirklich versteht — wir eskalieren keine Tickets mehr, wir schließen sie.', name: 'Lena Hoffmann', title: 'Leiterin IT-Betrieb, Nordstern', location: 'Hamburg · DE', metric: { v: '38%', l: 'Durchschn. Ticketzeit' } }, { quote: 'Ihr ServiceNow-Team hat aus einem festgefahrenen Rollout in einem Quartal eine funktionierende CMDB und ein HRSD-Portal gemacht. Die Akzeptanz kam von allein.', name: 'Priya Subramanian', title: 'VP Digital, Atlas Health', location: 'Frankfurt · DE', metric: { v: '94%', l: 'Mitarbeiterakzeptanz' } }, ], }, }; function Testimonials({ lang = 'EN' }) { const TT = TESTIMONIALS_I18N[lang] || TESTIMONIALS_I18N.EN; const TESTIMONIALS = TT.items; const [idx, setIdx] = React.useState(0); const [paused, setPaused] = React.useState(false); const total = TESTIMONIALS.length; const touch = React.useRef({ x: 0, y: 0, t: 0, active: false }); React.useEffect(() => { if (paused) return; const t = setTimeout(() => setIdx((i) => (i + 1) % total), 6500); return () => clearTimeout(t); }, [idx, paused, total]); const t = TESTIMONIALS[idx]; const onTouchStart = (e) => { const tc = e.touches[0]; touch.current = { x: tc.clientX, y: tc.clientY, t: Date.now(), active: true }; setPaused(true); }; const onTouchEnd = (e) => { if (!touch.current.active) return; const tc = e.changedTouches[0]; const dx = tc.clientX - touch.current.x; const dy = tc.clientY - touch.current.y; const dt = Date.now() - touch.current.t; touch.current.active = false; if (Math.abs(dx) > 40 && Math.abs(dx) > Math.abs(dy) * 1.2 && dt < 800) { if (dx < 0) setIdx((idx + 1) % total); else setIdx((idx - 1 + total) % total); } setTimeout(() => setPaused(false), 4000); }; return (
setPaused(true)} onMouseLeave={() => setPaused(false)} onTouchStart={onTouchStart} onTouchEnd={onTouchEnd} className="gs-testimonials-section" style={{padding: 'clamp(48px,8vw,120px) var(--page-px,40px)', background: 'var(--gs-50)'}}>
{TT.eyebrow}
{TESTIMONIALS.map((item, i) => (
{item.name.split(' ').map(w => w[0]).slice(0,2).join('')}
{item.name}
{item.title} · {item.location}
{item.metric.v}
{item.metric.l}
))}
{/* Progress bars + manual controls */}
{TESTIMONIALS.map((_, i) => ( ))}
{String(idx + 1).padStart(2, '0')} / {String(total).padStart(2, '0')}
); } window.Testimonials = Testimonials;