Everything you need to build a Svelte project, powered by sv
.
If you're seeing this, you've probably already done this step. Congrats!
# create a new project in the current directory
npx sv create
# create a new project in my-app
npx sv create my-app
Once you've created a project and installed dependencies with npm install
(or pnpm install
or yarn
), start a development server:
npm run dev
# or start the server and open the app in a new browser tab
npm run dev -- --open
To create a production version of your app:
npm run build
You can preview the production build with npm run preview
.
To deploy your app, you may need to install an adapter for your target environment.
A powerful, feature-rich data grid component built for SvelteKit with Svelte 5 and Tailwind CSS. This component provides AgGrid-like functionality including sorting, filtering, pagination, column management, and custom cell renderers.
This component is built for SvelteKit with Svelte 5. Make sure you have:
<script lang="ts">
import { SimpleDataGrid, type DataGridColumn } from '$lib';
interface User {
id: number;
name: string;
email: string;
role: string;
}
const data: User[] = [
{ id: 1, name: 'John Doe', email: '[email protected]', role: 'Admin' },
{ id: 2, name: 'Jane Smith', email: '[email protected]', role: 'User' },
];
const columns: DataGridColumn<User>[] = [
{
id: 'name',
header: 'Name',
field: 'name',
sortable: true,
filterable: true
},
{
id: 'email',
header: 'Email',
field: 'email',
sortable: true,
filterable: true
},
{
id: 'role',
header: 'Role',
field: 'role',
sortable: true,
filterable: true
}
];
</script>
<SimpleDataGrid {columns} rows={data} />
{
id: 'name', // Unique column identifier
header: 'Full Name', // Display header text
field: 'name', // Field to read from row data
width: 200, // Column width in pixels
sortable: true, // Enable sorting
filterable: true, // Enable filtering
resizable: true, // Enable column resizing
hidden: false // Initially hidden
}
{
id: 'salary',
header: 'Salary',
field: 'salary',
valueGetter: (row) => `$${row.salary.toLocaleString()}`,
sortable: true
}
{
id: 'department',
header: 'Department',
field: 'department',
filterable: true,
filter: {
type: 'select', // 'text' | 'number' | 'date' | 'select' | 'boolean'
operator: 'equals', // See operators below
options: [ // For select type
{ value: 'engineering', label: 'Engineering' },
{ value: 'marketing', label: 'Marketing' }
]
}
}
contains
, equals
, startsWith
, endsWith
equals
, greaterThan
, lessThan
, greaterThanOrEqual
, lessThanOrEqual
equals
equals
{
id: 'actions',
header: 'Actions',
cellRenderer: 'button',
cellRendererParams: {
label: 'Edit',
onClick: (value, row, column, rowIndex) => {
console.log('Edit clicked for:', row);
}
}
}
{
id: 'trend',
header: 'Performance Trend',
cellRenderer: 'chart',
cellRendererParams: {
chartConfig: {
type: 'sparkline',
width: 100,
height: 30,
color: '#3b82f6'
}
},
valueGetter: (row) => row.performanceData // Array of numbers
}
{
id: 'status',
header: 'Status',
cellRenderer: 'custom',
cellRendererParams: {
customRenderer: (value, row, column, rowIndex) => {
return `<span class="badge ${value === 'active' ? 'bg-green-100' : 'bg-red-100'}">${value}</span>`;
}
}
}
interface Props {
columns: DataGridColumn[]; // Column definitions
rows: any[]; // Data rows
pagination?: DataGridPaginationConfig;
selectable?: boolean; // Enable row selection
multiSelect?: boolean; // Allow multiple row selection
striped?: boolean; // Alternate row colors
bordered?: boolean; // Show borders
hover?: boolean; // Hover effects
loading?: boolean; // Show loading state
emptyMessage?: string; // Message when no data
className?: string; // Additional CSS classes
onSelectionChange?: (rows) => void; // Selection change callback
onSortChange?: (configs) => void; // Sort change callback
onFilterChange?: (filters) => void; // Filter change callback
}
const pagination = {
enabled: true,
pageSize: 10,
pageSizeOptions: [5, 10, 25, 50, 100],
showPageSizeSelector: true,
showPageInfo: true,
showFirstLastButtons: true
};
<script>
function handleSelectionChange(selectedRows) {
console.log('Selected:', selectedRows);
}
function handleSortChange(sortConfigs) {
console.log('Sort changed:', sortConfigs);
}
function handleFilterChange(filters) {
console.log('Filters:', filters);
}
</script>
<SimpleDataGrid
{columns}
{rows}
selectable={true}
multiSelect={true}
onSelectionChange={handleSelectionChange}
onSortChange={handleSortChange}
onFilterChange={handleFilterChange}
/>
The component uses Tailwind CSS classes. You can customize the appearance by:
Passing custom classes:
<SimpleDataGrid {columns} {rows} className="shadow-xl rounded-xl" />
Overriding CSS variables or classes in your global styles
Using the bordered
, striped
, hover
props for built-in styling options
See the demo page (src/routes/+page.svelte
) for a comprehensive example showing all features including:
This component requires modern browsers that support:
MIT License - feel free to use in your projects!
SimpleDataGrid.svelte
- Main grid component (recommended)DataGrid.svelte
- Advanced version (more complex)DataGridHeader.svelte
- Column header with sorting/filteringDataGridCell.svelte
- Cell renderer componentDataGridPagination.svelte
- Pagination controlsDataGridTypes.ts
- TypeScript type definitions