j3w1 / theme

j3w1 / theme4.0.0

j3w1 / command

  • SPEC Overview
  • SPEC Foundations
  • SPEC Components
  • SPEC Patterns
  • SPEC Tokens
  • SPEC Tools
  • SPEC Workbench
  • SPEC Form builder
  • SPEC Task kit
  • SPEC Recipes
  • SPEC Figma bridge
  • SPEC Report an issue
  • SPEC Implement
  • SPEC For agents
  • SPEC Ports
  • SPEC Releases
  • SPEC Specification
  • DEMO Vue application demo

Filterable table

A list screen composed from a toolbar with search and filter, removable chips, a selectable sortable data-table with status badges, a count and pagination; with empty and loading variants.

stable · light DOM · 4.0.0. Light DOM retains static content, native semantics, label relationships and host composition without duplicating controls.

Live variants

default

Project records · synthetic fixture
Atlas libraryAvery KimReady24
Orion workspaceJordan LeeIn progress12
Field notesMorgan NoorReady38
Signal monitorRiley StoneReview6

Markup
<j3w1-filterable-table id="example-filterable-table-default"><section class="filterable-table" aria-label="Project records"><div class="filterable-table-toolbar"><j3w1-search-field><div class="search-field"><label class="search-field-label" for="example-filterable-table-default-records-search">Search projects</label><div class="search-field-root"><input class="search-field-input" id="example-filterable-table-default-records-search" type="search"><button class="search-field-clear" type="button" aria-label="Clear search">Clear</button></div></div></j3w1-search-field><label for="example-filterable-table-default-records-status">Status<select class="select-control" id="example-filterable-table-default-records-status" data-status-filter="" name="example-filterable-table-default-records-status"><option value="all">All statuses</option><option>Ready</option><option>In progress</option><option>Review</option></select></label></div><div class="table-scroller" tabindex="0" role="region" aria-label="Project records"><table class="data-table"><caption class="table-caption">Project records · synthetic fixture</caption><thead class="data-table-head"><tr><th class="data-table-header data-table-header-select" scope="col"><button class="data-table-select-all" type="button" role="checkbox" aria-checked="false" aria-label="Select all rows"><span class="data-table-check-glyph" aria-hidden="true">✓</span></button></th><th class="data-table-header" scope="col"><button class="data-table-sort" type="button">Project<span class="data-table-sort-glyph" aria-hidden="true">↕</span></button></th><th class="data-table-header" scope="col"><button class="data-table-sort" type="button">Owner<span class="data-table-sort-glyph" aria-hidden="true">↕</span></button></th><th class="data-table-header" scope="col"><button class="data-table-sort" type="button">Status<span class="data-table-sort-glyph" aria-hidden="true">↕</span></button></th><th class="data-table-header" scope="col"><button class="data-table-sort" type="button">Scope<span class="data-table-sort-glyph" aria-hidden="true">↕</span></button></th></tr></thead><tbody class="data-table-body"><tr class="data-table-row" id="example-filterable-table-default-record-0" data-status="Ready" aria-selected="false" tabindex="0"><td class="data-table-cell data-table-cell-select"><input class="data-table-checkbox" type="checkbox" aria-labelledby="example-filterable-table-default-record-name-0" name="example-filterable-table-default-value"></td><td class="data-table-cell" id="example-filterable-table-default-record-name-0">Atlas library</td><td class="data-table-cell">Avery Kim</td><td class="data-table-cell">Ready</td><td class="data-table-cell">24</td></tr><tr class="data-table-row" id="example-filterable-table-default-record-1" data-status="In progress" aria-selected="false" tabindex="-1"><td class="data-table-cell data-table-cell-select"><input class="data-table-checkbox" type="checkbox" aria-labelledby="example-filterable-table-default-record-name-1" name="example-filterable-table-default-value"></td><td class="data-table-cell" id="example-filterable-table-default-record-name-1">Orion workspace</td><td class="data-table-cell">Jordan Lee</td><td class="data-table-cell">In progress</td><td class="data-table-cell">12</td></tr><tr class="data-table-row" id="example-filterable-table-default-record-2" data-status="Ready" aria-selected="false" tabindex="-1"><td class="data-table-cell data-table-cell-select"><input class="data-table-checkbox" type="checkbox" aria-labelledby="example-filterable-table-default-record-name-2" name="example-filterable-table-default-value"></td><td class="data-table-cell" id="example-filterable-table-default-record-name-2">Field notes</td><td class="data-table-cell">Morgan Noor</td><td class="data-table-cell">Ready</td><td class="data-table-cell">38</td></tr><tr class="data-table-row" id="example-filterable-table-default-record-3" data-status="Review" aria-selected="false" tabindex="-1"><td class="data-table-cell data-table-cell-select"><input class="data-table-checkbox" type="checkbox" aria-labelledby="example-filterable-table-default-record-name-3" name="example-filterable-table-default-value"></td><td class="data-table-cell" id="example-filterable-table-default-record-name-3">Signal monitor</td><td class="data-table-cell">Riley Stone</td><td class="data-table-cell">Review</td><td class="data-table-cell">6</td></tr><tr class="data-table-empty" hidden=""><td class="data-table-empty-cell" colspan="5">No rows match.</td></tr><tr class="data-table-loading" hidden=""><td colspan="5">⋯ Loading rows</td></tr></tbody></table></div><p class="filterable-table-count" role="status" data-table-status=""></p></section></j3w1-filterable-table>

