|
1 | 1 | <!DOCTYPE html> |
2 | 2 | <html lang="en"> |
3 | | -<head> |
4 | | - <meta charset="UTF-8"> |
5 | | - <title>LocalStorage</title> |
6 | | - <link rel="stylesheet" href="style.css"> |
7 | | -</head> |
8 | | -<body> |
9 | | - <!-- |
| 3 | + <head> |
| 4 | + <meta charset="UTF-8" /> |
| 5 | + <title>LocalStorage</title> |
| 6 | + <link rel="stylesheet" href="style.css" /> |
| 7 | + </head> |
| 8 | + <body> |
| 9 | + <!-- |
10 | 10 | Fish SVG Cred: |
11 | 11 | https://thenounproject.com/search/?q=fish&i=589236 |
12 | 12 | --> |
13 | 13 |
|
14 | | - <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" x="0px" y="0px" viewBox="0 0 512 512" enable-background="new 0 0 512 512" xml:space="preserve"><g><path d="M495.9,425.3H16.1c-5.2,0-10.1,2.9-12.5,7.6c-2.4,4.7-2.1,10.3,0.9,14.6l39,56.4c2.6,3.8,7,6.1,11.6,6.1h401.7 c4.6,0,9-2.3,11.6-6.1l39-56.4c3-4.3,3.3-9.9,0.9-14.6C506,428.2,501.1,425.3,495.9,425.3z M449.4,481.8H62.6L43,453.6H469 L449.4,481.8z"/><path d="M158.3,122c7.8,0,14.1-6.3,14.1-14.1V43.4c0-7.8-6.3-14.1-14.1-14.1c-7.8,0-14.1,6.3-14.1,14.1v64.5 C144.2,115.7,150.5,122,158.3,122z"/><path d="M245.1,94.7c7.8,0,14.1-6.3,14.1-14.1V16.1c0-7.8-6.3-14.1-14.1-14.1C237.3,2,231,8.3,231,16.1v64.5 C231,88.4,237.3,94.7,245.1,94.7z"/><path d="M331.9,122c7.8,0,14.1-6.3,14.1-14.1V43.4c0-7.8-6.3-14.1-14.1-14.1s-14.1,6.3-14.1,14.1v64.5 C317.8,115.7,324.1,122,331.9,122z"/><path d="M9.6,385.2c5.3,2.8,11.8,1.9,16.2-2.2l50.6-47.7c56.7,46.5,126.6,71.9,198.3,71.9c0,0,0,0,0,0 c87.5,0,169.7-36.6,231.4-103.2c5-5.4,5-13.8,0-19.2c-61.8-66.5-144-103.2-231.4-103.2c-72,0-142.2,25.6-199,72.5l-50-47.1 c-4.4-4.1-10.9-5-16.2-2.2c-5.3,2.8-8.3,8.7-7.4,14.6l11.6,75L2.2,370.6C1.3,376.5,4.2,382.4,9.6,385.2z M380.9,230.8 c34.9,14.3,67.2,35.7,95.3,63.6c-10.1,10-20.8,19.2-31.9,27.5c-22.4-3.3-29.6-8.8-30.7-9.7c-4-5.7-11.8-7.7-18.1-4.4 c-6.9,3.6-9.5,12.2-5.9,19.1c1.9,3.5,7.3,10.3,22.4,16c-10.1,5.7-20.5,10.7-31.1,15.1C352.4,320.2,352.4,268.6,380.9,230.8z M36.3,255.6l29.4,27.7c5.3,5,13.6,5.1,19.1,0.3c53.2-47.6,120.7-73.7,190-73.7c26.9,0,53.2,3.9,78.5,11.3 c-29.3,44.6-29.3,102,0,146.6c-25.3,7.4-51.6,11.3-78.5,11.3c-69,0-136.3-26-189.4-73.2c-2.7-2.4-13.4-6.3-19.1,0.3l-30.1,28.3 l5.7-40C42.2,293,36.3,255.6,36.3,255.6z"/><circle cx="398.8" cy="273.8" r="14.1"/></g></svg> |
| 14 | + <svg |
| 15 | + xmlns="http://www.w3.org/2000/svg" |
| 16 | + xmlns:xlink="http://www.w3.org/1999/xlink" |
| 17 | + version="1.1" |
| 18 | + x="0px" |
| 19 | + y="0px" |
| 20 | + viewBox="0 0 512 512" |
| 21 | + enable-background="new 0 0 512 512" |
| 22 | + xml:space="preserve" |
| 23 | + > |
| 24 | + <g> |
| 25 | + <path |
| 26 | + d="M495.9,425.3H16.1c-5.2,0-10.1,2.9-12.5,7.6c-2.4,4.7-2.1,10.3,0.9,14.6l39,56.4c2.6,3.8,7,6.1,11.6,6.1h401.7 c4.6,0,9-2.3,11.6-6.1l39-56.4c3-4.3,3.3-9.9,0.9-14.6C506,428.2,501.1,425.3,495.9,425.3z M449.4,481.8H62.6L43,453.6H469 L449.4,481.8z" |
| 27 | + /> |
| 28 | + <path |
| 29 | + d="M158.3,122c7.8,0,14.1-6.3,14.1-14.1V43.4c0-7.8-6.3-14.1-14.1-14.1c-7.8,0-14.1,6.3-14.1,14.1v64.5 C144.2,115.7,150.5,122,158.3,122z" |
| 30 | + /> |
| 31 | + <path |
| 32 | + d="M245.1,94.7c7.8,0,14.1-6.3,14.1-14.1V16.1c0-7.8-6.3-14.1-14.1-14.1C237.3,2,231,8.3,231,16.1v64.5 C231,88.4,237.3,94.7,245.1,94.7z" |
| 33 | + /> |
| 34 | + <path |
| 35 | + d="M331.9,122c7.8,0,14.1-6.3,14.1-14.1V43.4c0-7.8-6.3-14.1-14.1-14.1s-14.1,6.3-14.1,14.1v64.5 C317.8,115.7,324.1,122,331.9,122z" |
| 36 | + /> |
| 37 | + <path |
| 38 | + d="M9.6,385.2c5.3,2.8,11.8,1.9,16.2-2.2l50.6-47.7c56.7,46.5,126.6,71.9,198.3,71.9c0,0,0,0,0,0 c87.5,0,169.7-36.6,231.4-103.2c5-5.4,5-13.8,0-19.2c-61.8-66.5-144-103.2-231.4-103.2c-72,0-142.2,25.6-199,72.5l-50-47.1 c-4.4-4.1-10.9-5-16.2-2.2c-5.3,2.8-8.3,8.7-7.4,14.6l11.6,75L2.2,370.6C1.3,376.5,4.2,382.4,9.6,385.2z M380.9,230.8 c34.9,14.3,67.2,35.7,95.3,63.6c-10.1,10-20.8,19.2-31.9,27.5c-22.4-3.3-29.6-8.8-30.7-9.7c-4-5.7-11.8-7.7-18.1-4.4 c-6.9,3.6-9.5,12.2-5.9,19.1c1.9,3.5,7.3,10.3,22.4,16c-10.1,5.7-20.5,10.7-31.1,15.1C352.4,320.2,352.4,268.6,380.9,230.8z M36.3,255.6l29.4,27.7c5.3,5,13.6,5.1,19.1,0.3c53.2-47.6,120.7-73.7,190-73.7c26.9,0,53.2,3.9,78.5,11.3 c-29.3,44.6-29.3,102,0,146.6c-25.3,7.4-51.6,11.3-78.5,11.3c-69,0-136.3-26-189.4-73.2c-2.7-2.4-13.4-6.3-19.1,0.3l-30.1,28.3 l5.7-40C42.2,293,36.3,255.6,36.3,255.6z" |
| 39 | + /> |
| 40 | + <circle cx="398.8" cy="273.8" r="14.1" /> |
| 41 | + </g> |
| 42 | + </svg> |
15 | 43 |
|
16 | | - <div class="wrapper"> |
17 | | - <h2>LOCAL TAPAS</h2> |
18 | | - <p></p> |
19 | | - <ul class="plates"> |
20 | | - <li>Loading Tapas...</li> |
21 | | - </ul> |
22 | | - <form class="add-items"> |
23 | | - <input type="text" name="item" placeholder="Item Name" required> |
24 | | - <input type="submit" value="+ Add Item"> |
25 | | - </form> |
26 | | - </div> |
| 44 | + <div class="wrapper"> |
| 45 | + <h2>LOCAL TAPAS</h2> |
| 46 | + <p></p> |
| 47 | + <ul class="plates"> |
| 48 | + <li>Loading Tapas...</li> |
| 49 | + </ul> |
| 50 | + <form class="add-items"> |
| 51 | + <input type="text" name="item" placeholder="Item Name" required /> |
| 52 | + <input type="submit" value="+ Add Item" /> |
| 53 | + </form> |
| 54 | + </div> |
27 | 55 |
|
28 | | -<script> |
29 | | - const addItems = document.querySelector('.add-items'); |
30 | | - const itemsList = document.querySelector('.plates'); |
31 | | - const items = []; |
| 56 | + <script> |
| 57 | + const addItems = document.querySelector('.add-items'); |
| 58 | + const itemsList = document.querySelector('.plates'); |
| 59 | + const items = JSON.parse(localStorage.getItem('items')) || []; |
32 | 60 |
|
33 | | -</script> |
| 61 | + function addItem(e) { |
| 62 | + e.preventDefault(); |
| 63 | + const text = this.querySelector('[name=item]').value; |
| 64 | + const item = { |
| 65 | + text, |
| 66 | + done: false, |
| 67 | + }; |
| 68 | + items.push(item); |
| 69 | + populateList(items, itemsList); |
| 70 | + localStorage.setItem('items', JSON.stringify(items)); |
| 71 | + this.reset(); |
| 72 | + } |
34 | 73 |
|
| 74 | + function populateList(plates = [], platesList) { |
| 75 | + platesList.innerHTML = plates |
| 76 | + .map((plate, i) => { |
| 77 | + return ` |
| 78 | + <li> |
| 79 | + <input type="checkbox" data-index=${i} id="item${i}" ${ |
| 80 | + plate.done ? 'checked' : '' |
| 81 | + }/> |
| 82 | + <label for="item${i}">${plate.text}</label> |
| 83 | + </li> |
| 84 | + `; |
| 85 | + }) |
| 86 | + .join(''); |
| 87 | + } |
35 | 88 |
|
36 | | -</body> |
37 | | -</html> |
| 89 | + function toggleDone(e) { |
| 90 | + if (!e.target.matches('input')) return; |
| 91 | + const el = e.target; |
| 92 | + const index = el.dataset.index; |
| 93 | + items[index].done = !items[index].done; |
| 94 | + localStorage.setItem('items', JSON.stringify(items)); |
| 95 | + populateList(items, itemsList); |
| 96 | + } |
| 97 | + |
| 98 | + addItems.addEventListener('submit', addItem); |
| 99 | + itemsList.addEventListener('click', toggleDone); |
38 | 100 |
|
| 101 | + populateList(items, itemsList); |
| 102 | + </script> |
| 103 | + </body> |
| 104 | +</html> |
0 commit comments