¡Consultanos!
Ropa importada original Envíos a todo Buenos Aires Marcas H&M · Jack & Jones Calidad importada · precio local Consultanos por WhatsApp Base en Villa Devoto · BsAs Ropa importada original Envíos a todo Buenos Aires Marcas H&M · Jack & Jones Calidad importada · precio local Consultanos por WhatsApp Base en Villa Devoto · BsAs
Ropa importada original

La mejor
calidad al
mejor precio

Buzos y remeras importadas de primeras marcas. Envíos a todo Buenos Aires desde Villa Devoto.

Importado Devoto
Envíos BsAs
100% original
H&M
Marca
13+
Productos
CABA
Envíos
Marcas disponibles
H&M Jack & Jones

Colección

Buzos

7 productos
Filtrar talle:
Buzo Hoodie Crema
Ver detalle
Nuevo
H&M · Hoodie
Buzo Hoodie Crema
$50.000
Consultar
Buzo Hoodie Gris
Ver detalle
H&M · Hoodie
Buzo Hoodie Gris
$50.000
Consultar
Buzo Organic Marrón
Ver detalle
H&M · Organic
Buzo Organic Marrón
$45.000
XL
Buzo Gris Jack & Jones
Ver detalle
Jack & Jones
Buzo Gris Jack & Jones
$50.000
L
Buzo Polo H&M Negro
Ver detalle
H&M · Polo Loose Fit
Buzo Polo H&M Negro
$45.000
LS
Sweater H&M Polo Gris
Ver detalle
H&M · Polo Slim Fit
Sweater H&M Polo Gris
$45.000
XXLS
Buzo H&M Verde
Ver detalle
H&M · Loose Fit
Buzo H&M Verde
$40.000
XLM

Colección

Remeras

6 productos
Filtrar talle:
Remera Negra
Ver detalle
H&M · Relaxed Fit
Remera Negra
$30.000
XL
Remera Rosa
Ver detalle
H&M · Relaxed Fit
Remera Rosa
$30.000
ML
Remera Marrón
Ver detalle
H&M · Relaxed Fit
Remera Marrón
$30.000
LS
Remera Crema
Ver detalle
H&M · Relaxed Fit
Remera Crema
$30.000
LXL
Remera Marrón Manga Larga
Ver detalle
H&M · Loose Fit
Remera Marrón Manga Larga
$30.000
XLLM
Remera Wednesday
Ver detalle
Regular Fit
Remera Manga Larga Wednesday
$30.000
XS
Quiénes somos

Somos
Importado Devoto

Importamos ropa de primeras marcas. Te traemos lo mejor al mejor precio, sin vueltas. Base en Villa Devoto, Buenos Aires.

¿Buscás algo que no ves en el catálogo? Escribinos por WhatsApp o redes sociales.

Escribinos ahora
Marcas originalesH&M, Jack & Jones y más
Envíos a todo Buenos AiresRápidos y seguros
Precios imbatiblesCalidad importada, precio local

Contacto

¿Tenés una consulta? Escribinos, te respondemos rápido.

Medios de pago

Aceptamos transferencias bancarias. Comprá seguro y rápido.

Santander Mercado Pago
Tu Carrito

Tu carrito está vacío

¡Pedido recibido!

Tu orden fue registrada. Te contactaremos pronto por WhatsApp para coordinar el envío.

#000000

Finalizar compra
•••• •••• •••• ••••
Titular
NOMBRE APELLIDO
Vence
MM/AA
•••

Total a pagar $0

🔒 Pago seguro procesado por Mercado Pago.
Tu información está protegida.

Historial de Órdenes
No hay órdenes todavía.

Área de administración

Ingresá la contraseña para ver las órdenes

