import { h, x, render, useState, useEffect } from '@zserge/o';
const useLocalStorage = (key, initialValue) => {
const [value, setValue] = useState(() => {
const stored = localStorage.getItem(key);
return stored ? JSON.parse(stored) : initialValue;
});
useEffect(() => {
localStorage.setItem(key, JSON.stringify(value));
}, [value, key]);
return [value, setValue];
};
const useDocumentTitle = (title) => {
useEffect(() => {
const prevTitle = document.title;
document.title = title;
// Restore previous title on cleanup
return () => {
document.title = prevTitle;
};
}, [title]);
};
const NoteApp = () => {
const [notes, setNotes] = useLocalStorage('notes', []);
const [input, setInput] = useState('');
useDocumentTitle(`Notes (${notes.length})`);
const addNote = () => {
if (input.trim()) {
setNotes([...notes, { id: Date.now(), text: input }]);
setInput('');
}
};
const deleteNote = (id) => {
setNotes(notes.filter(note => note.id !== id));
};
return x`
<div className="note-app">
<h1>Persistent Notes</h1>
<div>
<input
type="text"
value=${input}
oninput=${(e) => setInput(e.target.value)}
placeholder="Write a note..."
/>
<button onclick=${addNote}>Add Note</button>
</div>
<ul>
${notes.map(note => h('li', { k: note.id },
h('span', {}, note.text),
h('button', { onclick: () => deleteNote(note.id) }, 'Delete')
))}
</ul>
</div>
`;
};
render(h(NoteApp, {}), document.body);