From 1c9693e573bf727496bee70bff8d68f9495e77b0 Mon Sep 17 00:00:00 2001 From: Cristian Felipe Cruz Buitron Date: Mon, 14 Sep 2026 00:29:28 +0000 Subject: [PATCH] =?UTF-8?q?fix(ecommerce):=20overflow=20horizontal=20en=20?= =?UTF-8?q?mobile=20hac=C3=ADa=20ver=20todo=20"a=20tama=C3=B1o=20real"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Root cause real del bug reportado por el usuario (imagen de producto viéndose gigante/cortada en Chrome y Edge Android) -- no era la imagen: al mover "También te puede gustar" DENTRO del grid de la página (para el layout de 2 filas del commit anterior), su carrusel horizontal (overflow-x-auto interno, sin flex-wrap) empezó a contar como item de ese grid. Sin min-w-0, el ancho mínimo intrínseco de TODAS las cards del carrusel sin wrappear se usa para dimensionar la columna compartida del grid -- en mobile (grid de una sola columna), eso empujaba TODO (imagen, título, specs) a ~800px de ancho en un viewport real de ~380px. El navegador termina "zoomeando" el layout para que entre, dando la sensación de que todo se ve a tamaño real / cortado. Confirmado en vivo con bisección real: sin el fix, el grid medía 783px en un viewport de 380px; agregando min-w-0 al contenedor del carrusel vuelve a 380px. Se agrega min-w-0 también a los otros 3 contenedores del grid (galería, info, buy-box) y a la tira de miniaturas dentro de ProductGallery (mismo patrón de overflow-x-auto) como defensa preventiva -- práctica estándar para items de grid/flex con scroll horizontal interno. Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_012Y4df3Z7odr9Cg8F2nw6uV --- workloads/ecommerce/app/product/[slug]/page.tsx | 14 +++++++++++--- .../components/product/product-gallery.tsx | 9 ++++++++- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/workloads/ecommerce/app/product/[slug]/page.tsx b/workloads/ecommerce/app/product/[slug]/page.tsx index 0e418db..2c15726 100644 --- a/workloads/ecommerce/app/product/[slug]/page.tsx +++ b/workloads/ecommerce/app/product/[slug]/page.tsx @@ -52,7 +52,7 @@ export default async function ProductPage({ params }: ProductPageProps) { esperar a que termine la columna más alta antes de aparecer. */}
-
+
{product.category} · {product.collection}

{product.name}

{product.description}

@@ -79,7 +79,7 @@ export default async function ProductPage({ params }: ProductPageProps) { scrollea. Los sugeridos (hasta 2) usan el mismo cálculo de "recommended" que ya alimenta el carrusel de abajo -- mismo criterio real (categoría/colección), no un dato inventado. */} -
+
@@ -92,8 +92,16 @@ export default async function ProductPage({ params }: ProductPageProps) {
)}
+ {/* min-w-0 es necesario: sin esto, el carrusel horizontal + (overflow-x-auto interno) contaba como item de este grid, y su + ancho minimo intrinseco (la suma de TODAS las cards sin + wrappear, ya que el scroller no tiene flex-wrap) empujaba todo + el grid completo a ~800px en mobile -- afectaba a TODA la + columna compartida (imagen, titulo, specs), no solo al + carrusel. Confirmado en vivo: sin min-w-0 el grid medía 783px + en un viewport real de 380px; con min-w-0 vuelve a 380px. */} {recommended.length > 0 && ( -
+

También te puede gustar

diff --git a/workloads/ecommerce/components/product/product-gallery.tsx b/workloads/ecommerce/components/product/product-gallery.tsx index 621cc1d..665e68a 100644 --- a/workloads/ecommerce/components/product/product-gallery.tsx +++ b/workloads/ecommerce/components/product/product-gallery.tsx @@ -109,7 +109,14 @@ export function ProductGallery({ images, name }: { images: string[]; name: strin }; return ( -
+
+ {/* min-w-0: esta tira de miniaturas es un overflow-x-auto (scroll + horizontal) igual que el carrusel de "También te puede gustar" + en app/product/[slug]/page.tsx -- mismo bug si este componente + termina como item de un grid externo sin min-w-0: para productos + con muchas fotos, el ancho minimo intrinseco de TODAS las + miniaturas sin wrappear puede forzar overflow horizontal en toda + la pagina en mobile. */}
{images.map((image) => )}