Skip to content

User-Facing Components

Context-aware components that automatically connect to the table via the useDataTable hook.

User-facing components are context-aware and automatically connect to the table via the useDataTable hook. These are the recommended components for most use cases.

Container for organizing filters and actions in the toolbar.

import { DataTableToolbarSection } from "@/components/niko-table/components"
<DataTableToolbarSection className="flex justify-between">
<DataTableSearchFilter />
<DataTableViewMenu />
</DataTableToolbarSection>
NameTypeDefaultDescription
classNamestring-Additional CSS classes.
childrenReact.ReactNode-Filter and action components.

Full-featured pagination controls with page size selection and navigation.

import { DataTablePagination } from "@/components/niko-table/components"
<DataTablePagination
pageSizeOptions={[10, 25, 50, 100]}
totalCount={500}
onPageChange={pageIndex => console.log("Page:", pageIndex)}
/>
NameTypeDefaultDescription
pageSizeOptionsnumber[][10, 25, 50, 100]Available page size options.
totalCountnumber-Total count of items (for server-side pagination).
isLoadingboolean-Loading state (overrides context loading).
isFetchingboolean-Fetching state (for TanStack Query).
disableNextPageboolean-Explicitly disable next page button.
disablePreviousPageboolean-Explicitly disable previous page button.
classNamestring-Additional CSS classes.
NameTypeDescription
onPageChange(pageIndex: number) => voidCalled when page changes.
onNextPage(pageIndex: number) => voidCalled when navigating to next page.
onPreviousPage(pageIndex: number) => voidCalled when navigating to previous page.
onPageSizeChange(pageSize: number, pageIndex: number) => voidCalled when page size changes.
onPaginationReady() => voidCalled when pagination is initialized.

Note: Pagination buttons are automatically disabled when isLoading or isFetching is true.

Global search input with debouncing. Supports both controlled and uncontrolled modes.

import { DataTableSearchFilter } from "@/components/niko-table/components"
// Uncontrolled (manages its own state)
<DataTableSearchFilter placeholder="Search products..." />
// Controlled (you manage the state)
const [search, setSearch] = useState("")
<DataTableSearchFilter
value={search}
onChange={setSearch}
placeholder="Search..."
/>
// With nuqs for URL state
const [search, setSearch] = useQueryState('search')
<DataTableSearchFilter
value={search ?? ""}
onChange={setSearch}
/>
NameTypeDefaultDescription
placeholderstring"Search..."Input placeholder text.
valuestring-Controlled value.
onChange(value: string) => void-Change handler for controlled mode.
showClearButtonbooleantrueShow clear button when input has value.
classNamestring-Additional CSS classes.

Command palette-style interface for adding filters with advanced operators and AND/OR logic.

import { DataTableFilterMenu } from "@/components/niko-table/components"
<DataTableFilterMenu
autoOptions
dynamicCounts
showCounts
mergeStrategy="augment"
/>
NameTypeDefaultDescription
autoOptionsbooleantrueAuto-generate options for select/multi_select columns.
showCountsbooleantrueShow counts beside each option.
dynamicCountsbooleantrueRecompute counts based on filtered rows.
limitToFilteredRowsbooleantrueGenerate options from filtered rows only.
includeColumnsstring[]-Only generate options for these column ids.
excludeColumnsstring[]-Exclude these column ids from generation.
limitPerColumnnumber-Limit number of generated options per column.
mergeStrategy"preserve" | "augment" | "replace""preserve"How to handle existing static options.
classNamestring-Additional CSS classes.
ValueDescription
preserveKeep user-defined options untouched (default).
augmentAdd counts to matching values from static options.
replaceOverride static options with generated options.

Faceted filter component for single or multiple selection with dynamic option generation.

import { DataTableFacetedFilter } from "@/components/niko-table/components"
// With static options
<DataTableFacetedFilter
accessorKey="category"
title="Category"
options={[
{ label: "Electronics", value: "electronics" },
{ label: "Clothing", value: "clothing" },
]}
multiple
/>
// Auto-generate options from data
<DataTableFacetedFilter
accessorKey="brand"
limitToFilteredRows={true}
/>
NameTypeDefaultDescription
accessorKeykeyof TData & string-Column accessor key (required).
titlestring-Custom title (uses column.meta.label if not provided).
optionsOption[]-Static options array.
multipleboolean-Allow multiple selection.
showCountsbooleantrueShow counts beside each option.
dynamicCountsbooleantrueRecompute counts based on filtered rows.
limitToFilteredRowsbooleantrueShow only options from filtered rows.