empty

Project records · synthetic fixture
No rows match.

Markup
<j3w1-filterable-table id="example-filterable-table-empty"><section class="filterable-table" aria-label="Project records"><div class="filterable-table-toolbar"><j3w1-search-field><div class="search-field"><label class="search-field-label" for="example-filterable-table-empty-records-search">Search projects</label><div class="search-field-root"><input class="search-field-input" id="example-filterable-table-empty-records-search" type="search"><button class="search-field-clear" type="button" aria-label="Clear search">Clear</button></div></div></j3w1-search-field><label for="example-filterable-table-empty-records-status">Status<select class="select-control" id="example-filterable-table-empty-records-status" data-status-filter="" name="example-filterable-table-empty-records-status"><option value="all">All statuses</option><option>Ready</option><option>In progress</option><option>Review</option></select></label></div><div class="table-scroller" tabindex="0" role="region" aria-label="Project records"><table class="data-table"><caption class="table-caption">Project records · synthetic fixture</caption><thead class="data-table-head"><tr><th class="data-table-header data-table-header-select" scope="col"><button class="data-table-select-all" type="button" role="checkbox" aria-checked="false" aria-label="Select all rows"><span class="data-table-check-glyph" aria-hidden="true">✓</span></button></th><th class="data-table-header" scope="col"><button class="data-table-sort" type="button">Project<span class="data-table-sort-glyph" aria-hidden="true">↕</span></button></th><th class="data-table-header" scope="col"><button class="data-table-sort" type="button">Owner<span class="data-table-sort-glyph" aria-hidden="true">↕</span></button></th><th class="data-table-header" scope="col"><button class="data-table-sort" type="button">Status<span class="data-table-sort-glyph" aria-hidden="true">↕</span></button></th><th class="data-table-header" scope="col"><button class="data-table-sort" type="button">Scope<span class="data-table-sort-glyph" aria-hidden="true">↕</span></button></th></tr></thead><tbody class="data-table-body"><tr class="data-table-empty"><td class="data-table-empty-cell" colspan="5">No rows match.</td></tr><tr class="data-table-loading" hidden=""><td colspan="5">⋯ Loading rows</td></tr></tbody></table></div><p class="filterable-table-count" role="status" data-table-status=""></p></section></j3w1-filterable-table>

loading

