An "Intersection Observer" is attached to the scrollable container and a "sentinel" (empty element) is placed on the bottom of the container.
Each time the sentinel enters in the viewport, multiple rows are inserted to the document until the sentinel leaves the viewport.