${fmtPrice(price)} • ${item.durationMinutes||60} min
${row.options && row.options.length ? `
Options: ${row.options.join(', ')}
`:''}
`;
list.appendChild(div);
});
$('#cartSubtotal').textContent = fmtPrice(subtotal);
list.onclick = (e)=>{
const rm = e.target.closest('button[data-rm]');
const inc = e.target.closest('button[data-inc]');
const dec = e.target.closest('button[data-dec]');
if(rm){ removeFromCart(Number(rm.dataset.rm)); return; }
if(inc){ const i=Number(inc.dataset.inc); cart[i].qty=(cart[i].qty||1)+1; localStorage.setItem('lc_cart', JSON.stringify(cart)); renderCart(); setCounters(); }
if(dec){ const i=Number(dec.dataset.dec); cart[i].qty=Math.max(1,(cart[i].qty||1)-1); localStorage.setItem('lc_cart', JSON.stringify(cart)); renderCart(); setCounters(); }
};
list.onchange = (e)=>{
const qty = e.target.closest('input[data-qty]');
if(qty){ const i=Number(qty.dataset.qty); cart[i].qty=Math.max(1, Number(qty.value)||1); localStorage.setItem('lc_cart', JSON.stringify(cart)); renderCart(); setCounters(); }
}
}
function renderFavs(){
const wrap = $('#favList');
wrap.innerHTML = '';
const ids = new Set(favs);
state.data.filter(i=>ids.has(i.id)).forEach(item=>{
const card = document.createElement('div');
const imgSrc = item.thumbnail || (item.images&&item.images[0]) || "./images/placeholder_silky_gradient_soft_lighting_camera_lens_blur_minimalist_background.jpg";
card.className = "rounded-xl border border-neutral-200 dark:border-neutral-800 p-3 flex gap-3";
card.innerHTML = `
Impossible de charger le catalogue
Vérifiez le fichier ./catalog.json
`;
}
document.addEventListener('keydown', (e)=>{
if(e.key==='Escape'){ closeModal(); openCart(false); openFav(false); }
});
}
bootstrap();