- // ==UserScript==
- // @name To-Do List
- // @namespace http://tampermonkey.net/
- // @version 1.1
- // @description A stylish dark-themed to-do list with keyboard toggle (Right Shift), due dates, cool animations, favorite tasks, and help instructions
- // @author GREGDGamer1
- // @match *://*/*
- // @grant none
- // @license You can modify as long as you credit me
- // ==/UserScript==
-
- (function() {
- 'use strict';
-
- // Append Google Fonts link for Fredoka
- const fontLink = document.createElement('link');
- fontLink.href = 'https://fonts.googleapis.com/css2?family=Fredoka:wght@400&display=swap';
- fontLink.rel = 'stylesheet';
- document.head.appendChild(fontLink);
-
- // Append Font Awesome for icons
- const fontAwesomeLink = document.createElement('link');
- fontAwesomeLink.href = 'https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css';
- fontAwesomeLink.rel = 'stylesheet';
- document.head.appendChild(fontAwesomeLink);
-
- // Styles for the modal (dark theme by default)
- const styles = `
- body {
- font-family: 'Fredoka', sans-serif;
- margin: 0;
- padding: 0;
- background-color: #181818;
- color: #ffffff;
- }
- #blur-background {
- position: fixed;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
- background: rgba(0, 0, 0, 0.5);
- z-index: 1000;
- display: none;
- }
- #todo-modal {
- position: fixed;
- top: 50%;
- left: 50%;
- transform: translate(-50%, -100%);
- background-color: #2c2c2c;
- padding: 20px;
- box-shadow: 0 4px 15px rgba(0, 0, 0, 0.5);
- border-radius: 10px;
- z-index: 1001;
- width: 300px;
- opacity: 0;
- transition: transform 0.4s ease, opacity 0.4s ease;
- display: none;
- }
- #todo-modal.show {
- display: block;
- transform: translate(-50%, -50%) scale(1);
- opacity: 1;
- }
- ul {
- list-style-type: none;
- padding: 0;
- }
- li {
- padding: 10px;
- border: 1px solid #444;
- margin: 5px 0;
- border-radius: 5px;
- opacity: 0;
- transform: translateX(-20px);
- transition: opacity 0.3s ease, transform 0.3s ease;
- cursor: pointer;
- }
- li.show {
- opacity: 1;
- transform: translateX(0);
- }
- li.fade-out {
- opacity: 0;
- transform: scale(0.9);
- transition: opacity 0.3s ease, transform 0.3s ease;
- }
- .favorite-icon {
- cursor: pointer;
- margin-right: 10px;
- }
- .help-icon {
- position: absolute;
- top: 10px;
- right: 10px;
- cursor: pointer;
- font-size: 18px;
- color: #ffffff;
- transition: transform 0.3s ease, color 0.3s ease; /* Add color transition */
- }
- .help-icon:hover {
- transform: scale(1.5); /* Scale up on hover */
- color: #ffdd57; /* Change color on hover */
- }
- .help-modal {
- position: fixed;
- top: 50%;
- left: 50%;
- transform: translate(-50%, -50%);
- background-color: #333;
- color: white;
- padding: 20px;
- border-radius: 10px;
- box-shadow: 0 4px 15px rgba(0, 0, 0, 0.5);
- z-index: 1002;
- display: none;
- width: 300px;
- opacity: 0;
- transition: opacity 0.4s ease;
- }
- .help-modal.show {
- display: block;
- opacity: 1;
- }
- input, input[type="date"] {
- width: calc(100% - 22px);
- padding: 10px;
- margin-bottom: 10px;
- border: 1px solid #444;
- border-radius: 5px;
- background-color: #444;
- color: #ffffff;
- font-family: 'Fredoka', sans-serif;
- }
- button {
- width: 100%;
- padding: 10px;
- border: none;
- border-radius: 5px;
- cursor: pointer;
- transition: background 0.3s, transform 0.2s;
- font-family: 'Fredoka', sans-serif;
- }
- button:hover {
- transform: translateY(-2px);
- }
- button.add-task {
- background-color: #28a745;
- color: white;
- }
- button.add-task:hover {
- background-color: #218838;
- }
- button.clear-tasks {
- background-color: #dc3545;
- color: white;
- margin-top: 10px;
- }
- button.clear-tasks:hover {
- background-color: #c82333;
- }
- button.export-tasks, button.import-tasks {
- background-color: #007bff;
- color: white;
- margin-top: 10px;
- }
- button.export-tasks:hover, button.import-tasks:hover {
- background-color: #0056b3;
- }
- select {
- width: calc(100% - 22px);
- padding: 10px;
- margin-bottom: 10px;
- border: 1px solid #444;
- border-radius: 5px;
- background-color: #444;
- color: #ffffff;
- font-family: 'Fredoka', sans-serif;
- }
- `;
-
- // Append styles to the head
- const styleSheet = document.createElement("style");
- styleSheet.type = "text/css";
- styleSheet.innerText = styles;
- document.head.appendChild(styleSheet);
-
- // Create blur background
- const blurBackground = document.createElement('div');
- blurBackground.id = 'blur-background';
- document.body.appendChild(blurBackground);
-
- // Create modal
- const todoModal = document.createElement('div');
- todoModal.id = 'todo-modal';
- document.body.appendChild(todoModal);
-
- // Help modal
- const helpModal = document.createElement('div');
- helpModal.className = 'help-modal';
- document.body.appendChild(helpModal);
- const helpTitle = document.createElement('h3');
- helpTitle.textContent = 'Help Instructions';
- helpModal.appendChild(helpTitle);
- const helpText = document.createElement('p');
- helpText.innerHTML = `
- <strong>Instructions:</strong><br>
- 1. Use the input field to add a new task.<br>
- 2. Set a due date (optional) using the date picker.<br>
- 3. Choose a category for your task.<br>
- 4. Click the star icon to mark tasks as favorites.<br>
- 5. Double-click the star in the task to edit it.(then dont click the input or else youll remove it, its automaticly focused)<br>
- 6. Click on a task to remove it from the list.<br>
- 7. Use the export/import buttons to backup tasks.<br>
- 8. Press the right Shift key to toggle this to-do list.<br>
- 9. some websites break the menu or the menu will break them
- `;
- helpModal.appendChild(helpText);
- const helpCloseButton = document.createElement('button');
- helpCloseButton.textContent = 'Close';
- helpModal.appendChild(helpCloseButton);
- helpCloseButton.onclick = () => {
- helpModal.classList.remove('show');
- helpModal.style.display = 'none';
- helpIcon.classList.remove('animate'); // Remove animation class when closed
- };
-
- const title = document.createElement('h2');
- title.textContent = 'To-Do List';
- todoModal.appendChild(title);
-
- // Help icon
- const helpIcon = document.createElement('span');
- helpIcon.className = 'help-icon';
- helpIcon.innerHTML = '?';
- helpIcon.onclick = () => {
- helpModal.classList.add('show');
- helpModal.style.display = 'block';
- helpModal.style.opacity = 1;
- helpIcon.classList.add('animate'); // Add animation class when opened
- };
- todoModal.appendChild(helpIcon);
-
- const todoList = document.createElement('ul');
- todoModal.appendChild(todoList);
-
- const input = document.createElement('input');
- input.type = 'text';
- input.placeholder = 'Add a new task';
- todoModal.appendChild(input);
-
- const dueDateInput = document.createElement('input');
- dueDateInput.type = 'date';
- todoModal.appendChild(dueDateInput);
-
- const categorySelect = document.createElement('select');
- const categories = ['Work', 'Personal', 'School', 'Other'];
- categories.forEach(category => {
- const option = document.createElement('option');
- option.value = category;
- option.textContent = category;
- categorySelect.appendChild(option);
- });
- todoModal.appendChild(categorySelect);
-
- const addButton = document.createElement('button');
- addButton.className = 'add-task';
- addButton.textContent = 'Add Task';
- todoModal.appendChild(addButton);
-
- const clearButton = document.createElement('button');
- clearButton.className = 'clear-tasks';
- clearButton.textContent = 'Clear All Tasks';
- todoModal.appendChild(clearButton);
-
- const exportButton = document.createElement('button');
- exportButton.className = 'export-tasks';
- exportButton.textContent = 'Export Tasks';
- todoModal.appendChild(exportButton);
-
- const importButton = document.createElement('button');
- importButton.className = 'import-tasks';
- importButton.textContent = 'Import Tasks';
- todoModal.appendChild(importButton);
-
- // Load tasks from localStorage
- function loadTasks() {
- const tasks = JSON.parse(localStorage.getItem('todoTasks')) || [];
- tasks.forEach(task => addTaskToList(task.text, task.dueDate, task.category));
- }
-
- // Save tasks to localStorage
- function saveTasks() {
- const tasks = Array.from(todoList.children).map(li => {
- const text = li.querySelector('.task-text').textContent;
- const dueDate = li.querySelector('.task-date') ? li.querySelector('.task-date').textContent : '';
- const category = li.querySelector('.task-category') ? li.querySelector('.task-category').textContent : '';
- return { text, dueDate, category: category.replace(' (Category: ', '').replace(')', '') };
- });
- localStorage.setItem('todoTasks', JSON.stringify(tasks));
- }
-
- // Add a task to the list
- function addTaskToList(task, dueDate, category) {
- const listItem = document.createElement('li');
-
- const favoriteIcon = document.createElement('i');
- favoriteIcon.className = 'favorite-icon fas fa-star'; // Font Awesome star icon
- favoriteIcon.onclick = (event) => {
- event.stopPropagation(); // Prevent task click event
- favoriteIcon.classList.toggle('fas');
- favoriteIcon.classList.toggle('far'); // Toggle filled and outlined star
- saveTasks();
- };
-
- const taskText = document.createElement('span');
- taskText.className = 'task-text';
- taskText.textContent = task;
-
- const taskDate = document.createElement('span');
- taskDate.className = 'task-date';
- taskDate.textContent = dueDate ? ` (Due: ${new Date(dueDate).toLocaleDateString()})` : '';
-
- const taskCategory = document.createElement('span');
- taskCategory.className = 'task-category';
- taskCategory.textContent = category ? ` (Category: ${category})` : '';
-
- // Add click event to remove the task
- listItem.onclick = () => {
- listItem.classList.add('fade-out');
- setTimeout(() => {
- todoList.removeChild(listItem);
- saveTasks();
- }, 300);
- };
-
- // Add double-click event for editing tasks
- listItem.ondblclick = () => {
- const currentText = taskText.textContent;
- const editInput = document.createElement('input');
- editInput.type = 'text';
- editInput.value = currentText;
- listItem.replaceChild(editInput, taskText);
-
- editInput.onblur = () => {
- const newText = editInput.value.trim();
- if (newText) {
- taskText.textContent = newText;
- listItem.replaceChild(taskText, editInput);
- saveTasks();
- } else {
- listItem.replaceChild(taskText, editInput);
- }
- };
-
- editInput.focus();
- };
-
- listItem.appendChild(favoriteIcon); // Append favorite icon
- listItem.appendChild(taskText);
- listItem.appendChild(taskDate);
- listItem.appendChild(taskCategory);
- todoList.appendChild(listItem);
-
- // Trigger animation
- setTimeout(() => listItem.classList.add('show'), 10);
-
- // Save tasks to localStorage
- saveTasks();
- }
-
- // Event listeners
- addButton.onclick = () => {
- const taskValue = input.value.trim();
- const dueDateValue = dueDateInput.value;
- const categoryValue = categorySelect.value;
- if (taskValue) {
- addTaskToList(taskValue, dueDateValue, categoryValue);
- input.value = '';
- dueDateInput.value = '';
- }
- };
-
- clearButton.onclick = () => {
- while (todoList.firstChild) {
- todoList.removeChild(todoList.firstChild);
- }
- saveTasks();
- };
-
- // Export tasks function
- exportButton.onclick = () => {
- const tasks = JSON.parse(localStorage.getItem('todoTasks')) || [];
- const blob = new Blob([JSON.stringify(tasks, null, 2)], { type: 'application/json' });
- const url = URL.createObjectURL(blob);
-
- const a = document.createElement('a');
- a.href = url;
- a.download = 'tasks.json';
- document.body.appendChild(a);
- a.click();
- document.body.removeChild(a);
- URL.revokeObjectURL(url);
- };
-
- // Import tasks function
- importButton.onclick = () => {
- const inputFile = document.createElement('input');
- inputFile.type = 'file';
- inputFile.accept = '.json';
- inputFile.onchange = (event) => {
- const file = event.target.files[0];
- if (file) {
- const reader = new FileReader();
- reader.onload = (e) => {
- try {
- const tasks = JSON.parse(e.target.result);
- clearTasks(); // Clear current tasks
- tasks.forEach(task => {
- addTaskToList(task.text, task.dueDate, task.category);
- });
- } catch (error) {
- alert('Error importing tasks. Please ensure the file is valid.');
- }
- };
- reader.readAsText(file);
- }
- };
- inputFile.click();
- };
-
- // Function to clear tasks (for import)
- function clearTasks() {
- while (todoList.firstChild) {
- todoList.removeChild(todoList.firstChild);
- }
- saveTasks();
- }
-
- // Keyboard toggle for the modal with animation
- document.addEventListener('keydown', (event) => {
- if (event.key === 'Shift' && event.code === 'ShiftRight') {
- const isVisible = todoModal.classList.toggle('show');
- blurBackground.style.display = isVisible ? 'block' : 'none';
-
- // Apply fade animation
- if (isVisible) {
- todoModal.style.display = 'block';
- setTimeout(() => {
- todoModal.style.opacity = 1;
- todoModal.style.transform = 'translate(-50%, -50%) scale(1)';
- }, 10);
- } else {
- todoModal.style.opacity = 0;
- todoModal.style.transform = 'translate(-50%, -50%) scale(0)';
- setTimeout(() => {
- todoModal.style.display = 'none';
- }, 400);
- }
- }
- });
-
- // Load existing tasks on startup
- loadTasks();
-
- })();
- // ==UserScript==
- // @name Advanced School Helper To-Do List backup
- // @namespace http://tampermonkey.net/
- // @version 2.9
- // @description A stylish dark-themed to-do list with keyboard toggle (Right Shift), due dates, cool animations, right-click editing, favorite tasks, and help instructions
- // @author GREGDGamer1
- // @match *://*/*
- // @grant none
- // ==/UserScript==
-
- (function() {
- 'use strict';
-
- // Append Google Fonts link for Fredoka
- const fontLink = document.createElement('link');
- fontLink.href = 'https://fonts.googleapis.com/css2?family=Fredoka:wght@400&display=swap';
- fontLink.rel = 'stylesheet';
- document.head.appendChild(fontLink);
-
- // Append Font Awesome for icons
- const fontAwesomeLink = document.createElement('link');
- fontAwesomeLink.href = 'https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css';
- fontAwesomeLink.rel = 'stylesheet';
- document.head.appendChild(fontAwesomeLink);
-
- // Styles for the modal (dark theme by default)
- const styles = `
- body {
- font-family: 'Fredoka', sans-serif;
- margin: 0;
- padding: 0;
- background-color: #181818;
- color: #ffffff;
- }
- #blur-background {
- position: fixed;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
- background: rgba(0, 0, 0, 0.5);
- z-index: 1000;
- display: none;
- }
- #todo-modal {
- position: fixed;
- top: 50%;
- left: 50%;
- transform: translate(-50%, -100%);
- background-color: #2c2c2c;
- padding: 20px;
- box-shadow: 0 4px 15px rgba(0, 0, 0, 0.5);
- border-radius: 10px;
- z-index: 1001;
- width: 300px;
- opacity: 0;
- transition: transform 0.4s ease, opacity 0.4s ease;
- display: none;
- }
- #todo-modal.show {
- display: block;
- transform: translate(-50%, -50%) scale(1);
- opacity: 1;
- }
- ul {
- list-style-type: none;
- padding: 0;
- }
- li {
- padding: 10px;
- border: 1px solid #444;
- margin: 5px 0;
- border-radius: 5px;
- opacity: 0;
- transform: translateX(-20px);
- transition: opacity 0.3s ease, transform 0.3s ease;
- cursor: pointer;
- }
- li.show {
- opacity: 1;
- transform: translateX(0);
- }
- li.fade-out {
- opacity: 0;
- transform: scale(0.9);
- transition: opacity 0.3s ease, transform 0.3s ease;
- }
- .favorite-icon {
- cursor: pointer;
- margin-right: 10px;
- }
- .help-icon {
- position: absolute;
- top: 10px;
- right: 10px;
- cursor: pointer;
- font-size: 18px;
- color: #ffffff;
- transition: transform 0.3s ease, color 0.3s ease; /* Add color transition */
- }
- .help-icon:hover {
- transform: scale(1.5); /* Scale up on hover */
- color: #ffdd57; /* Change color on hover */
- }
- .help-modal {
- position: fixed;
- top: 50%;
- left: 50%;
- transform: translate(-50%, -50%);
- background-color: #333;
- color: white;
- padding: 20px;
- border-radius: 10px;
- box-shadow: 0 4px 15px rgba(0, 0, 0, 0.5);
- z-index: 1002;
- display: none;
- width: 300px;
- opacity: 0;
- transition: opacity 0.4s ease;
- }
- .help-modal.show {
- display: block;
- opacity: 1;
- }
- input, input[type="date"] {
- width: calc(100% - 22px);
- padding: 10px;
- margin-bottom: 10px;
- border: 1px solid #444;
- border-radius: 5px;
- background-color: #444;
- color: #ffffff;
- font-family: 'Fredoka', sans-serif;
- }
- button {
- width: 100%;
- padding: 10px;
- border: none;
- border-radius: 5px;
- cursor: pointer;
- transition: background 0.3s, transform 0.2s;
- font-family: 'Fredoka', sans-serif;
- }
- button:hover {
- transform: translateY(-2px);
- }
- button.add-task {
- background-color: #28a745;
- color: white;
- }
- button.add-task:hover {
- background-color: #218838;
- }
- button.clear-tasks {
- background-color: #dc3545;
- color: white;
- margin-top: 10px;
- }
- button.clear-tasks:hover {
- background-color: #c82333;
- }
- button.export-tasks, button.import-tasks {
- background-color: #007bff;
- color: white;
- margin-top: 10px;
- }
- button.export-tasks:hover, button.import-tasks:hover {
- background-color: #0056b3;
- }
- select {
- width: calc(100% - 22px);
- padding: 10px;
- margin-bottom: 10px;
- border: 1px solid #444;
- border-radius: 5px;
- background-color: #444;
- color: #ffffff;
- font-family: 'Fredoka', sans-serif;
- }
- `;
-
- // Append styles to the head
- const styleSheet = document.createElement("style");
- styleSheet.type = "text/css";
- styleSheet.innerText = styles;
- document.head.appendChild(styleSheet);
-
- // Create blur background
- const blurBackground = document.createElement('div');
- blurBackground.id = 'blur-background';
- document.body.appendChild(blurBackground);
-
- // Create modal
- const todoModal = document.createElement('div');
- todoModal.id = 'todo-modal';
- document.body.appendChild(todoModal);
-
- // Help modal
- const helpModal = document.createElement('div');
- helpModal.className = 'help-modal';
- document.body.appendChild(helpModal);
- const helpTitle = document.createElement('h3');
- helpTitle.textContent = 'Help Instructions';
- helpModal.appendChild(helpTitle);
- const helpText = document.createElement('p');
- helpText.innerHTML = `
- <strong>Instructions:</strong><br>
- 1. Use the input field to add a new task.<br>
- 2. Set a due date (optional) using the date picker.<br>
- 3. Choose a category for your task.<br>
- 4. Click the star icon to mark tasks as favorites.<br>
- 5. Double-click the star in the task to edit it.(then dont click the input or else youll remove it, its automaticly focused)<br>
- 6. Click on a task to remove it from the list.<br>
- 7. Use the export/import buttons to backup tasks.<br>
- 8. Press the right Shift key to toggle this to-do list.<br>
- 9. some websites break the menu or the menu will break them
- `;
- helpModal.appendChild(helpText);
- const helpCloseButton = document.createElement('button');
- helpCloseButton.textContent = 'Close';
- helpModal.appendChild(helpCloseButton);
- helpCloseButton.onclick = () => {
- helpModal.classList.remove('show');
- helpModal.style.display = 'none';
- helpIcon.classList.remove('animate'); // Remove animation class when closed
- };
-
- const title = document.createElement('h2');
- title.textContent = 'To-Do List';
- todoModal.appendChild(title);
-
- // Help icon
- const helpIcon = document.createElement('span');
- helpIcon.className = 'help-icon';
- helpIcon.innerHTML = '?';
- helpIcon.onclick = () => {
- helpModal.classList.add('show');
- helpModal.style.display = 'block';
- helpModal.style.opacity = 1;
- helpIcon.classList.add('animate'); // Add animation class when opened
- };
- todoModal.appendChild(helpIcon);
-
- const todoList = document.createElement('ul');
- todoModal.appendChild(todoList);
-
- const input = document.createElement('input');
- input.type = 'text';
- input.placeholder = 'Add a new task';
- todoModal.appendChild(input);
-
- const dueDateInput = document.createElement('input');
- dueDateInput.type = 'date';
- todoModal.appendChild(dueDateInput);
-
- const categorySelect = document.createElement('select');
- const categories = ['Work', 'Personal', 'School', 'Other'];
- categories.forEach(category => {
- const option = document.createElement('option');
- option.value = category;
- option.textContent = category;
- categorySelect.appendChild(option);
- });
- todoModal.appendChild(categorySelect);
-
- const addButton = document.createElement('button');
- addButton.className = 'add-task';
- addButton.textContent = 'Add Task';
- todoModal.appendChild(addButton);
-
- const clearButton = document.createElement('button');
- clearButton.className = 'clear-tasks';
- clearButton.textContent = 'Clear All Tasks';
- todoModal.appendChild(clearButton);
-
- const exportButton = document.createElement('button');
- exportButton.className = 'export-tasks';
- exportButton.textContent = 'Export Tasks';
- todoModal.appendChild(exportButton);
-
- const importButton = document.createElement('button');
- importButton.className = 'import-tasks';
- importButton.textContent = 'Import Tasks';
- todoModal.appendChild(importButton);
-
- // Load tasks from localStorage
- function loadTasks() {
- const tasks = JSON.parse(localStorage.getItem('todoTasks')) || [];
- tasks.forEach(task => addTaskToList(task.text, task.dueDate, task.category));
- }
-
- // Save tasks to localStorage
- function saveTasks() {
- const tasks = Array.from(todoList.children).map(li => {
- const text = li.querySelector('.task-text').textContent;
- const dueDate = li.querySelector('.task-date') ? li.querySelector('.task-date').textContent : '';
- const category = li.querySelector('.task-category') ? li.querySelector('.task-category').textContent : '';
- return { text, dueDate, category: category.replace(' (Category: ', '').replace(')', '') };
- });
- localStorage.setItem('todoTasks', JSON.stringify(tasks));
- }
-
- // Add a task to the list
- function addTaskToList(task, dueDate, category) {
- const listItem = document.createElement('li');
-
- const favoriteIcon = document.createElement('i');
- favoriteIcon.className = 'favorite-icon fas fa-star'; // Font Awesome star icon
- favoriteIcon.onclick = (event) => {
- event.stopPropagation(); // Prevent task click event
- favoriteIcon.classList.toggle('fas');
- favoriteIcon.classList.toggle('far'); // Toggle filled and outlined star
- saveTasks();
- };
-
- const taskText = document.createElement('span');
- taskText.className = 'task-text';
- taskText.textContent = task;
-
- const taskDate = document.createElement('span');
- taskDate.className = 'task-date';
- taskDate.textContent = dueDate ? ` (Due: ${new Date(dueDate).toLocaleDateString()})` : '';
-
- const taskCategory = document.createElement('span');
- taskCategory.className = 'task-category';
- taskCategory.textContent = category ? ` (Category: ${category})` : '';
-
- // Add click event to remove the task
- listItem.onclick = () => {
- listItem.classList.add('fade-out');
- setTimeout(() => {
- todoList.removeChild(listItem);
- saveTasks();
- }, 300);
- };
-
- // Add double-click event for editing tasks
- listItem.ondblclick = () => {
- const currentText = taskText.textContent;
- const editInput = document.createElement('input');
- editInput.type = 'text';
- editInput.value = currentText;
- listItem.replaceChild(editInput, taskText);
-
- editInput.onblur = () => {
- const newText = editInput.value.trim();
- if (newText) {
- taskText.textContent = newText;
- listItem.replaceChild(taskText, editInput);
- saveTasks();
- } else {
- listItem.replaceChild(taskText, editInput);
- }
- };
-
- editInput.focus();
- };
-
- listItem.appendChild(favoriteIcon); // Append favorite icon
- listItem.appendChild(taskText);
- listItem.appendChild(taskDate);
- listItem.appendChild(taskCategory);
- todoList.appendChild(listItem);
-
- // Trigger animation
- setTimeout(() => listItem.classList.add('show'), 10);
-
- // Save tasks to localStorage
- saveTasks();
- }
-
- // Event listeners
- addButton.onclick = () => {
- const taskValue = input.value.trim();
- const dueDateValue = dueDateInput.value;
- const categoryValue = categorySelect.value;
- if (taskValue) {
- addTaskToList(taskValue, dueDateValue, categoryValue);
- input.value = '';
- dueDateInput.value = '';
- }
- };
-
- clearButton.onclick = () => {
- while (todoList.firstChild) {
- todoList.removeChild(todoList.firstChild);
- }
- saveTasks();
- };
-
- // Export tasks function
- exportButton.onclick = () => {
- const tasks = JSON.parse(localStorage.getItem('todoTasks')) || [];
- const blob = new Blob([JSON.stringify(tasks, null, 2)], { type: 'application/json' });
- const url = URL.createObjectURL(blob);
-
- const a = document.createElement('a');
- a.href = url;
- a.download = 'tasks.json';
- document.body.appendChild(a);
- a.click();
- document.body.removeChild(a);
- URL.revokeObjectURL(url);
- };
-
- // Import tasks function
- importButton.onclick = () => {
- const inputFile = document.createElement('input');
- inputFile.type = 'file';
- inputFile.accept = '.json';
- inputFile.onchange = (event) => {
- const file = event.target.files[0];
- if (file) {
- const reader = new FileReader();
- reader.onload = (e) => {
- try {
- const tasks = JSON.parse(e.target.result);
- clearTasks(); // Clear current tasks
- tasks.forEach(task => {
- addTaskToList(task.text, task.dueDate, task.category);
- });
- } catch (error) {
- alert('Error importing tasks. Please ensure the file is valid.');
- }
- };
- reader.readAsText(file);
- }
- };
- inputFile.click();
- };
-
- // Function to clear tasks (for import)
- function clearTasks() {
- while (todoList.firstChild) {
- todoList.removeChild(todoList.firstChild);
- }
- saveTasks();
- }
-
- // Keyboard toggle for the modal with animation
- document.addEventListener('keydown', (event) => {
- if (event.key === 'Shift' && event.code === 'ShiftRight') {
- const isVisible = todoModal.classList.toggle('show');
- blurBackground.style.display = isVisible ? 'block' : 'none';
-
- // Apply fade animation
- if (isVisible) {
- todoModal.style.display = 'block';
- setTimeout(() => {
- todoModal.style.opacity = 1;
- todoModal.style.transform = 'translate(-50%, -50%) scale(1)';
- }, 10);
- } else {
- todoModal.style.opacity = 0;
- todoModal.style.transform = 'translate(-50%, -50%) scale(0)';
- setTimeout(() => {
- todoModal.style.display = 'none';
- }, 400);
- }
- }
- });
-
- // Load existing tasks on startup
- loadTasks();
-
- })();