/
dashytka
/
TaskMaster_Pro
Обзор
Документация
Войти
/
dashytka
/
TaskMaster_Pro
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
html
279 строк
8 KB
dashytka
create html
30 окт 2025, 12:41
30 окт 2025, 12:41
714235d
Код
Авторство
О чём код?
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>TaskMaster Pro</title> <style> * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); min-height: 100vh; padding: 20px; } .container { max-width: 800px; margin: 0 auto; background: white; border-radius: 15px; box-shadow: 0 20px 40px rgba(0,0,0,0.1); overflow: hidden; } .header { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 30px; text-align: center; } .header h1 { font-size: 2.5em; margin-bottom: 10px; } .header p { opacity: 0.9; font-size: 1.1em; } .task-form { padding: 30px; border-bottom: 1px solid #eee; } .input-group { display: flex; gap: 15px; margin-bottom: 20px; } .task-input { flex: 1; padding: 15px; border: 2px solid #e1e5e9; border-radius: 8px; font-size: 16px; transition: border-color 0.3s; } .task-input:focus { outline: none; border-color: #667eea; } .add-btn { padding: 15px 30px; background: #667eea; color: white; border: none; border-radius: 8px; font-size: 16px; cursor: pointer; transition: background 0.3s; } .add-btn:hover { background: #5a6fd8; } .filters { display: flex; gap: 10px; justify-content: center; } .filter-btn { padding: 8px 16px; border: 2px solid #667eea; background: white; color: #667eea; border-radius: 20px; cursor: pointer; transition: all 0.3s; } .filter-btn.active { background: #667eea; color: white; } .task-list { padding: 20px; } .task-item { display: flex; align-items: center; padding: 15px; margin-bottom: 10px; background: #f8f9fa; border-radius: 8px; transition: transform 0.2s; } .task-item:hover { transform: translateX(5px); } .task-item.completed { opacity: 0.6; text-decoration: line-through; } .task-checkbox { margin-right: 15px; transform: scale(1.2); } .task-text { flex: 1; font-size: 16px; } .delete-btn { background: #ff6b6b; color: white; border: none; padding: 8px 12px; border-radius: 5px; cursor: pointer; transition: background 0.3s; } .delete-btn:hover { background: #ff5252; } .stats { padding: 20px; background: #f8f9fa; text-align: center; font-size: 14px; color: #666; } </style> </head> <body> <div class="container"> <div class="header"> <h1>TaskMaster Pro</h1> <p>Organize your life, one task at a time</p> </div> <div class="task-form"> <div class="input-group"> <input type="text" class="task-input" placeholder="Enter a new task..." id="taskInput"> <button class="add-btn" onclick="addTask()">Add Task</button> </div> <div class="filters"> <button class="filter-btn active" onclick="filterTasks('all')">All</button> <button class="filter-btn" onclick="filterTasks('active')">Active</button> <button class="filter-btn" onclick="filterTasks('completed')">Completed</button> </div> </div> <div class="task-list" id="taskList"> <!-- Tasks will be added here dynamically --> </div> <div class="stats" id="stats"> Total: 0 | Active: 0 | Completed: 0 </div> </div> <script> let tasks = JSON.parse(localStorage.getItem('tasks')) || []; let currentFilter = 'all'; function addTask() { const input = document.getElementById('taskInput'); const text = input.value.trim(); if (text) { tasks.push({ id: Date.now(), text: text, completed: false, createdAt: new Date().toLocaleDateString() }); input.value = ''; saveTasks(); renderTasks(); } } function toggleTask(id) { tasks = tasks.map(task => task.id === id ? {...task, completed: !task.completed} : task ); saveTasks(); renderTasks(); } function deleteTask(id) { tasks = tasks.filter(task => task.id !== id); saveTasks(); renderTasks(); } function filterTasks(filter) { currentFilter = filter; document.querySelectorAll('.filter-btn').forEach(btn => btn.classList.remove('active') ); event.target.classList.add('active'); renderTasks(); } function renderTasks() { const taskList = document.getElementById('taskList'); const filteredTasks = tasks.filter(task => { if (currentFilter === 'active') return !task.completed; if (currentFilter === 'completed') return task.completed; return true; }); taskList.innerHTML = filteredTasks.map(task => ` <div class="task-item ${task.completed ? 'completed' : ''}"> <input type="checkbox" class="task-checkbox" ${task.completed ? 'checked' : ''} onchange="toggleTask(${task.id})"> <span class="task-text">${task.text}</span> <button class="delete-btn" onclick="deleteTask(${task.id})">Delete</button> </div> `).join(''); updateStats(); } function updateStats() { const total = tasks.length; const completed = tasks.filter(task => task.completed).length; const active = total - completed; document.getElementById('stats').textContent = `Total: ${total} | Active: ${active} | Completed: ${completed}`; } function saveTasks() { localStorage.setItem('tasks', JSON.stringify(tasks)); } // Enter key support document.getElementById('taskInput').addEventListener('keypress', function(e) { if (e.key === 'Enter') addTask(); }); // Initial render renderTasks(); </script> </body> </html>