"use client" import { AnimatePresence, motion, useInView } from "motion/react" import { useEffect, useEffectEvent, useRef, useState } from "react" import { cn } from "@/lib/utils" import { TImage } from "../shared/media" import { Reveal, ScrollWords, ease } from "../shared/motion" import type { StatementData, StoryKapitelData, TextBildData } from "./definitions" import type { BlockProps } from "./types" import { container, easeInOut, Eyebrow, Heading, InkImage } from "./ui" export function Statement({ data }: BlockProps) { return (
{data.eyebrow}
{data.author.trim() && (

{data.author} {data.role}

)}
) } type Chapter = StoryKapitelData["items"][number] // Geschichte in Kapiteln: links ein stehendes Bild, das sich mit dem aktiven Kapitel von unten neu aufdeckt export function StoryKapitel({ data }: BlockProps) { const [active, setActive] = useState(0) const current = Math.min(active, Math.max(0, data.items.length - 1)) return (
{data.eyebrow}
{data.items.map((item, i) => ( ))}
{data.items[current]?.year}
{data.items.map((_, i) => ( ))}
{data.items.map((item, i) => ( setActive(i)} /> ))}
) } function ChapterText({ item, active, onEnter }: { item: Chapter; active: boolean; onEnter: () => void }) { const ref = useRef(null) // Aktiv, sobald das Kapitel die Bildschirmmitte kreuzt const inView = useInView(ref, { margin: "-45% 0px -45% 0px" }) const enter = useEffectEvent(onEnter) useEffect(() => { if (inView) enter() }, [inView]) return (

{item.year}

{item.title}

{item.text}

) } export function TextBild({ data }: BlockProps) { return (
{data.caption.trim() &&
{data.caption}
}
{data.eyebrow}

{data.text}

{data.quote.trim() && (
„{data.quote}“
)} {data.signature.trim() &&

{data.signature}

}
) }