Table
The Table component provides a full-featured data table with sorting, pagination, row selection, and customizable styling.
Installation
npm install @duskmoon-dev/el-table
Usage
import '@duskmoon-dev/el-table/register';
<el-dm-table id="my-table"></el-dm-table>
<script>
const table = document.getElementById('my-table');
table.columns = [
{ key: 'name', label: 'Name', sortable: true },
{ key: 'email', label: 'Email' }
];
table.data = [
{ id: 1, name: 'Alice', email: 'alice@example.com' },
{ id: 2, name: 'Bob', email: 'bob@example.com' }
];
</script>
Live Demo
Basic Table
Properties
| Property | Type | Default | Description |
|---|---|---|---|
columns | TableColumn[] | [] | Column definitions |
data | TableRow[] | [] | Row data array |
sort-column | string | - | Current sort column key |
sort-direction | 'asc' | 'desc' | 'asc' | Sort direction |
paginated | boolean | false | Enable pagination |
page | number | 1 | Current page number |
page-size | number | 10 | Rows per page |
selection-mode | 'none' | 'single' | 'multiple' | 'none' | Row selection mode |
striped | boolean | false | Alternating row colors |
bordered | boolean | false | Show cell borders |
hoverable | boolean | true | Highlight rows on hover |
compact | boolean | false | Reduced padding |
sticky-header | boolean | false | Fixed header on scroll |
loading | boolean | false | Show loading state |
empty-message | string | 'No data available' | Empty state text |
TableColumn Interface
interface TableColumn {
key: string; // Data key for this column
label: string; // Display label in header
sortable?: boolean; // Enable sorting
width?: string; // CSS width (e.g., '100px', '20%')
align?: 'left' | 'center' | 'right';
hidden?: boolean; // Hide column
}
TableRow Interface
interface TableRow {
id: string | number; // Required unique identifier
[key: string]: unknown; // Data fields matching column keys
}
Sorting
Click on sortable column headers to sort. Clicking the same header toggles between ascending and descending order.
Sortable Table
<el-dm-table id="table"></el-dm-table>
<script>
table.columns = [
{ key: 'name', label: 'Name', sortable: true },
{ key: 'salary', label: 'Salary', sortable: true, align: 'right' }
];
</script>
Pagination
Enable pagination to split large datasets across multiple pages.
Paginated Table
<el-dm-table paginated page-size="10"></el-dm-table>
Row Selection
Enable single or multiple row selection with checkboxes/radio buttons.
Multiple Selection
<!-- Multiple selection with checkboxes -->
<el-dm-table selection-mode="multiple"></el-dm-table>
<!-- Single selection with radio buttons -->
<el-dm-table selection-mode="single"></el-dm-table>
Styling Variants
Striped
Striped Rows
<el-dm-table striped></el-dm-table>
Bordered
Bordered Cells
<el-dm-table bordered></el-dm-table>
Compact
Compact Table
<el-dm-table compact></el-dm-table>
Declarative Columns
Use <el-dm-table-column> elements for declarative column definition:
<el-dm-table id="table">
<el-dm-table-column key="name" label="Name" sortable></el-dm-table-column>
<el-dm-table-column key="email" label="Email"></el-dm-table-column>
<el-dm-table-column key="role" label="Role" width="120px"></el-dm-table-column>
</el-dm-table>
<script>
// Only need to set data, columns come from children
table.data = [
{ id: 1, name: 'Alice', email: 'alice@example.com', role: 'Admin' }
];
</script>
Events
| Event | Detail | Description |
|---|---|---|
sort | { column, direction } | Fired when sort changes |
select | { selectedIds, selectedRows } | Fired when selection changes |
page-change | { page, pageSize } | Fired when page changes |
row-click | { row, rowIndex } | Fired when a row is clicked |
Event Handling
const table = document.querySelector('el-dm-table');
table.addEventListener('sort', (e) => {
console.log('Sorted by:', e.detail.column, e.detail.direction);
});
table.addEventListener('select', (e) => {
console.log('Selected rows:', e.detail.selectedRows);
});
table.addEventListener('page-change', (e) => {
console.log('Page changed to:', e.detail.page);
});
Methods
| Method | Parameters | Description |
|---|---|---|
sort(column, direction?) | column: string, direction?: 'asc' | 'desc' | Sort by column |
goToPage(page) | page: number | Navigate to page |
selectRow(id) | id: string | number | Select a row |
deselectRow(id) | id: string | number | Deselect a row |
selectAll() | - | Select all visible rows |
deselectAll() | - | Deselect all rows |
getSelectedRows() | - | Get selected row data |
CSS Custom Properties
| Property | Default | Description |
|---|---|---|
--table-max-height | 400px | Max height for sticky header |
--dm-color-surface | - | Table background |
--dm-color-surface-variant | - | Header/stripe background |
--dm-color-outline | - | Border color |
--dm-color-primary | - | Sort indicator color |
--dm-color-primary-container | - | Selected row background |
Accessibility
- Uses native
<table>semantics with proper ARIA roles - Sortable headers have
aria-sortattribute - Selected rows have
aria-selectedattribute - Loading state uses
aria-busyattribute - Keyboard navigation for interactive elements
- Focus indicators on all interactive elements