Docyrus

DataGrid

Headless spreadsheet grid for React Native — useDataGrid + DataGrid with FlashList virtualization, pinned columns, every cell variant, sheet editors, status transitions, grouping, change tracking, paging, color rules and gallery mode.

iOSAndroid
Preview DataGrid on your device

Scan with Expo Go

Download Expo Go, then scan the QR code to preview native components.

Installation

pnpm dlx @docyrus/cli add @docyrus/rn-data-grid
Required Packages(6 packages)
pnpm add @tanstack/react-table @shopify/flash-list react-native-svg jsonata @react-querybuilder/core expo-clipboard (optional)

The native grid mirrors the web API 1:1: a headless controller (useDataGrid) owns the TanStack table and all grid state, and DataGrid renders whatever it returns. Mobile idioms replace desktop ones — editors open in bottom sheets, long-press enters selection mode, long-press on a header opens the column actions, and rows are virtualized with FlashList v2.

Usage

import {
  DataGrid,
  DataGridToolbar,
  getDataGridSelectColumn,
  useDataGrid,
  type ColumnDef
} from '@/components/docyrus-native/data-grid';

type Employee = { id: string; name: string; status: string; salary: number; hireDate: string };

const columns: ColumnDef<Employee>[] = [
  getDataGridSelectColumn<Employee>(),
  { accessorKey: 'name', header: 'Name', size: 160, meta: { label: 'Name', cell: { variant: 'short-text' } } },
  {
    accessorKey: 'status',
    header: 'Status',
    meta: {
      label: 'Status',
      cell: {
        variant: 'status',
        options: [
          { label: 'Active', value: 'active', color: 'green' },
          { label: 'On Leave', value: 'on-leave', color: 'amber' },
          { label: 'Sick', value: 'sick', parent: 'on-leave', forceDescription: true },
          { label: 'Closed', value: 'closed', isFinalOption: true, forceFollowupDate: true }
        ]
      }
    }
  },
  { accessorKey: 'salary', header: 'Salary', meta: { label: 'Salary', cell: { variant: 'currency', currency: 'USD' } } },
  { accessorKey: 'hireDate', header: 'Hire date', meta: { label: 'Hire date', cell: { variant: 'date' } } }
];

export function EmployeesGrid() {
  const [data, setData] = useState<Employee[]>(initialRows);

  const grid = useDataGrid({
    data,
    columns,
    getRowId: row => row.id,
    onDataChange: setData,
    enableSearch: true,
    enableChangeTracking: true,
    onChangesSave: async (changes) => api.updateMany(changes),
    pagingMode: 'standard',
    pageSize: 50,
    rowColorRules: [{ formula: 'status = "closed"', color: 'red-100' }],
    initialState: { columnPinning: { left: ['select', 'name'] } },
    onRowsDelete: rows => api.delete(rows.map(row => row.id)),
    meta: {
      onStatusUpdate: input => api.statusUpdate(input),
      onOpenRelation: ({ relatedId }) => router.push(`/records/${relatedId}`)
    }
  });

  return (
    <View className="flex-1">
      <DataGridToolbar table={grid.table} />
      <DataGrid {...grid} actions={[{ label: 'Archive', onAction: rows => archive(rows) }]} />
    </View>
  );
}

Convenience (data + columns, native-only)

Without a table prop, DataGrid creates the controller internally. Every useDataGrid option is accepted, plus the legacy controlled sorting / columnFilters pairs and onDataUpdate.

<DataGrid data={tasks} columns={taskColumns} onDataChange={setTasks} stretchColumns height={320} />

Interaction model

GestureResult
Tap a cellSelection mode → toggle the row. Email / phone / url → contact sheet (Compose email · Call · Send message · Open link · Edit). Checkbox / switch → toggles in place. tableMeta.onRowClick set → called with the row. Editable cell → editor sheet. Otherwise → row detail sheet.
Long-press a rowSelects it and enters selection mode (the selection bar appears).
Tap a headerCycles sort asc → desc → none.
Long-press a headerColumn actions: sort, pin / unpin, move left / right, group by, "Show autonumber" (relation), tableMeta.columnHeaderActions(columnId), hide.
Pull downonRefresh.

useDataGrid

function useDataGrid<TData>(options: UseDataGridProps<TData>): UseDataGridReturn<TData>;

Options

