// Process — interactive 4-step timeline with scroll reveal + click-to-expand function Process({ lang }) { const t = (de, pl) => lang === 'de' ? de : pl; const isMobile = window.useIsMobile ? window.useIsMobile() : false; const steps = [ { n: '01', title: t('Erstgespräch','Pierwsza rozmowa'), d: t('Kostenloser Call. Wir lernen dein Business kennen.','Bezpłatna rozmowa. Poznajemy Twój biznes.'), duration: t('30 Min','30 min'), deliverables: [ t('Bedarfs-Analyse','Analiza potrzeb'), t('Erste Ideen & Empfehlungen','Wstępne pomysły i rekomendacje'), t('Klare nächste Schritte','Jasne kolejne kroki') ], youDo: t('Erzähl uns von deinem Business.','Opowiedz nam o swoim biznesie.') }, { n: '02', title: t('Strategie & Angebot','Strategia i oferta'), d: t('Maßgeschneiderter Plan mit klaren Zielen und Preisen.','Spersonalizowany plan z jasnymi celami i cenami.'), duration: t('3–5 Tage','3–5 dni'), deliverables: [ t('Strategie-Dokument','Dokument strategii'), t('Content- & Automations-Plan','Plan contentu i automatyzacji'), t('Transparentes Festpreis-Angebot','Przejrzysta oferta z ceną stałą') ], youDo: t('Feedback geben & Angebot freigeben.','Daj feedback i zatwierdź ofertę.') }, { n: '03', title: t('Umsetzung','Realizacja'), d: t('Wir produzieren, automatisieren und launchen.','Produkujemy, automatyzujemy, uruchamiamy.'), duration: t('2–6 Wochen','2–6 tygodni'), deliverables: [ t('Content-Produktion','Produkcja contentu'), t('Automations-Setup (n8n / API)','Setup automatyzacji (n8n / API)'), t('Launch & Übergabe','Launch i przekazanie') ], youDo: t('Wöchentliche Updates checken.','Sprawdzaj cotygodniowe aktualizacje.') }, { n: '04', title: t('Optimierung','Optymalizacja'), d: t('Kontinuierliches Monitoring und Skalierung.','Stały monitoring i skalowanie.'), duration: t('Laufend','Na bieżąco'), deliverables: [ t('Performance-Reporting','Raporty wydajności'), t('A/B-Tests & Iteration','Testy A/B i iteracja'), t('Skalierung der Automations','Skalowanie automatyzacji') ], youDo: t('Ergebnisse genießen. Wir machen den Rest.','Ciesz się rezultatami. Resztą zajmujemy się my.') } ]; const [active, setActive] = React.useState(null); const [revealed, setRevealed] = React.useState(false); const [progress, setProgress] = React.useState(0); const sectionRef = React.useRef(null); React.useEffect(() => { const el = sectionRef.current; if (!el) return; let ticking = false; const onScroll = () => { if (ticking) return; ticking = true; requestAnimationFrame(() => { const r = el.getBoundingClientRect(); const vh = window.innerHeight; if (r.top < vh * 0.8) setRevealed(true); const start = vh * 0.7; const end = vh * 0.2; const p = (start - r.top) / (start - end); setProgress(Math.max(0, Math.min(1, p))); ticking = false; }); }; onScroll(); window.addEventListener('scroll', onScroll, { passive: true }); window.addEventListener('resize', onScroll); return () => { window.removeEventListener('scroll', onScroll); window.removeEventListener('resize', onScroll); }; }, []); const liveStep = Math.min(steps.length - 1, Math.floor(progress * steps.length)); return (
— {t('Prozess','Proces')}

{t('Vom Erstgespräch zum Ergebnis — in 4 Schritten.','Od pierwszej rozmowy do rezultatu — w 4 krokach.')}

{t('Klick auf einen Schritt für Details','Kliknij krok, aby zobaczyć szczegóły')}

{!isMobile && (
)} {isMobile && (
)} {steps.map((s, i) => { const isOpen = active === i; const isLive = revealed && i <= liveStep; const reveal = revealed; return (
setActive(isOpen ? null : i)} role="button" tabIndex={0} onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); setActive(isOpen ? null : i); } }} style={{ position: 'relative', textAlign: 'left', display: isMobile ? 'grid' : 'block', gridTemplateColumns: isMobile ? '56px 1fr' : undefined, gap: isMobile ? 20 : 0, alignItems: isMobile ? 'start' : undefined, cursor: 'pointer', opacity: reveal ? 1 : 0, transform: reveal ? 'translateY(0)' : 'translateY(24px)', transition: `opacity .7s cubic-bezier(.2,.7,.2,1) ${i * 120}ms, transform .7s cubic-bezier(.2,.7,.2,1) ${i * 120}ms`, outline: 'none' }} >
{s.n}

{s.title}

{s.d}

{isOpen ? t('Schließen','Zamknij') : t('Mehr','Więcej')}
{t('Dauer','Czas trwania')} {s.duration}
{t('Was du bekommst','Co otrzymujesz')}
    {s.deliverables.map((d, di) => (
  • {d}
  • ))}
{t('Dein Part','Twoja rola')} {s.youDo}
); })}
); } window.Process = Process;