Project records · synthetic fixture
Atlas libraryAvery KimReady24
Orion workspaceJordan LeeIn progress12
Field notesMorgan NoorReady38
Signal monitorRiley StoneReview6
⋯ Loading rows

Markup
<j3w1-filterable-table id="example-filterable-table-loading"><section class="filterable-table" aria-label="Project records"><div class="filterable-table-toolbar"><j3w1-search-field><div class="search-field"><label class="search-field-label" for="example-filterable-table-loading-records-search">Search projects</label><div class="search-field-root"><input class="search-field-input" id="example-filterable-table-loading-records-search" type="search"><button class="search-field-clear" type="button" aria-label="Clear search">Clear</button></div></div></j3w1-search-field><label for="example-filterable-table-loading-records-status">Status<select class="select-control" id="example-filterable-table-loading-records-status" data-status-filter="" name="example-filterable-table-loading-records-status"><option value="all">All statuses</option><option>Ready</option><option>In progress</option><option>Review</option></select></label></div><div class="table-scroller" tabindex="0" role="region" aria-label="Project records"><table class="data-table" aria-busy="true"><caption class="table-caption">Project records · synthetic fixture</caption><thead class="data-table-head"><tr><th class="data-table-header data-table-header-select" scope="col"><button class="data-table-select-all" type="button" role="checkbox" aria-checked="false" aria-label="Select all rows"><span class="data-table-check-glyph" aria-hidden="true">✓</span></button></th><th class="data-table-header" scope="col"><button class="data-table-sort" type="button">Project<span class="data-table-sort-glyph" aria-hidden="true">↕</span></button></th><th class="data-table-header" scope="col"><button class="data-table-sort" type="button">Owner<span class="data-table-sort-glyph" aria-hidden="true">↕</span></button></th><th class="data-table-header" scope="col"><button class="data-table-sort" type="button">Status<span class="data-table-sort-glyph" aria-hidden="true">↕</span></button></th><th class="data-table-header" scope="col"><button class="data-table-sort" type="button">Scope<span class="data-table-sort-glyph" aria-hidden="true">↕</span></button></th></tr></thead><tbody class="data-table-body"><tr class="data-table-row" id="example-filterable-table-loading-record-0" data-status="Ready" aria-selected="false" tabindex="0"><td class="data-table-cell data-table-cell-select"><input class="data-table-checkbox" type="checkbox" aria-labelledby="example-filterable-table-loading-record-name-0" name="example-filterable-table-loading-value"></td><td class="data-table-cell" id="example-filterable-table-loading-record-name-0">Atlas library</td><td class="data-table-cell">Avery Kim</td><td class="data-table-cell">Ready</td><td class="data-table-cell">24</td></tr><tr class="data-table-row" id="example-filterable-table-loading-record-1" data-status="In progress" aria-selected="false" tabindex="-1"><td class="data-table-cell data-table-cell-select"><input class="data-table-checkbox" type="checkbox" aria-labelledby="example-filterable-table-loading-record-name-1" name="example-filterable-table-loading-value"></td><td class="data-table-cell" id="example-filterable-table-loading-record-name-1">Orion workspace</td><td class="data-table-cell">Jordan Lee</td><td class="data-table-cell">In progress</td><td class="data-table-cell">12</td></tr><tr class="data-table-row" id="example-filterable-table-loading-record-2" data-status="Ready" aria-selected="false" tabindex="-1"><td class="data-table-cell data-table-cell-select"><input class="data-table-checkbox" type="checkbox" aria-labelledby="example-filterable-table-loading-record-name-2" name="example-filterable-table-loading-value"></td><td class="data-table-cell" id="example-filterable-table-loading-record-name-2">Field notes</td><td class="data-table-cell">Morgan Noor</td><td class="data-table-cell">Ready</td><td class="data-table-cell">38</td></tr><tr class="data-table-row" id="example-filterable-table-loading-record-3" data-status="Review" aria-selected="false" tabindex="-1"><td class="data-table-cell data-table-cell-select"><input class="data-table-checkbox" type="checkbox" aria-labelledby="example-filterable-table-loading-record-name-3" name="example-filterable-table-loading-value"></td><td class="data-table-cell" id="example-filterable-table-loading-record-name-3">Signal monitor</td><td class="data-table-cell">Riley Stone</td><td class="data-table-cell">Review</td><td class="data-table-cell">6</td></tr><tr class="data-table-empty" hidden=""><td class="data-table-empty-cell" colspan="5">No rows match.</td></tr><tr class="data-table-loading"><td colspan="5">⋯ Loading rows</td></tr></tbody></table></div><p class="filterable-table-count" role="status" data-table-status=""></p></section></j3w1-filterable-table>

