try{ gearState = JSON.parse(localStorage.getItem(GEARKEY) || "{}") || {}; }catch(e){ gearState = {}; }function saveGear(){ try{ localStorage.setItem(GEARKEY, JSON.stringify(gearState)); }catch(e){} } function renderGear(){ const grid = document.getElementById("gear-grid"); grid.textContent = ""; let total = 0, done = 0; GEAR.forEach(g=>{ const card = el("div","gear-group"); card.appendChild(el("h3", null, g.group)); g.items.forEach(it=>{ total++; const lab = document.createElement("label"); lab.className = "item"; const cb = document.createElement("input"); cb.type = "checkbox"; cb.checked = !!gearState[it.id]; if(cb.checked) done++; cb.addEventListener("change", ()=>{ gearState[it.id] = cb.checked; saveGear(); updateCount(); lab.classList.toggle("done", cb.checked); }); lab.appendChild(cb); lab.appendChild(el("span","box")); const txt = el("span","txt"); txt.appendChild(el("b", null, it.name)); txt.appendChild(el("small", it.warn ? "warn" : null, it.note)); lab.appendChild(txt); card.appendChild(lab); }); grid.appendChild(card); }); function updateCount(){ const n = GEAR.reduce((a,g)=> a + g.items.filter(i=>gearState[i.id]).length, 0); document.getElementById("gear-count").textContent = n + " / " + total; } updateCount();}renderGear(); const lb = document.getElementById("lightbox");const lbImg = document.getElementById("lbimg");const lbCap = document.getElementById("lbcap");function openBox(src, cap){ lbImg.src = src; lbImg.alt = cap; lbCap.textContent = cap; if(typeof lb.showModal === "function") lb.showModal(); else lb.setAttribute("open","");}function closeBox(){ if(typeof lb.close === "function") lb.close(); else lb.removeAttribute("open");}document.getElementById("lbclose").addEventListener("click", closeBox);lb.addEventListener("click", (e)=>{ if(e.target === lb || e.target === lbImg) closeBox(); }); document.getElementById("reset").addEventListener("click", ()=>{ DATA.forEach(d=>{ state[d.id] = {start:d.start, mins:d.legs.map(l=>l.min)}; }); save(); render();}); document.addEventListener("input", (e)=>{ const id = e.target && e.target.dataset && e.target.dataset.idx; if(!id) return; const next = document.querySelector('.dur input[data-idx="' + id + '"]'); if(next && next !== e.target){ next.focus(); const v = next.value; next.value = ""; next.value = v; }}); render();