From c4bd427eff03582cb20d387135f87e715e5cfca1 Mon Sep 17 00:00:00 2001 From: flop Date: Fri, 22 May 2026 18:04:00 +0200 Subject: [PATCH] feat: session persistence --- ts/src/browser.ts | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) 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();