Install and register

Use the exact version. If npm publication is pending, install the release tarball from the installation guide.

npm install --save-exact @j3w1/ui@4.0.0
import '@j3w1/ui/tokens.css';
import '@j3w1/ui/styles/filterable-table.css';
import '@j3w1/ui/register/filterable-table';

Insert the maintained markup above after loading these imports. Its native children provide accessible names and form behavior; the empty custom tag alone does not create a control.

Vue SFC, React, Astro and plain HTML integration →

Copy the complete implementation

npx --package=@j3w1/ui@4.0.0 j3w1-ui copy filterable-table --out ./vendor/j3w1/filterable-table

The CLI verifies every file before writing and refuses overwrites. Serve the output over HTTP and open index.html. Keep its modules, CSS, tokens and licence notices together.

Public API

attributes

NameType / signatureMeaning
disabledCustomEventDisable the native controls owned by this instance.
loadingCustomEventMark the primary control busy and prevent duplicate activation.

properties

NameType / signatureMeaning
disabledbooleanDelegates disabled state to native children.
namestringNative control name; application form keys remain explicit.
selectedIdsstring[]Stable selected row IDs.

methods

NameType / signatureMeaning
refresh(): voidReconnect behavior after replacing native child structure.
focus(options?: FocusOptions): voidFocus the first usable native control.
sort(column: number, direction?: 'ascending' | 'descending'): voidSort existing native rows by a column.
filter(query: string): voidFilter existing rows by literal text.

events

NameType / signatureMeaning
j3w1-sortCustomEventThe user requested sorting.
j3w1-selectionCustomEventSelected row identities changed.

Dependencies and verification

Registered components: search-field. Style dependencies: data-table, menu, select, table, search-field.

Package presence establishes an available implementation. Actual passes depend on the tested artifact and environment. Read specification execution evidence; read packed-consumer evidence; inspect the complete state matrix.

Full implementation manifest, API and token dependency closure

Canonical specification

Filterable table filterable-table

  • Family: Composed specimens
  • Maturity: stable
  • Priority: R1
  • Since: 0.1.0
  • Native control: region landmark; a toolbar with roving tabindex holding a search landmark, a menu button, a toggle icon button and a button; a group of removable chips; a grid-less native table with aria-sort, aria-selected rows and a checkbox-role select-all; role=status for the count; a pagination nav — APG pattern
  • specified
  • demonstrated

A list screen composed from a toolbar with search and filter, removable chips, a selectable sortable data-table with status badges, a count and pagination; with empty and loading variants.

Report an issue with this component

Tokens

Focus a role to inspect its values; follow its link for persistent usage and source details.

