// tomugi-cover.jsx — reusable visual atoms function Logo({ size = 20 }) { const mark = Math.round(size * 1.2); return ( tomugi ); } // AniList serves the same cover at several sizes; swap to the small "medium" // variant for the hero wall so the landing stays light. function mediumCover(url) { return (url || "").replace("/cover/large/", "/cover/medium/").replace("/cover/extraLarge/", "/cover/medium/"); } function Cover({ s, idx = 0, size = "md", showTexture = true, generic = false, onClick, title }) { // Real AniList cover art when available (unless `generic` forces the colored // book). Use the lighter "medium" thumbnail everywhere — covers display at // <=240px, so medium is sharp and ~3.5x lighter than the large variant. if (!generic && s && s.coverImage) { const src = mediumCover(s.coverImage); return (
{size
); } const stripe = showTexture ? `repeating-linear-gradient(${135 + (idx % 4) * 12}deg, rgba(255,255,255,0.035) 0 2px, transparent 2px 9px)` : "none"; return (
{s.genre}
); } Object.assign(window, { Logo, Cover });