Contraseña incorrecta
Generando link de pago...
/* ══════════════════════════════════════════ CONFIG ══════════════════════════════════════════ */ const MP_PUBLIC_KEY = 'APP_USR-aaa2045f-68f9-4d67-9d75-08b184de6966'; const ADMIN_PASSWORD = 'devoto2024'; const STORE_EMAIL = '[email protected]'; /* ══════════════════════════════════════════ STOCK ══════════════════════════════════════════ */ const STOCK = { mBuzoCrema: {XS:1,S:1,M:1,L:1,XL:1,XXL:1}, mBuzoGris: {}, mBuzoMarron: {XL:1}, mBuzoJack: {L:1}, mBuzoPoloNegro: {S:1,L:2}, mSweaterGris: {S:2,XXL:1}, mBuzoVerde: {M:1,XL:1}, mRemeraNegra: {XL:1}, mRemeraRosa: {M:1,L:1}, mRemeraMarron: {S:1,L:2}, mRemeraCrema: {L:1,XL:1}, mRemeraMarronML: {M:1,L:1,XL:1}, mRemeraWednesday:{XS:2}, }; /* ══════════════════════════════════════════ CART ══════════════════════════════════════════ */ let cart = JSON.parse(localStorage.getItem('id_cart')||'[]'); let selectedPayMethod = 'mp'; function stockDisponible(id,size){ const s=STOCK[id]||{}; const used=cart.filter(i=>i.id===id&&i.size===size).reduce((a,i)=>a+i.qty,0); return (s[size]||0)-used; } function saveCart(){ localStorage.setItem('id_cart',JSON.stringify(cart)); } function showToast(msg,color='#2A6044'){ const t=document.createElement('div'); t.style.cssText=`position:fixed;top:1.4rem;left:50%;transform:translateX(-50%) translateY(-12px); background:${color};color:#fff;padding:.7rem 1.6rem;border-radius:100px; font-weight:700;font-size:.85rem;z-index:9999; box-shadow:0 8px 30px rgba(0,0,0,.2);transition:all .3s;white-space:nowrap;`; t.innerHTML=msg; document.body.appendChild(t); requestAnimationFrame(()=>{t.style.transform='translateX(-50%) translateY(0)';}); setTimeout(()=>{t.style.opacity='0';t.style.transform='translateX(-50%) translateY(-12px)';setTimeout(()=>t.remove(),350);},3000); } function updateCartUI(){ const total=cart.reduce((s,i)=>s+i.price*i.qty,0); const count=cart.reduce((s,i)=>s+i.qty,0); const badge=document.getElementById('cartBadge'); if(count>0){badge.style.display='flex';badge.textContent=count;} else{badge.style.display='none';} document.getElementById('cartTotal').textContent='$'+total.toLocaleString('es-AR'); const container=document.getElementById('cartItems'); const emptyEl=document.getElementById('cartEmpty'); const footEl=document.getElementById('cartFoot'); if(cart.length===0){ container.innerHTML='';emptyEl.style.display='flex'; container.appendChild(emptyEl);footEl.style.display='none';return; } emptyEl.style.display='none';footEl.style.display='block'; container.innerHTML=cart.map((item,idx)=>`
${item.name}
${item.name}
${item.brand} · Talle: ${item.size}
$${item.price.toLocaleString('es-AR')}
`).join(''); container.appendChild(emptyEl); } function openCart(){ document.getElementById('cartOverlay').classList.add('open'); document.getElementById('cartDrawer').classList.add('open'); document.body.style.overflow='hidden'; updateCartUI(); } function closeCart(){ document.getElementById('cartOverlay').classList.remove('open'); document.getElementById('cartDrawer').classList.remove('open'); document.body.style.overflow=''; } function removeFromCart(idx){ const r=cart[idx]; cart.splice(idx,1);saveCart();updateCartUI();refreshSzButtons(r.id); showToast(` ${r.name} · ${r.size} eliminado`,'#D95F2B'); } function selectSz(btn,modalId){ btn.closest('.sz-row').querySelectorAll('.sz-btn').forEach(b=>b.classList.remove('selected')); btn.classList.add('selected'); const size=btn.textContent.replace(/\d.*$/,'').trim(); const atcBtn=document.getElementById('atc-'+modalId); if(!atcBtn)return; const st=(STOCK[modalId]||{})[size]||0; if(st===0||stockDisponible(modalId,size)>0){ atcBtn.disabled=false;atcBtn.innerHTML=' Agregar al carrito'; }else{ atcBtn.disabled=true;atcBtn.innerHTML=' Sin stock disponible'; } } function refreshSzButtons(modalId){ const row=document.querySelector(`.sz-row[data-modal="${modalId}"]`); if(!row)return; row.querySelectorAll('.sz-btn').forEach(btn=>{ const size=btn.textContent.replace(/\d.*$/,'').trim(); const st=(STOCK[modalId]||{})[size]||0; if(st===0)return; const d=stockDisponible(modalId,size); btn.style.opacity=d<=0?'.35':'';btn.style.pointerEvents=d<=0?'none':''; }); } function addToCart(modalId,name,brand,price,img){ const row=document.querySelector(`.sz-row[data-modal="${modalId}"]`); const sel=row?row.querySelector('.sz-btn.selected'):null; if(!sel){showToast(' Seleccioná un talle','#E8A030');return;} const size=sel.textContent.replace(/\d.*$/,'').trim(); const st=(STOCK[modalId]||{})[size]||0; if(st>0&&stockDisponible(modalId,size)<=0){ showToast(' ¡Ya tenés la última unidad!','#D95F2B');return; } cart.push({id:modalId,name,brand,price,img,size,qty:1}); saveCart();updateCartUI();refreshSzButtons(modalId); const badge=document.getElementById('cartBadge'); badge.classList.add('bump');setTimeout(()=>badge.classList.remove('bump'),350); showToast(` ¡${name} · ${size} agregado!`); closeM(modalId);setTimeout(openCart,250); } /* ══════════════════════════════════════════ CHECKOUT ══════════════════════════════════════════ */ function openCheckout(){ if(cart.length===0)return; closeCart(); document.getElementById('ckSumItems').innerHTML=cart.map(item=>`
${item.name}
${item.name}
${item.brand} · Talle: ${item.size}
$${item.price.toLocaleString('es-AR')}
`).join(''); document.getElementById('ckTotalPrice').textContent='$'+cart.reduce((s,i)=>s+i.price*i.qty,0).toLocaleString('es-AR'); document.getElementById('ckForm').style.display='block'; document.getElementById('ckSuccess').classList.remove('show'); document.getElementById('ckPayBtn').className='ck-pay-btn mp'; document.getElementById('ckPayBtn').innerHTML=' Pagar con Mercado Pago'; if(document.getElementById('cardFormWrap')) document.getElementById('cardFormWrap').classList.remove('show'); document.getElementById('ckBg').classList.add('open'); document.body.style.overflow='hidden'; } function closeCk(){ document.getElementById('ckBg').classList.remove('open'); document.body.style.overflow=''; } function selectPay(label,method){ document.querySelectorAll('.pay-method').forEach(l=>l.classList.remove('selected')); label.classList.add('selected'); selectedPayMethod=method; const btn=document.getElementById('ckPayBtn'); const labels={mp:'Pagar con Mercado Pago',card:'Confirmar y pagar con tarjeta',cash:'Confirmar pedido (efectivo)'}; btn.innerHTML=` ${labels[method]}`; btn.className='ck-pay-btn '+method; const cf=document.getElementById('cardFormWrap'); if(cf) cf.classList.toggle('show',method==='card'); } /* ══════════════════════════════════════════ CARD FORM — 3D INTERACTIONS ══════════════════════════════════════════ */ function flipCard(toBack){ const c=document.getElementById('card3d'); if(c) c.classList.toggle('flipped',toBack); } function onCardNum(inp){ let v=inp.value.replace(/\D/g,'').substring(0,16); inp.value=v.replace(/(\d{4})(?=\d)/g,'$1 '); const disp=document.getElementById('cardNumDisp'); if(disp){ const padded=v.padEnd(16,'•'); disp.textContent=padded.replace(/(\d{4}|•{4})/g,'$1 ').trim(); } const net=document.getElementById('cardNetworkDisp'); if(net){ if(v.startsWith('4'))net.textContent='VISA'; else if(/^5[1-5]/.test(v)||/^2[2-7]/.test(v))net.textContent='MASTERCARD'; else if(/^3[47]/.test(v))net.textContent='AMEX'; else net.textContent=''; } inp.classList.toggle('valid',v.length>=15); } function onCardHolder(inp){ const disp=document.getElementById('cardHolderDisp'); if(disp)disp.textContent=inp.value.toUpperCase()||'NOMBRE APELLIDO'; } function onCardExp(inp){ let v=inp.value.replace(/\D/g,'').substring(0,4); if(v.length>=3)v=v.slice(0,2)+'/'+v.slice(2); inp.value=v; const disp=document.getElementById('cardExpDisp'); if(disp)disp.textContent=v||'MM/AA'; inp.classList.toggle('valid',v.length===5); } function onCardCvv(inp){ const disp=document.getElementById('cardCvvDisp'); if(disp)disp.textContent=inp.value.replace(/\D/g,'')||'•••'; } /* ══════════════════════════════════════════ PROCESO DE PAGO ══════════════════════════════════════════ */ async function procesarPago(){ const nombre=document.getElementById('ckNombre').value.trim(); const email=document.getElementById('ckEmail').value.trim(); const tel=document.getElementById('ckTel').value.trim(); const calle=document.getElementById('ckCalle').value.trim(); const barrio=document.getElementById('ckBarrio').value.trim(); if(!nombre||!email||!tel||!calle||!barrio){ showToast(' Completá todos los campos','#E8A030');return; } // Validate card fields if card selected if(selectedPayMethod==='card'){ const num=document.getElementById('cfNum')?document.getElementById('cfNum').value.replace(/\s/g,''):''; const holder=document.getElementById('cfHolder')?document.getElementById('cfHolder').value.trim():''; const exp=document.getElementById('cfExp')?document.getElementById('cfExp').value:''; const cvv=document.getElementById('cfCvv')?document.getElementById('cfCvv').value:''; if(num.length<15||!holder||exp.length<5||cvv.length<3){ showToast(' Completá todos los datos de la tarjeta','#E8A030');return; } } const btn=document.getElementById('ckPayBtn'); btn.disabled=true;btn.innerHTML=' Procesando...'; const total=cart.reduce((s,i)=>s+i.price*i.qty,0); const order={ id:'ORD-'+Date.now(), date:new Date().toLocaleString('es-AR'), status:selectedPayMethod==='mp'?'Pendiente MP':selectedPayMethod==='card'?'Pendiente tarjeta':'Efectivo / Acordar', payMethod:selectedPayMethod, customer:{nombre,email,tel}, address:{calle,depto:document.getElementById('ckDepto').value.trim(),cp:document.getElementById('ckCp').value.trim(),barrio}, items:[...cart], total }; if(selectedPayMethod==='card'){ order.cardLast4=document.getElementById('cfNum')?document.getElementById('cfNum').value.replace(/\s/g,'').slice(-4):''; } if(selectedPayMethod==='mp'){ closeCk(); btn.disabled=false; btn.innerHTML=' Pagar con Mercado Pago'; openMpModal(order,nombre,email); return; } // Card / Cash → save & show success saveOrder(order);saveMyOrder(order); sendEmailsViaNetlify(order); cart=[];saveCart();updateCartUI(); document.getElementById('ckForm').style.display='none'; document.getElementById('ckSuccess').classList.add('show'); document.getElementById('successOrderNum').textContent='#'+order.id.split('-')[1]; document.getElementById('successEmailMsg').textContent= `Te enviamos un resumen a ${email}. Te contactaremos por WhatsApp para coordinar el envío.`; btn.disabled=false; } /* ══════════════════════════════════════════ MERCADO PAGO CHECKOUT PRO ══════════════════════════════════════════ */ let currentMpOrder=null; async function openMpModal(order,nombre,email){ currentMpOrder=order; const bg=document.getElementById('mpModalBg'); bg.classList.add('open'); document.body.style.overflow='hidden'; document.getElementById('mpModalContent').innerHTML=`

Generando link de pago seguro...

`; try{ const res=await fetch('/.netlify/functions/create-preference',{ method:'POST', headers:{'Content-Type':'application/json'}, body:JSON.stringify({items:cart,orderId:order.id,payer:{name:nombre,email}}) }); if(!res.ok){ const err=await res.json().catch(()=>({})); throw new Error(err.error||'HTTP '+res.status); } const data=await res.json(); const total=cart.reduce((s,i)=>s+i.price*i.qty,0); const itemsHtml=cart.map(i=>`
${i.name} · ${i.size} $${i.price.toLocaleString('es-AR')}
`).join(''); document.getElementById('mpModalContent').innerHTML=`
Pago seguro con Mercado Pago
Resumen
${itemsHtml}
Total$${total.toLocaleString('es-AR')}
 Ir a pagar $${total.toLocaleString('es-AR')}
🔒 Podés pagar con tarjeta, débito, QR, Rapipago o Pago Fácil
`; saveOrder(order);saveMyOrder(order); sendEmailsViaNetlify(order); }catch(e){ console.error('MP error:',e); const total=cart.reduce((s,i)=>s+i.price*i.qty,0); document.getElementById('mpModalContent').innerHTML=`

Error al conectar

No se pudo generar el pago.
Detalle: ${e.message}

Coordinar pago por WhatsApp
`; } } function onMpLinkClick(){ localStorage.setItem('id_pending_order',JSON.stringify(currentMpOrder)); cart=[];saveCart();updateCartUI(); setTimeout(closeMpModal,400); } function closeMpModal(){ document.getElementById('mpModalBg').classList.remove('open'); document.body.style.overflow=''; } /* ══════════════════════════════════════════ EMAILS VIA NETLIFY ══════════════════════════════════════════ */ async function sendEmailsViaNetlify(order){ if(window.location.protocol==='file:'){console.log('Emails: modo local, skip');return;} try{ await fetch('/.netlify/functions/send-email',{ method:'POST',headers:{'Content-Type':'application/json'}, body:JSON.stringify({order,storeEmail:STORE_EMAIL}) }); }catch(e){console.warn('send-email:',e.message);} } /* ══════════════════════════════════════════ ORDERS — ADMIN ══════════════════════════════════════════ */ function saveOrder(order){ const orders=JSON.parse(localStorage.getItem('id_orders')||'[]'); if(!orders.find(o=>o.id===order.id))orders.unshift(order); localStorage.setItem('id_orders',JSON.stringify(orders)); } function saveMyOrder(order){ const mine=JSON.parse(localStorage.getItem('id_my_orders')||'[]'); if(!mine.find(o=>o.id===order.id))mine.unshift(order); localStorage.setItem('id_my_orders',JSON.stringify(mine)); } function openOrdersAdmin(){ document.getElementById('adminPwBg').classList.add('open'); document.getElementById('adminPwInput').value=''; document.getElementById('adminPwErr').style.display='none'; document.body.style.overflow='hidden'; setTimeout(()=>document.getElementById('adminPwInput').focus(),200); } function checkAdminPw(){ if(document.getElementById('adminPwInput').value===ADMIN_PASSWORD){ document.getElementById('adminPwBg').classList.remove('open'); openOrders(); }else{ document.getElementById('adminPwErr').style.display='block'; document.getElementById('adminPwInput').value=''; document.getElementById('adminPwInput').focus(); } } function openOrders(){ renderOrdersPanel(JSON.parse(localStorage.getItem('id_orders')||'[]')); document.getElementById('ordersPanelBg').classList.add('open'); document.body.style.overflow='hidden'; } function renderOrdersPanel(orders){ const body=document.getElementById('opBody'); if(orders.length===0){body.innerHTML='

No hay órdenes todavía.

';return;} const pl={mp:'Mercado Pago',card:'Tarjeta',cash:'Efectivo'}; body.innerHTML=orders.map((o,idx)=>{ const sc=o.payMethod==='cash'?'status-cash':o.status.toLowerCase().includes('aprobado')?'status-paid':'status-pending'; const iHtml=o.items.map(i=>`
${i.name} · ${i.size} $${i.price.toLocaleString('es-AR')}
`).join(''); const cardInfo=o.cardLast4?`
Tarjeta•••• ${o.cardLast4}
`:''; return `
${o.id} ${o.date}
${o.status}
Cliente${o.customer.nombre}
Email${o.customer.email}
Teléfono${o.customer.tel}
Pago${pl[o.payMethod]||o.payMethod}
${cardInfo}
Dirección${o.address.calle}${o.address.depto?' '+o.address.depto:''}, ${o.address.barrio}${o.address.cp?' (CP:'+o.address.cp+')':''}
${iHtml}
Total $${o.total.toLocaleString('es-AR')}
`; }).join(''); } function deleteOrder(idx){ if(!confirm('¿Eliminar esta orden?'))return; const orders=JSON.parse(localStorage.getItem('id_orders')||'[]'); const d=orders[idx]; if(d?.items)d.items.forEach(item=>{ if(STOCK[item.id]&&STOCK[item.id][item.size]!==undefined) STOCK[item.id][item.size]=(STOCK[item.id][item.size]||0)+item.qty; }); orders.splice(idx,1); localStorage.setItem('id_orders',JSON.stringify(orders)); renderOrdersPanel(orders); showToast(' Orden eliminada y stock restaurado'); } function clearAllOrders(){ if(!confirm('¿Eliminar TODAS las órdenes?'))return; localStorage.removeItem('id_orders'); renderOrdersPanel([]); showToast(' Historial borrado','#D95F2B'); } function closeOrders(){ document.getElementById('ordersPanelBg').classList.remove('open'); document.body.style.overflow=''; } /* ══════════════════════════════════════════ MP RETURN HANDLER ══════════════════════════════════════════ */ (function checkMPReturn(){ const p=new URLSearchParams(window.location.search); const status=p.get('status')||p.get('collection_status'); if(!status)return; const pending=localStorage.getItem('id_pending_order'); if(status==='approved'){ if(pending){ const o=JSON.parse(pending);o.status='Pago aprobado ✓'; saveOrder(o);saveMyOrder(o);sendEmailsViaNetlify(o); localStorage.removeItem('id_pending_order'); } cart=[];saveCart();updateCartUI(); showToast(' ¡Pago aprobado! Gracias por tu compra.'); }else if(status==='failure'){ showToast(' El pago fue rechazado. Intentá de nuevo.','#D95F2B'); }else if(status==='pending'){ if(pending){ const o=JSON.parse(pending);o.status='Pago pendiente...'; saveOrder(o);saveMyOrder(o);localStorage.removeItem('id_pending_order'); } showToast(' Pago pendiente de acreditación.','#E8A030'); } window.history.replaceState({},'',window.location.pathname); })(); /* ══════════════════════════════════════════ NAV / MODALS / CAROUSEL / FILTER / REVEAL ══════════════════════════════════════════ */ document.getElementById('mob-btn').addEventListener('click',()=>{ const m=document.getElementById('mob-menu'); m.style.display=m.style.display==='flex'?'none':'flex'; }); window.addEventListener('scroll',()=>{ document.getElementById('main-header').classList.toggle('scrolled',window.scrollY>10); }); function openM(id){ document.getElementById(id).classList.add('open'); document.body.style.overflow='hidden'; carGo(id,0); } function closeM(id){ document.getElementById(id).classList.remove('open'); document.body.style.overflow=''; } document.querySelectorAll('.modal-bg').forEach(bg=>{ bg.addEventListener('click',e=>{if(e.target===bg)closeM(bg.id);}); }); document.addEventListener('keydown',e=>{ if(e.key==='Escape'){ document.querySelectorAll('.modal-bg.open').forEach(m=>closeM(m.id)); ['mpModalBg','ckBg','adminPwBg','ordersPanelBg'].forEach(id=>{ const el=document.getElementById(id); if(el&&el.classList.contains('open')){el.classList.remove('open');document.body.style.overflow='';} }); } }); const carState={}; function carGo(id,idx){ const track=document.getElementById('car-'+id); if(!track)return; const slides=track.querySelectorAll('.m-carousel-slide'); if(idx<0)idx=slides.length-1;if(idx>=slides.length)idx=0; carState[id]=idx; track.style.transform=`translateX(-${idx*100}%)`; const dots=document.getElementById('dots-'+id); if(dots)dots.querySelectorAll('.c-dot').forEach((d,i)=>d.classList.toggle('active',i===idx)); } function carNext(id){carGo(id,(carState[id]||0)+1);} function carPrev(id){carGo(id,(carState[id]||0)-1);} document.querySelectorAll('.m-carousel').forEach(car=>{ let sx=0; car.addEventListener('touchstart',e=>{sx=e.touches[0].clientX;},{passive:true}); car.addEventListener('touchend',e=>{ const dx=e.changedTouches[0].clientX-sx; const id=car.closest('.modal-bg').id; if(Math.abs(dx)>40){dx<0?carNext(id):carPrev(id);} },{passive:true}); }); document.querySelectorAll('.filter-bar').forEach(bar=>{ const isR=bar.id==='remeraFilter'; const gId=isR?'remeraGrid':'buzoGrid'; bar.querySelectorAll('.filter-btn').forEach(btn=>{ btn.addEventListener('click',()=>{ bar.querySelectorAll('.filter-btn').forEach(b=>b.classList.remove('active')); btn.classList.add('active'); const sz=btn.dataset.size; document.getElementById(gId).querySelectorAll('.card').forEach(card=>{ const szs=(card.dataset.sizes||'').split(' '); card.style.display=(sz==='all'||szs.includes(sz))?'':'none'; }); }); }); }); const observer=new IntersectionObserver(entries=>{ entries.forEach(e=>{if(e.isIntersecting)e.target.classList.add('visible');}); },{threshold:0.06,rootMargin:'0px 0px -30px 0px'}); document.querySelectorAll('.reveal').forEach(el=>observer