Build a multi-select skills picker as a single React component. Chosen skills show as removable chips inside the control; the dropdown below lists only the skills you haven't picked yet. Add one and it moves up into a chip; remove a chip and it drops back into the list. No duplicates, ever — because there is only one array, and every option is either in it or not.
The starter App.tsx renders an inert snapshot: two chips (React, TypeScript) and the remaining six options below. Make it live:
selected string array with useState(['React', 'TypeScript']).available on every render as the full list minus selected — never store it in its own state.selected immutably: setSelected([...selected, o]).setSelected(selected.filter((s) => s !== o)).React and TypeScript; the list shows Vue, Angular, Svelte, Node, GraphQL, CSS.Vue in the list: a Vue chip appears and Vue disappears from the list.React chip: the chip vanishes and React returns to the list.selected is the only state; available is derived. Two arrays that must be kept in agreement is exactly the bug you're avoiding.available, so an already-chosen option isn't there to add again.filter; don't push or splice the existing state.styles.css; focus on the state.