data · interactive grid

TuxRichDataGrid

Interactive data grid for operational and research-dashboard surfaces — Landscape-class apps where the reader needs to act on rows, not just read them. Anatomy adapted from Ant Design Table and Microsoft Fabric Rich-data-grid; identity stays TUX (Work Sans / JetBrains Mono, maroon focus, warm- neutral surfaces, tabular figures throughout).

State is host-driven — selection, expansion, sort, filters, and pagination are all v-model bindings or events. The component renders; it doesn't own the data. For static editorial tables (numbered captions, footnotes, source line), use TuxDataTable. For the thin UTable wrap, use TuxTable.

flagship · operational dashboard

Full interactive grid

Sticky header, row selection, expandable detail panels, sortable columns, active-filter chips, and a bulk-action bar that surfaces when ≥1 row is selected. Click the chevron to expand a row; click headers to sort.

Active corridor projects
FY 2025 · 8 of 184 · last sync 14 min ago
FiltersDistrict:Houston, Austin, San AntonioStatus:Active or Risk
2 selected
Expand row
I-45 Central Sustained
PRJ-2847 · Construction
HoustonT. Nguyen Risk28.719.91280

Scope · PRJ-2847

Stack reconstruction; ROW acquisition lagging 14% behind plan.

Last update

2025-10-29

I-10 Border Freight
PRJ-2844 · Construction
El PasoJ. Aguirre Active21.048.2644.8
I-35 Capital Express
PRJ-2841 · Construction
AustinL. Whitfield Active18.423.6482
US-290 East Reliever
PRJ-2842 · Design 60%
HoustonC. Okafor Active12.131.4218.5
Loop 1604 Reconstruction
PRJ-2845 · Design 90%
San AntonioP. Choudhury Active9.314312.4
US-59 Lufkin Bypass
PRJ-2848 · Design 30%
AtlantaK. Boyd Active6.811.2154.1
SH-130 Rural ITS
PRJ-2843 · Scoping
San AntonioM. Reyes Hold4.29.836.2
FM-1488 Rural Realign
PRJ-2846 · Closeout
HoustonS. Patel Closed0.05.141.7
<TuxRichDataGrid
  title="Active corridor projects"
  meta="FY 2025 · 8 of 184 · last sync 14 min ago"
  :columns="columns"
  :rows="sortedRows"
  :filters="filters"
  v-model:selected="selected"
  v-model:expanded="expanded"
  v-model:sort-key="sortKey"
  v-model:sort-dir="sortDir"
  pagination-label="Showing 1–8 of 184 projects"
  :pagination-tokens="paginationTokens"
>
  <template #cell-status="{ row }">
    <span class="rdg-status" :data-tone="row.status">
      <span class="rdg-status-dot" />
      {{ row.status }}
    </span>
  </template>

  <template #expanded="{ row }">
    <div class="rdg-expanded">
      <p class="eyebrow">Scope · {{ row.id }}</p>
      <p>{{ row.scope }}</p>
    </div>
  </template>
</TuxRichDataGrid>

embedded · dashboard tile

Compact variant

Disable selection, expansion, and the search/filter trio for a denser surface that lives inside a dashboard tile or side rail. Density set to compact for tighter row rhythm.

Top corridors by delay
ProjectStatusDelayBudget
I-35 Capital Express Active18.4482
US-290 East Reliever Active12.1218.5
SH-130 Rural ITS Hold4.236.2
I-10 Border Freight Active21644.8
Loop 1604 Reconstruction Active9.3312.4
<TuxRichDataGrid
  title="Top corridors by delay"
  :columns="compactColumns"
  :rows="compactRows"
  density="compact"
  selection-disabled
  expansion-disabled
  :show-search="false"
  :show-filter="false"
  :show-columns="false"
/>

per-column controls

Header-menu slot

The #headerMenu slot mounts a consumer-supplied control next to each column header. Use it to expose sort / hide / pin / filter actions from the header itself — TUX ships no default chrome, so consumers compose with UDropdownMenu, UPopover, or a full TuxFilterPanel. Slot scope: { column, sortKey, sortDir }.

Header-menu demo
Expand row
I-35 Capital ExpressAustinL. WhitfieldActive
US-290 East RelieverHoustonC. OkaforActive
SH-130 Rural ITSSan AntonioM. ReyesHold
I-10 Border FreightEl PasoJ. AguirreActive
Loop 1604 ReconstructionSan AntonioP. ChoudhuryActive
<TuxRichDataGrid :columns :rows>
  <template #headerMenu="{ column }">
    <UDropdownMenu :items="menuItemsFor(column)">
      <button class="th-menu-btn" aria-label="Column actions">⋮</button>
    </UDropdownMenu>
  </template>
</TuxRichDataGrid>

big lists

Virtualized mode — 5,000 rows

Pass virtualized and the body windows through @tanstack/vue-virtual: only the visible slice of rows renders, bracketed by spacer rows that preserve the scroll extent — sticky header, sorting, and key-based selection all keep working. Rows should be uniform height (virtual-row-height, default 44). Row expansion is disabled while virtualized. This demo scrolls 5,000 generated rows; inspect the DOM to watch the window move.

Corridor segments (5,000 rows)
<TuxRichDataGrid
  virtualized
  :virtual-row-height="44"
  :rows="rows"      <!-- 5,000 rows -->
  :columns="columns"
  row-key="id"
  max-height="360px"
/>