Skip to content
Components

Data table

Toolbar, header, rows, pagination. The console's workhorse — and a real table, not a grid of divs.

Anatomy

Publisher: Brisbane City 1 selected
Data sources
SourcePublisherFreshness
Cadastre — DCDBQueensland Government02/08/2026 Fresh1,284,901
City Plan zoningBrisbane City31/07/2026 Fresh412,006
Flood overlayBrisbane City14/06/2025 Stale88,420
Bushfire hazardQueensland Government09/07/2026 Fresh51,733
Easements registerTitles Queensland Unreachable0

Why a real table

The flex-based row the design draws looks identical and loses everything a table gives an assistive technology.

In a real table a screen reader announces "column 3 of 6, Publisher, Brisbane City". In a grid of divs it announces "Brisbane City", and there is no way to navigate by column at all. The proportional widths come from GdColumn.flex and are applied to a <colgroup>, which keeps the layout without giving up the semantics.

  • The row is the link — never a trailing "view" button. Selection rides the 16px checkbox column, whose clicks do not fire the row; the header box selects the page and goes indeterminate at "some".
  • Sort is state, not behaviour. A sortable header is a real button carrying aria-sort, and clicking updates v-model:sort — the table never reorders the rows itself, because the rows are usually one page of a server's answer, and sorting the page you can see lies about the rest.

Machine facts are monospaced and tabular; human sentences are not. mono: true on a column is what says which is which, and data-gd-numeric stops a column of figures jittering as it updates.

Pagination

The range readout comes first, because it is the only thing that tells a user whether the filter they just applied did anything.

Past seven pages it window-elides rather than rendering forty numbers, and the elision is a static "…" rather than a control: a clickable ellipsis that jumps an arbitrary distance is a worse affordance than the arrows beside it.

Navigate

Esc