"use client"; import { useEffect } from "react"; import { motion, useAnimationControls, useReducedMotion } from "motion/react"; import { onCartLanded } from "@/components/cart-flight"; // Der Korb im Kopfzeilen-Symbol (20 px in einem 40-px-Knopf, viewBox 24): // seine Unterkante liegt bei y=15, die Mitte bei x=13.5. Dort bildet sich // der Tropfen — umgerechnet in Pixel des Knopfes. const DRIP_LEFT_PX = 10 + (13.5 / 24) * 20; const DRIP_TOP_PX = 10 + (15 / 24) * 20; const DRIP_WIDTH_PX = 6; const DRIP_DELAY_S = 0.3; /** * Nachspiel der Landung eines Honigtropfens (components/cart-flight.tsx): * Der Korb leuchtet zweimal warm in Honigfarbe auf, dann sammelt sich an * seiner Unterkante ein kleiner Tropfen, zieht sich lang und perlt nach * unten ab — als waere der Honig durch den Korb gesickert. * * Liegt als Overlay im Warenkorb-Knopf (relative) und faengt keine Klicks. * Das Leuchten ist eine deckungsgleiche, honigfarbene Kopie des Korbs (gleiche * Groesse, gleiche Strichstaerke, keine Fuellung), deren Deckkraft blinkt. * Das Symbol selbst bleibt unveraendert; nur seine Farbe wechselt kurz — im * hellen wie im dunklen Farbschema. Bei reduzierter Bewegung * bleibt nur ein einzelnes, ruhiges Aufleuchten ohne Tropfen. */ export function CartLandingEffect() { const glowControls = useAnimationControls(); const dripControls = useAnimationControls(); const reduceMotion = useReducedMotion(); useEffect( () => onCartLanded(() => { if (reduceMotion) { void glowControls.start({ opacity: [0, 0.9, 0], transition: { duration: 0.8, ease: "easeInOut" }, }); return; } void glowControls.start({ opacity: [0, 1, 0.35, 1, 0], transition: { duration: 0.75, ease: "easeInOut", times: [0, 0.2, 0.45, 0.65, 1] }, }); void dripControls.start({ // An der Kante sammeln, schwer werden und lang ziehen, // abloesen und nach unten perlen, verblassen. opacity: [0, 1, 1, 1, 0], scaleX: [0.3, 1, 0.85, 0.9, 0.7], scaleY: [0.2, 1, 1.35, 1, 0.8], y: [0, 0, 3, 13, 17], transition: { duration: 1.1, delay: DRIP_DELAY_S, ease: "easeIn", times: [0, 0.3, 0.55, 0.85, 1], }, }); }), [glowControls, dripControls, reduceMotion] ); return ( ); }