Components · Data table
Controlled sort and selection on one grid. Clicking a sortable header cycles its SortState { key, dir } — the active column keeps its asc/desc caret while the rest stay quiet (a faint hint appears on hover). Leading checkboxes drive a ReadonlySet of row ids under an indeterminate select-all; while any are ticked the BulkActionBar slides in with the live count and actions.
| Volunteer | Team | Status | Last active | |
|---|---|---|---|---|
HBHannah Bergström |
Community outreach | Active | 1h ago | |
MRMarisol Reyes |
Transport | Active | 2h ago | |
DFDiego Fuentes |
Medical | Active | 4h ago | |
DWDarnell Washington |
Foster network | Onboarding | 5h ago | |
WCWei Chen |
Transport | Active | 6h ago | |
PVPriya Venkatesan |
Intake & triage | Paused | Yesterday |
Last active is the active sort (dir:"desc", caret down); Volunteer is pinned :hover showing the faint sort hint. Two rows carry is-selected — accent-tinted with a left accent bar — the header check reads indeterminate, and the BulkActionBar mirrors the count of 2.
{ key, dir: "asc" | "desc" } | null. A header click emits its key; the host owns the comparator and feeds back sorted rows. Only the active column shows a caret.ReadonlySet<string> of row ids via getRowId; onSelectedChange emits the next set. Selected rows get is-selected — tint + left accent bar.count > 0: the count pill, the action children operating on the selected set, and an onClear that empties the selection.Source · RescuersTable.tsx (TanStack rowSelection + sorting, header select-all, SortAsc/SortDesc carets, selected-row tint) · @phauna/ds/grid DataGrid controlled sort/selected + BulkActionBar.