<header>
<h1>TODOs</h1>
</header>
<form id="todo-form" class="todo-form">
<label>
<span class="screen-reader-text">New TODO</span>
<input type="text" name="todo">
</label>
<button>Add</button>
</form>
<ol id="todo-list" class="todo-list"></ol>
header {
border: 1px solid black;
margin: 1px;
padding: 1rem;
text-align: center;
}
.todo-form {
border: 1px solid black;
text-align: center;
padding: 1rem;
margin: 1px;
label {
flex: 1;
}
input {
border: 1px solid black;
}
> button {
border: 1px solid black;
}
}
.todo-list {
border: 1px solid black;
padding: 1rem;
li {
border: 1px solid black;
margin: 1px;
padding: 0.5rem;
}
}
.screen-reader-text {
text-indent: -9999em;
width: 0;
height: 0;
display: block;
}
.svg-check {
display: block;
pointer-events: none;
}
const form = document.querySelector("#todo-form");
const list = document.querySelector("#todo-list");
let TODOs = [];
if (localStorage["data"] !== null && localStorage["data"] !== undefined) {
TODOs = JSON.parse(localStorage["data"]);
}
function buildUI() {
let HTML = ``;
TODOs.forEach((todo) => {
HTML += `<li id="${todo.id}">
${todo.title}
<button aria-label="Complete" class="button-complete">
<svg width="20" height="20" viewBox="0 0 1200 1200" class="svg-check">
<path d="m794.48 395.02-269.46 269.46-129.42-100.13-64.707 83.836 166.26 128.47 36.84 28.34 32.824-32.828 302.29-302.29-74.625-74.863z"/>
</svg>
</button>
</li>`;
});
list.innerHTML = HTML;
}
form.addEventListener("submit", (event) => {
event.preventDefault();
TODOs.push({
title: event.target[0].value,
complete: false,
id: self.crypto.randomUUID()
});
localStorage["data"] = JSON.stringify(TODOs);
buildUI();
form.reset();
});
document.documentElement.addEventListener("click", (event) => {
if (event.target.classList.contains("button-complete")) {
TODOs = TODOs.filter((todo) => todo.id !== event.target.parentElement.id);
localStorage["data"] = JSON.stringify(TODOs);
buildUI();
}
});
buildUI();
This Pen doesn't use any external CSS resources.
This Pen doesn't use any external JavaScript resources.