The same command installs the registry items it composes: @vegastack/button, @vegastack/checkbox, @vegastack/empty, @vegastack/skeleton, @vegastack/table.
These are parts, not a table. They render chrome and compute set arithmetic; nothing here owns
data, fetching, filtering or paging. Pick the renderer first — DataList for the presentational
default, DataGrid when grouping, inline editing, multi-key sort, column management or 10k+ rows
earn its engines — and reach for these directly only when you are building a table neither one fits.
The doctrinal split between the two renderers is unchanged: DataList stays presentational,
DataGrid keeps its engines. What they share is chrome and set maths, which is what lives here.
columnCellClass resolves three facts at once, so header, body and skeleton cells cannot disagree:
align — start (default), center, end.
mono — the mono numeral face (font-mono text-code tabular-nums), so figures line up.
nowrap — whether the cell stays on one line. Cells wrap by default; align="end" and mono
columns opt in automatically, and an explicit nowrap overrides the inference in both directions.
Activate the sort. Omitted (or with column.sortable false) the header
renders as static text.
order
number
—
1-based priority within a multi-key sort. Omit for a single-key sort.
Data attributes and CSS variables on SortableHead
Attribute
Values
data-sortable
""
data-sorted
mirrors a prop or state value
Prop
Type
Default
Description
key*
string
—
Stable identifier — the React key, the sort key, the visibility key.
align
"center" | "end" | "start"
"start"
Horizontal alignment of the header and cells.
mono
boolean
false
Render this column's values in the mono numeral face (text-code +
tabular-nums), so figures line up down the column.
nowrap
boolean
true for `align="end"` and `mono` columns, false otherwise
Keep this column's cells on one line instead of wrapping. Cells wrap by
default (D18) — scrolling is reserved for tables that are genuinely wide,
not forced by one long value. Figures and mono values are the exception and
opt IN automatically.
Prop
Type
Default
Description
checked*
boolean
—
This row is selected.
label*
string
—
Accessible name for the checkbox — name the row, not the column.
onToggle*
() => void
—
Toggle this row.
Data attributes and CSS variables on SelectionCell
Attribute
Values
data-slot
"data-table-selection-cell"
Prop
Type
Default
Description
columns*
DataTableColumnLayout[]
—
The columns being rendered, so the placeholder matches the real geometry.
rows
number
5
How many placeholder rows to draw.
selectable
boolean
false
Draw the leading selection column's placeholder.
slot
string
"data-table-skeleton-row"
data-slot for each placeholder row, so each renderer keeps its own
selector surface.
SortableHead emits aria-sort on every sortable column, "none" included — a table that
marks only the active column tells a screen-reader user which column is sorted but never which
ones they could sort.
SortHeaderButton is a real Button, so it is reachable, activatable and focus-visible without a
single hand-rolled rule.
SelectAllHead is tri-state: partial selection reports indeterminate rather than a misleading
checked or unchecked box.
Every selection checkbox needs a name that identifies its ROW (Select row 3, Select Acme), not
the column.
SkeletonRows is aria-hidden; announce loading once from the table's own busy/live wiring
instead of announcing every placeholder.
Key
Action
Tab
Move to the next sort header or selection checkbox.
Enter / Space
Sort by the focused column, or toggle the focused row.
Shift + click
Add the column as an additional sort key (when additive).