Example ToDo list app built with vanilla React + Vite.
Doing super generic setup. Using single controlled input with a button for adding new tasks; added keyup listener to "submit" on hitting Enter key so it works like a proper form.
Abstracted main content chunks into their own components. Added new "empty state" component to show when task list is empty. Added button to clear task list. Went from absolute prop drilling to moving all but the basic Task list state into child components.
Refactoring with useReducer.