Build a Todo List as a single React component. The list owns its own state with useState, the input is controlled, and two user actions — Add and Delete — drive the array of tasks.
You're given a starter App.tsx with the form, a pre-seeded <ul> of three tasks, and the Delete buttons wired into the markup. Make it work:
useState<Task[]>. Map them in the <ul>, with a stable key on each <li>.styles.css.value + onChange bound to state, not a ref poking the DOM. This is the React idiom and unlocks things like "disable Submit while empty" for free.key on each <li> (e.g. crypto.randomUUID()), not the array index. When the list mutates, index keys cause React to reuse the wrong DOM nodes.tasks.push(...) does not re-render; return a new array with [...prev, newTask] or prev.filter(...).event.preventDefault() in the onSubmit handler so the form doesn't trigger a page reload.Three files in the sandbox:
App.tsx — the component you'll edit. Renders the form, three pre-seeded <li> rows, and Delete buttons. Replace the static markup with a state-driven render.index.tsx — bootstraps the React root with <StrictMode>. Don't edit.styles.css — dark-theme styling for the page, form, and list. Edit only if you want to tweak visuals.