A dual listbox: two multi-selectable panes with per-side search and counts, move / move-all buttons between them, and a keyboard move that reports what travelled and where focus landed.
npx shadcn@latest add @zyeon/transfer-listZyeon UI limits how often it can be asked, and Transfer List hasn't had its turn. Its source will show here once it has.