Tier 1
Minimal grid
Canvas + create + setCellValue + render.
LIBRARY GUIDE // WASM + CANVAS
How to use wasabi-table in your app
Practical guide for npm users.
Start minimal and add depth only when you need it.
Tier 1
Canvas + create + setCellValue + render.
Tier 2
Column schema, validation, listeners.
Tier 3
records, filter/sort, resize, freeze.
You need a canvas and a bundler.
import { WasabiTable } from 'wasabi-table';
const canvas = document.getElementById('grid');
const table = await WasabiTable.create(canvas, {
row_count: 20,
col_count: 8,
});
table.setCellValue(0, 0, 'Hello');
table.render();
import { createWasabiTableWithListeners } from 'wasabi-table';
const { table, listeners } = await createWasabiTableWithListeners(
canvas,
{ row_count: 50, col_count: 10 },
{
cellReferenceSelector: '#cellRef',
formulaInputSelector: '#formula',
statsElementSelector: '#stats',
},
{ enableValidation: true, enableIMESupport: true }
);
table.setColumnHeaders(JSON.stringify([
{ name: 'email', display_name: 'Email', field_type: 'EmailField', width: 200, order: 0, is_visible: true },
]));
table.setEventHandlers({
onCellChange: (pos, oldVal, newVal) => console.log(pos, oldVal, newVal),
});
import { WasabiTable } from 'wasabi-table';
const records = [
{ id: 1, name: 'Alice', team: 'A' },
{ id: 2, name: 'Bob', team: 'B' },
// ... millions of rows OK — viewport sync only
];
const table = await WasabiTable.create(canvas, {
dataSource: {
records,
columns: [
{ field: 'id', header: 'ID', width: 60 },
{ field: 'name', header: 'Name', width: 120 },
{ field: 'team', header: 'Team', width: 80 },
],
},
freeze_cols: 1,
});
table.addFilterCondition({
columnIndex: 2,
fieldType: 'CharField',
operator: 'equals',
value: 'A',
isActive: true,
});
table.setSortCondition({
columnIndex: 1,
fieldType: 'CharField',
direction: 'asc',
});
table.render();
<canvas id="grid" width="800" height="400"></canvas>
<div id="cellRef">A1</div>
<input id="formula" type="text" />
<div id="stats"></div>
<script type="module">
import { createWasabiTableWithListeners } from 'wasabi-table';
// ... init as above
</script>
Feature checklist.
Pick your stack.
Pass field_type in setColumnHeaders.
Modern browsers with WASM.