diff --git a/ts/src/browser.ts b/ts/src/browser.ts index bddef1b..ec3a771 100644 --- a/ts/src/browser.ts +++ b/ts/src/browser.ts @@ -112,10 +112,38 @@ function showConfirm( }); } +// --- Persistence ------------------------------------------------------------- +const STORAGE_KEY = "monodisplay_autosave"; + +function saveToStorage() { + try { + const buf = file.toBuffer(); + const b64 = btoa(String.fromCharCode(...buf)); + localStorage.setItem(STORAGE_KEY, JSON.stringify({ filename: currentFilename, data: b64 })); + } catch {} +} + +function loadFromStorage() { + try { + const raw = localStorage.getItem(STORAGE_KEY); + if (!raw) return; + const { filename, data } = JSON.parse(raw); + const bytes = Uint8Array.from(atob(data), c => c.charCodeAt(0)); + const parsed = new MonoDisplay.MonoDisplayParser().parse(bytes.buffer); + file = new MonoDisplayFile(parsed.sections); + currentFilename = filename; + const filenameEl = document.getElementById("filename"); + if (filenameEl) filenameEl.textContent = filename; + isDirty = true; + document.getElementById("filename")?.classList.add("dirty"); + } catch {} +} + // --- Dirty tracking ---------------------------------------------------------- function markDirty() { isDirty = true; document.getElementById("filename")?.classList.add("dirty"); + saveToStorage(); } function markClean() { isDirty = false; @@ -797,4 +825,5 @@ window.addEventListener("beforeunload", (e) => { if (isDirty) e.preventDefault(); }); +loadFromStorage(); triggerPreview();