"use client"; import { AnimatePresence, LazyMotion, domAnimation, m } from "motion/react"; import { useEffect, useState } from "react"; import { BookButton, useBooking } from "./BookingProvider"; /** * Buchungsleiste fuer kleine Bildschirme. Erscheint erst, wenn der Hero * verlassen ist, und verschwindet im Preisbereich und am Seitenende, damit * sie dort keine Inhalte oder Bedienelemente verdeckt. */ export function MobileBookingBar({ priceLabel }: { priceLabel: string }) { const { pricing } = useBooking(); const [heroVisible, setHeroVisible] = useState(true); const [blocked, setBlocked] = useState(false); useEffect(() => { const hero = document.getElementById("top"); const blockers = ["preis", "site-footer"].map((id) => document.getElementById(id)).filter(Boolean) as HTMLElement[]; const visible = new Set(); const heroObserver = new IntersectionObserver(([entry]) => setHeroVisible(entry?.isIntersecting ?? false)); const blockObserver = new IntersectionObserver((entries) => { for (const entry of entries) { if (entry.isIntersecting) visible.add(entry.target.id); else visible.delete(entry.target.id); } setBlocked(visible.size > 0); }); if (hero) heroObserver.observe(hero); blockers.forEach((b) => blockObserver.observe(b)); return () => { heroObserver.disconnect(); blockObserver.disconnect(); }; }, []); const show = !heroVisible && !blocked; return ( {show && (

Modelcamp 2027 {priceLabel}

{pricing.checkoutOpen ? ( Platz sichern ) : ( Zum Preis )}
)}
); }