"use client"; import { AnimatePresence, LazyMotion, domAnimation, m, useReducedMotion } from "motion/react"; import Image from "next/image"; import { useEffect, useState } from "react"; import type { Media } from "@/content/site"; const INTERVAL_MS = 5500; type ImageMedia = Extract; /** * Bilderfolge der Villa: weiche Ueberblendung mit langsamem Zoom. * Laeuft von selbst, laesst sich aber jederzeit anhalten (WCAG 2.2.2) und * pausiert bei Maus oder Tastaturfokus. Bei reduzierter Bewegung kein * automatischer Wechsel und kein Zoom, nur die Punkte zum Umschalten. */ export function Slideshow({ images, className = "" }: { images: readonly Media[]; className?: string }) { const slides = images.filter((m): m is ImageMedia => m.kind === "image"); const reduce = useReducedMotion(); const [index, setIndex] = useState(0); const [paused, setPaused] = useState(false); const [hovered, setHovered] = useState(false); const running = !reduce && !paused && !hovered && slides.length > 1; useEffect(() => { if (!running) return; const timer = window.setInterval(() => setIndex((i) => (i + 1) % slides.length), INTERVAL_MS); return () => window.clearInterval(timer); }, [running, slides.length]); if (slides.length === 0) return null; const current = slides[index]!; return (
setHovered(true)} onMouseLeave={() => setHovered(false)} onFocus={() => setHovered(true)} onBlur={() => setHovered(false)} >
{current.alt}
{current.alt}
{slides.map((slide, i) => ( ))} {!reduce && slides.length > 1 && ( )}
); }