// home.jsx — landing page const homeUseCases = [ { num: "01", icon: "mail", title: "E-Mail & Kommunikation", body: "KI klassifiziert eingehende E-Mails, leitet sie ans richtige Team weiter und erstellt einen ersten Antwortentwurf.", tools: ["gmail", "n8n", "outlook"], hours: "3–6", }, { num: "02", icon: "file", title: "Dokumente & Rechnungen", body: "Betrag, Datum und Lieferant aus PDFs auslesen. Direkter Export in DATEV, SAP oder Sheets.", tools: ["datev", "sap", "n8n"], hours: "5–10", }, { num: "03", icon: "chart", title: "Reporting & Daten", body: "Vollautomatischer Reportversand aus euren Quellsystemen — inkl. KI-Kommentar zu Auffälligkeiten.", tools: ["sheets", "powerbi", "n8n"], hours: "4–8", }, { num: "04", icon: "users", title: "HR & Onboarding", body: "Vertrag unterschrieben — und alles läuft: Account, Slack, IT, Checkliste, Willkommensmail. Ohne einen Klick.", tools: ["workspace", "slack", "notion"], hours: "2–4", }, { num: "05", icon: "handshake", title: "Vertrieb & CRM", body: "Lead-Qualifizierung, Angebotsentwurf auf Knopfdruck, CRM-Einträge schreiben sich selbst.", tools: ["hubspot", "pipedrive", "n8n"], hours: "5–8", }, ]; const homeFaqs = [ { q: "Wie schnell läuft so ein Workflow?", a: "Wir fangen klein an, damit ihr sofort Ergebnisse seht. Einfache Lösungen (wie E-Mail-Sortierung) stehen in 3–5 Tagen. Komplexere Vernetzungen dauern meist 1–2 Wochen. Wir bauen agil: Der wichtigste Zeitfresser wird zuerst eliminiert.", }, { q: "Bleiben unsere Daten wirklich in der EU?", a: "Ja, ohne Wenn und Aber. Wir nutzen Hosting-Partner in Deutschland oder Finnland und Modelle von europäischen Anbietern (wie Mistral oder Aleph Alpha). Wenn gewünscht, installieren wir alles on-premise direkt auf euren eigenen Servern. Eure Daten verlassen niemals euren Kontrollbereich.", }, { q: "Brauchen wir eigenes IT-Personal dafür?", a: "Nein. Wir sind eure externe Engineering-Abteilung. Wir kümmern uns um die Einrichtung und Anbindung. Euer Team muss keine einzige Zeile Code verstehen — ihr nutzt einfach das Ergebnis. Falls ihr eine eigene IT habt, arbeiten wir gerne mit ihnen zusammen, um den Zugang sicherzustellen.", }, { q: "Was passiert, wenn ein Workflow mal stockt?", a: "Wir bauen robust, Error-Handling inklusive. Sollte sich eine Schnittstelle ändern (z.B. ein Update eurer Software), merken wir das oft, bevor ihr es tut. Wir bieten Wartungspakete an, damit eure Automatisierung so zuverlässig läuft wie euer Stromanschluss.", }, { q: "Können wir Änderungen auch selbst machen?", a: "Unbedingt. Wir nutzen Low-Code-Tools wie n8n. Das bedeutet: Nach der Übergabe gehört der Prozess euch. Wir dokumentieren alles so einfach, dass eine technisch affine Person in eurem Team kleine Anpassungen selbst vornehmen kann. Ihr seid nicht an uns gekettet.", }, ]; // "Warum Treibiq" - 4 Reasons mit Click-to-Modal-Popup const whyReasons = [ { num: "01", icon: "shield", title: "DSGVO-konform per Default", teaser: "Eure Daten bleiben bei euch — nicht in einer amerikanischen Cloud, nicht auf fremden Servern.", detail: "Wir bauen mit EU-Hosting und EU-Modellen wie Mistral und Aleph Alpha. Wo nötig, richten wir alles komplett on-premise ein — direkt auf eurer Infrastruktur, ohne dass ein einziges Dokument euer Unternehmen verlässt. DSGVO ist bei uns kein Häkchen in einer Checkliste, sondern der Ausgangspunkt jeder Lösung.", tags: ["EU-Hosting", "On-Premise möglich", "Keine US-Cloud"], }, { num: "02", icon: "server", title: "Open-Source-Stack ohne Abo-Falle", teaser: "Wir setzen auf n8n: Open Source, selbst gehostet und komplett in eurem Besitz statt monatlicher Miet-Tools.", detail: "Andere bauen Workflows in Zapier oder Make — und ihr zahlt monatlich für die reine Ausführung. Mit unserem n8n-Ansatz gibt es keine laufenden Tool-Kosten und keine Anbieter-Abhängigkeit. Der Workflow gehört euch — auch wenn wir morgen nicht mehr da sind. Ihr könnt ihn jederzeit lesen, anpassen und erweitern.", tags: ["n8n statt Zapier", "Keine Abo-Kosten", "Ihr besitzt den Code"], }, { num: "03", icon: "users", title: "Technisch und persönlich", teaser: "Kein Mittelsmann, keine Folien-Schubser. Ihr sprecht direkt mit den Engineers, die euren Code schreiben.", detail: "Wir sprechen direkt mit den Menschen, die den Workflow täglich nutzen — nicht nur mit der Geschäftsführung. Wir schreiben den Code selbst, sitzen bei Fragen am Tisch und übergeben eine vollständige Dokumentation. Was wir gebaut haben, versteht ihr. Was ihr nicht versteht, erklären wir — so lange, bis es sitzt.", tags: ["Kein Mittelsmann", "Direkter Draht", "Vollständig dokumentiert"], }, { num: "04", icon: "zap", title: "Pragmatisch, nicht überdimensioniert", teaser: "Automatisierung in 1–2 Wochen statt monatelanger Steering Committees.", detail: "Wir bauen in eurem Tempo und mit eurem vorhandenen Stack — egal ob Mittelstand, Start-up oder Konzern-Tochter. Keine Überdimensionierung, keine unnötigen Features, kein Projekt-Overhead. Die erste Automatisierung läuft schnell — dann schauen wir gemeinsam datenbasiert, was als nächster Schritt sinnvoll ist.", tags: ["1–2 Wochen Umsetzung", "Euer Stack", "Kein Overhead"], }, ]; // "Was wir umsetzen" - 6 Workflows mit Click-to-Modal-Popup const workflowsList = [ { icon: "mail", title: "Die intelligente Inbox", sub: "E-Mail-Triage", teaser: "KI sortiert eure Mails und schreibt Antwort-Entwürfe vor. Ihr klickt nur noch auf Senden.", problem: "Das info@-Postfach ist ein schwarzes Loch. Anfragen gehen unter, Antworten kommen zu spät.", loesung: "Die Flut an Anfragen wird automatisch kategorisiert. Rechnungen landen in der Buchhaltung, Termine im Kalender. Ihr startet den Tag nicht mit 100 Mails, sondern mit fertigen Lösungen.", bauzeit: "1–2 Wochen", ersparnis: "3–6 Std / Woche", }, { icon: "file", title: "Digitale Poststelle", sub: "Dokumenten-Ablage", teaser: "Nie wieder Scan_123.pdf händisch umbenennen und verschieben. Die KI weiß, wo es hingehört.", problem: "Scans landen im Download-Ordner, müssen einzeln umbenannt und in Projektordner verschoben werden.", loesung: "Scans und Anhänge werden gelesen, erkannt und mit logischen Namen (Datum_Kunde_Typ) direkt in eurem Zielordner abgelegt. DATEV-Export inklusive.", bauzeit: "1–2 Wochen", ersparnis: "5–10 Std / Woche", }, { icon: "handshake", title: "Angebots-Assistent", sub: "Vertrieb", teaser: "Aus euren Notizen oder Sprachnachrichten wird in Sekunden ein fertiges Angebot im Firmenlayout.", problem: "Nach jedem Kundentermin sitzt jemand 30 Minuten am Angebot, kopiert aus Vorlagen, vertippt sich.", loesung: "Ihr diktiert die Eckdaten nach dem Kundentermin ein — die KI formuliert daraus ein professionelles PDF, das sofort rausgehen kann.", bauzeit: "1–2 Wochen", ersparnis: "4–8 Std / Woche", }, { icon: "chart", title: "Smartes Reporting", sub: "Auswertung", teaser: "Echte Zahlen statt Bauchgefühl. Automatische Berichte aus euren Daten direkt auf euer Handy.", problem: "Reports werden monatlich aus Excel, CSV und drei Systemen zusammengeklickt. Immer wieder.", loesung: "Wir ziehen Daten aus CRM, Excel oder Buchhaltung zusammen und erstellen Dashboards, die euch sagen, wo ihr profitabel seid — ohne dass ihr eine Liste öffnen müsst.", bauzeit: "1–2 Wochen", ersparnis: "4–8 Std / Woche", }, { icon: "users", title: "Mitarbeiter-Onboarding", sub: "HR", teaser: "Neue Mitarbeiter im Team? Alle Konten, Verträge und Checklisten werden automatisch erstellt.", problem: "Bei jedem neuen Mitarbeiter klickt jemand 2 Stunden durch 8 Tools, vergisst die Hälfte, IT chaotisiert los.", loesung: "Ein Klick und der Workflow legt E-Mail, Slack und Zugriffsberechtigungen an. Kein IT-Chaos mehr am ersten Arbeitstag.", bauzeit: "1–2 Wochen", ersparnis: "2–4 Std / Woche", }, { icon: "sparkle", title: "Das Company Brain", sub: "Wissens-Chat", teaser: "Stellt Fragen an eure eigenen Dokumente. Schluss mit dem Suchen in alten Handbüchern.", problem: "Wissen liegt in 200 PDFs, Sharepoint-Ordnern und alten Protokollen. Niemand findet was.", loesung: "Wir machen eure PDFs und Protokolle durchsuchbar. Mitarbeiter fragen einen Chatbot: 'Wie war die Regelung für X?' und erhalten sofort die Antwort aus euren Quellen.", bauzeit: "1–2 Wochen", ersparnis: "3–5 Std / Woche", }, ]; // ----------------------------- // HERO with hot-swappable visual // ----------------------------- function Hero() { const { tweaks } = useTweaks(); return (

