diff --git a/modules/rdocs/components/folk-docs-app.ts b/modules/rdocs/components/folk-docs-app.ts index 6ddb0d89..04d58a31 100644 --- a/modules/rdocs/components/folk-docs-app.ts +++ b/modules/rdocs/components/folk-docs-app.ts @@ -319,7 +319,46 @@ class FolkDocsApp extends HTMLElement { // ── Demo data ── + private static readonly DEMO_STORAGE_KEY = 'rdocs_demo_data'; + private _demoSaveTimer: ReturnType | null = null; + + /** Debounce-save demo notebooks to localStorage (500ms). */ + private saveDemoState() { + if (this._demoSaveTimer) clearTimeout(this._demoSaveTimer); + this._demoSaveTimer = setTimeout(() => { + try { + const serializable = this.demoNotebooks.map(nb => ({ + id: nb.id, title: nb.title, description: nb.description, + cover_color: nb.cover_color, note_count: nb.note_count, + updated_at: nb.updated_at, notes: nb.notes, + })); + localStorage.setItem(FolkDocsApp.DEMO_STORAGE_KEY, JSON.stringify(serializable)); + } catch { /* localStorage full or unavailable */ } + }, 500); + } + private loadDemoData() { + // Try restoring from localStorage first + try { + const saved = localStorage.getItem(FolkDocsApp.DEMO_STORAGE_KEY); + if (saved) { + const parsed = JSON.parse(saved); + if (Array.isArray(parsed) && parsed.length > 0) { + this.demoNotebooks = parsed; + this.notebooks = this.demoNotebooks.map(({ notes, ...nb }: any) => nb as Notebook); + for (const nb of this.demoNotebooks) { + this.notebookNotes.set(nb.id, nb.notes); + } + if (this.demoNotebooks.length > 0) { + this.expandedNotebooks.add(this.demoNotebooks[0].id); + } + this.loading = false; + this.render(); + return; + } + } + } catch { /* corrupt data — fall through to defaults */ } + const now = Date.now(); const hour = 3600000; const day = 86400000; @@ -483,6 +522,7 @@ Gear: EUR 400 (10%)

Maya is tracking expenses in rF } this.loading = false; this.render(); + this.saveDemoState(); // persist initial state } private demoSearchNotes(query: string) { @@ -549,6 +589,7 @@ Gear: EUR 400 (10%)

Maya is tracking expenses in rF this.renderNav(); this.renderMeta(); this.mountEditor(newNote); + this.saveDemoState(); } private demoCreateNote(opts: CreateNoteOpts = {}) { @@ -584,6 +625,7 @@ Gear: EUR 400 (10%)

Maya is tracking expenses in rF this.renderNav(); this.renderMeta(); this.mountEditor(newNote); + this.saveDemoState(); } // ── Mobile stack navigation ── @@ -3520,6 +3562,7 @@ Gear: EUR 400 (10%)

Maya is tracking expenses in rF note.updated_at = new Date().toISOString(); } } + this.saveDemoState(); } // ── Import/Export Dialog ──