Overview
src/components/ui/Table.tsx renders each row's checkbox via onSelectionChangeCheckbox (line 214) whose only guard is if (!onSelect), but TableRow always receives onSelect={() => toggleSelectRow(id)} (line 525), so the guard never triggers. The header checkbox, however, is gated on onSelectionChange (line 442). When a consumer omits onSelectionChange the body rows show a checkbox column that the header lacks, misaligning every column. Only render the row checkbox when selection is enabled.
Overview
src/components/ui/Table.tsx renders each row's checkbox via onSelectionChangeCheckbox (line 214) whose only guard is if (!onSelect), but TableRow always receives onSelect={() => toggleSelectRow(id)} (line 525), so the guard never triggers. The header checkbox, however, is gated on onSelectionChange (line 442). When a consumer omits onSelectionChange the body rows show a checkbox column that the header lacks, misaligning every column. Only render the row checkbox when selection is enabled.