PartRoleValueUse
root.bgcolor.surface.defaultapproveduse#0d0707D-041 surface.default: color.primitive.modern.panel.
root.bordercolor.border.defaultapproveduse#482b2bD-041 border.default: color.primitive.modern.divider.
toolbar.bgcolor.surface.chromeapproveduse#000000D-041 surface.chrome: color.primitive.ink.0.
toolbar.bordercolor.border.dividerapproveduse#482b2bD-041 border.divider: color.primitive.modern.divider.
toolbar.separatorcolor.border.defaultapproveduse#482b2bD-041 border.default: color.primitive.modern.divider.
search.bgcolor.surface.inputapproveduse#000000Form-control fill.
search.bordercolor.border.controlapproveduse#c81a1aD-041 owner correction: red control and floating-frame borders, distinct from rose text.
search.textcolor.text.defaultapproveduse#e99499D-041 owner correction: rose is the default UI and reading foreground; near-white is reserved for document headings, highlights and contrast-critical fills.
search.placeholdercolor.text.placeholderapproveduse#bd787dD-041 owner correction: rose is the default UI and reading foreground; near-white is reserved for document headings, highlights and contrast-critical fills.
search.iconcolor.icon.defaultapproveduse#e99499D-041 owner correction: rose is the default UI and reading foreground; near-white is reserved for document headings, highlights and contrast-critical fills.
filter.textcolor.text.defaultapproveduse#e99499D-041 owner correction: rose is the default UI and reading foreground; near-white is reserved for document headings, highlights and contrast-critical fills.
filter.bordercolor.border.controlapproveduse#c81a1aD-041 owner correction: red control and floating-frame borders, distinct from rose text.
new.bgcolor.action.primary.bgapproveduse#7d1310Primary button fill; D-026 darkened it off color12, which stays fixed as heritage ANSI 12.
new.textcolor.action.primary.textapproveduse#ffa2a7Primary action labels: bright rose across rest, hover and pressed states (D-033).
chip.bgcolor.surface.defaultapproveduse#0d0707D-041 surface.default: color.primitive.modern.panel.
chip.bordercolor.border.controlapproveduse#c81a1aD-041 owner correction: red control and floating-frame borders, distinct from rose text.
chip.textcolor.text.defaultapproveduse#e99499D-041 owner correction: rose is the default UI and reading foreground; near-white is reserved for document headings, highlights and contrast-critical fills.
chip.removecolor.text.mutedapproveduse#d4868bD-041 owner correction: rose is the default UI and reading foreground; near-white is reserved for document headings, highlights and contrast-critical fills.
header.textcolor.text.brightapproveduse#ffa2a7D-041 owner correction: rose is the default UI and reading foreground; near-white is reserved for document headings, highlights and contrast-critical fills.
header.rulecolor.border.strongobserveduse#9e231fEmphasised 2px rule: sticky headers, section ends.
row.textcolor.text.defaultapproveduse#e99499D-041 owner correction: rose is the default UI and reading foreground; near-white is reserved for document headings, highlights and contrast-critical fills.
row.rulecolor.border.dividerapproveduse#482b2bD-041 border.divider: color.primitive.modern.divider.
row.bg-hovercolor.interaction.hover.bgapproveduse#1c1010D-041 interaction.hover.bg: color.primitive.modern.hover.
row.ringcolor.interaction.focus.ringobserveduse#e539351px dashed focus ring on controls and rows.
row.selected-bgcolor.interaction.selection.bgapproveduse#531310Selected row, tab, workspace; D-027 recessed the fill, leaving the 2px indicator and the check to carry selection.
row.selected-textcolor.interaction.selection.textobserveduse#f4eeeeText on the selection.
row.ring-on-selectioncolor.interaction.focus.ring-containerobserveduse#ffa2a7Focus colour for containers and explicitly mapped filled controls (D-015); component rules determine ring geometry.
check.bgcolor.surface.inputapproveduse#000000Form-control fill.
check.bordercolor.border.controlapproveduse#c81a1aD-041 owner correction: red control and floating-frame borders, distinct from rose text.
check.checked-bgcolor.action.primary.bgapproveduse#7d1310Primary button fill; D-026 darkened it off color12, which stays fixed as heritage ANSI 12.
check.glyphcolor.action.primary.textapproveduse#ffa2a7Primary action labels: bright rose across rest, hover and pressed states (D-033).
badge.tested-fillcolor.status.success.fillapproveduse#82d9a0D-041 status.success.fill: color.primitive.modern.green.
badge.tested-textcolor.status.success.on-fillapproveduse#000000Text on the success fill (7.13:1).
badge.demonstrated-fillcolor.status.info.fillapproveduse#82b4ffD-041 status.info.fill: color.primitive.modern.blue.
badge.demonstrated-textcolor.status.info.on-fillapproveduse#000000Text on the info fill (7.08:1).
empty.textcolor.text.mutedapproveduse#d4868bD-041 owner correction: rose is the default UI and reading foreground; near-white is reserved for document headings, highlights and contrast-critical fills.
empty.headingcolor.text.brightapproveduse#ffa2a7D-041 owner correction: rose is the default UI and reading foreground; near-white is reserved for document headings, highlights and contrast-critical fills.
empty.glyphcolor.icon.decorativeapproveduse#986f72D-041 icon.decorative: color.primitive.modern.control.
count.textcolor.text.mutedapproveduse#d4868bD-041 owner correction: rose is the default UI and reading foreground; near-white is reserved for document headings, highlights and contrast-critical fills.
pagination.textcolor.text.defaultapproveduse#e99499D-041 owner correction: rose is the default UI and reading foreground; near-white is reserved for document headings, highlights and contrast-critical fills.
pagination.currentcolor.text.brightapproveduse#ffa2a7D-041 owner correction: rose is the default UI and reading foreground; near-white is reserved for document headings, highlights and contrast-critical fills.
pagination.disabledcolor.text.disabledapproveduse#a3676bD-041 owner correction: rose is the default UI and reading foreground; near-white is reserved for document headings, highlights and contrast-critical fills.