Controls whether the filter shows options from all data or only from filtered rows.

  • true (default): Options are generated from rows that match other active filters. Useful for filters like “Brand” where you want to see only relevant options.
  • false: Options are generated from all rows, regardless of other filters. Useful for filters like “Category” where you want to see all available options.

Menu for managing column sorting with drag-and-drop reordering.

import { DataTableSortMenu } from "@/components/niko-table/components"
<DataTableSortMenu className="ml-auto" />
NameTypeDefaultDescription
classNamestring-Additional CSS classes.
debounceMsnumber-Debounce delay for sort updates.
throttleMsnumber-Throttle delay for sort updates.
shallowboolean-Use shallow comparison for sort state.
onSortingChange(sorting: ColumnSort[]) => void-Callback when sorting changes.

Column visibility toggle menu with search functionality.

import { DataTableViewMenu } from "@/components/niko-table/components"
<DataTableViewMenu />
NameTypeDefaultDescription
classNamestring-Additional CSS classes.
onColumnVisibilityChange(columnId: string, isVisible: boolean) => void-Callback when visibility changes.

Inline filter toolbar for managing filters with advanced operators and AND/OR logic.

import { DataTableInlineFilter } from "@/components/niko-table/components"
<DataTableInlineFilter
autoOptions
dynamicCounts
showCounts
mergeStrategy="augment"
/>

Same as DataTableFilterMenu. See DataTableFilterMenu section above for details.

Slider filter for numeric ranges with min/max inputs.

import { DataTableSliderFilter } from "@/components/niko-table/components"
// Auto-detect from column metadata
<DataTableSliderFilter accessorKey="price" />
// Custom range
<DataTableSliderFilter
accessorKey="rating"
min={1}
max={5}
step={0.5}
/>
// With unit
<DataTableSliderFilter
accessorKey="price"
range={[0, 1000]}
unit="$"
/>
NameTypeDefaultDescription
accessorKeykeyof TData & string-Column accessor key (required).
titlestring-Custom title.
minnumber-Minimum value (auto-detected from data if not provided).
maxnumber-Maximum value (auto-detected from data if not provided).
stepnumber1Step increment.
range[number, number]-Range array [min, max] (overrides min/max).
unitstring-Unit label (e.g., ”$”, “kg”).

Date filter component for single dates or date ranges.

import { DataTableDateFilter } from "@/components/niko-table/components"
// Single date
<DataTableDateFilter accessorKey="releaseDate" />
// Date range
<DataTableDateFilter
accessorKey="releaseDate"
multiple
/>
NameTypeDefaultDescription
accessorKeykeyof TData & string-Column accessor key (required).
titlestring-Custom title.
multiplebooleanfalseEnable date range selection.

Button to clear all active filters, sorting, and search.

import { DataTableClearFilter } from "@/components/niko-table/components"
<DataTableClearFilter />
NameTypeDefaultDescription
variantButtonVariant"outline"Button variant.
sizeButtonSize"sm"Button size.
showIconbooleantrueShow clear icon.
childrenReact.ReactNode-Button content.
enableResetColumnFiltersbooleantrueEnable resetting column filters.
enableResetGlobalFilterbooleantrueEnable resetting global filter (search).
enableResetSortingbooleantrueEnable resetting sorting.
classNamestring-Additional CSS classes.

Button to export table data to CSV.

import { DataTableExportButton } from "@/components/niko-table/components"
// Basic usage
<DataTableExportButton filename="products" />
// With human-readable headers from column.meta.label
<DataTableExportButton filename="products" useHeaderLabels />
// Export only selected rows
<DataTableExportButton filename="selected" onlySelected />
NameTypeDefaultDescription
filenamestring"table"Filename for exported CSV (without extension).
excludeColumns(keyof TData)[]-Columns to exclude from export.
onlySelectedbooleanfalseExport only selected rows.
useHeaderLabelsbooleanfalseUse column.columnDef.meta.label as CSV headers instead of column IDs.
variantButtonVariant"outline"Button variant.
sizeButtonSize"sm"Button size.
labelstring"Export CSV"Button label.
showIconbooleantrueShow download icon.
classNamestring-Additional CSS classes.