Every TanStack TableOptions<TData> key (except getCoreRowModel / pageCount) is spread into the table — data, columns, getRowId, state, initialState, onColumnVisibilityChange, onColumnOrderChange, onColumnPinningChange, onColumnSizingChange, onGroupingChange, onExpandedChange, onPaginationChange, manualPagination, manualSorting, manualFiltering, rowCount, enableRowSelection, meta, … sorting, columnFilters and rowSelection are grid-owned (read state.* when supplied, else internal) and their on*Change callbacks receive the resolved value.

OptionTypeDefaultDescription
dataTData[]—Rows (required).
columnsColumnDef<TData>[]—Column definitions; meta.cell (CellOpts) picks the cell variant (required).
onDataChange(data: TData[]) => void—Receives the next data array after every cell write / discard.
onRowAdd() => Partial<CellPosition> | Promise<Partial<CellPosition> | null | void> | null | void—Enables the "Add row" footer; the returned position is scrolled to.
onRowsAdd(count: number) => void | Promise<void>—Accepted for web parity.
onRowsDelete(rows: TData[], rowIndices: number[]) => void | Promise<void>—Enables the selection bar's Delete (through tableMeta.onRowsDelete).
onFilesUpload(params: { files: NativeFile[]; rowIndex: number; columnId: string }) => Promise<FileCellData[]>—Makes file / image cells editable.
onFilesDelete(params: { fileIds: string[]; rowIndex: number; columnId: string }) => void | Promise<void>—File removal from the file editor.
rowHeightRowHeightValue'short'Initial row height (re-seeded when the prop changes).
onRowHeightChange(rowHeight: RowHeightValue) => void—Row height change notification.
displayMode'table' | 'gallery''table'Initial display mode (re-seeded when the prop changes).
onDisplayModeChange(mode: DataGridDisplayMode) => void—Display mode change notification.
enableSearchbooleanfalseFind-in-grid (searchState); DataGrid renders the find bar.
enableGroupingbooleantrueGroupable variants get a normalized getGroupingValue (dates bucket by local day).
readOnlybooleanfalseDisables every write.
enableChangeTrackingbooleanfalseBuffers edits: tinted cells + change bar with Save / Cancel.
onChangesSave(changes: RowChange[], data: TData[]) => void | Promise<void>—Save from the change bar.
onChangesDiscard() => void—Cancel from the change bar (data is restored through onDataChange).
getRowLabel(row: TData, rowIndex: number) => string—Row label for the change list and row detail title.
maxSearchMatchesnumber500Find-in-grid match cap.
rowColorRulesDataGridRowColorRule[]—JSONata row background rules (evaluated async).
cellColorRulesDataGridCellColorRule[]—JSONata cell background rules.
pagingMode'virtual-scroll' | 'standard''virtual-scroll''standard' = client pagination + paging footer. Switching at runtime re-seeds the page size.
pageSizenumber50Page size in 'standard' mode.
overscan, measureRows, dir, autoFocus, enableSingleCellSelection, enableColumnSelection, enablePaste, onPaste, maxSelectCells——Accepted and ignored (desktop-only).

Return value

KeyTypeDescription
tableTable<TData>TanStack table (sorted / filtered / grouped / expanded / paginated models).
tableMetaTableMeta<TData>Meta passed to cells (see below).
columnsColumnDef<TData>[]The input columns.
rowHeightRowHeightValueCurrent row height.
displayModeDataGridDisplayModeCurrent display mode.
focusedCellCellPosition | nullLast tapped / navigated cell.
editingCellCellPosition | nullCell whose editor sheet is open.
searchStateSearchState | null{ searchQuery, onSearchQueryChange, onSearch, searchMatches, matchIndex, searchOpen, onSearchOpenChange, onNavigateToNextMatch, onNavigateToPrevMatch } when enableSearch.
onRowAdd(() => Promise<Partial<CellPosition> | null>) | undefinedWrapped onRowAdd.
changedCellsByRowIdMap<string, Set<string>> | nullChanged cells (change tracking only).
changedRowCountnumberRows with pending changes.
onChangesSave(() => Promise<void>) | undefinedChange tracking only.
onChangesDiscard(() => void) | undefinedChange tracking only.
changeMapRefRefObject<Map<string, ChangeMapEntry<TData>>> | undefinedPending change map.
getRowLabel((row, rowIndex) => string) | undefinedPassed through.
rowColorMapMap<string, string>Row id → colour.
cellColorMapMap<string, Map<string, string>>Row id → column id → colour.
pagingModeDataGridPagingMode | undefinedPassed through.
selectedRowsTData[]Selected originals.
selectedRowCountnumberSelected row count.

