Datatable
Simple in-memory table
Virtual scrolling — lazy windowed fetch
Set one fetch callback and the web component owns the whole loop: it loads page 1, derives the total from the response, and fetches each window only as its rows scroll into view. This list is the 1000 seeded orders from apps/api; scroll it and watch the fetch log — it never drains every page. No totalRecords prop, no event bridge.
Pages fetched: — (0 so far)
Tree mode — expandable rows
The same single fetch callback, branching on req.parentId for roots vs. children. The WC paginates roots lazily and loads children on expand; selected row objects arrive on @selectionChange as detail.selectedRows.