Composable column header container. Provides layout for title, actions, and filters within each column header.

import {
DataTableColumnHeader,
DataTableColumnTitle,
DataTableColumnSortMenu,
} from "@/components/niko-table/components"
const columns: DataTableColumnDef<User>[] = [
{
accessorKey: "name",
header: () => (
<DataTableColumnHeader>
<DataTableColumnTitle />
<DataTableColumnSortMenu />
</DataTableColumnHeader>
),
meta: { label: "Name" },
},
]
NameTypeDescription
childrenReact.ReactNodeColumn header content.
classNamestringAdditional CSS classes.

The DataTableColumnHeader is composable. You can break it down into parts to customize the layout or add custom filters.

import {
DataTableColumnHeader,
DataTableColumnTitle,
DataTableColumnActions,
DataTableColumnFilter,
DataTableColumnFilterTrigger,
DataTableColumnSortOptions,
DataTableColumnHideOptions,
DataTableColumnPinOptions,
DataTableColumnFacetedFilterOptions,
DataTableColumnSliderFilterOptions,
DataTableColumnDateFilterOptions,
} from "@/components/niko-table/components"
const columns: DataTableColumnDef<User>[] = [
{
accessorKey: "status",
header: () => (
<DataTableColumnHeader>
<DataTableColumnTitle />
<DataTableColumnActions>
<DataTableColumnFilter>
<DataTableColumnFilterTrigger />
<DataTableColumnFacetedFilterOptions />
</DataTableColumnFilter>
<DataTableColumnSortOptions />
<DataTableColumnPinOptions />
<DataTableColumnHideOptions />
</DataTableColumnActions>
</DataTableColumnHeader>
),
meta: { label: "Status" },
},
]

Standalone filter menus can also be placed directly inside DataTableColumnHeader without needing DataTableColumnActions:

import {
DataTableColumnHeader,
DataTableColumnTitle,
DataTableColumnSortMenu,
DataTableColumnFacetedFilterMenu,
DataTableColumnSliderFilterMenu,
DataTableColumnDateFilterMenu,
} from "@/components/niko-table/components"
import { FILTER_VARIANTS } from "@/components/niko-table/lib"
const columns: DataTableColumnDef<Product>[] = [
{
accessorKey: "category",
header: () => (
<DataTableColumnHeader>
<DataTableColumnTitle />
<DataTableColumnSortMenu variant={FILTER_VARIANTS.TEXT} />
<DataTableColumnFacetedFilterMenu
multiple
limitToFilteredRows={false}
/>
</DataTableColumnHeader>
),
meta: { label: "Category" },
enableColumnFilter: true,
},
{
accessorKey: "price",
header: () => (
<DataTableColumnHeader>
<DataTableColumnTitle />
<DataTableColumnSortMenu variant={FILTER_VARIANTS.NUMBER} />
<DataTableColumnSliderFilterMenu />
</DataTableColumnHeader>
),
meta: { label: "Price", variant: "range" },
enableColumnFilter: true,
},
{
accessorKey: "releaseDate",
header: () => (
<DataTableColumnHeader>
<DataTableColumnTitle />
<DataTableColumnSortMenu />
<DataTableColumnDateFilterMenu />
</DataTableColumnHeader>
),
meta: { label: "Release Date", variant: "date_range" },
enableColumnFilter: true,
},
]

When you use flexRender(...) in the core structure (like DataTableHeader or DataTableVirtualizedHeader), it renders the JSX returned by your header function. That JSX is automatically wrapped by the <DataTableColumnHeaderRoot column={...}> provider in the core components.

This means any component inside your header function (like DataTableColumnHeader, DataTableColumnTitle, etc.) correctly receives the column context even if you are using manual composition in your columns definition.

For custom integrations, the column header context is available directly:

Provider component that supplies column context to all child header components. This is used internally by DataTableHeader and DataTableVirtualizedHeader — you typically don’t need this unless building a completely custom header renderer.

