Data Table

Data Table

Dynamic table with sorting, search, and pagination — write plain arrays in MDX or pass fetched data programmatically

Installation

npx @ravikumarsurya/mdx-ui add data-table

Usage

Two APIs — pick what fits your context:

Simple (MDX-native)

Just pass headers and rows as plain arrays. No JavaScript objects needed.

<DataTable
  headers={["Prop", "Type", "Required", "Description"]}
  rows={[
    ["src", "string", "Yes", "Image URL or path"],
    ["alt", "string", "Yes", "Alt text"],
    ["width", "number", "No", "Width in px"],
    ["height", "number", "No", "Height in px"],
  ]}
/>
PropTypeRequiredDescription
srcstringYesImage URL or path
altstringYesAlt text
widthnumberNoWidth in px
heightnumberNoHeight in px

Programmatic (dynamic data)

Use when data comes from a file, fetch, or database.

import data from "./props.json";
 
export const columns = [
  { key: "prop", header: "Prop", sortable: true },
  { key: "type", header: "Type" },
  { key: "required", header: "Required", sortable: true },
];
 
<DataTable columns={columns} data={data} searchable pagination />
PropTypeRequiredDescription
srcstringYesImage URL or path
altstringYesAlt text
widthnumberNoWidth in px
heightnumberNoHeight in px
Rows per page
14 of 4

Examples

mdx-ui component registry
ComponentTypeVersion
AccordionInteractive0.0.35
BadgeDisplay0.0.35
CalloutDisplay0.0.35
Code BlockDisplay0.0.35
Data TableInteractive0.0.35
StepsDisplay0.0.35
TabsInteractive0.0.35

With search and sort

Add searchable to show a search input. Add sortable to enable click-to-sort on every column — sort type is auto-detected (A→Z for text, 1→9 for numbers, Newest for dates).

ComponentVersionSize (KB)Released
Accordion0.0.13.22024-11-01
Mermaid0.0.178.72025-01-10
DataTable0.0.295.12025-05-08
Changelog0.0.262.92025-04-22
Terminal0.0.263.42025-04-22
DiffBlock0.0.262.12025-04-22
Badge0.0.11.42024-11-01
Callout0.0.12.82024-11-01

With pagination

ComponentVersionSize (KB)Released
Accordion0.0.13.22024-11-01
Mermaid0.0.178.72025-01-10
DataTable0.0.295.12025-05-08
Changelog0.0.262.92025-04-22
Terminal0.0.263.42025-04-22
Rows per page
15 of 8

Per-column sort type (override auto-detection)

<DataTable
  headers={[
    "Name",
    { label: "Price", sortType: "number" },
    { label: "Published", sortType: "date" },
  ]}
  rows={[
    ["Alpha", "9.99", "2024-01-15"],
    ["Beta", "19.99", "2023-06-01"],
    ["Gamma", "4.99", "2025-03-22"],
  ]}
  sortable
/>

Props

DataTable

PropTypeDefaultDescription
headersstring[] | Header[]Column headers for the simple API
rowsArray<Array<string | number>>Row data for the simple API
columnsDataTableColumn[]Column definitions for the programmatic API
dataT[]Row objects for the programmatic API
searchablebooleanfalseShow a search input above the table
searchPlaceholderstring"Search…"Placeholder for the search input
sortablebooleanfalseEnable sorting on all columns (simple API). For programmatic API, set per column
paginationbooleanfalseEnable pagination with rows-per-page selector
defaultPageSizenumber10Initial rows per page
pageSizeOptionsnumber[][10,25,50,100]Rows-per-page dropdown options
captionstringCaption below the table
emptyTextstring"No data available."Text shown when no rows match
classNamestringExtra classes on the outer wrapper

Header object (simple API)

Instead of a plain string, a header can be an object to set sort type explicitly:

{ label: "Price", sortType: "number" }
{ label: "Date", sortType: "date" }

DataTableColumn (programmatic API)

PropTypeDefaultDescription
keystringKey read from each row object (required)
headerstringColumn header label (required)
sortablebooleanfalseEnable sort on this column
sortType"string" | "number" | "date"autoSort strategy; auto-detected if omitted
searchablebooleantrueInclude in search
render(value, row, index) => ReactNodeCustom cell renderer
classNamestringExtra classes on <th> and <td>