Notes
GPT 5.6 Luna Pro · typescript

Reviews & generation details
Reviews
No human review yet. Unreviewed does not mean unsuccessful.
Generation context
Imported historical artifact. Its exact original instructions and lineage are not known.
Generation prompt · exact text unavailable
See the current prompt for reference. It may differ from the instructions used to generate this artifact.
Inspect original source 24,048 bytes · SHA-256 90c0607e44a1
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Lumen Notes</title>
<style>
/* ── css: base ── */
*{box-sizing:border-box} :root{--bg:#f8f7f3;--panel:#fffefa;--panel2:#f2f0ea;--line:#e6e2d9;--text:#292a27;--muted:#85847d;--accent:#6d63d9;--accent2:#eeeaff;--warm:#c88654;--shadow:0 12px 40px #342d2410;font-family:Inter,ui-sans-serif,system-ui,-apple-system,sans-serif}body{margin:0;background:var(--bg);color:var(--text);height:100vh;overflow:hidden}button,input,select{font:inherit;color:inherit}button{border:0;background:none;cursor:pointer}button:focus-visible,input:focus-visible,.content:focus-visible{outline:2px solid #8c82eb;outline-offset:2px}#app{display:flex;height:100vh}.dark{--bg:#1d1e22;--panel:#25262b;--panel2:#303138;--line:#3b3c43;--text:#eeece8;--muted:#9a9aa2;--accent:#a59bff;--accent2:#35314d;--shadow:0 12px 40px #0004}#sidebar{width:248px;background:var(--panel2);border-right:1px solid var(--line);padding:22px 14px 16px;display:flex;flex-direction:column;flex-shrink:0;transition:width .25s,padding .25s;overflow:hidden}#sidebar.collapsed{width:68px;padding:22px 10px}.brand{display:flex;align-items:center;gap:10px;padding:0 8px 25px}.brand-mark{height:31px;width:31px;background:var(--accent);color:white;border-radius:10px;display:grid;place-items:center;font-size:18px;box-shadow:0 5px 14px #6d63d955}.brand strong{display:block;font-size:15px;letter-spacing:.2px}.brand span{display:block;font-size:11px;color:var(--muted);letter-spacing:1.5px;text-transform:uppercase}.icon-btn{color:var(--muted);font-size:20px;padding:5px;border-radius:8px}.icon-btn:hover,.tool-btn:hover{background:var(--line);color:var(--text)}#collapseBtn{margin-left:auto}.collapsed .brand>div:not(.brand-mark),.collapsed .sidebar-actions button:first-child,.collapsed .nav-item span,.collapsed .nav-item em,.collapsed .section-label,.collapsed #notebooks,.collapsed .sidebar-foot span:not(.avatar){display:none}.collapsed .brand{padding:0 3px 25px}.sidebar-actions{display:flex;gap:7px;margin:0 2px 24px}.ghost-btn,.primary-btn{border-radius:9px;padding:9px 13px;font-weight:600;font-size:13px}.ghost-btn{background:var(--panel);border:1px solid var(--line);flex:1;text-align:left}.ghost-btn:hover{border-color:var(--accent);color:var(--accent)}.primary-btn{background:var(--accent);color:white;box-shadow:0 4px 12px #6d63d933}.primary-btn:hover{filter:brightness(1.06);transform:translateY(-1px)}.nav-item,.book-item{width:100%;display:flex;align-items:center;gap:10px;text-align:left;padding:9px 10px;border-radius:8px;color:var(--muted);font-size:13px;margin:2px 0}.nav-item:hover,.book-item:hover{background:var(--line);color:var(--text)}.nav-item.active,.book-item.active{background:var(--accent2);color:var(--accent);font-weight:600}.nav-item em{margin-left:auto;font-style:normal;font-size:11px}.section-label{font-size:10px;color:var(--muted);letter-spacing:1.5px;margin:25px 10px 9px;display:flex;justify-content:space-between}.tiny-btn{font-size:15px;color:var(--muted)}#notebooks{overflow:auto}.book-item{position:relative}.book-item .book-actions{margin-left:auto;display:none}.book-item:hover .book-actions{display:block}.sidebar-foot{margin-top:auto;display:flex;align-items:center;gap:8px;color:var(--muted);font-size:11px;padding:15px 8px 0;border-top:1px solid var(--line)}.avatar{background:#e7b98f;color:#72472c;border-radius:50%;width:25px;height:25px;display:grid;place-items:center;font-size:9px;font-weight:700}.status-dot{width:6px;height:6px;background:#65b77a;border-radius:50%;margin-left:auto}#listPane{width:320px;border-right:1px solid var(--line);background:var(--panel);display:flex;flex-direction:column;min-width:250px}.list-head{padding:28px 22px 18px;display:flex;align-items:end;justify-content:space-between}.eyebrow{font-size:10px;letter-spacing:1.6px;color:var(--accent);font-weight:700;margin-bottom:6px}h1{font-size:25px;letter-spacing:-.7px;margin:0}.list-head .primary-btn{padding:8px 10px}.list-tools{display:flex;gap:8px;padding:0 18px 16px;border-bottom:1px solid var(--line)}.search{background:var(--panel2);border-radius:8px;display:flex;align-items:center;gap:7px;padding:7px 9px;flex:1;color:var(--muted)}.search input{border:0;outline:0;background:none;width:100%;font-size:12px}.list-tools select{border:1px solid var(--line);background:var(--panel);border-radius:8px;font-size:11px;padding:0 4px;color:var(--muted)}#tagBar{padding:8px 18px 0;display:flex;gap:5px;flex-wrap:wrap}.tag-chip{font-size:10px;color:var(--accent);background:var(--accent2);border-radius:20px;padding:4px 8px}.tag-chip.active{background:var(--accent);color:white}.note-card{padding:15px 20px;border-bottom:1px solid var(--line);cursor:pointer;transition:background .15s}.note-card:hover{background:var(--panel2)}.note-card.selected{background:var(--accent2);border-left:3px solid var(--accent);padding-left:17px}.note-card h3{margin:0 0 6px;font-size:14px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.note-card p{margin:0;color:var(--muted);font-size:12px;line-height:1.45;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.note-info{display:flex;justify-content:space-between;color:var(--muted);font-size:10px;margin-top:10px}.pin{color:var(--warm)}#noteList{overflow:auto;flex:1}.no-notes{text-align:center;color:var(--muted);font-size:12px;padding:50px 25px}#editorPane{flex:1;min-width:420px;background:var(--panel);overflow:auto}.editor-top{display:flex;justify-content:space-between;align-items:center;padding:22px 48px 0;color:#66a576;font-size:11px}.editor-actions{display:flex;gap:3px}.tool-btn{color:var(--muted);font-size:16px;border-radius:7px;padding:6px 8px}.tool-btn.danger:hover{color:#d56c6c}.title-input{display:block;width:calc(100% - 96px);margin:22px 48px 5px;border:0;background:transparent;font-size:36px;font-weight:700;letter-spacing:-1.4px;outline:0}.title-input::placeholder{color:var(--muted)}.meta-row{margin:0 48px 22px;display:flex;align-items:center;gap:10px;color:var(--muted);font-size:11px}.meta-row #tags{display:flex;gap:5px}.tag-add{font-size:11px;color:var(--muted);border:1px dashed var(--line);padding:3px 7px;border-radius:5px}.tag-add:hover{color:var(--accent);border-color:var(--accent)}.toolbar{margin:0 48px;border-top:1px solid var(--line);border-bottom:1px solid var(--line);padding:8px 0;display:flex;gap:2px;align-items:center;position:sticky;top:0;background:var(--panel);z-index:2}.toolbar button{font-size:12px;color:var(--muted);border-radius:5px;padding:5px 7px}.toolbar button:hover,.toolbar button.active{background:var(--accent2);color:var(--accent)}.divider{height:18px;width:1px;background:var(--line);margin:0 5px}.content{max-width:780px;margin:30px 48px 100px;min-height:400px;font-family:Georgia,serif;font-size:17px;line-height:1.75;outline:0}.content:empty:before{content:'Start writing your thoughts...';color:var(--muted);opacity:.6}.content h1{font-size:29px;margin:20px 0 8px}.content h2{font-size:24px;margin:18px 0 6px}.content h3{font-size:20px;margin:15px 0 5px}.content blockquote{border-left:3px solid var(--accent);margin-left:0;padding-left:18px;color:var(--muted);font-style:italic}.content code{background:var(--panel2);border-radius:4px;padding:2px 5px;font-family:monospace;font-size:.85em}.check-line{list-style:none}.check-line input{margin-right:9px;accent-color:var(--accent)}#emptyState{height:100%;display:grid;place-content:center;text-align:center;color:var(--muted)}.empty-icon{font-size:36px;color:var(--accent);margin-bottom:10px}.empty-state h2{color:var(--text)}#emptyState h2{color:var(--text);margin:0 0 7px}#emptyState p{margin:0 0 20px;font-size:13px}.dark .brand-mark{box-shadow:none}@media(max-width:800px){#sidebar{width:190px}#listPane{width:270px}.editor-top,.title-input,.meta-row,.toolbar{margin-left:25px;margin-right:25px}.title-input{width:calc(100% - 50px);font-size:30px}.content{margin-left:25px;margin-right:25px}.toolbar{flex-wrap:wrap}}
</style>
</head>
<body>
<div id="app"><aside id="sidebar"><div class="brand"><div class="brand-mark">✦</div><div><strong>Lumen</strong><span>Notes</span></div><button id="collapseBtn" class="icon-btn" title="Collapse sidebar">‹</button></div><div class="sidebar-actions"><button id="newNotebookBtn" class="ghost-btn">+ Notebook</button><button id="themeBtn" class="icon-btn" title="Toggle theme">☼</button></div><nav id="nav"><button class="nav-item active" data-view="all">◫ <span>All notes</span><em id="allCount"></em></button><button class="nav-item" data-view="trash">♧ <span>Trash</span><em id="trashCount"></em></button></nav><div class="section-label">NOTEBOOKS <button id="addNotebook" class="tiny-btn">+</button></div><div id="notebooks"></div><div class="sidebar-foot"><span class="avatar">LM</span><span>Local workspace</span><span class="status-dot"></span></div></aside><section id="listPane"><header class="list-head"><div><div class="eyebrow">YOUR SPACE</div><h1 id="viewTitle">All notes</h1></div><button id="newNoteBtn" class="primary-btn">+ New note</button></header><div class="list-tools"><label class="search"><span>⌕</span><input id="searchInput" placeholder="Search notes..." autocomplete="off"></label><select id="sortSelect"><option value="modified">Recently edited</option><option value="created">Recently created</option><option value="alpha">Alphabetical</option></select></div><div id="tagBar"></div><div id="noteList"></div></section><main id="editorPane"><div id="emptyState"><div class="empty-icon">✦</div><h2>Select or create a note</h2><p>Your ideas deserve a little room to glow.</p><button id="emptyNewBtn" class="primary-btn">Create a note</button></div><article id="editor" hidden=""><div class="editor-top"><span id="saveState">Saved</span><div class="editor-actions"><button id="pinBtn" class="tool-btn" title="Pin note">☆</button><button id="duplicateBtn" class="tool-btn" title="Duplicate">⧉</button><button id="moveBtn" class="tool-btn" title="Move note">↗</button><button id="deleteBtn" class="tool-btn danger" title="Move to trash">⌫</button></div></div><input id="titleInput" class="title-input" placeholder="Untitled note"><div class="meta-row"><span id="noteDate"></span><div id="tags"></div><button id="addTagBtn" class="tag-add">+ tag</button></div><div class="toolbar" id="toolbar"><button data-cmd="bold"><b>B</b></button><button data-cmd="italic"><i>I</i></button><button data-cmd="underline"><u>U</u></button><button data-cmd="strikeThrough"><s>S</s></button><i class="divider"></i><button data-cmd="formatBlock" data-value="h1">H1</button><button data-cmd="formatBlock" data-value="h2">H2</button><button data-cmd="formatBlock" data-value="h3">H3</button><i class="divider"></i><button data-cmd="insertUnorderedList">• list</button><button data-cmd="insertOrderedList">1. list</button><button id="checkBtn">☑ check</button><button data-cmd="formatBlock" data-value="blockquote">❝</button><button id="hrBtn">―</button><button data-cmd="removeFormat">Tx</button></div><div id="content" class="content" contenteditable="true" spellcheck="true"></div></article></main></div>
<script>
(function () {
'use strict';
var __mods = {};
var __cache = {};
var __map = {};
function __require(id) {
if (__cache[id]) return __cache[id].exports;
var module = __cache[id] = { exports: {} };
var factory = __mods[id];
if (!factory) throw new Error("Module not found: " + id);
factory(module.exports, function (spec) {
var target = (__map[id] && __map[id][spec]) || spec;
return __require(target);
}, module);
return module.exports;
}
// ── module: src/main.ts ──
__mods["src/main.ts"] = function (exports, require, module) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const KEY = 'lumen-notes-v1';
const CFG = { debounce: 500, snippet: 125 };
const $ = (s) => document.querySelector(s);
const uid = () => Math.random().toString(36).slice(2, 9) + Date.now().toString(36);
const seed = () => { const b = { id: uid(), name: 'Personal' }; const n = { id: uid(), notebookId: b.id, title: 'Welcome to Lumen', html: '<h1>A calmer place for your thoughts</h1><p>Lumen is your quiet corner for ideas, plans, and everything in between.</p><blockquote>Make space for what matters.</blockquote><ul><li>Try the formatting toolbar</li><li>Pin notes you return to often</li></ul>', created: Date.now() - 86400000, updated: Date.now(), pinned: true, tags: ['welcome'], deleted: false }; return { books: [b], notes: [n], view: 'all', selected: n.id, sort: 'modified', theme: 'light', collapsed: false }; };
let model;
try {
model = JSON.parse(localStorage.getItem(KEY) || '');
if (!model.books)
throw 0;
}
catch {
model = seed();
}
;
const save = () => { localStorage.setItem(KEY, JSON.stringify(model)); window.dispatchEvent(new CustomEvent('lumen-model', { detail: model })); };
window.lumenModel = model;
const text = (html) => { const d = document.createElement('div'); d.innerHTML = html; return d.textContent || ''; };
const esc = (s) => s.replace(/[&<>"']/g, c => ({ '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }[c]));
const fmt = (t) => { const d = new Date(t), now = new Date(); if (d.toDateString() === now.toDateString())
return d.toLocaleTimeString([], { hour: 'numeric', minute: '2-digit' }); return d.toLocaleDateString([], { month: 'short', day: 'numeric' }); };
const current = () => model.notes.find(n => n.id === model.selected && !n.deleted);
let saveTimer;
function schedule() { $('#saveState').textContent = 'Saving…'; clearTimeout(saveTimer); saveTimer = window.setTimeout(() => { save(); $('#saveState').textContent = 'Saved'; }, CFG.debounce); }
function renderBooks() { const box = $('#notebooks'); box.innerHTML = model.books.map(b => `<button class="book-item ${model.view === b.id ? 'active' : ''}" data-book="${b.id}">▱ <span>${esc(b.name)}</span><em>${model.notes.filter(n => n.notebookId === b.id && !n.deleted).length}</em></button>`).join(''); }
function renderList() {
let arr = model.notes.filter(n => !n.deleted);
if (model.view === 'trash')
arr = model.notes.filter(n => n.deleted);
else if (model.view !== 'all')
arr = arr.filter(n => n.notebookId === model.view);
const q = $('#searchInput').value.trim().toLowerCase();
if (q)
arr = arr.filter(n => (n.title + ' ' + text(n.html) + ' ' + n.tags.join(' ')).toLowerCase().includes(q));
const tag = window.activeTag;
if (tag)
arr = arr.filter(n => n.tags.includes(tag));
arr.sort((a, b) => Number(b.pinned) - Number(a.pinned) || (model.sort === 'alpha' ? a.title.localeCompare(b.title) : model.sort === 'created' ? b.created - a.created : b.updated - a.updated));
$('#noteList').innerHTML = arr.length ? arr.map(n => { const sn = esc(text(n.html).slice(0, CFG.snippet)); return `<div class="note-card ${n.id === model.selected ? 'selected' : ''}" data-note="${n.id}"><h3>${n.pinned ? '<span class="pin">★ </span>' : ''}${esc(n.title || 'Untitled')}</h3><p>${sn || 'No additional text'}</p><div class="note-info"><span>${fmt(n.updated)}</span><span>${n.tags.map(t => `#${esc(t)}`).join(' ')}</span></div></div>`; }).join('') : '<div class="no-notes">No notes here yet.<br><br>Start with a fresh thought.</div>';
$('#allCount').textContent = String(model.notes.filter(n => !n.deleted).length);
$('#trashCount').textContent = String(model.notes.filter(n => n.deleted).length);
const title = model.view === 'trash' ? 'Trash' : model.view === 'all' ? 'All notes' : model.books.find(b => b.id === model.view)?.name || 'Notes';
$('#viewTitle').textContent = title;
renderTags();
}
function renderTags() { const tags = [...new Set(model.notes.filter(n => !n.deleted).flatMap(n => n.tags))]; const active = window.activeTag; $('#tagBar').innerHTML = tags.map(t => `<button class="tag-chip ${active === t ? 'active' : ''}" data-tag="${esc(t)}">#${esc(t)}</button>`).join(''); }
function renderEditor() { const n = current(); $('#emptyState').toggleAttribute('hidden', !!n); $('#editor').toggleAttribute('hidden', !n); if (!n)
return; $('#titleInput').value = n.title; $('#content').innerHTML = n.html; $('#noteDate').textContent = 'Edited ' + fmt(n.updated); $('#pinBtn').textContent = n.pinned ? '★' : '☆'; $('#tags').innerHTML = n.tags.map(t => `<span class="tag-chip">#${esc(t)}</span>`).join(''); }
function render() { document.body.classList.toggle('dark', model.theme === 'dark'); $('#sidebar').classList.toggle('collapsed', model.collapsed); renderBooks(); renderList(); renderEditor(); window.lumenModel = model; }
function sanitize(html) { const d = document.createElement('div'); d.innerHTML = html; d.querySelectorAll('script,style,iframe,object,embed').forEach(x => x.remove()); d.querySelectorAll('*').forEach(el => { [...el.attributes].forEach(a => { if (a.name.startsWith('on') || a.name === 'style' || a.name === 'class' && el.tagName !== 'INPUT')
el.removeAttribute(a.name); }); if (!['B', 'I', 'U', 'S', 'STRONG', 'EM', 'H1', 'H2', 'H3', 'P', 'DIV', 'BR', 'UL', 'OL', 'LI', 'BLOCKQUOTE', 'CODE', 'HR', 'INPUT'].includes(el.tagName) && el !== d) {
el.replaceWith(...[...el.childNodes]);
} }); return d.innerHTML; }
function update() { const n = current(); if (!n)
return; n.title = $('#titleInput').value; n.html = sanitize($('#content').innerHTML); n.updated = Date.now(); renderList(); schedule(); }
function newNote() { let book = model.view === 'all' || model.view === 'trash' ? model.books[0].id : model.view; const n = { id: uid(), notebookId: book, title: '', html: '<p><br></p>', created: Date.now(), updated: Date.now(), pinned: false, tags: [], deleted: false }; model.notes.unshift(n); model.selected = n.id; render(); $('#titleInput').focus(); schedule(); }
function moveNote() { const n = current(); if (!n)
return; const names = model.books.map((b, i) => `${i + 1}. ${b.name}`).join('\n'); const x = prompt('Move to notebook:\n' + names); const i = Number(x) - 1; if (i >= 0 && i < model.books.length) {
n.notebookId = model.books[i].id;
n.updated = Date.now();
render();
schedule();
} }
$('#newNoteBtn').onclick = newNote;
$('#emptyNewBtn').onclick = newNote;
$('#searchInput').oninput = renderList;
$('#sortSelect').onchange = () => { model.sort = $('#sortSelect').value; save(); renderList(); };
$('#themeBtn').onclick = () => { model.theme = model.theme === 'light' ? 'dark' : 'light'; save(); render(); };
$('#collapseBtn').onclick = () => { model.collapsed = !model.collapsed; save(); render(); };
function addBook() { const name = prompt('Notebook name'); if (name?.trim()) {
model.books.push({ id: uid(), name: name.trim() });
model.view = model.books[model.books.length - 1].id;
save();
render();
} }
$('#newNotebookBtn').onclick = addBook;
$('#addNotebook').onclick = addBook;
$('#nav').onclick = (e) => { const b = e.target.closest('[data-view]'); if (b) {
model.view = b.dataset.view;
window.activeTag = undefined;
render();
} };
$('#notebooks').onclick = (e) => { const b = e.target.closest('[data-book]'); if (b) {
model.view = b.dataset.book;
render();
} };
$('#noteList').onclick = (e) => { const c = e.target.closest('[data-note]'); if (c) {
model.selected = c.dataset.note;
render();
} };
$('#tagBar').onclick = (e) => { const c = e.target.closest('[data-tag]'); if (c) {
const w = window;
w.activeTag = w.activeTag === c.dataset.tag ? undefined : c.dataset.tag;
renderList();
} };
$('#titleInput').oninput = update;
$('#content').oninput = update;
$('#pinBtn').onclick = () => { const n = current(); if (n) {
n.pinned = !n.pinned;
save();
render();
} };
$('#duplicateBtn').onclick = () => { const n = current(); if (n) {
const d = { ...n, id: uid(), title: n.title + ' copy', created: Date.now(), updated: Date.now(), tags: [...n.tags], deleted: false };
model.notes.unshift(d);
model.selected = d.id;
save();
render();
} };
$('#moveBtn').onclick = moveNote;
$('#deleteBtn').onclick = () => { const n = current(); if (n) {
n.deleted = true;
n.deletedAt = Date.now();
model.selected = null;
save();
render();
} };
$('#addTagBtn').onclick = () => { const n = current(); const t = prompt('Add a tag'); if (n && t?.trim() && !n.tags.includes(t.trim())) {
n.tags.push(t.trim());
n.updated = Date.now();
save();
render();
} };
$('#toolbar').onclick = (e) => { const b = e.target.closest('button'); if (!b)
return; $('#content').focus(); const cmd = b.dataset.cmd; if (cmd)
document.execCommand(cmd, false, b.dataset.value || undefined); update(); refreshToolbar(); };
$('#hrBtn').onclick = () => { document.execCommand('insertHorizontalRule'); update(); };
$('#checkBtn').onclick = () => { document.execCommand('insertUnorderedList'); const s = window.getSelection(); if (s?.anchorNode) {
const li = (s.anchorNode.parentElement?.closest('li'));
if (li) {
li.classList.add('check-line');
li.insertAdjacentHTML('afterbegin', '<input type="checkbox">');
update();
}
} };
$('#content').addEventListener('change', (e) => { if (e.target.tagName === 'INPUT')
update(); });
function refreshToolbar() { document.querySelectorAll('#toolbar [data-cmd]').forEach(x => x.classList.toggle('active', document.queryCommandState(x.dataset.cmd))); }
$('#content').addEventListener('keyup', refreshToolbar);
$('#content').addEventListener('mouseup', refreshToolbar);
$('#content').addEventListener('paste', (e) => { e.preventDefault(); const t = e.clipboardData?.getData('text/plain') || ''; document.execCommand('insertText', false, t); update(); });
$('#content').addEventListener('keydown', (e) => { if ((e.ctrlKey || e.metaKey) && ['b', 'i', 'u'].includes(e.key.toLowerCase())) {
e.preventDefault();
document.execCommand(e.key === 'b' ? 'bold' : e.key === 'i' ? 'italic' : 'underline');
update();
return;
} if (e.key === ' ') {
const sel = window.getSelection();
if (!sel || !sel.anchorNode)
return;
const line = sel.anchorNode.textContent || '';
const before = line.slice(0, sel.anchorOffset);
if (/^(#|##|###|-)$/.test(before) || before === '[]' || before == '>') {
e.preventDefault();
const type = before.trim();
document.execCommand('delete');
if (type === '>')
document.execCommand('formatBlock', false, 'blockquote');
else if (type.startsWith('#'))
document.execCommand('formatBlock', false, 'h' + type.length);
else if (type === '-')
document.execCommand('insertUnorderedList');
else {
document.execCommand('insertUnorderedList');
const s = window.getSelection();
const li = s?.anchorNode?.parentElement?.closest('li');
if (li) {
li.classList.add('check-line');
li.insertAdjacentHTML('afterbegin', '<input type="checkbox">');
}
}
update();
}
} });
// Trash view actions: click a deleted card restores; shift-click permanently removes
$('#noteList').addEventListener('click', (e) => { if (model.view !== 'trash')
return; const c = e.target.closest('[data-note]'); if (!c)
return; const n = model.notes.find(x => x.id === c.dataset.note); if (n) {
if (e.shiftKey) {
model.notes = model.notes.filter(x => x !== n);
}
else {
n.deleted = false;
model.selected = n.id;
}
save();
render();
} });
$('#sortSelect').value = model.sort;
render();
};
// ── entry ──
__require("src/main.ts");
})();
</script>
</body>
</html>
<!-- agent-meta {"model":"openai/gpt-5.6-luna-pro","provider":"openrouter","persona":"typescript","sessionId":"d611d1bc-4bc3-4875-965b-6a5b7b09997f","tokensIn":688185,"tokensOut":20497,"tokensTotal":708682,"turns":17,"toolCalls":22,"failedToolCalls":1,"timestamp":"2026-07-31T02:50:01.233Z"} -->