TableMeta

tableMeta spreads options.meta and adds the grid-owned members. Supply the host-side members through meta.

MemberTypeSourceDescription
onDataUpdate(update: CellUpdate | CellUpdate[]) => voidgridWrite one or many cells.
onRowsDelete(rowIndices: number[]) => void | Promise<void>gridPresent when onRowsDelete option is set.
onRowSelect(rowId: string, checked: boolean) => voidgridToggle a row.
onCellClick / onCellEditingStart / onCellEditingStopfunctionsgridFocus / open / close the editor sheet.
getIsCellChanged(rowId, columnId) => booleangridChange tracking lookup.
getVisualRowIndex(rowId) => number | undefinedgrid1-based leaf index (skips group rows).
rowHeight / onRowHeightChangegridRead by DataGridRowHeightMenu.
displayMode / onDisplayModeChangegridRead by DataGridDisplayMenu.
focusedCell / editingCell / readOnlygridCurrent state.
onFilesUpload / onFilesDeleteoptionFile cells.
formatDate / formatDateTime / formatNumberformattersmeta › DateFormatProvider / NumberFormatProvider (e.g. DocyrusTenantProvider) › cell fallback (toLocale* / Intl.NumberFormat)Tenant formatting.
onRowClick(row: TData) => voidmetaRow tap instead of the built-in detail sheet.
onStatusUpdate(input: { rowIndex; columnId; value; secondaryValue?; description?; followupDate? }) => Promise<void>metaEnables the status note / follow-up step.
loadCellOptions(column, { search, page, pageSize, signal }) => Promise<{ items; hasMore? }>metaAsync, paged, abortable options for relation / user / enum editors.
columnOptions / onColumnOptionsChange / onColumnOptionsResetmetaPer-column overrides (showAutonumber).
columnHeaderActions(columnId) => DataGridColumnHeaderAction[]metaExtra header long-press actions.
onOpenRelation / getRelationHref(args: RelationNavigationArgs) => void / stringmetaRelation "open" affordance (onOpenRelation wins; the href opens with Linking).
emailClientRestApiClientmeta (useDocyrusDataGrid wires its client)Email cell "Compose email" opens the grid-hosted EmailComposeDialog pre-addressed to the cell value (web parity).
messageClientRestApiClientmeta (useDocyrusDataGrid wires its client)Phone cell "Send message" opens the grid-hosted InstantMessageComposeDialog (SMS / WhatsApp).
onComposeEmail(address: string, row: TData) => voidmetaNative. Handle the email action yourself (wins over emailClient; without either → mailto:).
onSendMessage(phone: string, row: TData) => voidmetaNative. Handle the message action yourself (wins over messageClient; without either → sms:).

DataGrid

DataGridProps<TData> = DataGridHeadlessProps<TData> | DataGridConvenienceProps<TData>.

Props (headless — spread useDataGrid())

PropTypeDefaultDescription
tableTable<TData>—From useDataGrid. Selects the headless path.
tableMetaTableMeta<TData>—From useDataGrid.
columnsColumnDef<TData>[]—From useDataGrid.
rowHeightRowHeightValue—From useDataGrid (36 / 56 / 76 / 96 dp, 1–4 lines).
displayModeDataGridDisplayMode—'gallery' renders DataGridGallery.
focusedCell / editingCellCellPosition | null—From useDataGrid.
searchStateSearchState | null—Renders the find bar; matches are tinted and scrolled to.
onRowAdd() => Promise<Partial<CellPosition> | null>—"Add row" footer.
changedCellsByRowId, changedRowCount, onChangesSave, onChangesDiscard, changeMapRef—Change bar + tinted cells.
getRowLabel(row, rowIndex) => string—Change list + detail title.
rowColorMap / cellColorMapMap—Colour rules.
pagingMode'virtual-scroll' | 'standard'—'standard' shows DataGridPaginationFooter.
actionsDataGridAction<TData>[]—Selection bar actions.
onClearFilters() => voidresets column filters + searchEmpty-state "Clear filters".
heightnumber | 'auto'fill parentFixed height in dp. The grid is flex-1 otherwise — inside a ScrollView (unbounded height) pass a number.
stretchColumnsbooleanfalseGrow columns to the viewport width.
addRowLabelstring"Add row"Footer label.
cardConfigDataGridCardConfig<TData>—Legacy 3-slot card config (adapted).
galleryCardConfigDataGalleryCardConfig<TData>—Gallery card config (wins over cardConfig).
galleryDisplayConfigDataGalleryDisplayConfigDEFAULT_DATA_GALLERY_DISPLAY_CONFIGGallery display config.
onCardClick(record: TData, rowIndex: number) => voidonRowClick / detail sheetGallery card press.
isLoadingbooleanfalseSkeleton while there are no rows.
isReloadingbooleanfalseSpinner overlay; rows stay mounted.
onRefresh() => void—Pull-to-refresh.
refreshingbooleanisReloadingPull-to-refresh spinner.
emptyTextstring"No data" / "No results found"Empty-state title.
stripedbooleanfalseAlternate row tint.
showSummarybooleanfalseRow count + display mode chips.
classNamestring—Container classes.
selectedRows / selectedRowCount—Accepted and ignored (derived from rowSelection).

