DataTable is for data that users scan, sort or select: a list of records, an admin screen. The data may arrive page by page, hold hundreds or thousands of rows and change over time.
Sorting: the header button cycles three states: ascending, descending, unsorted. One column is sorted at a time.
Selection:aria-selected is not valid on a plain table; a selected row shows data-selected and the checked state of its checkbox. The selected count is announced in a polite live region.
Column visibility: the panel stays in the page flow; Escape closes it and returns focus to the button.
Row actions: the actions column stays at the end of the row while the table scrolls sideways.
States: while loading the header stays and the body is five skeleton rows. The error message has role="alert".
Virtualisation: only the visible rows plus an overscan are rendered; empty padding rows above and below keep the scroll height. Rows must be of equal height.
No row animation: rows update without animation when the data changes; tables do not animate rows.
No arrow-key navigation: interactive cells are reached with Tab.
Pinned columns (meta.pin) stay in place while the table scrolls sideways; their offsets come from the measured widths of the pinned columns.
In expandable rows the expand button opens and closes the detail row, which spans every column. An open row stays open by its id when the page or sort changes.