/* Portada de libro (placeholder editorial + carga de /covers/{asin}.{ext} si existe) y BookCard. */ (function () { const { useState } = React; // Motivo decorativo por categoría dentro del placeholder function Motif({ icon, color }) { return ; } // Portada: intenta la imagen real; si no existe, placeholder con el título. // ↓ Pon COVERS_READY = true cuando las portadas estén en /public/covers/{ASIN}.{ext} const COVERS_READY = window.FUN_COVERS_READY === true; function Cover({ book, eager }) { const [ok, setOk] = useState(false); const [ratio, setRatio] = useState(null); // ancho/alto real de la portada const c = book.cat; return (
{/* Placeholder editorial */}
{book.category}
{book.title}
FUN · {book.asin}
{/* Imagen real (aparece sola al subirla a /public/covers) */} {COVERS_READY && ( {`${book.title} { setOk(true); setRatio(e.target.naturalWidth + " / " + e.target.naturalHeight); }} onError={(e) => { e.currentTarget.style.display = "none"; }} style={{ opacity: ok ? 1 : 0 }} className="cover-img" /> )}
); } function BookCard({ book, onOpen, eager }) { return (
onOpen(book)}>
{book.age_range} años {book.category}

{book.title}

{book.rating_value.toFixed(1).replace(".", ",")} · {book.rating_count} reseñas
Ver libro
); } window.Cover = Cover; window.BookCard = BookCard; })();