Props (convenience — no table)

All useDataGrid options plus every view prop above, and:

PropTypeDefaultDescription
sorting / onSortingChangeSortingState / (sorting) => void—Controlled sorting.
columnFilters / onColumnFiltersChangeColumnFiltersState / (filters) => void—Controlled filters (values are DataGridFilterValue).
onDataUpdate(update: CellUpdate | CellUpdate[]) => void—Called for every cell write.
enableGroupingbooleanfalseLegacy default (the hook defaults to true).

DataGridAction

FieldTypeDescription
keystringStable key (defaults to label).
labelstringButton label.
iconReactNodeLeading icon.
variant'default' | 'destructive'Button colour.
disabledbooleanDisable the button.
onAction(selectedRows: TData[], rowIndices?: number[]) => voidPress handler (web signature + native row indices).
render(selectedRows: TData[]) => ReactNodeCustom renderer (wins over the button).

Cell variants (CellOpts)

VariantOptionsDisplayEditor
short-text / long-text—Text, clamped to the row-height line countText / textarea field
email / phone / url—Link textContact sheet → Edit → email / phone / url field
number / currency / percentmin, max, step, decimalPrecision, thousandSeparator, currency, symbolPositiontableMeta.formatNumber or Intl.NumberFormatNumber / money / percent field
select / enumoptions, display: 'badge' | 'text' (enum: appSlug, dataSourceSlug, fieldSlug)Colour badge or dot + textSearchable list (enum without options → loadCellOptions)
statusoptions (parent, isFinalOption, forceDescription, forceFollowupDate), display"Main › Sub" badges, final markerTwo-level list → note / follow-up step → onStatusUpdate
multi-select / tag-selectoptionsChips (+N)Multi list with Save / Clear
user / user-multi-selectoptions (avatarUrl, initials)Avatar(s) + name (raw { id, firstname, lastname, photo } supported)Avatar list (async via loadCellOptions when no options)
relationdataSourceId, relationAppSlug, relationDataSourceSlug, displayField, iconField, showAutonumberIcon / logo, autonumber, label, open affordanceAsync paged list (loadCellOptions); writes { id, name }
checkbox / switchtrueLabel, falseLabelBox / pillToggles in place
date / datetime / time / date-range—tableMeta.formatDate / formatDateTime or locale fallbackDate / datetime / time / range pickers
ratingmax, icon: RatingIconNameIconsRating field
duration—HH:MM:SSText input; HH:MM = hours:minutes (web parsing)
color / icon / currency-code—Swatch / icon / codeColour / icon / currency pickers
file / imagemaxFileSize, maxFiles, accept, multipleFile name / thumbnailsUpload / remove through onFilesUpload / onFilesDelete (read-only without them)
uuidshowCopyButtonMono text (long-press copies) or copy button — optional expo-clipboard, share-sheet fallback—
chartchartType: 'sparkline' | 'bar', dataKey, color, expandedCellContentSVG sparkline / bars (+ expand sheet)—
sparklinecolor, dataKeyDeprecated alias of chart—

Columns whose header is a function (e.g. getDataGridSelectColumn, getDataGridActionsColumn) render through flexRender, like web. Column width is the TanStack size (falls back to the deprecated meta.width).

