Render the window, state the truth
Virtualisation renders the visible window plus a buffer; the scrollbar lies by design and the lie is fine — as long as the row count and the total are printed somewhere real. A table that says 'showing 20 of 10,000' has told the truth; one that just scrolls has not.
Sorting is a database question
Client-side sorts beyond a few hundred rows are a slow re-render wearing a chevron. Sort on the server, or sort a pre-sorted index. The catalog's sortable-table pattern marks aria-sort and moves state to the URL, so a sorted view is a link, not a memory test.
- Sticky first column, and only the first — sticky everything is sticky nothing.
- Row expansion: one open at a time, Escape closes, the row announces its state.
- Empty table: the empty-state trio's third case is a failed load, not an empty result. Different words.