Problem był, że w momencie, gdy flitowałeś listę <ul> wartością z <input type="text" name="search" ...>
tasks = tasks.filter(li => li.textContent.toLowerCase().includes(nameTask));
"zerowałeś" bezpowrotnie listę <ul>, przecież chodzi tylko o "ukrycie, nieszukanych" elementów <li>
ul.textContent = "";
dodałem, gdy <ul> jest puste to "nic nie rób"
if (ul.textContent.trim() != "") {
. . .
}
Spróbuj
const searchTask = (e) => {
if (ul.textContent.trim() != "") {
const nameTask = e.target.value.toLowerCase();
let tasks = [...taskList];
tasks = tasks.filter(li => li.textContent.toLowerCase().includes(nameTask));
// ul.textContent = "";
const li_hidden = document.querySelectorAll("ul li");
li_hidden.forEach(li => li.style.display = "none");
tasks.forEach(li => ul.appendChild(li));
let numberTask = tasks.filter(li => li.style.display = "block");
taskNumber.textContent = ` ${numberTask.length} `;
}
}
"Kosmetyczne" poprawki - propozycje.
const removeTask = (e) => {
e.target.closest('li.task').remove();
taskList = document.querySelectorAll(".task");
taskNumber.textContent = ` ${taskList.length} `;
}
<h1>Liczba zadań: <span>0</span></h1>
<ul></ul>
<script src="main.js"></script>