An infinite feed appends records instead of replacing the current page. The reader should keep their place while more content appears. A viewport trigger is convenient, but a named Load more control gives keyboard users a predictable alternative and helps a test reproduce the same boundary. Both routes should call the same bounded append operation.
You'll render one record, append the next with a button, and append again when the feed reaches its bottom. Stop at the source length and announce that all records are loaded. Keep stable row identities and source order, including records loaded before the latest action. In a production viewport implementation, IntersectionObserver can trigger that same operation and must be disconnected on cleanup. This local exercise uses the scrollable region so each boundary remains repeatable.