class ToolTasks extends HTMLElement { connectedCallback() { this.attachShadow({ mode: 'open' }); // Load tasks from localStorage if available const savedTasks = JSON.parse(localStorage.getItem('flowstate_tasks')) || []; this.tasks = savedTasks; this.shadowRoot.innerHTML = `
`; this.inputEl = this.shadowRoot.getElementById('taskInput'); this.listEl = this.shadowRoot.getElementById('taskList'); this.addBtn = this.shadowRoot.getElementById('addBtn'); this.addBtn.addEventListener('click', () => this.addTask()); this.inputEl.addEventListener('keypress', (e) => { if (e.key === 'Enter') this.addTask(); }); this.renderTasks(); feather.replace(); } renderTasks() { this.listEl.innerHTML = ''; if (this.tasks.length === 0) { this.listEl.innerHTML = '
  • All clear. Flow unblocked.
  • '; return; } this.tasks.forEach((task, index) => { const li = document.createElement('li'); li.className = `task-item ${task.completed ? 'completed' : ''}`; li.innerHTML = `
    ${task.completed ? '' : ''}
    ${this.escapeHtml(task.text)} `; this.listEl.appendChild(li); }); feather.replace(); this.save(); } addTask() { const text = this.inputEl.value.trim(); if (text) { this.tasks.unshift({ text, completed: false }); this.inputEl.value = ''; this.renderTasks(); } } toggleTask(index) { this.tasks[index].completed = !this.tasks[index].completed; this.renderTasks(); } deleteTask(index) { this.tasks.splice(index, 1); this.renderTasks(); } save() { localStorage.setItem('flowstate_tasks', JSON.stringify(this.tasks)); } escapeHtml(text) { const div = document.createElement('div'); div.textContent = text; return div.innerHTML; } } customElements.define('tool-tasks', ToolTasks);