State matrix

Every declared state and combination, statically rendered; the default cell is live. Sizes: compact, comfortable (switch with the density control above).

StateEight of 43Nothing matchesLoading
default
priority: R1 maturity: stable
alertfeedbackR13Demonstrated
badgedisplayR12Demonstrated
breadcrumbsnavigationR15Demonstrated
buttonactionsR16Tested
carddisplayR15Demonstrated
checkboxforms-basicR110Tested
chipdisplayR16Demonstrated
code-editordeveloperR16Demonstrated
priority: R1 maturity: stable search: marquee
No components match.

No components match

Three filters are active; none of the 43 components passes all of them.

priority: R1 maturity: stable
alertfeedbackR13Demonstrated
badgedisplayR12Demonstrated
breadcrumbsnavigationR15Demonstrated
Loading components
hover
focus-visible
selected
no-results

Purpose

Proves that navigation, display and feedback components compose around one data-table (find, filter, select, page), including nothing matching and still loading. It shows a whole list screen’s states; it does not prescribe a product.

Anatomy

Parts as listed in the anatomy; badges carry ✓ (Tested) and i (Demonstrated). Every part is the composed component’s own markup and classes.

States

StateVisualNon-colour channel
defaulteach component at rest; Name sorted ascending with ▲; Prev disabledaria-sort; the glyph
hoverthe pointed row takes color.interaction.hover.bg; toolbar controls and chips hover only on their own pointer eventscursor
focus-visibledashed color.interaction.focus.ring on the focused row (the third in the specimen); toolbar and chips at restthe ring
selectedtwo rows in color.interaction.selection.bg with color.interaction.selection.text and a checked box; select-all mixed with –aria-selected; ✓ and – glyphs; aria-checked="mixed"
no-resultsthe body is the “No components match” row; count reads 0 of 43; the search status line announces it; chips stay so the cause is visibletext; role="status"

The composed components keep their own pressed, sorted, disabled, loading and open treatments; only the states the whole screen adds are declared here.

Keyboard

As in the key table, following the toolbar and data-table contracts. The region, the search landmark and the pagination navigation are offered by name. A disabled Prev is not focusable.

Accessibility

The search field’s label and its status line are visually hidden so the toolbar stays one row; the status line announces “No components match” through role="status". The count is a second status region and changes once per filter. Rows are named by their Name cell through aria-labelledby on the row checkbox. Badge glyphs keep status readable without colour. Text and badges meet 4.5:1; boundaries and the ring on the selection fill meet 3:1.

