"use client"; import { useEffect, useRef } from "react"; import { ClipboardIcon, CheckIcon } from "./Icons"; interface Week { week: string; expert?: string; title: string; body: string; vorlagen: string; result: string; } interface Module { label: string; headline: string; weeks: Week[]; } const MODULES: Module[] = [ { label: "Modul 1 — Wochen 1 & 2", headline: "Wunschkunde, Markt + dein erstes klares Angebot", weeks: [ { week: "Woche 1", title: "Dein Wunschkunde + dein Markt", body: "Erst weißt du für wen — dann weißt du womit du anfängst. Du schaust konkret hin: Wer ist dein Wunschkunde wirklich? Welches Problem hat er — und was hat er schon alles versucht? Was kostet ihn das jeden Monat? Du machst einen ehrlichen Marketing-Audit: Was läuft, was nicht — und warum. Diese Woche ist die Grundlage für dein Einstiegsangebot in Woche 2.", vorlagen: "Marketing-Audit-Vorlage · Wunschkunden-Persona-Vorlage", result: "Klarheit über deinen Wunschkunden — konkret, nicht allgemein. Basis für Woche 2.", }, { week: "Woche 2", title: "Was verkaufst du — und womit fängst du an?", body: "Schluss mit 'Ich habe so viel anzubieten — wo fange ich an?' Du schaust auf alles was du anbietest und wählst EIN klares Startangebot aus: konkret, klar, sofort buchbar. Welches Problem löst es? Für wen? Was macht es wert? Ab jetzt weißt du genau: das ist mein erstes Produkt.", vorlagen: "Startangebot-Vorlage · Angebotsportfolio-Canvas", result: "EIN klares Startangebot — definiert, priorisiert, bereit zum Verkauf.", }, ], }, { label: "Modul 2 — Wochen 3 & 4", headline: "Dein System steht.", weeks: [ { week: "Woche 3", title: "Angebot ausbauen + deine Positionierungsformel", body: "Du baust dein Startangebot weiter aus: Was sind die Extras die es unwiderstehlich machen? Dann entwickelst du deine Positionierungsformel — für wen, welches Problem, was macht dich anders. In einem Satz. Du übst ihn live in der Gruppe.", vorlagen: "Positionierungsformel-Vorlage · Kurztext für Website, Instagram und LinkedIn", result: "Angebot vollständig ausgebaut — Positionierung in einem Satz, für alle Kanäle.", }, { week: "Woche 4", title: "Verkaufsseite + Kanal-Strategie + 90-Tage-Marketingplan", body: "Du bekommst die Struktur für deine Verkaufsseite — 7 Pflicht-Elemente, Vorlage, direkt einsetzbar. Dann entscheidest du: Welche 2 Kanäle fokussierst du auf Basis deiner Zielgruppe? Du baust deine Marketing-Systemkarte und startest deinen 90-Tage-Plan.", vorlagen: "Verkaufsseiten-Vorlage · Kanal-Entscheidungsmatrix · Marketing-Systemkarte · 90-Tage-Marketingplan", result: "Verkaufsseite strukturiert + 2 Kanäle entschieden + 90-Tage-Plan begonnen.", }, ], }, { label: "Modul 3 — Wochen 5–8", headline: "Sichtbarkeit. Anfragen. Und du weißt wie es weitergeht.", weeks: [ { week: "Woche 5", expert: "Can Turkdogan · Social Media", title: "Dein Content-System", body: "Deine 3–4 Content-Themen die zeigen wofür du stehst. Du erstellst live deinen 4-Wochen-Redaktionsplan, schreibst deinen ersten Hook und weißt ab dieser Woche genau: was du postest, wann, und warum.", vorlagen: "Content-Säulen-Template · 4-Wochen-Redaktionsplan · 10 bewährte Hook-Formeln", result: "Content-Plan für 4 Wochen — weißt genau was und wie du postest.", }, { week: "Woche 6", expert: "Stefan & Philipp · Onlinewerbevideo", title: "Social Media Verkauf + Video-Setup", body: "Du lernst wie du dein Angebot aktiv über Social Media verkaufst — mit Strategie, nicht mit Druck. Die Video-Experten zeigen live: professionelle Videos mit dem Handy.", vorlagen: "Launch-Checkliste · Equipment-Checkliste · Filming-Guide", result: "Plan für Social Media Verkauf + professionell auf Video.", }, { week: "Woche 7", expert: "Manuela Ludewig · Vertrieb", title: "Verkauf + Direktansprache", body: "Dein persönliches Verkaufsskript für die Direktansprache — angepasst auf deine Positionierung. Du übst es live in der Gruppe mit konkretem Plan für deine nächsten Kontakte.", vorlagen: "Persönliches Verkaufsskript · Follow-up-Template · Event-Recherche-Guide", result: "Dein Verkaufsskript für die Direktansprache — einmal geübt.", }, { week: "Woche 8", expert: "Katja Pestereva · Market Compass", title: "Sichtbarkeit auf Google + Abschluss", body: "Du optimierst dein Google Business Profil Schritt für Schritt in der Gruppe. Du bringst deine Website auf die Grundlagen die Google belohnt. Abschlussrunde: Was hat sich in 8 Wochen verändert?", vorlagen: "SEO-Checkliste · Keyword-Recherche-Vorlage · Website-Leitfaden", result: "Google Business vollständig optimiert + Seite für dein Haupt-Keyword.", }, ], }, ]; /* Running week counter so odd/even alternates across all modules */ let globalWeekIndex = 0; function WeekCard({ week, isLeft }: { week: Week; isLeft: boolean }) { const ref = useRef(null); useEffect(() => { const el = ref.current; if (!el) return; const obs = new IntersectionObserver( ([entry]) => { if (entry.isIntersecting) { el.classList.add("tl-visible"); obs.disconnect(); } }, { threshold: 0.15 } ); obs.observe(el); return () => obs.disconnect(); }, []); return (
{/* Header */}
{week.week} {week.expert && ( {week.expert} )}
{/* Title */}

{week.title}

{/* Body */}

{week.body}

{/* Vorlagen */}

{week.vorlagen}

{/* Result */}

{week.result}

); } export default function WeekTimeline() { /* Reset global counter each render (SSR-safe: only matters client-side) */ globalWeekIndex = 0; return (
{/* Section header */}
8 Wochen · Schritt für Schritt

Dein Programm — Woche für Woche

Jede Woche baut auf der nächsten auf. Am Ende hast du kein Zertifikat — sondern ein fertiges System.

{MODULES.map((mod) => (
{/* Module divider */} {/* Weeks */}
{/* Vertical timeline line */}
{mod.weeks.map((week) => { const isLeft = globalWeekIndex % 2 === 0; globalWeekIndex++; return (
{/* Timeline dot — centered */}
{week.week.replace("Woche ", "")}
); })}
))}
); } function ModuleDivider({ label, headline }: { label: string; headline: string }) { const ref = useRef(null); useEffect(() => { const el = ref.current; if (!el) return; const obs = new IntersectionObserver( ([entry]) => { if (entry.isIntersecting) { el.classList.add("tl-visible"); obs.disconnect(); } }, { threshold: 0.2 } ); obs.observe(el); return () => obs.disconnect(); }, []); return (
{label}

{headline}

); }