Slides
+ New Slide Duplicate Delete Print / PDF Export HTML
● Saved in browser
1 / 5 |
`; const blob = new Blob([htmlContent], { type: "text/html;charset=utf-8;" }); const url = URL.createObjectURL(blob); const a = document.createElement("a"); a.href = url; a.download = title + ".html"; a.click(); URL.revokeObjectURL(url); } function escapeHtml(str){ if(!str) return ""; return str.replace(/&/g, "&").replace(//g, ">").replace(/"/g, """); } // Vault Persistence function getSlidesVault(){ try { return JSON.parse(localStorage.getItem("rahmanov_slides_vault") || "[]"); } catch(e){ return []; } } function saveDeckToVault(deck){ const vault = getSlidesVault(); const idx = vault.findIndex(d => d.id === deck.id); if(idx >= 0){ vault[idx] = deck; } else { vault.unshift(deck); } localStorage.setItem("rahmanov_slides_vault", JSON.stringify(vault)); } let saveTimeout = null; function triggerAutoSave(){ saveBadge.textContent = "○ Saving..."; saveBadge.style.color = "var(--ink-faint)"; clearTimeout(saveTimeout); saveTimeout = setTimeout(() => { const deck = { id: deckId, title: titleInput.value.trim() || "Untitled Presentation", theme: deckTheme, slides, updatedAt: Date.now() }; saveDeckToVault(deck); document.title = deck.title + " - Obscura Slides"; saveBadge.textContent = "● Saved in browser"; saveBadge.style.color = "var(--good)"; }, 400); } titleInput.addEventListener("input", triggerAutoSave); initSlides();