No events yet.
auto, plus a custom host-CSS theme.
Every capability the component ships with, running on this page rather than described. It uses
only bm-treelistview.demo.js, ordinary HTML, and the component’s public properties,
methods and events. Grouping, totals, inline editing, typed filters, column reordering and four
export formats are all switchable live below.
Demo runtime · Nothing is sent anywhere · Reload to reset
auto, plus a custom host-CSS theme.01Workbench
The same component renders all five datasets without a rewrite. Everything in the controls panel maps to a public attribute, property or method: nothing here is demo-only scaffolding.
Product hierarchy, suppliers, stock health, revenue, row-level actions, lazy loading, filtering and export.
02Inspector
Live metrics update on every state change. The event log is the raw DOM event stream a host application
would listen to, and the snapshot is exactly what getState() returns.
No events yet.
Click “Snapshot state” to inspect the component state.
03Guided pass
Work through these thirteen passes and you will have exercised the whole public surface — themes, keyboard access, columns, grouping, editing, filtering, export, scale and right-to-left.
04Integration
The playground uses direct HTML integration on purpose, so customers can see the smallest possible adoption path: no build step, no framework, no wrapper.
Load the runtime, place the element, hand it columns and rows. That is the whole adoption path.
<script src="./bm-treelistview.min.js"></script>
<bm-treelistview
id="tree"
theme="dark"
mode="tree"
selection-mode="checkbox"
show-filter="true"
show-footer="true">
</bm-treelistview>
await tree.setData(columns, items);This page exercises the main public surface: properties, methods, events, column metadata, cell kinds, row actions, lazy loading and CSS custom properties.
All of it is attributes and one call per feature. Nothing here needs a build step or a wrapper.
<bm-treelistview
id="tree"
theme="auto"
selection-mode="checkbox"
show-column-filters="true"
allow-grouping="true"
show-group-panel="true"
show-totals="true"
allow-column-reorder="true"
editable="true"
virtualize-threshold="200">
</bm-treelistview>
// A column opts into totals and editing:
{ id: 'value', title: 'Value', kind: 'currency',
aggregate: 'sum', editable: true,
validate: ({ value }) => value >= 0 || 'Cannot be negative' }
await tree.setGroupBy([{ columnId: 'region' }]);
await tree.downloadData({ format: 'excel' }, 'report.xls');The Custom theme button applies a host CSS class and overrides --tlv-* variables. Built-in themes use theme="..."; custom branding uses host CSS.
bm-treelistview.custom-demo-theme {
--tlv-header-bg: linear-gradient(135deg, #7c2d12, #9f1239);
--tlv-node-bg: #fffaf0;
--tlv-node-bg-alt: #ffedd5;
--tlv-node-hover-bg: #fed7aa;
--tlv-node-selected-bg: #fdba74;
--tlv-focus-ring: #f97316;
}