A modern, feature-rich data table component built with Next.js 15, TypeScript, and Tailwind CSS v4.
- Row virtualization for handling 500+ rows
- Multi-column sorting with visual indicators
- Advanced filtering (text, number, select)
- Global search across all columns
- Responsive design for all screen sizes
- Multi-row selection with checkboxes
- Inline cell editing
- Bulk operations (delete, export, status change)
- Export to CSV, Excel, and PDF
- Column visibility management
- Dark/Light/System theme support
- Smooth animations and transitions
- Premium color palette
- Professional icons (Lucide React)
- Custom scrollbars
- Loading states
- Touch-friendly controls
- Framework: Next.js 15.4 (App Router)
- Language: TypeScript 5.0
- Styling: Tailwind CSS v4
- Animations: Framer Motion
- Icons: Lucide React
- Fonts: Inter
- Testing: Jest + React Testing Library
git clone <repository-url>
cd next-grid
npm install
npm run devOpen http://localhost:3000 in your browser.
src/
├── app/
│ ├── layout.tsx
│ ├── page.tsx
│ └── globals.css
├── components/
│ ├── DataGrid/
│ │ ├── VirtualizedDataGrid.tsx
│ │ ├── DataGridHeader.tsx
│ │ ├── DataGridRow.tsx
│ │ ├── BulkActions.tsx
│ │ ├── ColumnManager.tsx
│ │ └── Pagination.tsx
│ ├── ui/
│ │ ├── Button.tsx
│ │ ├── Modal.tsx
│ │ └── Badge.tsx
│ └── ThemeToggle.tsx
├── hooks/
│ ├── useDataGrid.tsx
│ ├── useVirtualScroll.tsx
│ └── useLocalStorage.tsx
├── types/
│ ├── api.types.ts
│ └── grid.types.ts
└── utils/
└── exportUtils.ts
npm run dev # Start development server
npm run build # Build for production
npm run start # Start production server
npm run lint # Run ESLint
npm run type-check # Check TypeScript types
npm run test # Run tests
npm run test:coverage # Generate test coverageimport VirtualizedDataGrid from '@/components/DataGrid/VirtualizedDataGrid'
export default function Page() {
return <VirtualizedDataGrid />
}import Button from '@/components/ui/Button'
import { Eye } from 'lucide-react'
<Button
label="View"
onClick={handleView}
color="primary"
variant="ghost"
size="sm"
icon={Eye}
/>import ThemeToggle from '@/components/ThemeToggle'
<ThemeToggle />Create .env.local:
NEXT_PUBLIC_API_URL=http://localhost:3000/apiEdit src/app/globals.css:
:root {
--primary: #007aff;
--success: #34c759;
--error: #ff3b30;
}- Handles 500+ rows efficiently
- Virtual scrolling for smooth performance
- 60fps animations
- ~149 kB initial bundle size
- Build time: ~5 seconds
npm test # Run all tests
npm run test:watch # Watch mode
npm run test:coverage # Coverage reportTest Coverage: 41 passing tests
npm i -g vercel
vercel --prod- Static pages: 5 routes
- First Load JS: ~149 kB
MIT License
Naveen Singh
- GitHub: @naveensing575
- LinkedIn: Naveen Singh