// === HELPER FUNCTIONS === function getName(t) { return state.lang === "en" ? (t.name_en || t.name_es || t.ref) : state.lang === "ch" ? (t.name_ch || t.name_en || t.name_es || t.ref) : (t.name_es || t.name_en || t.ref); } function getImg(t) { return t.img_thumb_url || t.img_url || ""; } function getFullImg(t) { return t.img_url || t.img_thumb_url || ""; } function filterTags() { let f = [...state.tags]; // Search filter if (state.search) { const q = state.search.toLowerCase(); f = f.filter(t => (t.ref||"").toLowerCase().includes(q) || (t.name_es||"").toLowerCase().includes(q) || (t.name_en||"").toLowerCase().includes(q) || (t.mrf||"").toLowerCase().includes(q) ); } // Group filter if (state.group !== "all") { f = f.filter(t => t.set_hst === state.group); } // Library filter if (state.library !== "all" && state.libraryMembers.size) { f = f.filter(t => state.libraryMembers.has(t.mrf)); } return f; } function toast(msg) { const t = document.getElementById("toast"); t.textContent = msg; t.classList.add("show"); setTimeout(() => t.classList.remove("show"), 2500); } function copyMrf(mrf) { navigator.clipboard.writeText(mrf).then(() => toast(`Copiado: ${mrf.slice(0,16)}...`)); } function closeDetail() { document.getElementById("right-panel").classList.remove("open"); state.selectedTag = null; } function toggleSel(mrf) { state.selected.has(mrf) ? state.selected.delete(mrf) : state.selected.add(mrf); updateSelCount(); renderView(); } function updateSelCount() { document.getElementById("sel-count").textContent = state.selected.size ? `(${state.selected.size})` : ""; } function clearSelection() { state.selected.clear(); state.selectionMode = false; document.getElementById("btn-sel").classList.remove("active"); updateSelCount(); }