Eure Routinen laufen. Eure Zeit gehört wieder euch.

Mit Treibiq automatisiert ihr alles, was sich täglich wiederholt und euch Zeit kostet.

); } // Mobile-only: 6 Tool-Logos verstreut platziert (wie Desktop floating), // poppen nacheinander auf + schweben subtil, dann werden die Linien // zwischen ihnen sequenziell als SVG-Pfade "gezeichnet" (stroke-dashoffset). // Sitzt im Hero zwischen H1 und Lede. Auf Desktop per CSS versteckt. function HeroMobileFlow() { // Float-Parameter pro Logo: Frequenzen + Phasen + Amplituden fuer // asynchrone Sinus-Bewegung. Werte sind so gewaehlt, dass keine zwei // Logos synchron laufen (verschiedene Primzahl-aehnliche Frequenzen). // ampX/ampY in % vom Container (200px hoch x ~360px breit auf Mobile). // Amplituden (aX/aY) bewusst klein gehalten - User-Wunsch 2026-05-12: // Bewegung soll auf Mobile dezenter sein. War 1.8-2.4 / 2.6-3.4, jetzt // 0.9-1.2 / 1.3-1.7 -> ca. halbiert, sanftes Atmen statt Schweben. const tools = [ { name: "gmail", top: 22, left: 12, fX: 0.18, fY: 0.22, aX: 1.1, aY: 1.7, pX: 0.0, pY: 0.5 }, { name: "n8n", top: 14, left: 50, fX: 0.22, fY: 0.16, aX: 0.9, aY: 1.5, pX: 1.2, pY: 2.0 }, { name: "openai", top: 32, left: 86, fX: 0.20, fY: 0.24, aX: 1.2, aY: 1.4, pX: 2.4, pY: 0.8 }, { name: "hubspot", top: 68, left: 78, fX: 0.17, fY: 0.20, aX: 1.0, aY: 1.5, pX: 0.6, pY: 1.4 }, { name: "slack", top: 78, left: 38, fX: 0.25, fY: 0.18, aX: 1.0, aY: 1.3, pX: 1.8, pY: 2.6 }, { name: "sheets", top: 54, left: 18, fX: 0.19, fY: 0.21, aX: 1.2, aY: 1.6, pX: 3.0, pY: 1.0 }, ]; // Interconnected: n8n als Hub. const connections = [ [0, 1], // gmail → n8n [1, 2], // n8n → openai [2, 3], // openai → hubspot [3, 1], // hubspot → n8n (Quer-Verbindung) [1, 4], // n8n → slack [4, 5], // slack → sheets ]; const [phase, setPhase] = useState("logos"); const [step, setStep] = useState(0); // Refs auf DOM-Elements - wir updaten sie pro RAF-Frame direkt (kein // React re-render bei 60fps). const posRefs = useRef([]); const linePathRefs = useRef([]); const pulsePathRefs = useRef([]); useEffect(() => { if (phase === "logos") { if (step < tools.length) { const t = setTimeout(() => setStep(step + 1), 220); return () => clearTimeout(t); } else { const t = setTimeout(() => { setPhase("lines"); setStep(0); }, 400); return () => clearTimeout(t); } } if (phase === "lines" && step < connections.length) { const t = setTimeout(() => setStep(step + 1), 480); return () => clearTimeout(t); } }, [phase, step]); // RAF-Loop: aktualisiert Logo-Positionen UND Pfad-Endpoints in einem // Schritt. Damit folgen die Linien dem Float der Logos synchron. // Performance-Fix 2026-05-13: Loop pausiert sobald der Hero-Container // ausserhalb des Viewports ist (IntersectionObserver-Guard). Vorher // lief der Loop permanent 60fps mit ~24 DOM-Writes pro Frame, auch // wenn der User schon laengst weiter unten gescrollt war. const containerRef = useRef(null); useEffect(() => { if (typeof window === "undefined") return; const mediaReduced = window.matchMedia?.("(prefers-reduced-motion: reduce)").matches; if (mediaReduced) return; let raf = null; let isVisible = true; let flowWidth = 0; let flowHeight = 0; const t0 = performance.now(); const TAU = Math.PI * 2; const measureFlow = () => { const rect = containerRef.current?.getBoundingClientRect(); flowWidth = rect?.width || 0; flowHeight = rect?.height || 0; }; measureFlow(); window.addEventListener("resize", measureFlow, { passive: true }); const bob = (tool, t) => ({ x: tool.aX * Math.sin(t * tool.fX * TAU + tool.pX), y: tool.aY * Math.sin(t * tool.fY * TAU + tool.pY), }); const buildD = (a, b) => { const midX = (a.left + b.left) / 2; const midY = (a.top + b.top) / 2; const dx = b.left - a.left; const dy = b.top - a.top; const cx = midX - dy * 0.12; const cy = midY + dx * 0.12; return `M ${a.left.toFixed(2)} ${a.top.toFixed(2)} Q ${cx.toFixed(2)} ${cy.toFixed(2)} ${b.left.toFixed(2)} ${b.top.toFixed(2)}`; }; const loop = () => { if (!isVisible) { raf = null; return; } const t = (performance.now() - t0) / 1000; const positions = tools.map(tool => { const b = bob(tool, t); return { top: tool.top + b.y, left: tool.left + b.x, xPx: (b.x / 100) * flowWidth, yPx: (b.y / 100) * flowHeight, }; }); for (let i = 0; i < tools.length; i++) { const el = posRefs.current[i]; if (el) { el.style.transform = `translate3d(${positions[i].xPx.toFixed(2)}px, ${positions[i].yPx.toFixed(2)}px, 0) translate(-50%, -50%)`; } } for (let i = 0; i < connections.length; i++) { const [from, to] = connections[i]; const d = buildD(positions[from], positions[to]); const lineEl = linePathRefs.current[i]; const pulseEl = pulsePathRefs.current[i]; if (lineEl) lineEl.setAttribute("d", d); if (pulseEl) pulseEl.setAttribute("d", d); } raf = requestAnimationFrame(loop); }; // IntersectionObserver: nur RAF starten wenn Hero im Viewport const io = new IntersectionObserver((entries) => { const entry = entries[0]; isVisible = entry.isIntersecting; if (isVisible && raf === null) { raf = requestAnimationFrame(loop); } }, { threshold: 0, rootMargin: "100px" }); const target = containerRef.current; if (target) io.observe(target); // Initial start (falls IO erst spaeter feuert) raf = requestAnimationFrame(loop); return () => { isVisible = false; if (raf) cancelAnimationFrame(raf); window.removeEventListener("resize", measureFlow); io.disconnect(); }; }, []); // Static initial d-strings (fuer reduced-motion und ersten Render bevor // RAF zuschlaegt) const initialD = (from, to) => { const a = tools[from]; const b = tools[to]; const midX = (a.left + b.left) / 2; const midY = (a.top + b.top) / 2; const dx = b.left - a.left; const dy = b.top - a.top; return `M ${a.left} ${a.top} Q ${midX - dy * 0.12} ${midY + dx * 0.12} ${b.left} ${b.top}`; }; return ( ); } function HeroVisual({ variant }) { if (variant === "stat") return ; if (variant === "flow") return ; return ; } // Variant A: video slot (default) — drop a video into