From 7d27b527e2017303584586e12f36474b1f483a55 Mon Sep 17 00:00:00 2001 From: Cristian Felipe Cruz Buitron Date: Fri, 28 Aug 2026 17:37:42 +0000 Subject: [PATCH] feat(ecommerce): ADR 0008 sub-fase 4 - hero carrusel azul con dots Reemplaza hero-bento.tsx (grid estatico de 3 tarjetas en fucsia/rosa/ rojo/violeta del esquema arcoiris original, nunca migrado -- sub-fase 4 del ADR 0008 pendiente) por hero-carousel.tsx: un slide a la vez sobre fondo azul de marca (--color-ari-marino) para los tres mensajes promocionales existentes, con dots de paginacion clicables abajo (patron pedido explicitamente por el usuario) y autoplay cada 6s (respeta prefers-reduced-motion). Actualiza app/page.tsx para usar el componente nuevo y elimina hero-bento.tsx. --- workloads/ecommerce/app/page.tsx | 4 +- .../ecommerce/components/home/hero-bento.tsx | 42 ------- .../components/home/hero-carousel.tsx | 113 ++++++++++++++++++ 3 files changed, 115 insertions(+), 44 deletions(-) delete mode 100644 workloads/ecommerce/components/home/hero-bento.tsx create mode 100644 workloads/ecommerce/components/home/hero-carousel.tsx diff --git a/workloads/ecommerce/app/page.tsx b/workloads/ecommerce/app/page.tsx index 0e91d18..753ae5a 100644 --- a/workloads/ecommerce/app/page.tsx +++ b/workloads/ecommerce/app/page.tsx @@ -1,7 +1,7 @@ import Link from "next/link"; import { ArrowRight } from "lucide-react"; import { CategoryTiles } from "@/components/home/category-tiles"; -import { HeroBento } from "@/components/home/hero-bento"; +import { HeroCarousel } from "@/components/home/hero-carousel"; import { TrustBar } from "@/components/home/trust-bar"; import { ProductCarousel } from "@/components/product/product-carousel"; import { Button } from "@/components/ui/button"; @@ -17,5 +17,5 @@ export const dynamic = "force-dynamic"; export default async function HomePage() { const [products, categories] = await Promise.all([getProducts(), getCategories()]); const treasures = products.filter((product) => product.isNew || product.featured).slice(0, 8); - return <>
Novedades

Tesoros recién llegados

Desliza y encuentra nuevos favoritos.

Club ARI

Promociones, lanzamientos y mucha diversión.

Únete a nuestra comunidad y recibe primero las novedades del catálogo.

; + return <>
Novedades

Tesoros recién llegados

Desliza y encuentra nuevos favoritos.

Club ARI

Promociones, lanzamientos y mucha diversión.

Únete a nuestra comunidad y recibe primero las novedades del catálogo.

; } diff --git a/workloads/ecommerce/components/home/hero-bento.tsx b/workloads/ecommerce/components/home/hero-bento.tsx deleted file mode 100644 index 77c5b6c..0000000 --- a/workloads/ecommerce/components/home/hero-bento.tsx +++ /dev/null @@ -1,42 +0,0 @@ -"use client"; - -import Image from "next/image"; -import Link from "next/link"; -import { ArrowRight, BadgePercent, Sparkles } from "lucide-react"; -import { motion, useReducedMotion } from "motion/react"; -import { Button } from "@/components/ui/button"; - -export function HeroBento() { - const reduceMotion = useReducedMotion(); - const initial = reduceMotion ? false : { opacity: 0, y: 20 }; - - return ( -
-
- -
-
Celebración ARI
-

Hasta50% OFFen tesoros seleccionados

-

Personajes, mochilas y regalos que convierten cualquier día en una celebración.

- -
-
- Promoción principal de Ari Shopping -
-
- -
- -
Héroes favoritos

Acción y aventura

-
Colección Marvel
-
- - -
Novedad

Tesoros para regalar

-
Personajes y peluches
-
-
-
-
- ); -} diff --git a/workloads/ecommerce/components/home/hero-carousel.tsx b/workloads/ecommerce/components/home/hero-carousel.tsx new file mode 100644 index 0000000..7380a39 --- /dev/null +++ b/workloads/ecommerce/components/home/hero-carousel.tsx @@ -0,0 +1,113 @@ +"use client"; + +import Image from "next/image"; +import Link from "next/link"; +import { ArrowRight, BadgePercent, Sparkles } from "lucide-react"; +import { AnimatePresence, motion, useReducedMotion } from "motion/react"; +import { useEffect, useState } from "react"; +import { Button } from "@/components/ui/button"; + +// ADR 0008 sub-fase 4: hero azul con dots de paginacion (carrusel), en vez +// del bento estatico de 3 tarjetas en fucsia/rojo/violeta del esquema +// arcoiris original. Un slide a la vez, fondo azul de marca en los tres, +// para leerse como una sola pieza de marca en vez de 3 bloques de colores +// distintos. +const slides = [ + { + id: "celebracion", + badge: "Celebración ARI", + icon: Sparkles, + title: "Hasta 50% OFF", + subtitle: "en tesoros seleccionados", + description: "Personajes, mochilas y regalos que convierten cualquier día en una celebración.", + href: "/catalog", + image: "/images/promo/hero-vibrant.webp", + imageAlt: "Promoción principal de Ari Shopping", + }, + { + id: "marvel", + badge: "Héroes favoritos", + icon: BadgePercent, + title: "Acción y aventura", + subtitle: "colección Marvel", + description: "Figuras, mochilas y sets listos para la próxima misión.", + href: "/catalog?collection=Marvel", + image: "/images/promo/promo-marvel.webp", + imageAlt: "Colección Marvel", + }, + { + id: "regalos", + badge: "Novedad", + icon: Sparkles, + title: "Tesoros para regalar", + subtitle: "", + description: "Personajes y peluches para sorprender en cualquier ocasión.", + href: "/catalog", + image: "/images/promo/promo-characters.webp", + imageAlt: "Personajes y peluches", + }, +]; + +const AUTOPLAY_MS = 6000; + +export function HeroCarousel() { + const reduceMotion = useReducedMotion(); + const [index, setIndex] = useState(0); + + useEffect(() => { + if (reduceMotion) return; + const timer = setInterval(() => setIndex((current) => (current + 1) % slides.length), AUTOPLAY_MS); + return () => clearInterval(timer); + }, [reduceMotion]); + + const slide = slides[index]; + const Icon = slide.icon; + + return ( +
+
+ + +
+
+ + {slide.badge} +
+

{slide.title}

+ {slide.subtitle &&

{slide.subtitle}

} +

{slide.description}

+ +
+
+ {slide.imageAlt} +
+
+
+ +
+ {slides.map((item, itemIndex) => ( +
+
+
+ ); +}