├── .gitignore ├── src ├── modules │ ├── Task.js │ ├── deleteTask.js │ ├── clearTask.js │ ├── completeTask.js │ ├── displayTask.js │ ├── createTask.js │ └── editTask.js ├── index.js ├── index.html ├── img │ ├── menu-icon.svg │ ├── icons8-refresh.svg │ ├── save-icon.svg │ └── icons8-trash.svg └── style.css ├── .hintrc ├── .eslintrc.json ├── webpack.config.js ├── dist ├── index.html ├── 19c84313d62edb23795c.svg ├── 62ef7ea007720cc07b88.svg ├── 5cc280062b69e945d347.svg ├── 533f687c0efc420b1e43.svg └── main.js ├── MIT.md ├── package.json ├── .stylelintrc.json ├── .github └── workflows │ └── linters.yml └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ -------------------------------------------------------------------------------- /src/modules/Task.js: -------------------------------------------------------------------------------- 1 | export default class Task { 2 | static tasks = []; 3 | 4 | constructor(description, index) { 5 | this.description = description; 6 | this.index = index; 7 | this.completed = false; 8 | } 9 | 10 | static storageManagement(task) { 11 | localStorage.setItem('taskList', JSON.stringify(task)); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /.hintrc: -------------------------------------------------------------------------------- 1 | { 2 | "connector": { 3 | "name": "local", 4 | "options": { 5 | "pattern": ["**", "!.git/**", "!node_modules/**"] 6 | } 7 | }, 8 | "extends": ["development"], 9 | "formatters": ["stylish"], 10 | "hints": [ 11 | "button-type", 12 | "disown-opener", 13 | "html-checker", 14 | "meta-charset-utf-8", 15 | "meta-viewport", 16 | "no-inline-styles:error" 17 | ] 18 | } -------------------------------------------------------------------------------- /src/modules/deleteTask.js: -------------------------------------------------------------------------------- 1 | import Task from './Task.js'; 2 | 3 | const deleteTask = (event) => { 4 | if (event.target.classList.contains('delete-icon')) { 5 | const taskIndex = event.target.parentNode.parentNode.className.split(' ')[1]; 6 | const task = event.target.parentNode.parentNode; 7 | 8 | Task.tasks = Task.tasks.filter((task) => task.index !== parseInt(taskIndex, 10)) 9 | .map((task, index) => ({ ...task, index: index + 1 })); 10 | 11 | Task.storageManagement(Task.tasks); 12 | task.remove(); 13 | } 14 | }; 15 | 16 | export default deleteTask; -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import './style.css'; 2 | import tasksDisplay from './modules/displayTask.js'; 3 | import createTask from './modules/createTask.js'; 4 | import deleteTask from './modules/deleteTask.js'; 5 | import editTask from './modules/editTask.js'; 6 | import completeTask from './modules/completeTask.js'; 7 | import clearCompletedTask from './modules/clearTask.js'; 8 | 9 | const clearButton = document.querySelector('.clear-btn'); 10 | 11 | document.addEventListener('keypress', createTask); 12 | document.addEventListener('click', deleteTask); 13 | document.addEventListener('click', editTask); 14 | clearButton.addEventListener('click', clearCompletedTask); 15 | 16 | tasksDisplay(); 17 | completeTask(); -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "browser": true, 4 | "es6": true, 5 | "jest": true 6 | }, 7 | "parser": "babel-eslint", 8 | "parserOptions": { 9 | "ecmaVersion": 2018, 10 | "sourceType": "module" 11 | }, 12 | "extends": [ 13 | "airbnb-base" 14 | ], 15 | "rules": { 16 | "no-shadow": "off", 17 | "no-param-reassign": "off", 18 | "eol-last": "off", 19 | "import/extensions": [ 20 | 1, 21 | { 22 | "js": "always", 23 | "json": "always" 24 | } 25 | ] 26 | }, 27 | "ignorePatterns": [ 28 | "dist/", 29 | "build/" 30 | ] 31 | } -------------------------------------------------------------------------------- /src/modules/clearTask.js: -------------------------------------------------------------------------------- 1 | import Task from './Task.js'; 2 | import tasksDisplay from './displayTask.js'; 3 | 4 | const reDisplayTask = () => { 5 | const taskItems = document.querySelectorAll('.task-item'); 6 | taskItems.forEach((task) => { 7 | task.remove(); 8 | }); 9 | 10 | tasksDisplay(); 11 | }; 12 | 13 | const clearCompletedTask = () => { 14 | const completedTasks = document.querySelectorAll('done'); 15 | 16 | completedTasks.forEach((task) => { 17 | task.parentNode.parentNode.remove(); 18 | }); 19 | 20 | Task.tasks = Task.tasks.filter((task) => task.completed !== true) 21 | .map((task, index) => ({ ...task, index: index + 1 })); 22 | 23 | Task.storageManagement(Task.tasks); 24 | reDisplayTask(); 25 | }; 26 | 27 | export default clearCompletedTask; -------------------------------------------------------------------------------- /src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | To Do List 9 | 10 | 11 | 12 |
13 | 21 |
22 | 23 | 24 | -------------------------------------------------------------------------------- /webpack.config.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | const HtmlWebpackPlugin = require('html-webpack-plugin'); 3 | 4 | module.exports = { 5 | mode: 'development', 6 | entry: './src/index.js', 7 | output: { 8 | filename: 'main.js', 9 | path: path.resolve(__dirname, 'dist'), 10 | }, 11 | plugins: [ 12 | new HtmlWebpackPlugin({ 13 | title: 'Output Management', 14 | template: './src/index.html', 15 | }), 16 | ], 17 | module: { 18 | rules: [ 19 | { 20 | test: /\.css$/, 21 | use: ['style-loader', 'css-loader'], 22 | }, 23 | { 24 | test: /\.html$/, 25 | use: ['html-loader'], 26 | }, 27 | { 28 | test: /\.(png|svg|jpg|jpeg|gif)$/i, 29 | type: 'asset/resource', 30 | }, 31 | ], 32 | }, 33 | }; 34 | -------------------------------------------------------------------------------- /dist/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | To Do List 9 | 10 | 11 | 12 |
13 | 21 |
22 | 23 | 24 | -------------------------------------------------------------------------------- /src/modules/completeTask.js: -------------------------------------------------------------------------------- 1 | import Task from './Task.js'; 2 | 3 | const boxChangeHanlder = (event) => { 4 | const targetID = parseInt(event.target.parentNode.parentNode.className.split(' ')[1], 10) - 1; 5 | if (event.target.checked) { 6 | event.target.nextElementSibling.classList.add('done'); 7 | Task.tasks[targetID].completed = true; 8 | } else if (!event.target.checked) { 9 | event.target.nextElementSibling.classList.remove('done'); 10 | Task.tasks[targetID].completed = false; 11 | } 12 | Task.storageManagement(Task.tasks); 13 | }; 14 | 15 | const completeTask = () => { 16 | const checkBoxes = document.querySelectorAll('.checkbox'); 17 | checkBoxes.forEach((box) => { 18 | box.addEventListener('change', (event) => { 19 | boxChangeHanlder(event); 20 | }); 21 | }); 22 | }; 23 | 24 | export default completeTask; -------------------------------------------------------------------------------- /MIT.md: -------------------------------------------------------------------------------- 1 | ## Copyright 2023, Ahmed Eid 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this webpage and associated documentation files, to deal in the webpage without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the webpage, and to permit persons to whom the webpage is furnished to do so, subject to the following conditions: 4 | 5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the webpage. 6 | 7 | THE webpage IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE webpage OR THE USE OR OTHER DEALINGS IN THE webpage. -------------------------------------------------------------------------------- /src/modules/displayTask.js: -------------------------------------------------------------------------------- 1 | import menuIcon from '../img/menu-icon.svg'; 2 | import deleteIcon from '../img/icons8-trash.svg'; 3 | import Task from './Task.js'; 4 | import completeTask from './completeTask.js'; 5 | 6 | const inputs = document.querySelector('.task-input-item'); 7 | 8 | const tasksDisplay = () => { 9 | if (JSON.parse(localStorage.getItem('taskList'))) { 10 | Task.tasks = JSON.parse(localStorage.getItem('taskList')); 11 | } 12 | 13 | Task.tasks.forEach((task) => { 14 | const html = ` 15 |
  • 16 |
    17 | 18 |
    19 |
    20 | option-icon 21 | delete-icon 22 |
    23 |
  • 24 | `; 25 | inputs.insertAdjacentHTML('afterend', html); 26 | }); 27 | completeTask(); 28 | }; 29 | 30 | export default tasksDisplay; -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "todo-list", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "webpack-dev-server --config webpack.config.js --open", 8 | "build": "webpack --config webpack.config.js" 9 | }, 10 | "devDependencies": { 11 | "babel-eslint": "^10.1.0", 12 | "css-loader": "^6.8.1", 13 | "eslint": "^7.32.0", 14 | "eslint-config-airbnb-base": "^14.2.1", 15 | "eslint-plugin-import": "^2.27.5", 16 | "file-loader": "^6.2.0", 17 | "gh-pages": "^5.0.0", 18 | "hint": "^7.1.8", 19 | "html-loader": "^4.2.0", 20 | "html-webpack-plugin": "^5.5.1", 21 | "push-dir": "^0.4.1", 22 | "style-loader": "^3.3.3", 23 | "stylelint": "^13.13.1", 24 | "stylelint-config-standard": "^21.0.0", 25 | "stylelint-csstree-validator": "^1.9.0", 26 | "stylelint-scss": "^3.21.0", 27 | "webpack": "^5.85.1", 28 | "webpack-cli": "^5.1.3", 29 | "webpack-dev-server": "^4.15.0", 30 | "webpack-merge": "^5.9.0" 31 | }, 32 | "keywords": [], 33 | "author": "", 34 | "license": "ISC" 35 | } 36 | -------------------------------------------------------------------------------- /src/img/menu-icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /dist/19c84313d62edb23795c.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /.stylelintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": [ 3 | "stylelint-config-standard" 4 | ], 5 | "plugins": [ 6 | "stylelint-scss", 7 | "stylelint-csstree-validator" 8 | ], 9 | "rules": { 10 | "at-rule-no-unknown": [ 11 | true, 12 | { 13 | "ignoreAtRules": [ 14 | "tailwind", 15 | "apply", 16 | "variants", 17 | "responsive", 18 | "screen" 19 | ] 20 | } 21 | ], 22 | "scss/at-rule-no-unknown": [ 23 | true, 24 | { 25 | "ignoreAtRules": [ 26 | "tailwind", 27 | "apply", 28 | "variants", 29 | "responsive", 30 | "screen" 31 | ] 32 | } 33 | ], 34 | "csstree/validator": true 35 | }, 36 | "ignoreFiles": [ 37 | "build/**", 38 | "dist/**", 39 | "**/reset*.css", 40 | "**/bootstrap*.css", 41 | "**/*.js", 42 | "**/*.jsx" 43 | ] 44 | } -------------------------------------------------------------------------------- /src/img/icons8-refresh.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /dist/62ef7ea007720cc07b88.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/modules/createTask.js: -------------------------------------------------------------------------------- 1 | import menuIcon from '../img/menu-icon.svg'; 2 | import deleteIcon from '../img/icons8-trash.svg'; 3 | import Task from './Task.js'; 4 | import completeTask from './completeTask.js'; 5 | 6 | const inputField = document.querySelector('.taks-input'); 7 | const taskList = document.querySelector('.task-input-item'); 8 | 9 | const createTask = (event) => { 10 | if (JSON.parse(localStorage.getItem('taskList'))) { 11 | Task.tasks = JSON.parse(localStorage.getItem('taskList')); 12 | } 13 | 14 | if (event.key === 'Enter') { 15 | if (inputField.value === '') return; 16 | 17 | const newItem = new Task(inputField.value, Task.tasks.length + 1); 18 | Task.tasks.push(newItem); 19 | Task.storageManagement(Task.tasks); 20 | 21 | const html = ` 22 |
  • 23 |
    24 | 25 |
    26 |
    27 | option-icon 28 | delete-icon 29 |
    30 |
  • 31 | `; 32 | taskList.insertAdjacentHTML('afterend', html); 33 | completeTask(); 34 | inputField.value = ''; 35 | } 36 | }; 37 | 38 | export default createTask; -------------------------------------------------------------------------------- /src/modules/editTask.js: -------------------------------------------------------------------------------- 1 | import Task from './Task.js'; 2 | import saveIcon from '../img/save-icon.svg'; 3 | 4 | const createSaveIcon = () => { 5 | const spanSaveIcon = document.createElement('span'); 6 | const img = document.createElement('img'); 7 | 8 | img.setAttribute('src', saveIcon); 9 | img.setAttribute('alt', 'Save Icon'); 10 | img.classList.add('save-icon'); 11 | 12 | spanSaveIcon.appendChild(img); 13 | return spanSaveIcon; 14 | }; 15 | 16 | const editTask = (event) => { 17 | if (event.target.classList.contains('menu-icon')) { 18 | const taskIndex = event.target.parentNode.parentNode.className.split(' ')[1]; 19 | const menuIcon = event.target; 20 | const taskInput = event.target.parentNode.parentNode.firstChild.nextSibling.childNodes[3]; 21 | 22 | taskInput.removeAttribute('readonly'); 23 | taskInput.focus(); 24 | 25 | const spanSaveIcon = createSaveIcon(); 26 | 27 | menuIcon.parentNode.insertAdjacentElement('afterbegin', spanSaveIcon); 28 | menuIcon.classList.add('hidden'); 29 | 30 | spanSaveIcon.addEventListener('click', () => { 31 | const task = Task.tasks.find((t) => t.index === parseInt(taskIndex, 10)); 32 | 33 | if (task) { 34 | task.description = taskInput.value; 35 | } 36 | 37 | Task.storageManagement(Task.tasks); 38 | taskInput.setAttribute('readonly', 'readonly'); 39 | menuIcon.classList.remove('hidden'); 40 | spanSaveIcon.classList.add('hidden'); 41 | }); 42 | } 43 | }; 44 | 45 | export default editTask; -------------------------------------------------------------------------------- /src/style.css: -------------------------------------------------------------------------------- 1 | *, 2 | ::after, 3 | ::before { 4 | margin: 0; 5 | padding: 0; 6 | box-sizing: border-box; 7 | } 8 | 9 | html { 10 | font-size: 65%; 11 | } 12 | 13 | body { 14 | font-size: 15px; 15 | background-color: #f5f5f5; 16 | color: #5c5959; 17 | } 18 | 19 | .hidden { 20 | display: none; 21 | } 22 | 23 | .todo-list-menu { 24 | width: 60rem; 25 | margin: 10rem auto; 26 | background-color: #fff; 27 | box-shadow: 0.5rem 0.5rem 2rem #040720; 28 | font-size: 2rem; 29 | list-style: none; 30 | } 31 | 32 | .list-header, 33 | .task-item { 34 | display: flex; 35 | justify-content: space-between; 36 | align-items: center; 37 | padding: 1rem; 38 | flex-wrap: wrap; 39 | color: #040720; 40 | } 41 | 42 | .task-text { 43 | border: none; 44 | padding: 0 0.5rem; 45 | font-size: 1.8rem; 46 | letter-spacing: 1px; 47 | color: #040720; 48 | outline: none; 49 | } 50 | 51 | .todo-list-menu li:not(:nth-last-of-type(2))::after { 52 | content: ""; 53 | flex-basis: 100%; 54 | border-bottom: 0.5px solid #d9d9d9; 55 | padding: 1rem 0; 56 | } 57 | 58 | .menu-icon, 59 | .refresh-icon, 60 | .save-icon { 61 | cursor: pointer; 62 | width: 3rem; 63 | height: 3rem; 64 | } 65 | 66 | .delete-icon { 67 | cursor: pointer; 68 | width: 3.5rem; 69 | } 70 | 71 | .taks-input { 72 | width: 100%; 73 | height: 5rem; 74 | padding: 1rem 1.5rem; 75 | font-size: 2rem; 76 | border: none; 77 | outline: none; 78 | margin-bottom: 2rem; 79 | } 80 | 81 | .clear-btn { 82 | text-align: center; 83 | cursor: pointer; 84 | padding: 2rem; 85 | margin-top: 1.5rem; 86 | background-color: #d9d9d9; 87 | } 88 | 89 | .done { 90 | text-decoration: line-through; 91 | } 92 | -------------------------------------------------------------------------------- /src/img/save-icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | save_item [#80808008080] Created with Sketch. 7 | -------------------------------------------------------------------------------- /dist/5cc280062b69e945d347.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | save_item [#80808008080] Created with Sketch. 7 | -------------------------------------------------------------------------------- /.github/workflows/linters.yml: -------------------------------------------------------------------------------- 1 | name: Linters 2 | 3 | on: pull_request 4 | 5 | env: 6 | FORCE_COLOR: 1 7 | 8 | jobs: 9 | lighthouse: 10 | name: Lighthouse 11 | runs-on: ubuntu-22.04 12 | steps: 13 | - uses: actions/checkout@v3 14 | - uses: actions/setup-node@v3 15 | with: 16 | node-version: "18.x" 17 | - name: Setup Lighthouse 18 | run: npm install -g @lhci/cli@0.11.x 19 | - name: Lighthouse Report 20 | run: lhci autorun --upload.target=temporary-public-storage --collect.staticDistDir=. 21 | webhint: 22 | name: Webhint 23 | runs-on: ubuntu-22.04 24 | steps: 25 | - uses: actions/checkout@v3 26 | - uses: actions/setup-node@v3 27 | with: 28 | node-version: "18.x" 29 | - name: Setup Webhint 30 | run: | 31 | npm install --save-dev hint@7.x 32 | [ -f .hintrc ] || wget https://raw.githubusercontent.com/microverseinc/linters-config/master/html-css-js/.hintrc 33 | - name: Webhint Report 34 | run: npx hint . 35 | stylelint: 36 | name: Stylelint 37 | runs-on: ubuntu-22.04 38 | steps: 39 | - uses: actions/checkout@v3 40 | - uses: actions/setup-node@v3 41 | with: 42 | node-version: "18.x" 43 | - name: Setup Stylelint 44 | run: | 45 | npm install --save-dev stylelint@13.x stylelint-scss@3.x stylelint-config-standard@21.x stylelint-csstree-validator@1.x 46 | [ -f .stylelintrc.json ] || wget https://raw.githubusercontent.com/microverseinc/linters-config/master/html-css-js/.stylelintrc.json 47 | - name: Stylelint Report 48 | run: npx stylelint "**/*.{css,scss}" 49 | eslint: 50 | name: ESLint 51 | runs-on: ubuntu-22.04 52 | steps: 53 | - uses: actions/checkout@v3 54 | - uses: actions/setup-node@v3 55 | with: 56 | node-version: "18.x" 57 | - name: Setup ESLint 58 | run: | 59 | npm install --save-dev eslint@7.x eslint-config-airbnb-base@14.x eslint-plugin-import@2.x babel-eslint@10.x 60 | [ -f .eslintrc.json ] || wget https://raw.githubusercontent.com/microverseinc/linters-config/master/html-css-js/.eslintrc.json 61 | - name: ESLint Report 62 | run: npx eslint . 63 | nodechecker: 64 | name: node_modules checker 65 | runs-on: ubuntu-22.04 66 | steps: 67 | - uses: actions/checkout@v3 68 | - name: Check node_modules existence 69 | run: | 70 | if [ -d "node_modules/" ]; then echo -e "\e[1;31mThe node_modules/ folder was pushed to the repo. Please remove it from the GitHub repository and try again."; echo -e "\e[1;32mYou can set up a .gitignore file with this folder included on it to prevent this from happening in the future." && exit 1; fi -------------------------------------------------------------------------------- /src/img/icons8-trash.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /dist/533f687c0efc420b1e43.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 |
    6 | 7 |

    Todo List

    8 | 9 |
    10 | 11 | 12 | 13 | # 📗 Table of Contents 14 | 15 | - [📖 About the Project](#about-project) 16 | - [🛠 Built With](#built-with) 17 | - [Tech Stack](#tech-stack) 18 | - [Key Features](#key-features) 19 | - [🚀 Live Demo](#live-demo) 20 | - [💻 Getting Started](#getting-started) 21 | - [Setup](#setup) 22 | - [Prerequisites](#prerequisites) 23 | - [Install](#install) 24 | - [Usage](#usage) 25 | - [Run tests](#run-tests) 26 | - [Deployment](#triangular_flag_on_post-deployment) 27 | - [👥 Authors](#authors) 28 | - [🔭 Future Features](#future-features) 29 | - [🤝 Contributing](#contributing) 30 | - [⭐️ Show your support](#support) 31 | - [🙏 Acknowledgements](#acknowledgements) 32 | - [📝 License](#license) 33 | 34 | 35 | 36 | # 📖 Todo List 37 | 38 | 39 | **Todo List** Todo List" is a web application that assists in organizing your daily tasks. With this app, you can easily list the things that you need to do and mark them as complete once they are done. The app is built using ES6 and Webpack, and it provides a simple and intuitive interface for managing your tasks. Use "Todo List" to streamline your day and increase your productivity. 40 | 41 | ## 🛠 Built With 42 | 43 | ### Tech Stack 44 | 45 | 46 |
    47 | Client 48 | 54 |
    55 | 56 | 57 | 58 | ### Key Features 59 | 60 | 61 | - A good HTML and CSS Design. 62 | - Using Webpack 63 | - Check Linters 64 | - Good RADME 65 | 66 |

    (back to top)

    67 | 68 | 69 | 70 | 71 | ## 💻 Getting Started 72 | 73 | To get a local copy up and running, follow these steps. 74 | 75 | ### Prerequisites 76 | 77 | In order to run this project you need: 78 | 79 | - Create a repo on your repositores files. 80 | - Clone or make a copy of this repo on your local machine. 81 | - Follow GitHub flow. 82 | - A carefully reading of this README.md is required. 83 | 84 | 85 | ### Setup 86 | 87 | Clone this repository to your desired folder: 88 | 89 | ```bash 90 | cd my-folder 91 | git clone https://github.com/ahmedeid6842/ToDo-List.git 92 | ``` 93 | 94 | ### Install 95 | 96 | Install this project with: 97 | 98 | ```bash 99 | npm install 100 | ``` 101 | 102 | ### Usage 103 | 104 | To run the project: 105 | ```bash 106 | npm start 107 | ``` 108 | 109 | To build the project: 110 | ```bash 111 | npm run build 112 | ``` 113 | 114 | ### Run tests 115 | 116 | To run tests, execute the following command: 117 | 118 | ```bash 119 | npx hint . 120 | ``` 121 | 122 |

    (back to top)

    123 | 124 | 125 | 126 | ## 👥 Authors 127 | 128 | 👤 **Ahmed Eid** 129 | 130 | - GitHub: [@ahmedeid6842](https://github.com/ahmedeid6842) 131 | - Twitter: [ahmedeid2684](https://twitter.com/ahmedeid2684 132 | ) 133 | - LinkedIn: [Ahmed Eid](https://www.linkedin.com/in/ahmed-eid-0018571b1/) 134 | 135 |

    (back to top)

    136 | 137 | 138 | 139 | ## 🔭 Future Features 140 | 141 | 142 | - [ ] Apply the Addition and removal functionality 143 | - [ ] Make the project more interactive 144 | 145 |

    (back to top)

    146 | 147 | 148 | 149 | ## 🤝 Contributing 150 | 151 | Contributions, issues, and feature requests are welcome! 152 | 153 | Feel free to check the [issues page](../../issues/). 154 | 155 |

    (back to top)

    156 | 157 | 158 | 159 | ## ⭐️ Show your support 160 | 161 | 162 | If you like this project feel free to leave a start, all contributions are welcome!. 163 | 164 |

    (back to top)

    165 | 166 | 167 | 168 | ## 🙏 Acknowledgments 169 | 170 | We would like to thank Microverse comunity, they do an excellent job. 171 | 172 |

    (back to top)

    173 | 174 | ## 📝 License 175 | 176 | This project is [MIT](./MIT.md) licensed. 177 | 178 | _NOTE: we recommend using the [MIT license] 179 | 180 |

    (back to top)

    181 | -------------------------------------------------------------------------------- /dist/main.js: -------------------------------------------------------------------------------- 1 | /* 2 | * ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development"). 3 | * This devtool is neither made for production nor for readable output files. 4 | * It uses "eval()" calls to create a separate source file in the browser devtools. 5 | * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) 6 | * or disable the default devtool with "devtool: false". 7 | * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). 8 | */ 9 | /******/ (() => { // webpackBootstrap 10 | /******/ "use strict"; 11 | /******/ var __webpack_modules__ = ({ 12 | 13 | /***/ "./node_modules/css-loader/dist/cjs.js!./src/style.css": 14 | /*!*************************************************************!*\ 15 | !*** ./node_modules/css-loader/dist/cjs.js!./src/style.css ***! 16 | \*************************************************************/ 17 | /***/ ((module, __webpack_exports__, __webpack_require__) => { 18 | 19 | eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../node_modules/css-loader/dist/runtime/noSourceMaps.js */ \"./node_modules/css-loader/dist/runtime/noSourceMaps.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `*,\n::after,\n::before {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n}\n\nhtml {\n font-size: 65%;\n}\n\nbody {\n font-size: 15px;\n background-color: #f5f5f5;\n color: #5c5959;\n}\n\n.hidden {\n display: none;\n}\n\n.todo-list-menu {\n width: 60rem;\n margin: 10rem auto;\n background-color: #fff;\n box-shadow: 0.5rem 0.5rem 2rem #040720;\n font-size: 2rem;\n list-style: none;\n}\n\n.list-header,\n.task-item {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 1rem;\n flex-wrap: wrap;\n color: #040720;\n}\n\n.task-text {\n border: none;\n padding: 0 0.5rem;\n font-size: 1.8rem;\n letter-spacing: 1px;\n color: #040720;\n outline: none;\n}\n\n.todo-list-menu li:not(:nth-last-of-type(2))::after {\n content: \"\";\n flex-basis: 100%;\n border-bottom: 0.5px solid #d9d9d9;\n padding: 1rem 0;\n}\n\n.menu-icon,\n.refresh-icon,\n.save-icon {\n cursor: pointer;\n width: 3rem;\n height: 3rem;\n}\n\n.delete-icon {\n cursor: pointer;\n width: 3.5rem;\n}\n\n.taks-input {\n width: 100%;\n height: 5rem;\n padding: 1rem 1.5rem;\n font-size: 2rem;\n border: none;\n outline: none;\n margin-bottom: 2rem;\n}\n\n.clear-btn {\n text-align: center;\n cursor: pointer;\n padding: 2rem;\n margin-top: 1.5rem;\n background-color: #d9d9d9;\n}\n\n.done {\n text-decoration: line-through;\n}\n`, \"\"]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n\n\n//# sourceURL=webpack://todo-list/./src/style.css?./node_modules/css-loader/dist/cjs.js"); 20 | 21 | /***/ }), 22 | 23 | /***/ "./node_modules/css-loader/dist/runtime/api.js": 24 | /*!*****************************************************!*\ 25 | !*** ./node_modules/css-loader/dist/runtime/api.js ***! 26 | \*****************************************************/ 27 | /***/ ((module) => { 28 | 29 | eval("\n\n/*\n MIT License http://www.opensource.org/licenses/mit-license.php\n Author Tobias Koppers @sokra\n*/\nmodule.exports = function (cssWithMappingToString) {\n var list = [];\n\n // return the list of modules as css string\n list.toString = function toString() {\n return this.map(function (item) {\n var content = \"\";\n var needLayer = typeof item[5] !== \"undefined\";\n if (item[4]) {\n content += \"@supports (\".concat(item[4], \") {\");\n }\n if (item[2]) {\n content += \"@media \".concat(item[2], \" {\");\n }\n if (needLayer) {\n content += \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\");\n }\n content += cssWithMappingToString(item);\n if (needLayer) {\n content += \"}\";\n }\n if (item[2]) {\n content += \"}\";\n }\n if (item[4]) {\n content += \"}\";\n }\n return content;\n }).join(\"\");\n };\n\n // import a list of modules into the list\n list.i = function i(modules, media, dedupe, supports, layer) {\n if (typeof modules === \"string\") {\n modules = [[null, modules, undefined]];\n }\n var alreadyImportedModules = {};\n if (dedupe) {\n for (var k = 0; k < this.length; k++) {\n var id = this[k][0];\n if (id != null) {\n alreadyImportedModules[id] = true;\n }\n }\n }\n for (var _k = 0; _k < modules.length; _k++) {\n var item = [].concat(modules[_k]);\n if (dedupe && alreadyImportedModules[item[0]]) {\n continue;\n }\n if (typeof layer !== \"undefined\") {\n if (typeof item[5] === \"undefined\") {\n item[5] = layer;\n } else {\n item[1] = \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\").concat(item[1], \"}\");\n item[5] = layer;\n }\n }\n if (media) {\n if (!item[2]) {\n item[2] = media;\n } else {\n item[1] = \"@media \".concat(item[2], \" {\").concat(item[1], \"}\");\n item[2] = media;\n }\n }\n if (supports) {\n if (!item[4]) {\n item[4] = \"\".concat(supports);\n } else {\n item[1] = \"@supports (\".concat(item[4], \") {\").concat(item[1], \"}\");\n item[4] = supports;\n }\n }\n list.push(item);\n }\n };\n return list;\n};\n\n//# sourceURL=webpack://todo-list/./node_modules/css-loader/dist/runtime/api.js?"); 30 | 31 | /***/ }), 32 | 33 | /***/ "./node_modules/css-loader/dist/runtime/noSourceMaps.js": 34 | /*!**************************************************************!*\ 35 | !*** ./node_modules/css-loader/dist/runtime/noSourceMaps.js ***! 36 | \**************************************************************/ 37 | /***/ ((module) => { 38 | 39 | eval("\n\nmodule.exports = function (i) {\n return i[1];\n};\n\n//# sourceURL=webpack://todo-list/./node_modules/css-loader/dist/runtime/noSourceMaps.js?"); 40 | 41 | /***/ }), 42 | 43 | /***/ "./src/style.css": 44 | /*!***********************!*\ 45 | !*** ./src/style.css ***! 46 | \***********************/ 47 | /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { 48 | 49 | eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! !../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js */ \"./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\");\n/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! !../node_modules/style-loader/dist/runtime/styleDomAPI.js */ \"./node_modules/style-loader/dist/runtime/styleDomAPI.js\");\n/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! !../node_modules/style-loader/dist/runtime/insertBySelector.js */ \"./node_modules/style-loader/dist/runtime/insertBySelector.js\");\n/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! !../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js */ \"./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\");\n/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! !../node_modules/style-loader/dist/runtime/insertStyleElement.js */ \"./node_modules/style-loader/dist/runtime/insertStyleElement.js\");\n/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! !../node_modules/style-loader/dist/runtime/styleTagTransform.js */ \"./node_modules/style-loader/dist/runtime/styleTagTransform.js\");\n/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _node_modules_css_loader_dist_cjs_js_style_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! !!../node_modules/css-loader/dist/cjs.js!./style.css */ \"./node_modules/css-loader/dist/cjs.js!./src/style.css\");\n\n \n \n \n \n \n \n \n \n \n\nvar options = {};\n\noptions.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default());\noptions.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default());\n\n options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, \"head\");\n \noptions.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default());\noptions.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default());\n\nvar update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_style_css__WEBPACK_IMPORTED_MODULE_6__[\"default\"], options);\n\n\n\n\n /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_css_loader_dist_cjs_js_style_css__WEBPACK_IMPORTED_MODULE_6__[\"default\"] && _node_modules_css_loader_dist_cjs_js_style_css__WEBPACK_IMPORTED_MODULE_6__[\"default\"].locals ? _node_modules_css_loader_dist_cjs_js_style_css__WEBPACK_IMPORTED_MODULE_6__[\"default\"].locals : undefined);\n\n\n//# sourceURL=webpack://todo-list/./src/style.css?"); 50 | 51 | /***/ }), 52 | 53 | /***/ "./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js": 54 | /*!****************************************************************************!*\ 55 | !*** ./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js ***! 56 | \****************************************************************************/ 57 | /***/ ((module) => { 58 | 59 | eval("\n\nvar stylesInDOM = [];\nfunction getIndexByIdentifier(identifier) {\n var result = -1;\n for (var i = 0; i < stylesInDOM.length; i++) {\n if (stylesInDOM[i].identifier === identifier) {\n result = i;\n break;\n }\n }\n return result;\n}\nfunction modulesToDom(list, options) {\n var idCountMap = {};\n var identifiers = [];\n for (var i = 0; i < list.length; i++) {\n var item = list[i];\n var id = options.base ? item[0] + options.base : item[0];\n var count = idCountMap[id] || 0;\n var identifier = \"\".concat(id, \" \").concat(count);\n idCountMap[id] = count + 1;\n var indexByIdentifier = getIndexByIdentifier(identifier);\n var obj = {\n css: item[1],\n media: item[2],\n sourceMap: item[3],\n supports: item[4],\n layer: item[5]\n };\n if (indexByIdentifier !== -1) {\n stylesInDOM[indexByIdentifier].references++;\n stylesInDOM[indexByIdentifier].updater(obj);\n } else {\n var updater = addElementStyle(obj, options);\n options.byIndex = i;\n stylesInDOM.splice(i, 0, {\n identifier: identifier,\n updater: updater,\n references: 1\n });\n }\n identifiers.push(identifier);\n }\n return identifiers;\n}\nfunction addElementStyle(obj, options) {\n var api = options.domAPI(options);\n api.update(obj);\n var updater = function updater(newObj) {\n if (newObj) {\n if (newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap && newObj.supports === obj.supports && newObj.layer === obj.layer) {\n return;\n }\n api.update(obj = newObj);\n } else {\n api.remove();\n }\n };\n return updater;\n}\nmodule.exports = function (list, options) {\n options = options || {};\n list = list || [];\n var lastIdentifiers = modulesToDom(list, options);\n return function update(newList) {\n newList = newList || [];\n for (var i = 0; i < lastIdentifiers.length; i++) {\n var identifier = lastIdentifiers[i];\n var index = getIndexByIdentifier(identifier);\n stylesInDOM[index].references--;\n }\n var newLastIdentifiers = modulesToDom(newList, options);\n for (var _i = 0; _i < lastIdentifiers.length; _i++) {\n var _identifier = lastIdentifiers[_i];\n var _index = getIndexByIdentifier(_identifier);\n if (stylesInDOM[_index].references === 0) {\n stylesInDOM[_index].updater();\n stylesInDOM.splice(_index, 1);\n }\n }\n lastIdentifiers = newLastIdentifiers;\n };\n};\n\n//# sourceURL=webpack://todo-list/./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js?"); 60 | 61 | /***/ }), 62 | 63 | /***/ "./node_modules/style-loader/dist/runtime/insertBySelector.js": 64 | /*!********************************************************************!*\ 65 | !*** ./node_modules/style-loader/dist/runtime/insertBySelector.js ***! 66 | \********************************************************************/ 67 | /***/ ((module) => { 68 | 69 | eval("\n\nvar memo = {};\n\n/* istanbul ignore next */\nfunction getTarget(target) {\n if (typeof memo[target] === \"undefined\") {\n var styleTarget = document.querySelector(target);\n\n // Special case to return head of iframe instead of iframe itself\n if (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) {\n try {\n // This will throw an exception if access to iframe is blocked\n // due to cross-origin restrictions\n styleTarget = styleTarget.contentDocument.head;\n } catch (e) {\n // istanbul ignore next\n styleTarget = null;\n }\n }\n memo[target] = styleTarget;\n }\n return memo[target];\n}\n\n/* istanbul ignore next */\nfunction insertBySelector(insert, style) {\n var target = getTarget(insert);\n if (!target) {\n throw new Error(\"Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.\");\n }\n target.appendChild(style);\n}\nmodule.exports = insertBySelector;\n\n//# sourceURL=webpack://todo-list/./node_modules/style-loader/dist/runtime/insertBySelector.js?"); 70 | 71 | /***/ }), 72 | 73 | /***/ "./node_modules/style-loader/dist/runtime/insertStyleElement.js": 74 | /*!**********************************************************************!*\ 75 | !*** ./node_modules/style-loader/dist/runtime/insertStyleElement.js ***! 76 | \**********************************************************************/ 77 | /***/ ((module) => { 78 | 79 | eval("\n\n/* istanbul ignore next */\nfunction insertStyleElement(options) {\n var element = document.createElement(\"style\");\n options.setAttributes(element, options.attributes);\n options.insert(element, options.options);\n return element;\n}\nmodule.exports = insertStyleElement;\n\n//# sourceURL=webpack://todo-list/./node_modules/style-loader/dist/runtime/insertStyleElement.js?"); 80 | 81 | /***/ }), 82 | 83 | /***/ "./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js": 84 | /*!**********************************************************************************!*\ 85 | !*** ./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js ***! 86 | \**********************************************************************************/ 87 | /***/ ((module, __unused_webpack_exports, __webpack_require__) => { 88 | 89 | eval("\n\n/* istanbul ignore next */\nfunction setAttributesWithoutAttributes(styleElement) {\n var nonce = true ? __webpack_require__.nc : 0;\n if (nonce) {\n styleElement.setAttribute(\"nonce\", nonce);\n }\n}\nmodule.exports = setAttributesWithoutAttributes;\n\n//# sourceURL=webpack://todo-list/./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js?"); 90 | 91 | /***/ }), 92 | 93 | /***/ "./node_modules/style-loader/dist/runtime/styleDomAPI.js": 94 | /*!***************************************************************!*\ 95 | !*** ./node_modules/style-loader/dist/runtime/styleDomAPI.js ***! 96 | \***************************************************************/ 97 | /***/ ((module) => { 98 | 99 | eval("\n\n/* istanbul ignore next */\nfunction apply(styleElement, options, obj) {\n var css = \"\";\n if (obj.supports) {\n css += \"@supports (\".concat(obj.supports, \") {\");\n }\n if (obj.media) {\n css += \"@media \".concat(obj.media, \" {\");\n }\n var needLayer = typeof obj.layer !== \"undefined\";\n if (needLayer) {\n css += \"@layer\".concat(obj.layer.length > 0 ? \" \".concat(obj.layer) : \"\", \" {\");\n }\n css += obj.css;\n if (needLayer) {\n css += \"}\";\n }\n if (obj.media) {\n css += \"}\";\n }\n if (obj.supports) {\n css += \"}\";\n }\n var sourceMap = obj.sourceMap;\n if (sourceMap && typeof btoa !== \"undefined\") {\n css += \"\\n/*# sourceMappingURL=data:application/json;base64,\".concat(btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))), \" */\");\n }\n\n // For old IE\n /* istanbul ignore if */\n options.styleTagTransform(css, styleElement, options.options);\n}\nfunction removeStyleElement(styleElement) {\n // istanbul ignore if\n if (styleElement.parentNode === null) {\n return false;\n }\n styleElement.parentNode.removeChild(styleElement);\n}\n\n/* istanbul ignore next */\nfunction domAPI(options) {\n if (typeof document === \"undefined\") {\n return {\n update: function update() {},\n remove: function remove() {}\n };\n }\n var styleElement = options.insertStyleElement(options);\n return {\n update: function update(obj) {\n apply(styleElement, options, obj);\n },\n remove: function remove() {\n removeStyleElement(styleElement);\n }\n };\n}\nmodule.exports = domAPI;\n\n//# sourceURL=webpack://todo-list/./node_modules/style-loader/dist/runtime/styleDomAPI.js?"); 100 | 101 | /***/ }), 102 | 103 | /***/ "./node_modules/style-loader/dist/runtime/styleTagTransform.js": 104 | /*!*********************************************************************!*\ 105 | !*** ./node_modules/style-loader/dist/runtime/styleTagTransform.js ***! 106 | \*********************************************************************/ 107 | /***/ ((module) => { 108 | 109 | eval("\n\n/* istanbul ignore next */\nfunction styleTagTransform(css, styleElement) {\n if (styleElement.styleSheet) {\n styleElement.styleSheet.cssText = css;\n } else {\n while (styleElement.firstChild) {\n styleElement.removeChild(styleElement.firstChild);\n }\n styleElement.appendChild(document.createTextNode(css));\n }\n}\nmodule.exports = styleTagTransform;\n\n//# sourceURL=webpack://todo-list/./node_modules/style-loader/dist/runtime/styleTagTransform.js?"); 110 | 111 | /***/ }), 112 | 113 | /***/ "./src/index.js": 114 | /*!**********************!*\ 115 | !*** ./src/index.js ***! 116 | \**********************/ 117 | /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { 118 | 119 | eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _style_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./style.css */ \"./src/style.css\");\n/* harmony import */ var _modules_displayTask_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./modules/displayTask.js */ \"./src/modules/displayTask.js\");\n/* harmony import */ var _modules_createTask_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./modules/createTask.js */ \"./src/modules/createTask.js\");\n/* harmony import */ var _modules_deleteTask_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./modules/deleteTask.js */ \"./src/modules/deleteTask.js\");\n/* harmony import */ var _modules_editTask_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./modules/editTask.js */ \"./src/modules/editTask.js\");\n/* harmony import */ var _modules_completeTask_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./modules/completeTask.js */ \"./src/modules/completeTask.js\");\n/* harmony import */ var _modules_clearTask_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./modules/clearTask.js */ \"./src/modules/clearTask.js\");\n\n\n\n\n\n\n\n\nconst clearButton = document.querySelector('.clear-btn');\n\ndocument.addEventListener('keypress', _modules_createTask_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"]);\ndocument.addEventListener('click', _modules_deleteTask_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"]);\ndocument.addEventListener('click', _modules_editTask_js__WEBPACK_IMPORTED_MODULE_4__[\"default\"]);\nclearButton.addEventListener('click', _modules_clearTask_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"]);\n\n(0,_modules_displayTask_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])();\n(0,_modules_completeTask_js__WEBPACK_IMPORTED_MODULE_5__[\"default\"])();\n\n//# sourceURL=webpack://todo-list/./src/index.js?"); 120 | 121 | /***/ }), 122 | 123 | /***/ "./src/modules/Task.js": 124 | /*!*****************************!*\ 125 | !*** ./src/modules/Task.js ***! 126 | \*****************************/ 127 | /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { 128 | 129 | eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ Task)\n/* harmony export */ });\nclass Task {\n static tasks = [];\n\n constructor(description, index) {\n this.description = description;\n this.index = index;\n this.completed = false;\n }\n\n static storageManagement(task) {\n localStorage.setItem('taskList', JSON.stringify(task));\n }\n}\n\n\n//# sourceURL=webpack://todo-list/./src/modules/Task.js?"); 130 | 131 | /***/ }), 132 | 133 | /***/ "./src/modules/clearTask.js": 134 | /*!**********************************!*\ 135 | !*** ./src/modules/clearTask.js ***! 136 | \**********************************/ 137 | /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { 138 | 139 | eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _Task_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Task.js */ \"./src/modules/Task.js\");\n/* harmony import */ var _displayTask_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./displayTask.js */ \"./src/modules/displayTask.js\");\n\n\n\nconst reDisplayTask = () => {\n const taskItems = document.querySelectorAll('.task-item');\n taskItems.forEach((task) => {\n task.remove();\n });\n\n (0,_displayTask_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])();\n};\n\nconst clearCompletedTask = () => {\n const completedTasks = document.querySelectorAll('done');\n\n completedTasks.forEach((task) => {\n task.parentNode.parentNode.remove();\n });\n\n _Task_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].tasks = _Task_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].tasks.filter((task) => task.completed !== true)\n .map((task, index) => ({ ...task, index: index + 1 }));\n\n _Task_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].storageManagement(_Task_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].tasks);\n reDisplayTask();\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (clearCompletedTask);\n\n//# sourceURL=webpack://todo-list/./src/modules/clearTask.js?"); 140 | 141 | /***/ }), 142 | 143 | /***/ "./src/modules/completeTask.js": 144 | /*!*************************************!*\ 145 | !*** ./src/modules/completeTask.js ***! 146 | \*************************************/ 147 | /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { 148 | 149 | eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _Task_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Task.js */ \"./src/modules/Task.js\");\n\n\nconst boxChangeHanlder = (event) => {\n const targetID = parseInt(event.target.parentNode.parentNode.className.split(' ')[1], 10) - 1;\n if (event.target.checked) {\n event.target.nextElementSibling.classList.add('done');\n _Task_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].tasks[targetID].completed = true;\n _Task_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].storageManagement(_Task_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].tasks);\n } else if (!event.target.checked) {\n event.target.nextElementSibling.classList.remove('done');\n _Task_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].tasks[targetID].completed = false;\n _Task_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].storageManagement(_Task_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].tasks);\n }\n};\n\nconst completeTask = () => {\n const checkBoxes = document.querySelectorAll('.checkbox');\n checkBoxes.forEach((box) => {\n box.addEventListener('change', (event) => {\n boxChangeHanlder(event);\n });\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (completeTask);\n\n//# sourceURL=webpack://todo-list/./src/modules/completeTask.js?"); 150 | 151 | /***/ }), 152 | 153 | /***/ "./src/modules/createTask.js": 154 | /*!***********************************!*\ 155 | !*** ./src/modules/createTask.js ***! 156 | \***********************************/ 157 | /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { 158 | 159 | eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _img_menu_icon_svg__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../img/menu-icon.svg */ \"./src/img/menu-icon.svg\");\n/* harmony import */ var _img_icons8_trash_svg__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../img/icons8-trash.svg */ \"./src/img/icons8-trash.svg\");\n/* harmony import */ var _Task_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Task.js */ \"./src/modules/Task.js\");\n/* harmony import */ var _completeTask_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./completeTask.js */ \"./src/modules/completeTask.js\");\n\n\n\n\n\nconst inputField = document.querySelector('.taks-input');\nconst taskList = document.querySelector('.task-input-item');\n\nconst createTask = (event) => {\n if (JSON.parse(localStorage.getItem('taskList'))) {\n _Task_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].tasks = JSON.parse(localStorage.getItem('taskList'));\n }\n\n if (event.key === 'Enter') {\n if (inputField.value === '') return;\n\n const newItem = new _Task_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"](inputField.value, _Task_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].tasks.length + 1);\n _Task_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].tasks.push(newItem);\n _Task_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].storageManagement(_Task_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].tasks);\n\n const html = `\n
  • \n
    \n \n
    \n
    \n \"option-icon\"\n \"delete-icon\"\n
    \n
  • \n `;\n taskList.insertAdjacentHTML('afterend', html);\n (0,_completeTask_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"])();\n inputField.value = '';\n }\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (createTask);\n\n//# sourceURL=webpack://todo-list/./src/modules/createTask.js?"); 160 | 161 | /***/ }), 162 | 163 | /***/ "./src/modules/deleteTask.js": 164 | /*!***********************************!*\ 165 | !*** ./src/modules/deleteTask.js ***! 166 | \***********************************/ 167 | /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { 168 | 169 | eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _Task_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Task.js */ \"./src/modules/Task.js\");\n\n\nconst deleteTask = (event) => {\n if (event.target.classList.contains('delete-icon')) {\n const taskIndex = event.target.parentNode.parentNode.className.split(' ')[1];\n const task = event.target.parentNode.parentNode;\n\n _Task_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].tasks = _Task_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].tasks.filter((task) => task.index !== parseInt(taskIndex, 10))\n .map((task, index) => ({ ...task, index: index + 1 }));\n\n _Task_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].storageManagement(_Task_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].tasks);\n task.remove();\n }\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (deleteTask);\n\n//# sourceURL=webpack://todo-list/./src/modules/deleteTask.js?"); 170 | 171 | /***/ }), 172 | 173 | /***/ "./src/modules/displayTask.js": 174 | /*!************************************!*\ 175 | !*** ./src/modules/displayTask.js ***! 176 | \************************************/ 177 | /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { 178 | 179 | eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _img_menu_icon_svg__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../img/menu-icon.svg */ \"./src/img/menu-icon.svg\");\n/* harmony import */ var _img_icons8_trash_svg__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../img/icons8-trash.svg */ \"./src/img/icons8-trash.svg\");\n/* harmony import */ var _Task_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Task.js */ \"./src/modules/Task.js\");\n/* harmony import */ var _completeTask_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./completeTask.js */ \"./src/modules/completeTask.js\");\n\n\n\n\n\nconst inputs = document.querySelector('.task-input-item');\n\nconst tasksDisplay = () => {\n if (JSON.parse(localStorage.getItem('taskList'))) {\n _Task_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].tasks = JSON.parse(localStorage.getItem('taskList'));\n }\n\n _Task_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].tasks.forEach((task) => {\n const html = `\n
  • \n
    \n \n
    \n
    \n \"option-icon\"\n \"delete-icon\"\n
    \n
  • \n `;\n inputs.insertAdjacentHTML('afterend', html);\n });\n (0,_completeTask_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"])();\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (tasksDisplay);\n\n//# sourceURL=webpack://todo-list/./src/modules/displayTask.js?"); 180 | 181 | /***/ }), 182 | 183 | /***/ "./src/modules/editTask.js": 184 | /*!*********************************!*\ 185 | !*** ./src/modules/editTask.js ***! 186 | \*********************************/ 187 | /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { 188 | 189 | eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _Task_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Task.js */ \"./src/modules/Task.js\");\n/* harmony import */ var _img_save_icon_svg__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../img/save-icon.svg */ \"./src/img/save-icon.svg\");\n\n\n\nconst editTask = (event) => {\n if (event.target.classList.contains('menu-icon')) {\n const taskIndex = event.target.parentNode.parentNode.className.split(' ')[1];\n const menuIcon = event.target;\n const taskInput = event.target.parentNode.parentNode.firstChild.nextSibling.childNodes[3];\n\n taskInput.removeAttribute('readonly');\n taskInput.focus();\n\n const spanIcon = document.createElement('span');\n const img = document.createElement('img');\n\n img.setAttribute('src', _img_save_icon_svg__WEBPACK_IMPORTED_MODULE_1__);\n img.setAttribute('alt', 'Save Icon');\n img.classList.add('save-icon');\n\n spanIcon.appendChild(img);\n menuIcon.parentNode.insertAdjacentElement('afterbegin', spanIcon);\n menuIcon.classList.add('hidden');\n\n spanIcon.addEventListener('click', () => {\n const task = _Task_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].tasks.find((t) => t.index === parseInt(taskIndex, 10));\n\n if (task) {\n task.description = taskInput.value;\n }\n\n _Task_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].storageManagement(_Task_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].tasks);\n taskInput.setAttribute('readonly', 'readonly');\n menuIcon.classList.remove('hidden');\n spanIcon.classList.add('hidden');\n });\n }\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (editTask);\n\n//# sourceURL=webpack://todo-list/./src/modules/editTask.js?"); 190 | 191 | /***/ }), 192 | 193 | /***/ "./src/img/icons8-trash.svg": 194 | /*!**********************************!*\ 195 | !*** ./src/img/icons8-trash.svg ***! 196 | \**********************************/ 197 | /***/ ((module, __unused_webpack_exports, __webpack_require__) => { 198 | 199 | eval("module.exports = __webpack_require__.p + \"533f687c0efc420b1e43.svg\";\n\n//# sourceURL=webpack://todo-list/./src/img/icons8-trash.svg?"); 200 | 201 | /***/ }), 202 | 203 | /***/ "./src/img/menu-icon.svg": 204 | /*!*******************************!*\ 205 | !*** ./src/img/menu-icon.svg ***! 206 | \*******************************/ 207 | /***/ ((module, __unused_webpack_exports, __webpack_require__) => { 208 | 209 | eval("module.exports = __webpack_require__.p + \"19c84313d62edb23795c.svg\";\n\n//# sourceURL=webpack://todo-list/./src/img/menu-icon.svg?"); 210 | 211 | /***/ }), 212 | 213 | /***/ "./src/img/save-icon.svg": 214 | /*!*******************************!*\ 215 | !*** ./src/img/save-icon.svg ***! 216 | \*******************************/ 217 | /***/ ((module, __unused_webpack_exports, __webpack_require__) => { 218 | 219 | eval("module.exports = __webpack_require__.p + \"5cc280062b69e945d347.svg\";\n\n//# sourceURL=webpack://todo-list/./src/img/save-icon.svg?"); 220 | 221 | /***/ }) 222 | 223 | /******/ }); 224 | /************************************************************************/ 225 | /******/ // The module cache 226 | /******/ var __webpack_module_cache__ = {}; 227 | /******/ 228 | /******/ // The require function 229 | /******/ function __webpack_require__(moduleId) { 230 | /******/ // Check if module is in cache 231 | /******/ var cachedModule = __webpack_module_cache__[moduleId]; 232 | /******/ if (cachedModule !== undefined) { 233 | /******/ return cachedModule.exports; 234 | /******/ } 235 | /******/ // Create a new module (and put it into the cache) 236 | /******/ var module = __webpack_module_cache__[moduleId] = { 237 | /******/ id: moduleId, 238 | /******/ // no module.loaded needed 239 | /******/ exports: {} 240 | /******/ }; 241 | /******/ 242 | /******/ // Execute the module function 243 | /******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); 244 | /******/ 245 | /******/ // Return the exports of the module 246 | /******/ return module.exports; 247 | /******/ } 248 | /******/ 249 | /************************************************************************/ 250 | /******/ /* webpack/runtime/compat get default export */ 251 | /******/ (() => { 252 | /******/ // getDefaultExport function for compatibility with non-harmony modules 253 | /******/ __webpack_require__.n = (module) => { 254 | /******/ var getter = module && module.__esModule ? 255 | /******/ () => (module['default']) : 256 | /******/ () => (module); 257 | /******/ __webpack_require__.d(getter, { a: getter }); 258 | /******/ return getter; 259 | /******/ }; 260 | /******/ })(); 261 | /******/ 262 | /******/ /* webpack/runtime/define property getters */ 263 | /******/ (() => { 264 | /******/ // define getter functions for harmony exports 265 | /******/ __webpack_require__.d = (exports, definition) => { 266 | /******/ for(var key in definition) { 267 | /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { 268 | /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); 269 | /******/ } 270 | /******/ } 271 | /******/ }; 272 | /******/ })(); 273 | /******/ 274 | /******/ /* webpack/runtime/global */ 275 | /******/ (() => { 276 | /******/ __webpack_require__.g = (function() { 277 | /******/ if (typeof globalThis === 'object') return globalThis; 278 | /******/ try { 279 | /******/ return this || new Function('return this')(); 280 | /******/ } catch (e) { 281 | /******/ if (typeof window === 'object') return window; 282 | /******/ } 283 | /******/ })(); 284 | /******/ })(); 285 | /******/ 286 | /******/ /* webpack/runtime/hasOwnProperty shorthand */ 287 | /******/ (() => { 288 | /******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) 289 | /******/ })(); 290 | /******/ 291 | /******/ /* webpack/runtime/make namespace object */ 292 | /******/ (() => { 293 | /******/ // define __esModule on exports 294 | /******/ __webpack_require__.r = (exports) => { 295 | /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { 296 | /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); 297 | /******/ } 298 | /******/ Object.defineProperty(exports, '__esModule', { value: true }); 299 | /******/ }; 300 | /******/ })(); 301 | /******/ 302 | /******/ /* webpack/runtime/publicPath */ 303 | /******/ (() => { 304 | /******/ var scriptUrl; 305 | /******/ if (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + ""; 306 | /******/ var document = __webpack_require__.g.document; 307 | /******/ if (!scriptUrl && document) { 308 | /******/ if (document.currentScript) 309 | /******/ scriptUrl = document.currentScript.src; 310 | /******/ if (!scriptUrl) { 311 | /******/ var scripts = document.getElementsByTagName("script"); 312 | /******/ if(scripts.length) { 313 | /******/ var i = scripts.length - 1; 314 | /******/ while (i > -1 && !scriptUrl) scriptUrl = scripts[i--].src; 315 | /******/ } 316 | /******/ } 317 | /******/ } 318 | /******/ // When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration 319 | /******/ // or pass an empty string ("") and set the __webpack_public_path__ variable from your code to use your own logic. 320 | /******/ if (!scriptUrl) throw new Error("Automatic publicPath is not supported in this browser"); 321 | /******/ scriptUrl = scriptUrl.replace(/#.*$/, "").replace(/\?.*$/, "").replace(/\/[^\/]+$/, "/"); 322 | /******/ __webpack_require__.p = scriptUrl; 323 | /******/ })(); 324 | /******/ 325 | /******/ /* webpack/runtime/nonce */ 326 | /******/ (() => { 327 | /******/ __webpack_require__.nc = undefined; 328 | /******/ })(); 329 | /******/ 330 | /************************************************************************/ 331 | /******/ 332 | /******/ // startup 333 | /******/ // Load entry module and return exports 334 | /******/ // This entry module can't be inlined because the eval devtool is used. 335 | /******/ var __webpack_exports__ = __webpack_require__("./src/index.js"); 336 | /******/ 337 | /******/ })() 338 | ; --------------------------------------------------------------------------------