Toolbar & menus

Every menu is a compact chip that opens a bottom sheet (web: popover / dropdown). All take table and the common props below unless noted.

Common propTypeDefaultDescription
tableTable<TData>—The grid's TanStack table.
disabledbooleanfalseDisable the trigger.
classNamestring—Trigger chip classes.
ComponentExtra propsDescription
DataGridToolbarenableFilter (true), enableSort (true), enableRowHeight (true), enableFields (true), enableView (true), enableDisplayMode (false), enableGroup (false), startContent, endContent, contentClassName; enableSearch / enablePaste / enableRowAdd / enableRowsDelete / enableUndoRedo accepted and ignoredHorizontally scrollable row of the menus.
DataGridFilterMenugetAsyncOptions?: (column) => AsyncOptionsConfig | undefinedColumn filter chips (operator + value).
DataGridAdvancedFiltergroup: RuleGroupType | undefined, onChange: (group | undefined) => voidAND/OR query-builder draft editor, emits on Apply.
DataGridSortMenu—Multi-column sort.
DataGridGroupMenudefaultRowGroupingColumn?: stringRow grouping.
DataGridRowHeightMenu—short / medium / tall / extra-tall.
DataGridFieldsMenuenableReorder (true), enablePinning (true)Visibility, order, pin-left.
DataGridDisplayMenu—Table ↔ gallery.
DataGridViewMenustorageKey?: stringLocal saved views (sync 'local' store).
DataGridExportMenuonExport?: (rows, format, columnScope) => void, isExporting, fileName ('export')CSV / Excel / JSON / Markdown; built-in writer + share sheet without onExport.
DataGridSearchsearchQuery, onSearchQueryChange, onSearch?, searchMatches?, matchIndex?, onNavigateToNextMatch?, onNavigateToPrevMatch?, searchOpen?, onSearchOpenChange?, placeholder?, autoFocus? (no table)Find-in-grid bar.

DataGridSidePanel

Container for useDocyrusDataGrid's vertical-tabs view picker (sidePanel). Web renders a fixed <aside> column; native is a full-width strip on phones (the vertical-tabs DataGridViewSelect opens its view list as a bottom sheet) and a side column on tablets.

PropTypeDefaultDescription
headerReactNode—Header above the body (strings render as a caption).
footerReactNode—Footer below the body.
widthnumber224Column width in dp (web: Tailwind class 'w-56').
columnBreakpointnumber768Native. Window width at which the column layout kicks in.
layout'strip' | 'column'derivedNative. Force a layout.
classNamestring—Root classes.
childrenReactNode—Panel body.

Components

ComponentDescription
DataGridGrid view (headless or convenience).
DataGridSidePanelSide panel container (strip on phones, column on tablets).
DataGridGalleryIn-grid gallery (DataGalleryCard in a responsive FlashList).
DataGridPaginationFooterPaging footer driven by table.getState().pagination (pageSizeOptions).
DataGridChangeActionBarChange tracking bar with pending-change list.
DataGridColumnHeaderHeader cell (tap sort, long-press actions).
DataGridCellEditorEditor sheet for editingCell.
DataGridSkeleton / DataGridSkeletonGrid / DataGridSkeletonToolbarLoading placeholders.
DataGridSelectHeader / DataGridSelectCellCheckbox header / cell.
DataGridCellStandalone read-only cell (value, cellOpts, rowHeight, tableMeta?, row?, columnId?, backgroundColor?, className?) — native-only.
DataGridCellContentUnwrapped cell content renderer — native-only.

Exports

ExportKind
useDataGridHook
getDataGridSelectColumn, getDataGridActionsColumnColumn factories
adaptLegacyCardConfig, getIsCellEditableHelpers
copyToClipboard(text), isClipboardAvailable()Clipboard (optional expo-clipboard, share-sheet fallback; resolves 'clipboard' | 'share')
applyViewToTable, captureViewSnapshot, getManagedColumns, getColumnLabel, getGeneratedViewId, moveColumn, reorderColumn, canMoveColumn, pinColumnLeft, pinColumnRight, unpinColumn, SYSTEM_COLUMN_IDSView utils
dataGridFilterFn, getFilterFn, isDataGridFilterValue, matchesDataGridFilterFilter helpers
DATA_GRID_DEFAULT_PAGE_SIZE, DATA_GRID_PAGE_SIZE_OPTIONS, isSavedDataGridViewConstants / guards

