[{"data":1,"prerenderedAt":288},["ShallowReactive",2],{"\u002Fprojects\u002Fpokestore":3,"posts":212},{"id":4,"title":5,"body":6,"description":157,"extension":158,"featured":159,"images":160,"links":178,"meta":185,"navigation":159,"order":186,"path":187,"seo":188,"stack":189,"stats":196,"stem":209,"tag":94,"url":210,"__hash__":211},"projects\u002Fprojects\u002Fpokestore.md","PokeStore",{"type":7,"value":8,"toc":145},"minimark",[9,14,67,71,76,84,88,100,104,111,115],[10,11,13],"h2",{"id":12},"qué-hace","Qué hace",[15,16,17,25,31,37,43,49,55,61],"ul",{},[18,19,20,24],"li",{},[21,22,23],"strong",{},"Fichas de producto para coleccionistas."," La carta se inclina siguiendo el ratón con un reflejo holográfico, se puede inspeccionar con una lupa y una retícula de centrado PSA\u002FBGS, y lleva su estado (Near Mint, Lightly Played...) con una guía que explica cada uno.",[18,26,27,30],{},[21,28,29],{},"Filtros pensados para TCG."," Franquicia, expansión, idioma y tipo de producto, con selección múltiple, filtros rápidos de stock y ofertas, y chips con lo que tienes activo.",[18,32,33,36],{},[21,34,35],{},"Búsqueda por código."," El buscador en vivo encuentra productos por nombre, SKU, código de set o número de carta.",[18,38,39,42],{},[21,40,41],{},"Simulador de apertura de sobres."," Eliges un sobre, lo rasgas y te salen cinco productos de la tienda que se voltean.",[18,44,45,48],{},[21,46,47],{},"Lista de deseos con vista de álbum"," 3x3, como una carpeta de cartas.",[18,50,51,54],{},[21,52,53],{},"Carrito lateral y vista rápida",", para comprar sin salir del catálogo.",[18,56,57,60],{},[21,58,59],{},"Modo claro y oscuro",", rutas en español y todos los textos preparados para traducir.",[18,62,63,66],{},[21,64,65],{},"Todo configurable desde el Personalizador",": cabecera, colores, slider, secciones de la portada, botones flotantes, pie de página, datos legales.",[10,68,70],{"id":69},"cómo-está-hecho","Cómo está hecho",[72,73,75],"h3",{"id":74},"un-tema-clásico-sin-dependencias-externas","Un tema clásico, sin dependencias externas",[77,78,79,80,83],"p",{},"Es un tema clásico de WordPress en PHP que sobrescribe 13 plantillas de WooCommerce (ficha, carrito, cuenta, catálogo). Los estilos son ",[21,81,82],{},"Tailwind CSS v4"," compilado con PostCSS, y el JavaScript son 21 módulos sin framework que se cargan solo en las páginas que los usan. Fuentes, iconos y el único script de terceros (Swiper) van dentro del tema: ninguna petición sale a un CDN.",[72,85,87],{"id":86},"pensado-para-que-lo-mantenga-el-dueño-de-la-tienda","Pensado para que lo mantenga el dueño de la tienda",[77,89,90,91,95,96,99],{},"Todo lo que cambia de una tienda a otra (logo, colores, textos del slider, categorías destacadas, umbral de envío gratis, columnas del pie, datos legales) está en el Personalizador de WordPress. Los textos usan el dominio ",[92,93,94],"code",{},"pokestore",", así que se traducen con un ",[92,97,98],{},".po"," sin instalar plugins de idiomas.",[72,101,103],{"id":102},"seo-y-rendimiento","SEO y rendimiento",[77,105,106,107,110],{},"Datos estructurados Schema.org para el producto (con oferta, valoraciones y política de devolución, como pide Google Merchant), las migas de pan, la organización y el buscador del sitio; metaetiquetas Open Graph; imágenes con ",[92,108,109],{},"srcset"," y subtamaños WebP generados al subir; consultas costosas como el rango de precios, cacheadas.",[10,112,114],{"id":113},"problemas-que-resolví","Problemas que resolví",[15,116,117,123,133,139],{},[18,118,119,122],{},[21,120,121],{},"Escapado y nonces."," Una revisión del código encontró salidas sin escapar y acciones AJAX sin comprobar. Las corregí todas: la lista de deseos, por ejemplo, ahora valida un nonce también para invitados.",[18,124,125,128,129,132],{},[21,126,127],{},"Accesibilidad de los paneles."," El carrito lateral, la vista rápida y los modales atrapan el foco mientras están abiertos, se cierran con Esc y actualizan ",[92,130,131],{},"aria-expanded",".",[18,134,135,138],{},[21,136,137],{},"Filtros y el botón Atrás."," Al filtrar sin recargar, el historial del navegador se perdía. Ahora cada filtro actualiza la URL y Atrás\u002FAdelante los restaura.",[18,140,141,144],{},[21,142,143],{},"Cantidades en el carrito."," Cambiar dos filas seguidas hacía que la segunda pisara a la primera. Cada fila tiene ahora su propio temporizador.",{"title":146,"searchDepth":147,"depth":147,"links":148},"",2,[149,150,156],{"id":12,"depth":147,"text":13},{"id":69,"depth":147,"text":70,"children":151},[152,154,155],{"id":74,"depth":153,"text":75},3,{"id":86,"depth":153,"text":87},{"id":102,"depth":153,"text":103},{"id":113,"depth":147,"text":114},"Tema de WordPress y WooCommerce hecho desde cero para tiendas de cartas coleccionables. Cartas con efecto holográfico, lupa de inspección, guía de estados, simulador de apertura de sobres y filtros pensados para coleccionistas. Sin CDNs, accesible y personalizable desde el Personalizador.","md",true,[161,166,169,173],{"src":162,"alt":163,"width":164,"height":165},"\u002Fimages\u002Fposts\u002Fpokestore-tema-wordpress-para-tiendas-tcg\u002Fportada.webp","La ficha de una carta japonesa con el efecto holográfico activo y el estado Near Mint",1440,900,{"src":167,"alt":168,"width":164,"height":165},"\u002Fimages\u002Fposts\u002Fpokestore-tema-wordpress-para-tiendas-tcg\u002Ftienda-filtros.webp","La tienda filtrada por idioma japonés, con el filtro activo arriba y el panel de filtros a la izquierda",{"src":170,"alt":171,"width":164,"height":172},"\u002Fimages\u002Fposts\u002Fpokestore-tema-wordpress-para-tiendas-tcg\u002Fabrir-sobres.webp","El simulador de apertura de sobres con un sobre japonés de Scarlet ex",1160,{"src":174,"alt":175,"width":176,"height":177},"\u002Fimages\u002Fposts\u002Fpokestore-tema-wordpress-para-tiendas-tcg\u002Fmovil-inicio.webp","La portada de la tienda en el móvil",780,1688,[179,182],{"label":180,"url":181},"Cómo es por fuera","\u002Fposts\u002Fpokestore-tema-wordpress-para-tiendas-tcg",{"label":183,"url":184},"Me interesa","\u002Fcontact",{},5,"\u002Fprojects\u002Fpokestore",{"title":5,"description":157},[190,191,192,82,193,194,195],"WordPress","WooCommerce","PHP","JavaScript","Schema.org","i18n",[197,200,203,206],{"value":198,"label":199},"266","commits",{"value":201,"label":202},"13","plantillas de WooCommerce",{"value":204,"label":205},"21","módulos JavaScript",{"value":207,"label":208},"0","CDNs externos","projects\u002Fpokestore",null,"jDtYD5Ym15xoXjeYPPns4N77C7xKvPmdc52f6EEsOmU",[213,222,231,239,248,254,262,268,275,281],{"title":214,"description":215,"date":216,"path":181,"tags":217,"type":221},"PokeStore: un tema de WordPress a medida para tiendas de cartas coleccionables","Un tema de WordPress y WooCommerce hecho desde cero para tiendas de Pokémon y One Piece TCG. Un recorrido por la tienda como la ve quien compra, de la portada a la lista de deseos, y por lo que puede ajustar quien la lleva.","2026-10-21",[94,218,219,220],"wordpress","woocommerce","proyectos","guia",{"title":223,"description":224,"date":225,"path":226,"tags":227,"type":221},"YouTube Like Shortcut: da like con una tecla, como en TikTok","Una extensión de Chrome que da like al vídeo o Short de YouTube que estás viendo al pulsar la L. Cómo se instala, qué opciones tiene y por qué no se dispara mientras escribes.","2026-10-20","\u002Fposts\u002Fyoutube-like-shortcut-like-con-una-tecla",[228,229,230,220],"youtube-like-shortcut","youtube","productividad",{"title":232,"description":233,"date":225,"path":234,"tags":235,"type":238},"YouTube Like Shortcut por dentro: pulsar un botón en una web que cambia sin avisar","Cómo una extensión de una sola función llega antes que el reproductor de YouTube, encuentra el botón de like entre variantes ocultas y layouts que cambian con el ancho de la ventana, y se asegura de que el like ha entrado aunque YouTube esté reconstruyendo la página.","\u002Fposts\u002Fyoutube-like-shortcut-por-dentro",[228,229,236,237],"arquitectura","typescript","tecnico",{"title":240,"description":241,"date":242,"path":243,"tags":244,"type":221},"AI Upscaler: amplía imágenes y quita fondos con IA, sin salir de tu navegador","Una extensión de Chrome que amplía imágenes ×2 o ×4 y elimina fondos con inteligencia artificial, todo en tu equipo. Sin subir nada a ningún servidor, sin cuentas y gratis. Qué hace y cómo se usa.","2026-10-19","\u002Fposts\u002Fai-upscaler-imagenes-con-ia-en-tu-navegador",[245,246,247,220],"ai-upscaler","ia","privacidad",{"title":249,"description":250,"date":242,"path":251,"tags":252,"type":238},"AI Upscaler por dentro: dos redes neuronales en una extensión de Chrome","Cómo ejecuta AI Upscaler Real-ESRGAN y U²-Net dentro del navegador con ONNX Runtime Web, por qué la imagen se procesa en mosaicos con margen, qué hubo que parchear en el modelo de quitar fondos y qué obstáculos pone una extensión Manifest V3 a los workers y al WebAssembly.","\u002Fposts\u002Fai-upscaler-por-dentro",[245,246,236,237,253],"vue",{"title":255,"description":256,"date":257,"path":258,"tags":259,"type":221},"ABR Cipher: cifrado seguro, completamente en tu navegador","Una suite de cifrado que no envía nada a ningún servidor. Cifrar textos y archivos, compartir secretos con un enlace que caduca, guardar contraseñas y destruir archivos. Qué hace y cómo se usa.","2026-10-18","\u002Fposts\u002Fabr-cipher-cifrado-en-tu-navegador",[260,261,247,220],"cipher","seguridad",{"title":263,"description":264,"date":257,"path":265,"tags":266,"type":238},"ABR Cipher por dentro: criptografía sin servidor, de la URL al disco","Por qué ABR Cipher solo usa la Web Crypto API, cómo viaja un secreto en el fragmento de una URL, cómo se cifra un archivo de varios GB en el navegador y qué hace falta para destruir un archivo de verdad, con un compañero en Rust que lee NTFS.","\u002Fposts\u002Fabr-cipher-por-dentro",[260,261,236,237,267],"rust",{"title":269,"description":270,"date":257,"path":271,"tags":272,"type":238},"ABReader por dentro: el lector que no encontré, construido a mi medida","Voces neuronales que se ejecutan en el navegador, sincronización entre dispositivos sin servidor y once formatos detrás de un mismo contrato. Las decisiones técnicas de ABReader y por qué las tomé.","\u002Fposts\u002Fabreader-por-dentro",[273,236,237,274],"abreader","nuxt",{"title":276,"description":277,"date":257,"path":278,"tags":279,"type":221},"ABReader: tu biblioteca de libros electrónicos en el navegador","Un lector de libros electrónicos que funciona en el navegador, sin cuentas ni servidores. Qué hace, cómo se usa y cómo probarlo en un minuto.","\u002Fposts\u002Fabreader-tu-biblioteca-en-el-navegador",[273,280,220],"lectura",{"title":282,"description":283,"date":257,"path":284,"tags":285,"type":238},"Cómo construí este blog: estático, sin servidor y sin coste de hosting","Por qué elegí Nuxt y Markdown en lugar de WordPress, cómo separo el código privado del sitio publicado y qué se rompió en el primer despliegue.","\u002Fposts\u002Farquitectura-de-este-blog",[274,253,286,287],"devops","meta",1792586523640]