A draggable, resizable widget grid: widgets snap to a column grid, collisions push neighbours down deterministically, and every accepted change emits the whole layout for the consumer to persist.
npx shadcn@latest add @zyeon/dashboard-gridZyeon UI limits how often it can be asked, and Dashboard Grid hasn't had its turn. Its source will show here once it has.