"use client" import { motion, useInView, useScroll, useSpring } from "motion/react" import { useRef } from "react" import { cn } from "@/lib/utils" import { ease } from "../shared/motion" import type { AblaufLinieData, AblaufSpaltenData } from "./definitions" import type { BlockProps } from "./types" import { container, easeInOut, Eyebrow, Heading } from "./ui" const ROMAN = ["I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X", "XI", "XII"] type Step = AblaufLinieData["items"][number] // Zeitstrahl: die Linie zeichnet sich mit dem Scrollen, Schritte leuchten auf, sobald die Linie sie erreicht export function AblaufLinie({ data }: BlockProps) { const track = useRef(null) const { scrollYProgress } = useScroll({ target: track, offset: ["start 75%", "end 55%"] }) const progress = useSpring(scrollYProgress, { stiffness: 120, damping: 30 }) return (
{data.eyebrow}
    {data.items.map((item, i) => ( ))}
) } function TimelineStep({ item, index }: { item: Step; index: number }) { const ref = useRef(null) // Gleiche Höhe wie das Ende der Linie (offset "end 55%"), damit Punkt und Linie zusammen ankommen const lit = useInView(ref, { margin: "0px 0px -45% 0px" }) const right = index % 2 === 1 return (
  • Schritt {String(index + 1).padStart(2, "0")} {item.duration.trim() && {item.duration}}

    {item.title}

    {item.text}

  • ) } // Schritte nebeneinander: Linien zeichnen sich nacheinander, darunter römische Ziffern export function AblaufSpalten({ data }: BlockProps) { return (
    {data.eyebrow}
      {data.items.map((item, i) => (
    1. {ROMAN[i] ?? i + 1}

      {item.title}

      {item.text}

    2. ))}
    ) }