diff --git a/workloads/ecommerce/app/product/[slug]/page.tsx b/workloads/ecommerce/app/product/[slug]/page.tsx
index 1214b4d..1cd8827 100644
--- a/workloads/ecommerce/app/product/[slug]/page.tsx
+++ b/workloads/ecommerce/app/product/[slug]/page.tsx
@@ -34,7 +34,13 @@ export default async function ProductPage({ params }: ProductPageProps) {
if (!product) notFound();
const products = await getProducts();
const recommended = products.filter((candidate) => candidate.id !== product.id && (candidate.category === product.category || candidate.collection === product.collection)).slice(0, 8);
- const suggestions = recommended.slice(0, 2);
+ // Categoría distinta a propósito -- antes repetía los primeros 2 del
+ // mismo "recommended" que ya alimenta el carrusel de abajo (mismos
+ // productos en dos lugares de la página, reportado por el usuario).
+ // Un cross-sell real de otra categoría aporta algo que el carrusel no
+ // muestra, en vez de duplicarlo.
+ const crossCategory = products.filter((candidate) => candidate.id !== product.id && candidate.category !== product.category);
+ const crossSell = crossCategory.find((candidate) => candidate.available) ?? crossCategory[0];
return (
<>
@@ -55,7 +61,7 @@ export default async function ProductPage({ params }: ProductPageProps) {
{product.category} · {product.collection}
{product.name}
-
{product.description}
+
{product.description}
{/* Antes escondido detrás de un click en el acordeón --
siempre visible, estilo Amazon, con los mismos datos
reales que ya existían (marca/edad/categoría/colección),
@@ -76,19 +82,19 @@ export default async function ProductPage({ params }: ProductPageProps) {
{/* Buy box estilo Amazon: precio/variantes/carrito en su propia
tarjeta, sticky desde xl mientras el resto de la pagina
- 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. */}
+ scrollea. El cross-sell es de OTRA categoría a propósito --
+ evita repetir lo que ya muestra el carrusel de "También te
+ puede gustar" de abajo (mismo criterio de categoría/colección
+ que ese carrusel), aportando un producto genuinamente distinto
+ en vez de duplicado. */}
- {suggestions.length > 0 && (
+ {crossSell && (
También te puede interesar
-
- {suggestions.map((item) =>
)}
-
+
)}
diff --git a/workloads/ecommerce/components/product/product-gallery.tsx b/workloads/ecommerce/components/product/product-gallery.tsx
index 97883bc..97c1189 100644
--- a/workloads/ecommerce/components/product/product-gallery.tsx
+++ b/workloads/ecommerce/components/product/product-gallery.tsx
@@ -147,13 +147,18 @@ export function ProductGallery({ images, name }: { images: string[]; name: strin
(ambos Chromium) y en Chromium headless. unoptimized deja
un solo recurso real por foto -- sin candidatos entre los
que el bug pueda elegir mal. */}
+ {/* object-contain (no object-cover): mismo motivo que las
+ miniaturas -- fotos verticales (933x1500 confirmado en
+ este catalogo) perdian la cabeza al forzar el cuadrado.
+ Reportado en vivo: al seleccionar esa foto, Buzz aparecia
+ sin cabeza en la imagen principal. */}
{/* Lupa: recuadro que marca la region ampliada -- solo cuando
hay lugar real para el panel de al lado (showPanel,