From 9d4553f3a4d86c8c60b57569deea18f96d6a3458 Mon Sep 17 00:00:00 2001 From: Cristian Felipe Cruz Buitron Date: Sun, 13 Sep 2026 20:34:42 +0000 Subject: [PATCH] =?UTF-8?q?fix(ecommerce):=20panel=20de=20zoom=20din=C3=A1?= =?UTF-8?q?mico=20y=20CTA=20m=C3=B3vil=20con=20revelado=20progresivo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - El panel de zoom lateral ahora calcula tamaño/posición contra el viewport real (window.innerWidth/innerHeight) en cada mousemove, en vez de un breakpoint fijo (lg:block) con ancho fijo -- a resoluciones altas con poco espacio a la derecha de la imagen terminaba saliéndose de la pantalla. Si no entra un panel de al menos PANEL_MIN_SIZE, se cae automáticamente al overlay in-place (antes atado a "por debajo de lg", ahora a "no hay espacio real"). - La barra fija de "Añadir al carrito" en mobile quedaba fija desde el primer render, tapando permanentemente parte de la imagen del producto. Ahora el botón real (ProductPurchase) también se muestra en mobile, y la barra sticky solo aparece cuando ese botón sale del viewport (IntersectionObserver) -- mismo patrón que el "Buy Now" sticky de Amazon. Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_012Y4df3Z7odr9Cg8F2nw6uV --- .../components/product/mobile-add-to-cart.tsx | 28 ++++++++- .../components/product/product-gallery.tsx | 61 +++++++++++++++---- .../components/product/product-purchase.tsx | 10 ++- 3 files changed, 84 insertions(+), 15 deletions(-) diff --git a/workloads/ecommerce/components/product/mobile-add-to-cart.tsx b/workloads/ecommerce/components/product/mobile-add-to-cart.tsx index 22bb946..c81421e 100644 --- a/workloads/ecommerce/components/product/mobile-add-to-cart.tsx +++ b/workloads/ecommerce/components/product/mobile-add-to-cart.tsx @@ -1,15 +1,41 @@ "use client"; +import { useEffect, useState } from "react"; import { ShoppingBag } from "lucide-react"; import { Button } from "@/components/ui/button"; import type { Product } from "@/lib/headless/types"; import { useCartStore } from "@/store/cart-store"; +// Antes esta barra quedaba fija desde el primer render en mobile, +// tapando permanentemente parte de la imagen del producto solo para +// duplicar un boton que ya está visible más abajo. Ahora se muestra +// recien cuando el boton real (#product-buy-button en ProductPurchase, +// visible tambien en mobile) sale del viewport -- mismo patron que el +// "Buy Now" sticky de Amazon, que solo aparece al scrollear mas alla +// del boton real. export function MobileAddToCart({ product }: { product: Product }) { const addItem = useCartStore((state) => state.addItem); + const [visible, setVisible] = useState(false); const outOfStock = product.variants[0]?.available === false; + + useEffect(() => { + const target = document.getElementById("product-buy-button"); + if (!target) return; + const observer = new IntersectionObserver((entries) => { + const entry = entries[0]; + if (entry) setVisible(!entry.isIntersecting); + }, { threshold: 0 }); + observer.observe(target); + return () => observer.disconnect(); + }, []); + return ( -
+