✅ Add tasks | ✅ Mark complete | ✅ Delete tasks | ✅ localStorage persistence | ✅ Responsive UI
<div class="container">
<h1>📝 Todo List</h1>
<div class="input-container">
<input type="text" id="todoInput" placeholder="Add a new task...">
<button id="addBtn">Add</button>
</div>
<ul class="todos" id="todoList"></ul>
<div class="empty-message" id="emptyMsg">No tasks yet</div>
</div>
function addTodo() {
const text = todoInput.value.trim();
if (text === '') return;
todos.push({ text, completed: false });
todoInput.value = '';
saveTodos();
render();
}
function render() {
todoList.innerHTML = '';
emptyMsg.style.display = todos.length === 0 ? 'block' : 'none';
todos.forEach((todo, index) => {
const li = document.createElement('li');
li.className = `todo-item ${todo.completed ? 'completed' : ''}`;
li.innerHTML = `
<span class="todo-text">${todo.text}</span>
<button class="delete-btn" onclick="deleteTodo(${index})">Delete</button>
`;
li.querySelector('.todo-text').addEventListener('click', () => toggleTodo(index));
todoList.appendChild(li);
});
}
function deleteTodo(index) {
todos.splice(index, 1);
saveTodos();
render();
}
function toggleTodo(index) {
todos[index].completed = !todos[index].completed;
saveTodos();
render();
}
function saveTodos() {
localStorage.setItem('todos', JSON.stringify(todos));
}