"use client"; import Image from "next/image"; import Link from "next/link"; import { ChevronLeft, ChevronRight } from "lucide-react"; import { useRef, useState } from "react"; // Galería deslizable de la tarjeta de producto: permite ver todas las // imágenes desde el listado sin entrar al producto. En móvil se desliza // con el dedo (scroll-snap nativo); en escritorio aparecen flechas al // pasar el mouse. Cada imagen sigue siendo un link a la ficha. export function ProductCardGallery({ images, name, href, priority = false, }: { images: string[]; name: string; href: string; priority?: boolean; }) { const scroller = useRef(null); const [index, setIndex] = useState(0); const total = images.length; const goTo = (target: number) => { const node = scroller.current; if (!node) return; const next = Math.max(0, Math.min(total - 1, target)); node.scrollTo({ left: next * node.clientWidth, behavior: "smooth" }); }; const onScroll = () => { const node = scroller.current; if (!node || node.clientWidth === 0) return; setIndex(Math.round(node.scrollLeft / node.clientWidth)); }; return ( <>
1 ? onScroll : undefined} className="flex h-full snap-x snap-mandatory overflow-x-auto [overscroll-behavior-x:contain] [scrollbar-width:none] [&::-webkit-scrollbar]:hidden" > {images.map((src, slide) => ( 1 ? `${name}, imagen ${slide + 1} de ${total}` : name} tabIndex={slide === 0 ? 0 : -1} > {/* object-contain (no object-cover): las fotos secundarias del catálogo no son cuadradas (verticales tipo 933x1500 u horizontales) y cover les cortaba cabeza, pies o bordes -- reportado en vivo con Tristeza y Buzz. Mismo criterio que product-gallery.tsx; el letterbox queda del bg-white de la tarjeta. */} {/* unoptimized desde la 2da imagen: pasar todas por el optimizador de Next multiplica el trabajo de sharp dentro del pod (~58 imagenes en el catalogo vs. 18 antes) -- una carga en rafaga de todas las galerias dejo un pod de prod OOMKilled (limite 768Mi) el 2026-09-27. Los originales de media.cruzcloud.net pesan ~165 KB promedio y son lazy: solo se bajan al deslizar. La 1ra sigue optimizada como antes. */} {slide 0} priority={priority && slide === 0} sizes="(max-width: 640px) 82vw, (max-width: 1024px) 44vw, 280px" className="object-contain transition duration-500 group-hover:scale-[1.035]" /> ))}
{total > 1 && ( <>
{images.map((src, dot) => ( ))}
)} ); }