Tablewind is a React/Next.js/Tailwind CSS library for data tables. It provides a set of reusable components that support inline editing, filtering, sorting, pagination, and more – all styled with Tailwind CSS.
Install via npm:
npm install tablewind
Or using Yarn:
yarn add tablewind
Ensure you have the following installed in your project:
next
(>= 15.0.0) – for using the Next.js version.react-router-dom
(>= 7.0.0) – for using the React Router version.import { DataTable } from 'tablewind';
function MyComponent() {
return (
<DataTable
endpoint="/api/data"
columns={[
// Define your column configurations here
]}
fetcher={fetch} // Or your custom fetcher function
/>
);
}
import { DataTable } from 'tablewind/next';
function MyPage() {
return (
<DataTable
endpoint="/api/data"
columns={[
// Define your column configurations here
]}
fetcher={fetch} // Or your custom fetcher function
/>
);
}
DataTable
PropsProp Name | Type | Description | Optional |
---|---|---|---|
pageTitle |
string |
The main heading for the table page. | Yes |
pageSubtitle |
string |
Subtitle displayed beneath the main title. | Yes |
addNewUrl |
string |
URL to navigate to when the "Add New" button is clicked. | Yes |
endpoint |
string |
API endpoint used to fetch table data. | No |
columns |
ColumnConfig<T>[] |
Column definitions for the table. | No |
initialQuery |
Record<string, string> |
Initial query params to pre-load filters or pagination. | Yes |
fetcher |
(url: string) => Promise<PaginatedResponse<T>> |
Custom function for fetching data. | Yes |
onRowSelect |
(selectedIds: string[]) => void |
Callback when row selection changes. | Yes |
filterFields |
FilterField[] |
Array of field definitions for building the filter UI. | Yes |
bulkActions |
BulkAction[] |
List of bulk actions to display when multiple rows are selected. | Yes |
className |
string |
Custom CSS class for the table container. | Yes |
handleDelete |
(id: string) => void |
Callback invoked when a row is deleted. | Yes |
dateRangeFilter |
{ queryParamBase: string } |
Enables a plug-and-play date range filter using the provided param base. | Yes |
loadingComponent |
React.ReactNode |
Custom component to render during loading. | Yes |
errorComponent |
React.ReactNode |
Custom component to render on error. | Yes |
redirectOnError |
() => void |
Called when there's an error; useful for redirecting. | Yes |
navigate |
(url: string) => void |
Function used to navigate (Next.js or React Router). | Yes |
showMobileFilters |
boolean |
Controls visibility of the filter panel on mobile. | No |
setShowMobileFilters |
(open: boolean) => void |
Sets the visibility state of mobile filters. | No |
onEditSave |
(id: string, newValues: EditValues) => void |
Called when an inline edit is saved. | Yes |
onEditCancel |
() => void |
Called when inline edit mode is cancelled. | Yes |
Before using Tablewind, be sure to import its CSS file into your project (for example, in your global stylesheet or in Next.js’s src/app/globals.css
):
@import 'tailwindcss';
@import 'tablewind/tablewind.css';
To customize Tablewind’s colors, override the following CSS variables in your own stylesheet. For example:
:root {
--dark-tablewind-accent: #yourCustomColor;
}
The available override variables are:
--dark-tablewind-accent
--dark-tablewind-accent-hover
--light-tablewind-accent
--light-tablewind-accent-hover
--dark-tablewind-text-primary
--dark-tablewind-text-secondary
--light-tablewind-text-primary
--light-tablewind-text-secondary
--dark-tablewind-border-primary
--light-tablewind-border-primary
--dark-tablewind-bg-primary
--dark-tablewind-bg-primary-hover
--light-tablewind-bg-primary
--light-tablewind-bg-primary-hover
--dark-success-alert-bg
--dark-success-alert-text
--light-success-alert-bg
--light-success-alert-text
--dark-reset-filters-bg
--dark-reset-filters-bg-hover
--dark-reset-filters-text
--light-reset-filters-bg
--light-reset-filters-bg-hover
--light-reset-filters-text
--dark-button-delete-bg
--dark-button-delete-bg-hover
--dark-button-delete-text
--light-button-delete-bg
--light-button-delete-bg-hover
--light-button-delete-text
--dark-button-edit-bg
--dark-button-edit-bg-hover
--dark-button-edit-text
--light-button-edit-bg
--light-button-edit-bg-hover
--light-button-edit-text
--dark-button-cancel-bg
--dark-button-cancel-bg-hover
--dark-button-cancel-text
--light-button-cancel-bg
--light-button-cancel-bg-hover
--light-button-cancel-text
--dark-button-save-bg
--dark-button-save-bg-hover
--dark-button-save-text
--light-button-save-bg
--light-button-save-bg-hover
--light-button-save-text
--dark-button-pagination-bg
--dark-button-pagination-bg-hover
--dark-button-pagination-text
--light-button-pagination-bg
--light-button-pagination-bg-hover
--light-button-pagination-text
--dark-button-pagination-disabled-bg
--dark-button-pagination-disabled-text
--light-button-pagination-disabled-bg
--light-button-pagination-disabled-text
--dark-pagination-text
--light-pagination-text
--dark-switch-bg
--light-switch-bg
--dark-show-filters-bg
--dark-show-filters-bg-hover
--dark-show-filters-text
--light-show-filters-bg
--light-show-filters-bg-hover
--light-show-filters-text
--dark-header-bg
--light-header-bg
--dark-table-divider
--light-table-divider
--dark-table-header-bg
--light-table-header-bg
--dark-header-ring
--light-header-ring
--dark-bulk-dropdown-bg
--dark-bulk-dropdown-bg-hover
--dark-bulk-dropdown-text
--dark-bulk-dropdown-ring
--dark-bulk-dropdown-divider
--light-bulk-dropdown-bg
--light-bulk-dropdown-bg-hover
--light-bulk-dropdown-text
--light-bulk-dropdown-ring
--light-bulk-dropdown-divider
--dark-multi-select-item-bg
--dark-multi-select-item-text
--light-multi-select-item-bg
--light-multi-select-item-text
Contributions are welcome! However, whilst this has been open sourced, it was built to solve a specific set of use cases I have with my projects. If you have ideas for new features or improvements, please open an issue or submit a pull request, however it will only get merged if it will work with my projects.
This project is licensed under the MIT License.
For a complete list of changes, see the CHANGELOG.md file.
If you find this project useful and would like to support its development, please consider donating via one of the platforms below:
Thank you for your support!