Skip to content

Commit 72215b9

Browse files
committed
Improve UI of Todo List: alignment, spacing, and accessibility
1 parent 8d4ded5 commit 72215b9

2 files changed

Lines changed: 55 additions & 11 deletions

File tree

projects/todo/main.js

Lines changed: 47 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,50 @@
1-
const form = document.getElementById('form'); const input = document.getElementById('input'); const list = document.getElementById('list');
1+
const form = document.getElementById('form');
2+
const input = document.getElementById('input');
3+
const list = document.getElementById('list');
4+
25
let items = [];
3-
form.addEventListener('submit', e => { e.preventDefault(); items.push({ id: crypto.randomUUID(), text: input.value, done: false }); input.value = ''; render(); });
4-
function render() { list.innerHTML = ''; for (const it of items) { const li = document.createElement('li'); li.innerHTML = `<label><input type="checkbox" ${it.done ? 'checked' : ''}> ${it.text}</label> <button class="del">×</button>`; li.querySelector('input').addEventListener('change', e => { it.done = e.target.checked; }); li.querySelector('.del').addEventListener('click', () => { items = items.filter(x => x.id !== it.id); render(); }); list.appendChild(li); } }
6+
7+
function escapeHTML(text) {
8+
const div = document.createElement('div');
9+
div.textContent = text;
10+
return div.innerHTML;
11+
}
12+
13+
form.addEventListener('submit', (e) => {
14+
e.preventDefault();
15+
items.push({ id: crypto.randomUUID(), text: input.value.trim(), done: false });
16+
input.value = '';
17+
render();
18+
});
19+
20+
function render() {
21+
list.innerHTML = '';
22+
for (const it of items) {
23+
const li = document.createElement('li');
24+
if (it.done) li.classList.add('done');
25+
26+
li.innerHTML = `
27+
<label>
28+
<input type="checkbox" ${it.done ? 'checked' : ''}>
29+
<span>${escapeHTML(it.text)}</span>
30+
</label>
31+
<button class="del" aria-label="Delete">×</button>
32+
`;
33+
34+
const checkbox = li.querySelector('input');
35+
checkbox.addEventListener('change', (e) => {
36+
it.done = e.target.checked;
37+
li.classList.toggle('done', it.done);
38+
});
39+
40+
li.querySelector('.del').addEventListener('click', () => {
41+
items = items.filter((x) => x.id !== it.id);
42+
render();
43+
});
44+
45+
list.appendChild(li);
46+
}
47+
}
48+
549
render();
650
// TODOs: save to localStorage; add filter (all/active/done); sort; theme switcher

projects/todo/styles.css

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -130,33 +130,33 @@ ul {
130130
margin: 1rem 0;
131131
}
132132

133-
/* FIXED: Todo Item Alignment */
133+
/* Improved: Todo Item Alignment */
134134
li {
135135
display: flex;
136136
align-items: center;
137137
gap: 12px;
138-
padding: 1rem;
138+
padding: 0.75rem 0.5rem;
139139
border-bottom: 1px solid var(--item-border);
140140
transition: background-color 0.2s;
141-
min-height: 60px;
141+
min-height: 52px;
142142
}
143143

144144
li:hover {
145145
background-color: rgba(255, 255, 255, 0.05);
146146
}
147147

148-
/* FIXED: Label alignment */
148+
/* Improved: Label alignment */
149149
label {
150150
display: flex;
151151
align-items: center;
152152
gap: 0.75rem;
153153
cursor: pointer;
154154
flex: 1;
155155
margin: 0;
156-
padding: 4px 0;
156+
padding: 2px 0;
157157
}
158158

159-
/* FIXED: Checkbox alignment */
159+
/* Improved: Checkbox alignment */
160160
input[type="checkbox"] {
161161
width: 1.2rem;
162162
height: 1.2rem;
@@ -165,7 +165,7 @@ input[type="checkbox"] {
165165
flex-shrink: 0;
166166
}
167167

168-
/* FIXED: Text alignment */
168+
/* Improved: Text alignment */
169169
label span {
170170
flex: 1;
171171
word-break: break-word;
@@ -178,7 +178,7 @@ li.done label span {
178178
color: var(--completed-text);
179179
}
180180

181-
/* FIXED: Delete button alignment */
181+
/* Improved: Delete button alignment */
182182
.del {
183183
background: #ef4444;
184184
color: white;

0 commit comments

Comments
 (0)