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);