// components.jsx — Componentes compartidos para MiPC y su Mundo // (Header, Footer, ProductCard, ProductImage, Banners, Breadcrumbs, Rating, etc.) const { useState, useEffect, useRef, useMemo, useCallback } = React; // ── Iconos SVG (line, stroke-current) ──────────────────────────────── const Icon = { search: () => , cart: () => , user: () => , heart: () => , menu: () => , truck: () => , shield: () => , card: () => , headset: () => , chevron: ({d='right'}) => , star: ({filled}) => , close: () => , check: () => , trash: () => , filter: () => , }; // ── ProductImage (placeholder SVG por categoría + color) ───────────── function ProductImage({ p, size = 'card' }) { const big = size === 'big'; const sz = big ? 460 : 220; const bg = p.color || '#64748b'; const cat = p.categoria; // Glifo grande translúcido del icono de la categoría const cats = window.MiPCInventario.categorias.find(c => c.id === cat); return (
{cats?.icono || '📦'} {(p.marca || '').toUpperCase()}
); } // ── Rating estrellas ───────────────────────────────────────────────── function Rating({ value = 0, reviews, size = 14 }) { const full = Math.round(value); return ( {[1,2,3,4,5].map(i => ( ))} {reviews != null && ({reviews})} ); } // ── Badge ──────────────────────────────────────────────────────────── function Badge({ children, tone = 'default' }) { return {children}; } // ── ProductCard ────────────────────────────────────────────────────── function ProductCard({ p, onClick, onAdd }) { const fmt = window.MiPCInventario.formatoCOP; const desc = p.precioAntes && p.precioAntes > p.precio ? Math.round((1 - p.precio / p.precioAntes) * 100) : 0; return (
{desc > 0 && -{desc}%}
{p.marca}

{p.nombre}

{p.precioAntes && p.precioAntes > p.precio && ( {fmt(p.precioAntes)} )} {fmt(p.precio)}
{p.envioGratis &&
Envío gratis
}
); } // ── Header ─────────────────────────────────────────────────────────── function Header({ route, cartCount, onNavigate, onSearch, query, setQuery, showBanners }) { const cats = window.MiPCInventario.categorias; const [openMenu, setOpenMenu] = useState(false); const submit = (e) => { e.preventDefault(); onSearch(query); }; return (
{showBanners && (
🚚 Envío gratis en compras superiores a $150.000 COP · 📞 (601) 745 8800 · 💳 Hasta 36 cuotas con tu tarjeta de crédito
)}
{e.preventDefault(); onNavigate('/');}} href="#/"> Mi PC y su Mundo
setQuery(e.target.value)} aria-label="Buscar productos" />
); } // ── Footer ─────────────────────────────────────────────────────────── function Footer() { return ( ); } // ── Breadcrumbs ────────────────────────────────────────────────────── function Breadcrumbs({ items, onNavigate }) { return ( ); } // ── Hero / Carrusel principal ──────────────────────────────────────── function Hero({ onNavigate, variant = 'A' }) { const slidesA = [ { kicker:'TECNO DAYS', titulo:'Hasta 40% OFF', sub:'En los mejores portátiles para estudio y trabajo', cta:'Ver portátiles', to:'/categoria/computadores', bg:'#dc2626', accent:'#fbbf24' }, { kicker:'GAMING', titulo:'Arma tu setup', sub:'PS5, sillas, monitores 165Hz y más', cta:'Explorar gaming', to:'/categoria/gaming', bg:'#1e3a8a', accent:'#22c55e' }, { kicker:'NUEVO', titulo:'iPhone 15 ya llegó', sub:'Llévalo con 12 cuotas sin interés', cta:'Lo quiero', to:'/categoria/celulares', bg:'#0f172a', accent:'#f59e0b' }, ]; const [idx, setIdx] = useState(0); useEffect(() => { const t = setInterval(() => setIdx(i => (i + 1) % slidesA.length), 6000); return () => clearInterval(t); }, []); const s = slidesA[idx]; return (
{s.kicker}

{s.titulo}

{s.sub}

{slidesA.map((_,i) => (
); } // ── Strip de beneficios ────────────────────────────────────────────── function BenefitsStrip() { const items = [ { icon: , t:'Envío gratis', s:'A partir de $150.000' }, { icon: , t:'Compra protegida', s:'30 días para cambios' }, { icon: , t:'Hasta 36 cuotas', s:'Con tarjeta de crédito' }, { icon: , t:'Atención 24/7', s:'Chat, WhatsApp y línea' }, ]; return (
{items.map((it,i)=>(
{it.icon}
{it.t}{it.s}
))}
); } // ── Grid de categorías circulares ──────────────────────────────────── function CategoryCircles({ onNavigate }) { const cats = window.MiPCInventario.categorias; return (

Compra por categoría

{cats.map(c => ( ))}
); } Object.assign(window, { Icon, ProductImage, Rating, Badge, ProductCard, Header, Footer, Breadcrumbs, Hero, BenefitsStrip, CategoryCircles, });