{"id":49,"date":"2026-08-13T06:21:55","date_gmt":"2026-08-13T06:21:55","guid":{"rendered":"https:\/\/bibliotea.com\/?page_id=49"},"modified":"2026-08-13T18:19:49","modified_gmt":"2026-08-13T18:19:49","slug":"49-2","status":"publish","type":"page","link":"https:\/\/bibliotea.com\/?page_id=49","title":{"rendered":"Mis Comics"},"content":{"rendered":"\n<div class=\"bt-miscomics\">\n  <div class=\"bt-mc-inner\">\n    <h1>Mis c\u00f3mics<\/h1>\n    <p class=\"bt-mc-intro\">Busca c\u00f3mics y novelas gr\u00e1ficas y punt\u00faalos. Se guardan aparte de tus libros.<\/p>\n    <div class=\"bt-mc-search\">\n      <input id=\"mcq\" type=\"text\" placeholder=\"Ej.: Watchmen, Maus, Sandman, Ast\u00e9rix...\">\n      <button class=\"bt-btn\" id=\"mcSearchBtn\">Buscar<\/button>\n    <\/div>\n    <div class=\"bt-mc-source\" id=\"mcSource\"><\/div>\n    <div class=\"bt-mc-results\" id=\"mcResults\"><\/div>\n    <p class=\"bt-mc-hint\" id=\"mcHint\">Escribe algo y pulsa Buscar para encontrar c\u00f3mics.<\/p>\n    <div class=\"bt-mc-listhead\">\n      <h2>Tus c\u00f3mics valorados<\/h2>\n      <div class=\"bt-mc-summary\" id=\"mcSummary\"><\/div>\n    <\/div>\n    <div class=\"bt-ml-filters\" id=\"mcFilters\">\n      <input id=\"mcfq\" type=\"text\" placeholder=\"Buscar en tus c\u00f3mics...\">\n      <select id=\"mcsort\">\n        <option value=\"date\">M\u00e1s recientes<\/option>\n        <option value=\"rating\">Mejor valorados<\/option>\n        <option value=\"title\">T\u00edtulo (A-Z)<\/option>\n        <option value=\"author\">Autor (A-Z)<\/option>\n      <\/select>\n      <select id=\"mcmin\">\n        <option value=\"0\">Todas las notas<\/option>\n        <option value=\"5\">Solo 5 estrellas<\/option>\n        <option value=\"4\">4 o m\u00e1s<\/option>\n        <option value=\"3\">3 o m\u00e1s<\/option>\n      <\/select>\n    <\/div>\n    <div class=\"bt-ml-grid\" id=\"mcGrid\"><\/div>\n  <\/div>\n  <div class=\"bt-ml-overlay\" id=\"mcOverlay\">\n    <div class=\"bt-ml-modal\">\n      <div class=\"bt-mc-modhead\">\n        <img id=\"mcmCover\" alt=\"\">\n        <div style=\"min-width:0\">\n          <h2 id=\"mcmTitle\"><\/h2>\n          <div class=\"bt-ml-who\" id=\"mcmWho\"><\/div>\n          <div class=\"bt-ml-stars\" id=\"mcmStars\"><\/div>\n        <\/div>\n      <\/div>\n      <label for=\"mcmOpinion\">Tu opini\u00f3n<\/label>\n      <textarea id=\"mcmOpinion\" placeholder=\"Escribe tu rese\u00f1a...\"><\/textarea>\n      <div class=\"bt-ml-actions\">\n        <button class=\"bt-btn ghost\" id=\"mcmCancel\">Cancelar<\/button>\n        <button class=\"bt-btn\" id=\"mcmSave\">Guardar valoraci\u00f3n<\/button>\n      <\/div>\n    <\/div>\n  <\/div>\n<\/div>\n<style>\n.bt-miscomics{position:relative;left:50%;right:50%;width:100vw!important;max-width:100vw!important;margin-left:-50vw!important;margin-right:-50vw!important;box-sizing:border-box;background:#f5efe4;color:#2b2118;font-family:\"Iowan Old Style\",\"Palatino Linotype\",Georgia,serif;padding:2.5rem 1.2rem}\n.bt-mc-inner{max-width:1100px;margin:0 auto}\n.bt-mc-inner h1{font-size:1.9rem;margin:0 0 .2rem}\n.bt-mc-intro{color:#7a6a58;margin:0 0 1rem}\n.bt-mc-search{display:flex;gap:.6rem;flex-wrap:wrap;margin-bottom:.6rem}\n.bt-mc-search input{flex:1;min-width:220px;padding:.7rem .9rem;border:1px solid #e4d8c5;border-radius:12px;font-family:inherit;font-size:1rem;background:#fffdf8;color:#2b2118}\n.bt-mc-source{color:#7a6a58;font-size:.82rem;margin-bottom:.6rem}\n.bt-mc-results{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:1rem}\n.bt-mc-card{display:flex;gap:.8rem;background:#fffdf8;border:1px solid #e4d8c5;border-radius:14px;padding:.8rem;box-shadow:0 10px 30px rgba(60,40,20,.10)}\n.bt-mc-card .th{width:64px;min-width:64px;height:96px;border-radius:6px;object-fit:cover;background:#8a5a3a}\n.bt-mc-card .mt{display:flex;flex-direction:column;min-width:0}\n.bt-mc-card .mt h3{font-size:1rem;margin:0 0 .15rem}\n.bt-mc-card .mt .au{color:#7a6a58;font-size:.85rem}\n.bt-mc-card .mt .yr{color:#7a6a58;font-size:.78rem;margin-bottom:auto}\n.bt-mc-hint{color:#7a6a58;font-style:italic;text-align:center;padding:1.4rem}\n.bt-mc-listhead{display:flex;align-items:baseline;justify-content:space-between;gap:1rem;flex-wrap:wrap;margin:2rem 0 .6rem}\n.bt-mc-listhead h2{font-size:1.4rem;margin:0}\n.bt-mc-summary{color:#7a6a58;font-size:.95rem}\n.bt-ml-filters{display:flex;gap:.6rem;flex-wrap:wrap;margin-bottom:1.2rem}\n.bt-ml-filters input,.bt-ml-filters select{padding:.6rem .8rem;border:1px solid #e4d8c5;border-radius:10px;font-family:inherit;font-size:.95rem;background:#fffdf8;color:#2b2118}\n.bt-ml-filters input{flex:1;min-width:200px}\n.bt-ml-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:1.1rem}\n.bt-ml-card{background:#fffdf8;border:1px solid #e4d8c5;border-radius:16px;box-shadow:0 10px 30px rgba(60,40,20,.10);padding:1rem;display:flex;flex-direction:column;gap:.5rem}\n.bt-ml-top{display:flex;gap:.8rem}\n.bt-ml-cover{width:60px;min-width:60px;height:90px;border-radius:6px;overflow:hidden;background:#8a5a3a}\n.bt-ml-cover img{width:100%;height:100%;object-fit:cover;display:block}\n.bt-ml-meta{min-width:0}\n.bt-ml-meta h3{font-size:1.02rem;margin:0 0 .15rem}\n.bt-ml-auth{color:#7a6a58;font-size:.85rem;margin-bottom:.2rem}\n.bt-stars{display:inline-flex;gap:.1rem;font-size:1.05rem;line-height:1}\n.bt-stars .st{color:#e4d8c5}\n.bt-stars .st.on{color:#e0a12b}\n.bt-stars.sm{font-size:.95rem}\n.bt-ml-op{font-size:.92rem;border-top:1px dashed #e4d8c5;padding-top:.5rem;white-space:pre-wrap}\n.bt-ml-foot{display:flex;justify-content:space-between;align-items:center;gap:.5rem}\n.bt-ml-date{color:#7a6a58;font-size:.78rem}\n.bt-link{background:none;border:none;color:#9c3d2e;font-weight:600;font-size:.82rem;cursor:pointer;padding:.2rem .3rem}\n.bt-ml-empty{color:#7a6a58;font-style:italic;text-align:center;padding:1.5rem;grid-column:1 \/ -1}\n.bt-btn{border:none;background:#9c3d2e;color:#fff;padding:.7rem 1.3rem;border-radius:12px;font-weight:600;font-size:1rem;cursor:pointer;font-family:inherit}\n.bt-btn.ghost{background:transparent;color:#9c3d2e;border:1px solid #9c3d2e}\n.bt-btn.sm{padding:.45rem .85rem;font-size:.85rem}\n.bt-ml-overlay{position:fixed;inset:0;background:rgba(20,12,6,.55);display:none;align-items:center;justify-content:center;z-index:99999;padding:1rem}\n.bt-ml-overlay.show{display:flex}\n.bt-ml-modal{background:#fffdf8;color:#2b2118;border-radius:16px;max-width:520px;width:100%;padding:1.6rem;box-shadow:0 20px 50px rgba(0,0,0,.35);font-family:inherit}\n.bt-mc-modhead{display:flex;gap:1rem;margin-bottom:.6rem}\n.bt-mc-modhead img{width:80px;height:120px;border-radius:8px;object-fit:cover;background:#8a5a3a}\n.bt-ml-modal h2{margin:0 0 .2rem}\n.bt-ml-who{color:#7a6a58;margin-bottom:.4rem}\n.bt-ml-stars{display:flex;gap:.15rem;font-size:1.6rem}\n.bt-ml-stars .st{background:none;border:none;cursor:pointer;color:#e4d8c5;font-size:inherit;padding:0}\n.bt-ml-stars .st.on{color:#e0a12b}\n.bt-ml-modal label{display:block;font-weight:600;margin:.6rem 0 .35rem}\n.bt-ml-modal textarea{width:100%;min-height:110px;padding:.75rem;border:1px solid #e4d8c5;border-radius:10px;font-family:inherit;font-size:1rem;background:#f5efe4;color:#2b2118;resize:vertical}\n.bt-ml-actions{display:flex;gap:.6rem;justify-content:flex-end;margin-top:1.2rem}\n<\/style>\n<script>\n(function(){\n  var LS = 'biblio.reviews.v1';\n  var AMP = String.fromCharCode(38);\n  function load(){ try{ return JSON.parse(localStorage.getItem(LS)) || []; }catch(e){ return []; } }\n  function save(arr){ localStorage.setItem(LS, JSON.stringify(arr)); }\n  var reviews = load();\n  var editingId = null, currentRating = 0, currentBook = null;\n  var mcq = document.getElementById('mcq');\n  var mcResults = document.getElementById('mcResults');\n  var mcSource = document.getElementById('mcSource');\n  var mcHint = document.getElementById('mcHint');\n  var grid = document.getElementById('mcGrid');\n  var summary = document.getElementById('mcSummary');\n  var filters = document.getElementById('mcFilters');\n  var fq = document.getElementById('mcfq');\n  var sortSel = document.getElementById('mcsort');\n  var minSel = document.getElementById('mcmin');\n  function comics(){ return reviews.filter(function(r){ return r.kind === 'comic'; }); }\n  function starsRow(rating, extra){\n    var wrap = document.createElement('span'); wrap.className = 'bt-stars' + (extra ? ' ' + extra : '');\n    for(var i = 1; i <= 5; i++){ var s = document.createElement('span'); s.textContent = '\u2605'; s.className = 'st' + (i <= rating ? ' on' : ''); wrap.appendChild(s); }\n    return wrap;\n  }\n  function fmtDate(ts){ try{ return new Date(ts).toLocaleDateString('es-ES', {day:'numeric', month:'short', year:'numeric'}); }catch(e){ return ''; } }\n  function normGB(it){\n    var v = it.volumeInfo || {}; var il = v.imageLinks || {};\n    var cover = (il.thumbnail || il.smallThumbnail || '').replace('http:\/\/', 'https:\/\/');\n    return { title: v.title || 'Sin titulo', authors: (v.authors || ['Autor desconocido']).join(', '), year: (v.publishedDate || '').slice(0, 4), cover: cover };\n  }\n  function normOL(doc){\n    var cover = '';\n    if(doc.cover_i){ cover = 'https:\/\/covers.openlibrary.org\/b\/id\/' + doc.cover_i + '-M.jpg'; }\n    else if(doc.isbn){ if(doc.isbn[0]){ cover = 'https:\/\/covers.openlibrary.org\/b\/isbn\/' + doc.isbn[0] + '-M.jpg'; } }\n    return { title: doc.title || 'Sin titulo', authors: (doc.author_name || ['Autor desconocido']).join(', '), year: doc.first_publish_year ? String(doc.first_publish_year) : '', cover: cover };\n  }\n  async function gbSearch(query){\n    var url = 'https:\/\/www.googleapis.com\/books\/v1\/volumes?q=' + encodeURIComponent(query + ' subject:comics') + AMP + 'maxResults=15' + AMP + 'country=ES';\n    var r = await fetch(url);\n    if(!r.ok){ throw new Error('gb'); }\n    var d = await r.json();\n    return (d.items || []).map(normGB);\n  }\n  async function olSearch(query){\n    var url = 'https:\/\/openlibrary.org\/search.json?q=' + encodeURIComponent(query + ' subject:comics') + AMP + 'limit=15' + AMP + 'fields=title,author_name,first_publish_year,cover_i,isbn';\n    var r = await fetch(url);\n    if(!r.ok){ throw new Error('ol'); }\n    var d = await r.json();\n    return (d.docs || []).map(normOL);\n  }\n  async function search(query){\n    var gErr = false;\n    try{ var g = await gbSearch(query); if(g.length){ return { books: g, source: 'Google Books' }; } }catch(e){ gErr = true; }\n    try{ var o = await olSearch(query); if(o.length){ return { books: o, source: gErr ? 'Open Library (Google no disponible)' : 'Open Library' }; } }\n    catch(e2){ if(gErr){ throw new Error('Google Books no disponible ahora. Intentalo en un momento.'); } throw e2; }\n    return { books: [], source: '' };\n  }\n  function resultCard(bk){\n    var c = document.createElement('div'); c.className = 'bt-mc-card';\n    if(bk.cover){ var im = document.createElement('img'); im.className = 'th'; im.src = bk.cover; im.alt = ''; c.appendChild(im); }\n    else { var ph = document.createElement('div'); ph.className = 'th'; c.appendChild(ph); }\n    var mt = document.createElement('div'); mt.className = 'mt';\n    var h = document.createElement('h3'); h.textContent = bk.title; mt.appendChild(h);\n    var au = document.createElement('div'); au.className = 'au'; au.textContent = bk.authors; mt.appendChild(au);\n    var yr = document.createElement('div'); yr.className = 'yr'; yr.textContent = bk.year || ''; mt.appendChild(yr);\n    var b = document.createElement('button'); b.className = 'bt-btn sm'; b.textContent = 'Valorar'; b.onclick = function(){ openRate(bk, null); };\n    mt.appendChild(b); c.appendChild(mt);\n    return c;\n  }\n  async function doSearch(){\n    var query = (mcq.value || '').trim();\n    if(!query){ return; }\n    mcSource.textContent = ''; mcResults.innerHTML = ''; mcHint.style.display = 'block'; mcHint.textContent = 'Buscando...';\n    try{\n      var res = await search(query);\n      if(!res.books.length){ mcHint.textContent = 'No se encontraron comics. Prueba con otras palabras.'; return; }\n      mcHint.style.display = 'none';\n      res.books.forEach(function(bk){ mcResults.appendChild(resultCard(bk)); });\n      if(res.source){ mcSource.textContent = 'Resultados de ' + res.source; }\n    }catch(e){ mcHint.style.display = 'block'; mcHint.textContent = e.message || 'No se pudo completar la busqueda.'; }\n  }\n  document.getElementById('mcSearchBtn').onclick = doSearch;\n  mcq.addEventListener('keydown', function(e){ if(e.key === 'Enter'){ doSearch(); } });\n  var overlay = document.getElementById('mcOverlay');\n  var mCover = document.getElementById('mcmCover');\n  var mTitle = document.getElementById('mcmTitle');\n  var mWho = document.getElementById('mcmWho');\n  var mStars = document.getElementById('mcmStars');\n  var mOpinion = document.getElementById('mcmOpinion');\n  function drawStars(){\n    mStars.innerHTML = '';\n    for(var i = 1; i <= 5; i++){\n      (function(n){ var b = document.createElement('button'); b.type = 'button'; b.className = 'st' + (n <= currentRating ? ' on' : ''); b.textContent = '\u2605'; b.onclick = function(){ currentRating = n; drawStars(); }; mStars.appendChild(b); })(i);\n    }\n  }\n  function openRate(book, existing){\n    currentBook = book; editingId = existing ? existing.id : null; currentRating = existing ? existing.rating : 0;\n    if(book.cover){ mCover.src = book.cover; mCover.style.display = 'block'; } else { mCover.style.display = 'none'; }\n    mTitle.textContent = book.title || '';\n    mWho.textContent = [book.authors, book.year].filter(function(x){ return x; }).join(' \u00b7 ');\n    mOpinion.value = existing ? (existing.opinion || '') : '';\n    drawStars(); overlay.classList.add('show');\n  }\n  document.getElementById('mcmCancel').onclick = function(){ overlay.classList.remove('show'); };\n  overlay.onclick = function(e){ if(e.target === overlay){ overlay.classList.remove('show'); } };\n  document.getElementById('mcmSave').onclick = function(){\n    if(currentRating === 0){ window.alert('Pon al menos una estrella'); return; }\n    var opinion = (mOpinion.value || '').trim();\n    if(editingId){\n      for(var i = 0; i < reviews.length; i++){ if(reviews[i].id === editingId){ reviews[i].rating = currentRating; reviews[i].opinion = opinion; reviews[i].date = Date.now(); break; } }\n    } else {\n      reviews.unshift({ id: 'r' + Date.now() + Math.random().toString(36).slice(2, 6), title: currentBook.title, authors: currentBook.authors, year: currentBook.year, cover: currentBook.cover, rating: currentRating, opinion: opinion, date: Date.now(), kind: 'comic' });\n    }\n    save(reviews); overlay.classList.remove('show'); render();\n  };\n  function applyFilter(list){\n    var text = (fq.value || '').toLowerCase().trim();\n    var min = parseInt(minSel.value, 10) || 0;\n    var out = list.filter(function(r){\n      if((r.rating || 0) < min){ return false; }\n      if(text){ var hay = ((r.title || '') + ' ' + (r.authors || '')).toLowerCase(); if(hay.indexOf(text) < 0){ return false; } }\n      return true;\n    });\n    var sort = sortSel.value;\n    out.sort(function(a, b){\n      if(sort === 'rating'){ if(b.rating !== a.rating){ return b.rating - a.rating; } return b.date - a.date; }\n      if(sort === 'title'){ return (a.title || '').localeCompare(b.title || '', 'es'); }\n      if(sort === 'author'){ return (a.authors || '').localeCompare(b.authors || '', 'es'); }\n      return b.date - a.date;\n    });\n    return out;\n  }\n  function listCard(r){\n    var c = document.createElement('div'); c.className = 'bt-ml-card';\n    var top = document.createElement('div'); top.className = 'bt-ml-top';\n    var cov = document.createElement('div'); cov.className = 'bt-ml-cover';\n    if(r.cover){ var im = document.createElement('img'); im.src = r.cover; im.alt = ''; cov.appendChild(im); }\n    top.appendChild(cov);\n    var meta = document.createElement('div'); meta.className = 'bt-ml-meta';\n    var h = document.createElement('h3'); h.textContent = r.title || 'Sin titulo'; meta.appendChild(h);\n    var au = document.createElement('div'); au.className = 'bt-ml-auth'; au.textContent = (r.authors || '') + (r.year ? ' \u00b7 ' + r.year : ''); meta.appendChild(au);\n    meta.appendChild(starsRow(r.rating || 0, 'sm'));\n    top.appendChild(meta); c.appendChild(top);\n    if(r.opinion){ var op = document.createElement('div'); op.className = 'bt-ml-op'; op.textContent = r.opinion; c.appendChild(op); }\n    var foot = document.createElement('div'); foot.className = 'bt-ml-foot';\n    var dt = document.createElement('span'); dt.className = 'bt-ml-date'; dt.textContent = fmtDate(r.date); foot.appendChild(dt);\n    var acts = document.createElement('span');\n    var ed = document.createElement('button'); ed.className = 'bt-link'; ed.textContent = 'Editar'; ed.onclick = function(){ openRate(r, r); };\n    var de = document.createElement('button'); de.className = 'bt-link'; de.textContent = 'Eliminar'; de.onclick = function(){ removeReview(r.id); };\n    acts.appendChild(ed); acts.appendChild(de); foot.appendChild(acts); c.appendChild(foot);\n    return c;\n  }\n  function removeReview(id){\n    if(!window.confirm('Eliminar esta valoracion?')){ return; }\n    reviews = reviews.filter(function(x){ return x.id !== id; });\n    save(reviews); render();\n  }\n  function render(){\n    var all = comics();\n    grid.innerHTML = '';\n    if(all.length === 0){ summary.textContent = ''; filters.style.display = 'none'; var p = document.createElement('p'); p.className = 'bt-ml-empty'; p.textContent = 'Aun no has valorado ningun comic. Busca uno arriba y pulsa Valorar.'; grid.appendChild(p); return; }\n    filters.style.display = 'flex';\n    var sum = 0; for(var i = 0; i < all.length; i++){ sum += (all[i].rating || 0); }\n    var avg = (sum \/ all.length).toFixed(1);\n    var list = applyFilter(all);\n    summary.textContent = all.length + ' comic(s) \u00b7 nota media ' + avg + ' \u2605' + (list.length !== all.length ? ' \u00b7 mostrando ' + list.length : '');\n    if(list.length === 0){ var p2 = document.createElement('p'); p2.className = 'bt-ml-empty'; p2.textContent = 'Ningun comic coincide con el filtro.'; grid.appendChild(p2); return; }\n    for(var j = 0; j < list.length; j++){ grid.appendChild(listCard(list[j])); }\n  }\n  fq.addEventListener('input', render);\n  sortSel.addEventListener('change', render);\n  minSel.addEventListener('change', render);\n  render();\n})();\n<\/script>\n","protected":false},"excerpt":{"rendered":"<p>Mis c\u00f3mics Busca c\u00f3mics y novelas gr\u00e1ficas y punt\u00faalos. Se guardan aparte de tus libros. Buscar Escribe algo y pulsa Buscar para encontrar c\u00f3mics. Tus c\u00f3mics valorados M\u00e1s recientesMejor valoradosT\u00edtulo (A-Z)Autor (A-Z) Todas las notasSolo 5 estrellas4 o m\u00e1s3 o m\u00e1s Tu opini\u00f3n Cancelar Guardar valoraci\u00f3n<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-49","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/bibliotea.com\/index.php?rest_route=\/wp\/v2\/pages\/49","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bibliotea.com\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/bibliotea.com\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/bibliotea.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/bibliotea.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=49"}],"version-history":[{"count":4,"href":"https:\/\/bibliotea.com\/index.php?rest_route=\/wp\/v2\/pages\/49\/revisions"}],"predecessor-version":[{"id":61,"href":"https:\/\/bibliotea.com\/index.php?rest_route=\/wp\/v2\/pages\/49\/revisions\/61"}],"wp:attachment":[{"href":"https:\/\/bibliotea.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=49"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}