Portability

Every state renders without script from the root hooks data-state-selected and data-state-no-results and the table’s own aria-busy.

Non-examples

A rounded search pill with a magnifier in a shadowed toolbar. Chips as pills with a coloured fill per category. Zebra-striped rows. A selected row shown by a coloured left bar and no fill. A blue Material checkbox. A skeleton shimmer while loading. Infinite scroll with no count and no pages.

Contrast report

19 declared pairs measured on resolved sRGB values with the WCAG 2.x formula; 0 waived (decorative only), 0 failing. A pass is a design target for the named role, not an application-wide conformance claim.

PairStateKindForegroundBackgroundRatioMinResult
filterable-table default textdefaulttextcolor.text.default #e99499color.surface.default #0d07078.724.5pass
filterable-table hover texthovertextcolor.text.default #e99499color.interaction.hover.bg #1c10108.104.5pass
filterable-table focus-visible textfocus-visibletextcolor.text.default #e99499color.surface.default #0d07078.724.5pass
filterable-table focus-visible outlinefocus-visibleuicolor.interaction.focus.ring #e53935color.surface.default #0d07074.733pass
filterable-table selected textselectedtextcolor.interaction.selection.text #f4eeeecolor.interaction.selection.bg #53131012.474.5pass
filterable-table no-results textno-resultstextcolor.text.muted #d4868bcolor.surface.default #0d07077.224.5pass
toolbar controls on the chrome surface—textcolor.text.default #e99499color.surface.chrome #0000009.164.5pass
search box and filter button boundaries on the chrome surface—uicolor.border.control #c81a1acolor.surface.chrome #0000003.623pass
column headers, empty-state heading and current page—textcolor.text.bright #ffa2a7color.surface.default #0d070710.454.5pass
count, chip remove glyph and empty-state text—textcolor.text.muted #d4868bcolor.surface.default #0d07077.224.5pass
Tested badge—textcolor.status.success.on-fill #000000color.status.success.fill #82d9a012.384.5pass
Demonstrated badge—textcolor.status.info.on-fill #000000color.status.info.fill #82b4ff9.924.5pass
New button and checked boxes—textcolor.action.primary.text #ffa2a7color.action.primary.bg #7d13105.574.5pass
ring on a selected rowselecteduicolor.interaction.focus.ring-container #ffa2a7color.interaction.selection.bg #5313107.483pass
chip and checkbox boundaries—uicolor.border.control #c81a1acolor.surface.default #0d07073.443pass
disabled Prev link (exempt; house floor 3:1)—uicolor.text.disabled #a3676bcolor.surface.default #0d07074.483pass
header rule (decorative)—uicolor.border.strong #9e231fcolor.surface.default #0d07072.581pass
panel edge and toolbar separator (decorative)—uicolor.border.default #482b2bcolor.surface.default #0d07071.581pass
row, toolbar and footer rules (decorative)—uicolor.border.divider #482b2bcolor.surface.default #0d07071.581pass

Keys

KeyAction
Tab / Shift+TabInto the toolbar (the search input is its stop), then each chip's Remove button, then the table (the first row is its stop), then Next.
Arrow keysInside the toolbar move between the search field, Filter, Columns and New; inside the table move between rows; Home and End reach the first and last row.
Enter / SpaceOpen the Filter menu; toggle Columns; activate New or a chip's Remove; on a header sort by it; on a row's checkbox toggle its selection.
EscapeClears a non-empty search; closes the Filter menu and returns focus to its button.

For agents

Component JSON ·Implementation brief ·Build a task kit ·

Related: toolbar search-field menu icon-button button chip data-table badge empty-state pagination

Stress fixtures: FX-STATE-MATRIX FX-320 FX-360 FX-ZOOM-200 FX-RM FX-HC FX-I18N FX-RTL FX-OVERFLOW FX-DENSITY