Type Exports

TypeDescription
UseDataGridProps<TData> / UseDataGridReturn<TData>Hook options / return.
DataGridProps<TData>, DataGridHeadlessProps<TData>, DataGridConvenienceProps<TData>, DataGridViewProps<TData>Grid props.
DataGridAction<TData>Selection bar action.
CellOpts, CellVariant, CellSelectOption, CellUserOption, CellOptionIconComponent, RatingIconNameCell configuration.
CellUpdate, CellChange, RowChange, CellPosition, ChangeMapEntry, FileCellData, SearchStateGrid state.
RowHeightValue, DataGridDisplayMode, DataGridPagingMode, DataGridCardConfigLayout.
DataGridRowColorRule, DataGridCellColorRule, DataGridColumnOptions, DataGridColumnHeaderAction, RelationNavigationArgsRules / column options.
SavedDataGridView, ICollectionFilterGroup, ICollectionFilterRule, ICollectionListParams, ICollectionOrderByViews / collection params.
FilterOperator, FilterValue, DataGridFilterValueFilter values.
DataGridCellProps, DataGridCellContentProps, DataGridGalleryProps, DataGridPaginationFooterProps, DataGridChangeActionBarProps, DataGridColumnHeaderProps, DataGridCellEditorProps, DataGridSidePanelProps, DataGridAdvancedFilterProps, DataGridToolbarProps, DataGridSearchProps, DataGridSortMenuProps, DataGridFilterMenuProps, DataGridFieldsMenuProps, DataGridGroupMenuProps, DataGridRowHeightMenuProps, DataGridDisplayMenuProps, DataGridViewMenuProps, DataGridExportMenuPropsComponent props.
DataGridExportFormat, DataGridExportColumnScopeExport menu unions.
ColumnDefRe-exported from @tanstack/react-table.

Translation keys

Copy goes through useUiTranslation() with the web ui.dataGrid.* keys (addRow, emptyTitle, emptyFilteredTitle, clearFilters, selectAll, selectRow, clearSelection, contextMenuDeleteRows, contextMenuClear, save, saving, cancel, item, itemsChanged, changesPending, cellEmpty, searchStatus, noStatusFound, statusNote, statusFollowup, statusUpdateFailed, openRelation, copyId, copyFailed, copiedToClipboard, sortAsc, sortDesc, removeSort, pinToLeft, unpinFromLeft, moveColumnLeft, moveColumnRight, groupByColumn, showAutonumber, hideColumn, tableView, galleryView, pagination.*) plus ui.common.cancel, ui.emailComposer.compose, ui.instantMessageComposer.compose, ui.formField.fileSource*. Native-only keys: ui.dataGrid.searchOptions, noOptions, call, openLink, edit, tapToEdit, rowDetails, rowCount.

Migration from the previous native DataGrid

  • Headless first. useDataGrid + <DataGrid {...grid} /> is the primary API. <DataGrid data columns /> still works (convenience path).
  • Built-in toolbar removed. The grid no longer renders its own filter / sort / group / row-height / display toolbar — compose DataGridToolbar and the menus above it. enableSearch renders the find bar (web find-in-grid) instead of a client globalFilter.
  • Row tap calls tableMeta.onRowClick when supplied, else opens the editor sheet for editable cells, else the row detail sheet (email / phone / url cells open the contact sheet; checkbox / switch toggle in place). Long-press still selects.
  • Summary chips ("N rows" / mode) are opt-in via showSummary.
  • DataGridProps / DataGridAction moved from types.ts to data-grid.tsx (still exported from the barrel). DataGridAction.onAction is optional and receives (rows, rowIndices?).
  • onRowsDelete(rows, indices) is now wired (selection bar Delete). onDataUpdate receives a single update or an array.
  • rowHeight adds 'extra-tall'; height accepts 'auto'; the default is now fill-parent instead of intrinsic.
  • Column width: use TanStack size; meta.width is a deprecated fallback.
  • Date / number cells format through DateFormatProvider / NumberFormatProvider (or tableMeta.format*) — no more toISOString() output.
  • DataGridCell accepts rowHeight as a preset or pixels and optional tableMeta / row / columnId.
  • sparkline is a deprecated alias of { variant: 'chart', chartType: 'sparkline' }.
  • The old internal components/* files and lib/data-grid-utils.ts were removed.

On this page