import { DataTableColumnHeaderRoot } from "@/components/niko-table/components"
<DataTableColumnHeaderRoot column={column}>
{/* All child components receive column context */}
<DataTableColumnHeader>
<DataTableColumnTitle />
</DataTableColumnHeader>
</DataTableColumnHeaderRoot>
NameTypeDescription
columnColumn<TData, TValue>Table column instance (required).
childrenReact.ReactNodeChild components.

Hook to access the column header context. Returns the current column instance. Use this when building custom sub-components that need access to the column.

import { useColumnHeaderContext } from "@/components/niko-table/components"
function CustomHeaderButton() {
const { column } = useColumnHeaderContext(true)
return <button onClick={() => column.toggleSorting()}>Sort</button>
}
ParameterTypeDescription
requiredbooleanIf true, throws if used outside DataTableColumnHeaderRoot.

Renders the column title (clickable to toggle sort). Uses column context automatically.

NameTypeDefaultDescription
titlestring-Custom title (uses column.meta.label if not provided).
classNamestring-Additional CSS classes.

Container for action icons and dropdown menu for column options. Automatically detects active state (sorted, pinned, filtered).

NameTypeDefaultDescription
childrenReact.ReactNode-Action option components.
isActivebooleanautoOverride active state (auto-detected from context).
classNamestring-Additional CSS classes.

Wrapper for grouping column filter components.

NameTypeDescription
childrenReact.ReactNodeFilter components.
classNamestringAdditional CSS classes.

Dedicated filter icon button that uses column context. Shows a funnel icon to open column filters.

NameTypeDescription
classNamestringAdditional CSS classes.

Sorting options to compose inside DataTableColumnActions. Renders sort ascending/descending/clear options within a dropdown menu.

NameTypeDefaultDescription
variantSortIconVariant"text"Sort icon variant ("text", "number", "date"). Auto-detected from column.meta.variant.
withSeparatorbooleantrueWhether to render a separator before the options.
classNamestring-Additional CSS classes.

Standalone sort button for inline use outside dropdown menus. Renders as a clickable button with a dropdown for sort options.

NameTypeDefaultDescription
variantSortIconVariant"text"Sort icon variant ("text", "number", "date"). Auto-detected from column.meta.variant.
classNamestring-Additional CSS classes.

Pinning options to compose inside DataTableColumnActions. Renders pin left/right/unpin options.

NameTypeDescription
classNamestringAdditional CSS classes.

Standalone pinning menu for column header. Renders as a clickable button.

NameTypeDescription
classNamestringAdditional CSS classes.

Hide column option to compose inside DataTableColumnActions.

NameTypeDescription
classNamestringAdditional CSS classes.

Standalone hide menu for column header. Renders as a clickable button.

NameTypeDescription
classNamestringAdditional CSS classes.

Faceted filter options to compose inside DataTableColumnActions. Shows a multi-select filter list.

NameTypeDescription
columnColumn<TData>Optional override (auto-detected from context).
optionsOption[]Static options array.
multiplebooleanAllow multiple selection.
classNamestringAdditional CSS classes.

Standalone faceted filter popover for column header. Renders as a clickable button with filter icon. Auto-generates options from row data when no explicit options are provided.

NameTypeDefaultDescription
columnColumn<TData>-Optional override (auto-detected from context).
optionsOption[]-Static options array (auto-generated if omitted).
multipleboolean-Allow multiple selection.
limitToFilteredRowsbooleantrueShow only options from filtered rows (false = all rows).
classNamestring-Additional CSS classes.

Slider filter options to compose inside DataTableColumnActions. Shows a range slider for numeric columns.

NameTypeDescription
columnColumn<TData>Optional override (auto-detected from context).
minnumberMinimum value.
maxnumberMaximum value.
stepnumberStep increment.
classNamestringAdditional CSS classes.

Standalone slider filter popover for column header. Renders as a clickable button with slider icon.

NameTypeDescription
columnColumn<TData>Optional override (auto-detected from context).
minnumberMinimum value.
maxnumberMaximum value.
stepnumberStep increment.
classNamestringAdditional CSS classes.

Date filter options to compose inside DataTableColumnActions. Shows a date picker for date columns.

NameTypeDescription
columnColumn<TData>Optional override (auto-detected from context).
multiplebooleanEnable date range selection.
classNamestringAdditional CSS classes.

Standalone date filter popover for column header. Renders as a clickable button with calendar icon.

