Files
apps-registry/workloads/ecommerce/index.html
T
devops e25845bac9
Build and Push Frontend / build (push) Successful in 1m21s
feat(ecommerce): release Ari Shopping Frontend v2.1 real catalog
2026-07-19 17:23:16 -05:00

76 lines
22 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!doctype html>
<html lang="es">
<head>
<meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><meta name="theme-color" content="#ff4f9a">
<title>Ari Shopping</title><meta name="description" content="Tienda online Ari Shopping"><link rel="icon" href="assets/img/brand/favicon.png" type="image/png">
<style>
:root{
--bg:#f8f7fb;--card:#fff;--ink:#17141d;--muted:#716b78;--line:#e8e2ec;
--pink:#ff4f9a;--violet:#8b45e7;--soft:#f4edf8;--shadow:0 18px 50px rgba(35,22,45,.11);
--radius:28px;--max:1240px
}
*{box-sizing:border-box}html{scroll-behavior:smooth}body{margin:0;background:var(--bg);color:var(--ink);font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif}body.lock{overflow:hidden}button,input,select{font:inherit}button{cursor:pointer;color:inherit}a{color:inherit;text-decoration:none}img{display:block;max-width:100%}[hidden]{display:none!important}.wrap{width:min(calc(100% - 32px),var(--max));margin:auto}
.topbar{background:linear-gradient(90deg,var(--pink),var(--violet));color:#fff;text-align:center;padding:10px 16px;font-size:12px;font-weight:800;letter-spacing:.03em}
.header{position:sticky;top:0;z-index:60;background:rgba(248,247,251,.94);backdrop-filter:blur(18px);border-bottom:1px solid var(--line)}
.header-inner{min-height:86px;display:grid;grid-template-columns:260px 1fr auto;align-items:center;gap:24px}.brand{display:flex;align-items:center;gap:14px}.brand img{width:64px;height:64px;border-radius:50%;object-fit:cover;box-shadow:var(--shadow)}.brand strong{display:block;font-size:20px}.brand span{display:block;margin-top:4px;color:var(--muted);font-size:12px}.nav{display:flex;justify-content:center;gap:22px;flex-wrap:wrap}.nav button{border:0;background:transparent;padding:10px 0;color:var(--muted);font-size:14px}.nav button:hover,.nav button.active{color:var(--pink)}.actions{display:flex;gap:10px}.ghost,.cart-btn,.cta,.white,.small-btn{border:0;border-radius:999px;font-weight:800}.ghost{height:44px;padding:0 17px;background:#fff;border:1px solid var(--line)}.cart-btn,.cta,.small-btn{background:linear-gradient(90deg,var(--pink),var(--violet));color:#fff;box-shadow:0 10px 24px rgba(255,79,154,.2)}.cart-btn{height:46px;padding:0 18px}.cart-btn b{display:inline-grid;place-items:center;margin-left:8px;min-width:24px;height:24px;padding:0 6px;border-radius:999px;background:#fff;color:var(--ink);font-size:12px}.search{display:grid;grid-template-columns:1fr auto;gap:10px;padding-bottom:16px}.search input{height:50px;border:1px solid var(--line);border-radius:999px;padding:0 18px;background:#fff;outline:none}.search input:focus{border-color:var(--pink);box-shadow:0 0 0 4px rgba(255,79,154,.1)}
.hero{padding:64px 0 70px;display:grid;grid-template-columns:.95fr 1.05fr;gap:50px;align-items:center}.eyebrow{color:var(--pink);font-size:11px;font-weight:900;text-transform:uppercase;letter-spacing:.14em}.hero h1{margin:14px 0 20px;font-size:clamp(50px,6.2vw,84px);line-height:.96;letter-spacing:-.06em}.hero h1 em{display:block;color:var(--pink);font-family:Georgia,serif;font-weight:400}.hero p{max-width:560px;color:var(--muted);font-size:17px;line-height:1.75}.hero-actions{display:flex;gap:14px;margin-top:28px;align-items:center}.cta,.white{min-height:50px;padding:0 22px;display:inline-flex;align-items:center;justify-content:center}.white{background:#fff;border:1px solid var(--line)}.hero-media{position:relative;padding:18px;border-radius:36px;background:linear-gradient(145deg,#f3e3fb,#e9f8f1);box-shadow:var(--shadow)}.hero-media img{width:100%;border-radius:28px}.hero-badge{position:absolute;right:34px;bottom:34px;padding:12px 16px;background:rgba(255,255,255,.92);border-radius:16px;font-size:12px;font-weight:800;box-shadow:var(--shadow)}
.trust{display:grid;grid-template-columns:repeat(3,1fr);gap:16px;margin-bottom:90px}.trust article{display:flex;gap:14px;align-items:center;padding:22px;background:#fff;border:1px solid var(--line);border-radius:22px}.trust i{width:38px;height:38px;display:grid;place-items:center;border-radius:50%;background:#fff0f7;color:var(--pink);font-style:normal;font-weight:900}.trust strong,.trust span{display:block}.trust span{color:var(--muted);font-size:13px;margin-top:4px}
.section{padding-bottom:96px}.section-head{display:flex;justify-content:space-between;align-items:end;gap:24px;margin-bottom:26px}.section-head h2{margin:8px 0;font-size:clamp(34px,4vw,54px);line-height:1;letter-spacing:-.05em}.section-head p{margin:0;color:var(--muted)}.section-head a{color:var(--pink);font-weight:800}
.category-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:18px}.category-card{padding:0;border:0;background:#fff;border-radius:26px;overflow:hidden;box-shadow:var(--shadow);text-align:left;transition:.2s}.category-card:hover{transform:translateY(-5px)}.category-card img{width:100%;aspect-ratio:4/5;object-fit:cover}.category-card div{padding:17px 18px 20px}.category-card strong{display:block;font-size:19px}.category-card span{display:block;color:var(--muted);font-size:13px;margin-top:5px}
.toolbar{display:flex;justify-content:space-between;gap:18px;align-items:center;margin-bottom:24px}.chips{display:flex;gap:8px;flex-wrap:wrap}.chip{border:1px solid var(--line);border-radius:999px;padding:10px 15px;background:#fff;font-size:13px;font-weight:800}.chip.active{background:var(--ink);color:#fff;border-color:var(--ink)}.toolbar select{height:44px;border:1px solid var(--line);border-radius:14px;background:#fff;padding:0 12px}.product-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:18px}.product{background:#fff;border:1px solid var(--line);border-radius:24px;overflow:hidden;box-shadow:0 9px 28px rgba(35,22,45,.07);display:flex;flex-direction:column}.product-media{border:0;padding:0;background:#fff}.product-media img{width:100%;aspect-ratio:1/1;object-fit:cover}.product-body{padding:17px;display:flex;flex-direction:column;gap:11px;flex:1}.labels{display:flex;gap:7px;flex-wrap:wrap}.label{padding:6px 9px;border-radius:999px;background:var(--soft);color:var(--muted);font-size:11px;font-weight:800}.product-title{padding:0;border:0;background:transparent;text-align:left;font-size:18px;font-weight:900;line-height:1.2}.product-desc{margin:0;color:var(--muted);font-size:13px;line-height:1.55;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3;overflow:hidden}.product-footer{display:flex;justify-content:space-between;align-items:center;gap:10px;margin-top:auto}.product-footer strong{font-size:12px}.small-btn{height:40px;padding:0 15px}.empty{padding:40px;background:#fff;border:1px dashed var(--line);border-radius:24px;text-align:center}
.social{background:linear-gradient(135deg,#65165d,#1a1122);color:#fff;padding:72px 0}.social-inner{display:flex;justify-content:space-between;align-items:center;gap:24px}.social h2{font-size:clamp(34px,4vw,54px);line-height:1;letter-spacing:-.04em;margin:10px 0 0;max-width:760px}.footer{background:#16101c;color:#fff}.footer-inner{min-height:116px;display:flex;justify-content:space-between;align-items:center;gap:20px}.footer-brand{display:flex;align-items:center;gap:14px}.footer-brand img{width:64px;height:64px;border-radius:50%;object-fit:cover}.footer-brand strong,.footer-brand span{display:block}.footer-brand span{color:#d7cddd;font-size:13px;margin-top:4px}.footer small{color:#d7cddd}
.backdrop{position:fixed;inset:0;z-index:90;background:rgba(22,12,28,.58);backdrop-filter:blur(4px)}.drawer{position:fixed;z-index:95;top:0;right:0;width:min(430px,100%);height:100dvh;background:#fff;display:grid;grid-template-rows:auto 1fr auto;transform:translateX(105%);transition:.22s;box-shadow:-24px 0 70px rgba(20,10,25,.2)}.drawer.open{transform:none}.drawer-head,.drawer-foot{padding:22px;border-bottom:1px solid var(--line)}.drawer-head{display:flex;justify-content:space-between;align-items:center}.drawer-head h3{margin:8px 0 0;font-size:28px}.drawer-body{padding:18px 22px;overflow:auto}.drawer-foot{border-top:1px solid var(--line);border-bottom:0;display:grid;gap:10px}.full{width:100%}.cart-empty{text-align:center;color:var(--muted);padding:35px 15px}.cart-line{display:grid;grid-template-columns:70px 1fr auto;gap:11px;margin-bottom:15px}.cart-line img{width:70px;height:70px;border-radius:14px;object-fit:cover}.cart-line strong,.cart-line small{display:block}.cart-line small{color:var(--muted);margin-top:5px}.qty{display:flex;gap:7px;align-items:center;margin-top:9px}.qty button{width:28px;height:28px;border-radius:50%;border:1px solid var(--line);background:#fff}.remove{border:0;background:transparent;color:var(--pink);font-weight:800}.dialog{width:min(920px,calc(100% - 24px));padding:0;border:0;border-radius:28px;box-shadow:0 30px 90px rgba(20,10,25,.3)}.dialog::backdrop{background:rgba(22,12,28,.58);backdrop-filter:blur(4px)}.dialog-close{position:absolute;right:14px;top:14px;width:42px;height:42px;border:0;border-radius:50%;background:#fff;font-size:26px}.dialog-grid{display:grid;grid-template-columns:1fr .95fr}.dialog-grid>img{width:100%;height:100%;min-height:520px;object-fit:cover}.dialog-copy{padding:42px 34px 34px}.dialog-copy h3{font-size:38px;line-height:1.04;letter-spacing:-.04em;margin:12px 0 16px}.dialog-copy p{color:var(--muted);line-height:1.7}.details{display:grid;gap:10px;margin:20px 0}.details div{padding:14px 16px;border:1px solid var(--line);border-radius:18px;background:#faf7fb}.details strong{display:block;color:var(--pink);font-size:11px;text-transform:uppercase;letter-spacing:.1em}.dialog-actions{display:flex;gap:10px;flex-wrap:wrap}
@media(max-width:1050px){.header-inner{grid-template-columns:1fr;padding:16px 0}.nav{justify-content:flex-start}.hero,.dialog-grid{grid-template-columns:1fr}.trust,.category-grid,.product-grid{grid-template-columns:repeat(2,1fr)}.section-head,.toolbar,.social-inner,.footer-inner{align-items:flex-start;flex-direction:column}}
@media(max-width:620px){.wrap{width:min(calc(100% - 22px),var(--max))}.brand span{display:none}.hero{padding-top:42px}.hero h1{font-size:46px}.hero-actions{align-items:flex-start;flex-direction:column}.trust,.category-grid,.product-grid{grid-template-columns:1fr}.dialog-copy{padding:28px 20px}.dialog-copy h3{font-size:30px}}
</style>
</head>
<body>
<div class="topbar">Envíos seguros · Atención personalizada · Pedidos por WhatsApp</div>
<header class="header"><div class="wrap header-inner">
<a class="brand" href="#inicio"><img src="assets/img/brand/logo-ari.png" alt="Ari Shopping"><div><strong>Ari Shopping</strong><span>Detalles que hacen tu día más especial</span></div></a>
<nav class="nav"><button data-nav="Todos">Todos</button><button data-nav="Figuras">Juguetes</button><button data-nav="Peluches">Peluches</button><button data-nav="Mochilas">Mochilas</button><button data-col="Marvel">Marvel</button><button data-col="Toy Story">Toy Story</button></nav>
<div class="actions"><button id="searchBtn" class="ghost">Buscar</button><button id="cartBtn" class="cart-btn">Carrito <b id="cartCount">0</b></button></div>
</div><div class="wrap search" id="searchRow" hidden><input id="searchInput" type="search" placeholder="Buscar producto o colección…"><button id="searchClose" class="ghost">Cerrar</button></div></header>
<main id="inicio">
<section class="wrap hero"><div><span class="eyebrow">Nueva colección</span><h1>Encuentra ese detalle que hace el día más <em>especial.</em></h1><p>Juguetes, personajes, peluches y mochilas seleccionados para sorprender. Compra fácil y recibe atención personalizada.</p><div class="hero-actions"><a class="cta" href="#productos">Explorar productos</a><a class="white" href="https://www.instagram.com/ari_shopping1/" target="_blank" rel="noopener">Ver Instagram</a></div></div><div class="hero-media"><img src="assets/img/hero/hero-real.webp" alt="Productos Ari Shopping"><span class="hero-badge">Productos reales de Ari Shopping</span></div></section>
<section class="wrap trust"><article><i></i><div><strong>Envíos seguros</strong><span>Coordina tu entrega con nosotros.</span></div></article><article><i></i><div><strong>Pagos fáciles</strong><span>Confirma disponibilidad antes de pagar.</span></div></article><article><i></i><div><strong>Atención cercana</strong><span>Te ayudamos a elegir el producto ideal.</span></div></article></section>
<section class="wrap section"><div class="section-head"><div><span class="eyebrow">Explora la tienda</span><h2>Compra por categoría</h2><p>Encuentra rápidamente lo que estás buscando.</p></div><a href="#productos">Ver todo →</a></div><div class="category-grid">
<button class="category-card" data-cat="Figuras"><img src="assets/img/categories/figuras.webp" alt="Juguetes"><div><strong>Juguetes</strong><span>Toy Story y personajes</span></div></button>
<button class="category-card" data-cat="Peluches"><img src="assets/img/categories/peluches.webp" alt="Peluches"><div><strong>Peluches</strong><span>Personajes para regalar</span></div></button>
<button class="category-card" data-cat="Mochilas"><img src="assets/img/categories/mochilas.webp" alt="Mochilas"><div><strong>Bolsos y mochilas</strong><span>Escolares y casuales</span></div></button>
<button class="category-card" data-col="Marvel"><img src="assets/img/categories/marvel.webp" alt="Marvel"><div><strong>Marvel</strong><span>Diseños con personalidad</span></div></button></div></section>
<section class="wrap section" id="productos"><div class="section-head"><div><span class="eyebrow">Catálogo real</span><h2>Productos destacados</h2><p id="summary">Cargando productos…</p></div><a target="_blank" rel="noopener" href="https://wa.link/rvcqqc">Consultar disponibilidad →</a></div><div class="toolbar"><div id="chips" class="chips"></div><select id="sort"><option value="featured">Destacados</option><option value="new">Más recientes</option><option value="name">Nombre</option></select></div><div id="productGrid" class="product-grid"></div><div id="empty" class="empty" hidden><strong>No encontramos productos</strong><p>Prueba con otra categoría.</p><button id="reset" class="cta">Ver todos</button></div></section>
<section class="social"><div class="wrap social-inner"><div><span class="eyebrow" style="color:#ffbad9">Comunidad Ari Shopping</span><h2>Novedades y promociones en Instagram.</h2></div><a class="white" href="https://www.instagram.com/ari_shopping1/" target="_blank" rel="noopener">@ari_shopping1</a></div></section>
</main>
<footer class="footer"><div class="wrap footer-inner"><div class="footer-brand"><img src="assets/img/brand/logo-ari.png" alt="Ari Shopping"><div><strong>Ari Shopping</strong><span>Detalles que emocionan, compras que disfrutas.</span></div></div><small>Frontend v3.0.0</small></div></footer>
<div id="backdrop" class="backdrop" hidden></div><aside id="drawer" class="drawer"><div class="drawer-head"><div><span class="eyebrow">Tu pedido</span><h3>Carrito</h3></div><button id="drawerClose" class="ghost">Cerrar</button></div><div id="cartItems" class="drawer-body"></div><div class="drawer-foot"><button id="checkout" class="cta full">Enviar por WhatsApp</button><button id="clearCart" class="ghost full">Vaciar pedido</button><small>Precio y disponibilidad se confirman directamente con Ari Shopping.</small></div></aside>
<dialog id="dialog" class="dialog"><button id="dialogClose" class="dialog-close">×</button><div id="dialogContent"></div></dialog>
<template id="productTemplate"><article class="product"><button class="product-media open-product"><img alt=""></button><div class="product-body"><div class="labels"><span class="label cat"></span><span class="label col"></span></div><button class="product-title open-product"></button><p class="product-desc"></p><div class="product-footer"><strong>Consultar</strong><button class="small-btn add">Agregar</button></div></div></article></template>
<script>
(() => {
const state={products:[],store:null,category:'Todos',collection:'',query:'',sort:'featured',cart:JSON.parse(localStorage.getItem('ari-cart-v3')||'{}')};
const $=(s,r=document)=>r.querySelector(s), $$=(s,r=document)=>[...r.querySelectorAll(s)];
const el={grid:$('#productGrid'),tpl:$('#productTemplate'),chips:$('#chips'),summary:$('#summary'),empty:$('#empty'),sort:$('#sort'),searchBtn:$('#searchBtn'),searchRow:$('#searchRow'),searchInput:$('#searchInput'),searchClose:$('#searchClose'),cartBtn:$('#cartBtn'),cartCount:$('#cartCount'),drawer:$('#drawer'),drawerClose:$('#drawerClose'),backdrop:$('#backdrop'),cartItems:$('#cartItems'),clearCart:$('#clearCart'),checkout:$('#checkout'),dialog:$('#dialog'),dialogClose:$('#dialogClose'),dialogContent:$('#dialogContent'),reset:$('#reset')};
const norm=v=>String(v||'').toLowerCase().normalize('NFD').replace(/[\u0300-\u036f]/g,'');
const product=id=>state.products.find(p=>p.id===id), save=()=>localStorage.setItem('ari-cart-v3',JSON.stringify(state.cart));
async function init(){const [s,c]=await Promise.all([fetch('data/store.json',{cache:'no-store'}),fetch('data/products.json',{cache:'no-store'})]);state.store=await s.json();state.products=(await c.json()).products||[];render()}
function categories(){return ['Todos',...new Set(state.products.map(p=>p.category))]}
function filtered(){const q=norm(state.query);return state.products.filter(p=>(state.category==='Todos'||p.category===state.category)&&(!state.collection||p.collection===state.collection)&&(!q||norm(`${p.name} ${p.category} ${p.collection} ${p.description}`).includes(q))).sort((a,b)=>state.sort==='name'?a.name.localeCompare(b.name,'es'):state.sort==='new'?Number(!!b.new)-Number(!!a.new):Number(!!b.featured)-Number(!!a.featured)||a.name.localeCompare(b.name,'es'))}
function renderChips(){el.chips.innerHTML=categories().map(c=>`<button class="chip ${state.category===c&&!state.collection?'active':''}" data-chip="${c}">${c}</button>`).join('')}
function renderProducts(){const list=filtered();el.summary.textContent=`${list.length} productos disponibles para consultar.`;el.empty.hidden=list.length>0;el.grid.innerHTML='';list.forEach(p=>{const f=el.tpl.content.cloneNode(true);$('img',f).src=p.image;$('img',f).alt=p.name;$('.cat',f).textContent=p.category;$('.col',f).textContent=p.collection;$('.product-title',f).textContent=p.name;$('.product-desc',f).textContent=p.description;$$('.open-product',f).forEach(b=>b.addEventListener('click',()=>openDialog(p.id)));$('.add',f).addEventListener('click',()=>add(p.id));el.grid.appendChild(f)})}
function cartEntries(){return Object.entries(state.cart).map(([id,qty])=>({p:product(id),qty:Number(qty)})).filter(x=>x.p&&x.qty>0)}
function renderCart(){const list=cartEntries();el.cartCount.textContent=String(list.reduce((s,x)=>s+x.qty,0));if(!list.length){el.cartItems.innerHTML='<div class="cart-empty"><strong>Tu pedido está vacío</strong><p>Agrega productos para consultarlos por WhatsApp.</p></div>';return}el.cartItems.innerHTML=list.map(({p,qty})=>`<article class="cart-line" data-id="${p.id}"><img src="${p.image}" alt="${p.name}"><div><strong>${p.name}</strong><small>${p.collection} · Consultar disponibilidad</small><div class="qty"><button data-minus></button><span>${qty}</span><button data-plus>+</button></div></div><button class="remove" data-remove>Quitar</button></article>`).join('');$$('[data-minus]',el.cartItems).forEach(b=>b.addEventListener('click',()=>change(b.closest('[data-id]').dataset.id,-1)));$$('[data-plus]',el.cartItems).forEach(b=>b.addEventListener('click',()=>change(b.closest('[data-id]').dataset.id,1)));$$('[data-remove]',el.cartItems).forEach(b=>b.addEventListener('click',()=>remove(b.closest('[data-id]').dataset.id)))}
function render(){renderChips();renderProducts();renderCart()}
function add(id){state.cart[id]=Number(state.cart[id]||0)+1;save();renderCart();openDrawer()}
function change(id,d){const n=Number(state.cart[id]||0)+d;if(n<=0)delete state.cart[id];else state.cart[id]=n;save();renderCart()}
function remove(id){delete state.cart[id];save();renderCart()}
function openDrawer(){el.drawer.classList.add('open');el.backdrop.hidden=false;document.body.classList.add('lock')}
function closeDrawer(){el.drawer.classList.remove('open');el.backdrop.hidden=true;document.body.classList.remove('lock')}
function openDialog(id){const p=product(id);if(!p)return;el.dialogContent.innerHTML=`<div class="dialog-grid"><img src="${p.image}" alt="${p.name}"><div class="dialog-copy"><span class="eyebrow">${p.category} · ${p.collection}</span><h3>${p.name}</h3><p>${p.description}</p><div class="details"><div><strong>Precio</strong><span>Consultar disponibilidad</span></div><div><strong>Entrega</strong><span>Coordinar con Ari Shopping</span></div>${p.dimensions?`<div><strong>Medidas</strong><span>${p.dimensions}</span></div>`:''}</div><div class="dialog-actions"><button id="dialogAdd" class="cta">Agregar al pedido</button><a class="ghost" target="_blank" rel="noopener" href="${state.store.whatsappUrl}">Consultar por WhatsApp</a></div></div></div>`;$('#dialogAdd',el.dialogContent).addEventListener('click',()=>{add(id);el.dialog.close()});el.dialog.showModal()}
function checkout(){const list=cartEntries();const msg=['Hola Ari Shopping 👋','Quiero consultar disponibilidad para:','',...list.map(x=>`• ${x.qty} x ${x.p.name}`),'','Nombre:','Ciudad:','Forma de entrega:'].join('\n');window.open(`${state.store.whatsappUrl}?text=${encodeURIComponent(msg)}`,'_blank','noopener')}
document.addEventListener('click',ev=>{const nav=ev.target.closest('[data-nav]');if(nav){state.category=nav.dataset.nav;state.collection='';render()}const col=ev.target.closest('[data-col]');if(col){state.category='Todos';state.collection=col.dataset.col;render()}const cat=ev.target.closest('[data-cat]');if(cat){state.category=cat.dataset.cat;state.collection='';render()}const chip=ev.target.closest('[data-chip]');if(chip){state.category=chip.dataset.chip;state.collection='';render()}});
el.sort.addEventListener('change',()=>{state.sort=el.sort.value;renderProducts()});el.searchBtn.addEventListener('click',()=>{el.searchRow.hidden=false;el.searchInput.focus()});el.searchClose.addEventListener('click',()=>{el.searchRow.hidden=true;state.query='';el.searchInput.value='';renderProducts()});el.searchInput.addEventListener('input',()=>{state.query=el.searchInput.value;renderProducts()});el.cartBtn.addEventListener('click',openDrawer);el.drawerClose.addEventListener('click',closeDrawer);el.backdrop.addEventListener('click',closeDrawer);el.clearCart.addEventListener('click',()=>{state.cart={};save();renderCart()});el.checkout.addEventListener('click',checkout);el.dialogClose.addEventListener('click',()=>el.dialog.close());el.reset.addEventListener('click',()=>{state.category='Todos';state.collection='';state.query='';render()});
init().catch(err=>{console.error(err);el.summary.textContent='No se pudo cargar el catálogo.';el.empty.hidden=false});
})();
</script>
</body></html>