import { h, x, render, useState } from '@zserge/o';
const TodoList = () => {
const [todos, setTodos] = useState([
{ id: 1, text: 'Learn O! library', completed: false },
{ id: 2, text: 'Build an app', completed: false }
]);
const [input, setInput] = useState('');
const [nextId, setNextId] = useState(3);
const addTodo = () => {
if (input.trim()) {
setTodos([...todos, { id: nextId, text: input, completed: false }]);
setInput('');
setNextId(nextId + 1);
}
};
const removeTodo = (id) => {
setTodos(todos.filter(todo => todo.id !== id));
};
const toggleTodo = (id) => {
setTodos(todos.map(todo =>
todo.id === id ? { ...todo, completed: !todo.completed } : todo
));
};
const handleKeyPress = (e) => {
if (e.key === 'Enter') {
addTodo();
}
};
return x`
<div className="todo-app">
<h1>My Todo List</h1>
<div className="input-container">
<input
type="text"
value=${input}
oninput=${(e) => setInput(e.target.value)}
onkeypress=${handleKeyPress}
placeholder="Add a new todo..."
/>
<button onclick=${addTodo}>Add</button>
</div>
<ul className="todo-list">
${todos.map(todo => h('li', { k: todo.id, className: todo.completed ? 'completed' : '' },
h('input', {
type: 'checkbox',
checked: todo.completed,
onchange: () => toggleTodo(todo.id)
}),
h('span', {}, todo.text),
h('button', { onclick: () => removeTodo(todo.id) }, 'Delete')
))}
</ul>
<div className="stats">
${todos.filter(t => !t.completed).length} items left
</div>
</div>
`;
};
render(h(TodoList, {}), document.body);