// PDP.jsx — Product Detail Page const { useState: usePDPState } = React; const PDP = ({ params, onNav, onAdd, onFav, favs }) => { const p = CATALOG.find(x => x.id === params?.id) || CATALOG[0]; const [gallery, setGallery] = usePDPState(0); const [qty, setQty] = usePDPState(1); const [tab, setTab] = usePDPState("descripcion"); const { isMobile, isTablet } = useViewport(); const fav = favs.has(p.id); const gallerySrc = [p.img, p.img, p.img, p.img]; const related = CATALOG.filter(x => x.cat === p.cat && x.id !== p.id).slice(0, 4); return (
c.id === p.cat)?.label || "Productos", p.brand, p.name.slice(0, 32) + (p.name.length > 32 ? "…" : "")]} /> {/* main */}
{/* gallery */}
{gallerySrc.map((src, i) => ( ))}
{p.name} {p.discount && ( −{p.discount}% off )}
{/* info */}
{p.brand}

{p.name}

Lee {p.reviews?.toLocaleString("es-MX")} opiniones
{/* price block */}
${p.price.toLocaleString("es-MX")} MXN
{p.was && (
${p.was.toLocaleString("es-MX")} Ahorras ${(p.was - p.price).toLocaleString("es-MX")}
)}
en 12 MSI de ${Math.round(p.price / 12).toLocaleString("es-MX")} sin intereses
{/* shipping */}
Llega el viernes 5 de marzo a Puerto Vallarta · 48330. Cambiar Compra protegida. Devolución gratis hasta 30 días. Vendido por {p.brand} Store · ★ 4.8 · +2 años en Allen
{/* quantity + buttons */}
{qty}
{p.inStock || 12} disponibles
{/* tabs */}
{[ { id: "descripcion", label: "Descripción" }, { id: "specs", label: "Especificaciones" }, { id: "reseñas", label: `Reseñas (${p.reviews?.toLocaleString("es-MX") || 0})` }, { id: "preguntas", label: "Preguntas" }, ].map(t => ( ))}
{tab === "descripcion" && (

Diseñado para uso diario, este producto combina materiales premium con la facilidad de mantenimiento que esperas. Probado por Allen y avalado por su garantía oficial.

  • Garantía oficial Allen de 12 meses.
  • Envío con seguimiento en tiempo real.
  • Empaque seguro: tu producto llega listo para usarse.
  • Soporte 24/7 en español.
)} {tab === "specs" && ( {[ ["Marca", p.brand], ["Modelo", p.id.toUpperCase()], ["Categoría", CATEGORIES.find(c => c.id === p.cat)?.label || p.cat], ["Garantía", "12 meses"], ["Origen", "México"], ].map(([k, v]) => ( ))}
{k} {v}
)} {tab === "reseñas" && (
{p.rating.toFixed(1)}
{p.reviews?.toLocaleString("es-MX")} opiniones
{[5, 4, 3, 2, 1].map(s => (
{s}★
{s === 5 ? 605 : s === 4 ? 150 : 30}
))}
{[ { name: "María G.", date: "12 feb 2026", rating: 5, text: "Cumple totalmente lo prometido. Llegó antes de lo estimado y muy bien empacado." }, { name: "Carlos R.", date: "5 feb 2026", rating: 4, text: "Buena calidad por el precio. El único detalle es que la batería podría durar más, pero por lo demás recomendado." }, ].map(rv => (
{rv.name[0]}
{rv.name}
{rv.date}

{rv.text}

))}
)} {tab === "preguntas" && (

Aún no hay preguntas sobre este producto.

)}
{/* related */}
onNav("plp", { cat: p.cat })}> onNav("pdp", { id: x.id })} onAdd={onAdd} onFav={onFav} favs={favs} />
); }; const iconBtn = { width: 36, height: 36, borderRadius: 18, border: 0, background: "transparent", display: "grid", placeItems: "center", cursor: "pointer", color: "var(--fg-strong)", }; const Row = ({ icon, tint, children }) => { const colors = { success: { bg: "var(--success-bg)", fg: "var(--success)" }, primary: { bg: "var(--primary-soft)", fg: "var(--primary-press)" }, muted: { bg: "var(--bg-section)", fg: "var(--fg-muted)" }, }; const c = colors[tint] || colors.muted; return (
{children}
); }; window.PDP = PDP;