Split the paste codebody into per-line block spans (paste-lines.js) and rebuild the gutter from each line's wrapped height so numbers count visual rows, not logical lines. Pinned the gutter width (flex 0 0 auto, 3ch) so its row count no longer feeds back into the code column width. ResizeObserver renumbers on wrap toggle / resize; wrap-off behavior is unchanged (one number per newline).