NameTypeDescription
columnColumn<TData>Optional override (auto-detected from context).
multiplebooleanEnable date range selection.
classNamestringAdditional CSS classes.

Sidebar component for displaying additional content (filters, details, etc.) alongside the table.

import {
DataTableAside,
DataTableAsideTrigger,
DataTableAsideContent,
DataTableAsideHeader,
DataTableAsideTitle,
DataTableAsideDescription,
DataTableAsideClose,
} from "@/components/niko-table/components"
<DataTableAside side="right">
<DataTableAsideTrigger>Open Filters</DataTableAsideTrigger>
<DataTableAsideContent>
<DataTableAsideHeader>
<DataTableAsideTitle>Filters</DataTableAsideTitle>
<DataTableAsideDescription>Filter your data</DataTableAsideDescription>
<DataTableAsideClose />
</DataTableAsideHeader>
{/* filter content */}
</DataTableAsideContent>
</DataTableAside>
NameTypeDefaultDescription
childrenReact.ReactNode-Aside components (Trigger, Content).
side"left" | "right""right"Side of the table to display the aside.
openboolean-Controlled open state.
onOpenChange(open: boolean) => void-Callback when open state changes.
defaultOpenbooleanfalseInitial open state (uncontrolled).
NameTypeDefaultDescription
childrenReact.ReactNode-Trigger content.
asChildbooleanfalseRender as child element.
classNamestring-Additional CSS classes.
NameTypeDefaultDescription
childrenReact.ReactNode-Aside content.
widthstring"w-1/2"Width of the aside (Tailwind class).
stickybooleanfalseMake aside sticky.
classNamestring-Additional CSS classes.

Shows bulk actions when rows are selected.

import { DataTableSelectionBar } from "@/components/niko-table/components"
<DataTableSelectionBar
selectedCount={table.getSelectedRowModel().rows.length}
onClear={() => table.resetRowSelection()}
>
<Button onClick={handleDelete}>Delete Selected</Button>
<Button onClick={handleExport}>Export Selected</Button>
</DataTableSelectionBar>
NameTypeDefaultDescription
selectedCountnumber-Number of selected rows (required).
onClear() => void-Callback to clear selection.
childrenReact.ReactNode-Custom action buttons.
classNamestring-Additional CSS classes.

Composition components for building custom empty states.

import {
DataTableEmptyIcon,
DataTableEmptyMessage,
DataTableEmptyTitle,
DataTableEmptyDescription,
DataTableEmptyFilteredMessage,
DataTableEmptyActions,
} from "@/components/niko-table/components"
import { PackageOpen } from "lucide-react"
import { Button } from "@/components/ui/button"
// Complete empty state composition
<DataTableEmptyBody>
<DataTableEmptyIcon>
<PackageOpen className="size-12 text-muted-foreground" />
</DataTableEmptyIcon>
<DataTableEmptyMessage>
<DataTableEmptyTitle>No products found</DataTableEmptyTitle>
<DataTableEmptyDescription>
Get started by adding your first product to the catalog.
</DataTableEmptyDescription>
</DataTableEmptyMessage>
<DataTableEmptyFilteredMessage>
No products match your current filters. Try adjusting your search criteria.
</DataTableEmptyFilteredMessage>
<DataTableEmptyActions>
<Button onClick={handleAddProduct}>Add Product</Button>
<Button variant="outline" onClick={handleImport}>
Import from CSV
</Button>
</DataTableEmptyActions>
</DataTableEmptyBody>

Icon component for empty state.

NameTypeDescription
childrenReact.ReactNodeIcon element.
classNamestringAdditional CSS classes.

Message shown when table is empty (not filtered).

NameTypeDescription
childrenReact.ReactNodeMessage content.
classNamestringAdditional CSS classes.

Message shown when filters return no results.

NameTypeDescription
childrenReact.ReactNodeMessage content.
classNamestringAdditional CSS classes.

Title component for empty state messages.

NameTypeDescription
childrenReact.ReactNodeTitle text.
classNamestringAdditional CSS classes.

Description component for empty state messages.

NameTypeDescription
childrenReact.ReactNodeDescription text.
classNamestringAdditional CSS classes.

Actions component for empty state (buttons, links, etc.).

NameTypeDescription
childrenReact.ReactNodeAction buttons/links.
classNamestringAdditional CSS classes.