TreeListView <bm-treelistview>
Our flagship tree grid, for the web.
BMX is a suite of production-grade UI components built as standards-based custom elements. The browser renders them, not a framework — so the same markup works unchanged in plain HTML, Angular, React, Vue, Svelte, Blazor, ASP.NET Razor Pages and MVC, Django, Rails, htmx, or a twelve-year-old server-rendered application with no toolchain at all.
Every Hypernova web suite includes the TreeListView Web Component and every BMX element outside the project-management family. The Gantt chart, PERT chart and task board are in Hypernova Pro.
A suite an enterprise team can adopt without adopting a philosophy.
Drop one script tag on a page and every <bmx-*> element works. No bundler, no module graph, no CDN account, and no build step in an application nobody wants to touch.
Form submission from inside a shadow root. The accessible name of an icon-only button. Enter versus Space on a link. Keeping a destructive action from firing twice. A composite widget that takes one Tab stop rather than eight. Every application eventually hand-rolls these, and hand-rolls them badly.
WCAG 2.2 AA as a design constraint rather than a later remediation: real elements instead of ARIA impersonations, one focus indicator across the whole library, full WAI-ARIA keyboard patterns, and prefers-reduced-motion, prefers-contrast and forced-colors honoured.
The same markup in a Razor page, a React component, an Angular template or a plain HTML file. Typed React, Angular and Vue wrappers ship alongside, generated from each component's own API.
<script src="/assets/bmx-components.min.js"></script>
<bmx-button tone="primary">Save changes</bmx-button>
<bmx-button variant="outline" tone="neutral">Cancel</bmx-button>
<bmx-select label="Region" placeholder="Choose one">
<bmx-option value="uk">United Kingdom</bmx-option>
<bmx-option value="us">United States</bmx-option>
</bmx-select>
Generated React, Angular and Vue wrappers that carry no component code, and a documented path for Blazor, ASP.NET MVC and any server-rendered template.
Every composite widget takes one Tab stop and moves with the arrows, the way the WAI-ARIA pattern for it says — not eight tab stops and a guess.
Switchable per page or per panel, and the whole library retints from a dozen CSS custom properties with no build step.
Right-to-left handled in the arithmetic where a logical property cannot reach it — an SVG path does not flip on its own.
Built in order, so each one reuses what the ones before it established. Every entry below links to its own page, its API reference and its live demo.
The flagship, and a product in its own right: hierarchical and tabular data at any scale, with grouping, inline editing, saved views and real .xlsx export.
<bm-treelistview>Our flagship tree grid, for the web.
The button, and the two widgets built out of it. Everything else in the library borrows its conventions from here.
<bmx-button>The workhorse, and the conventions every other component borrows.
<bmx-button-group>Three widgets in one tag: toolbar, segmented control, multi-toggle.
<bmx-split-button>"Save", with "Save as…" behind the chevron.
The controls you type into, search, or drop a file onto. All of them submit real FormData from inside a shadow root, with no adapter in between.
<bmx-input>Everything an enterprise form needs around a text field.
<bmx-textarea>Multi-line text that matches the rest of the form.
<bmx-select>Ten thousand options cost the same as ten.
<bmx-combobox>A text field that filters a list as you type.
<bmx-date-picker>Typed or picked, one date or a range.
<bmx-upload>Drop or click, then see what became of every file.
The controls you toggle, slide or score with — each one over a real platform control, so focus and form participation are the browser's rather than a re-implementation.
<bmx-checkbox>Including the third state, done properly.
<bmx-radio-group>One answer from several — two selected at once made impossible.
<bmx-switch>For a setting that takes effect immediately.
<bmx-slider>A value along a track, or a range between two.
<bmx-rating>A row of stars that submits a number.
Getting around, and surviving a narrow window: a toolbar that collapses what does not fit into a menu, a breadcrumb that folds its middle, and a pagination control that does not change width as you page.
<bmx-menu>Dropdown, cascade and context menu — one component.
<bmx-tabs>Write the panels. The tabs draw themselves.
<bmx-accordion>One section at a time, or several — and a closed panel really closed.
<bmx-toolbar>A bar of controls that does not break when the window does.
<bmx-breadcrumb>The trail shortens itself rather than wrapping.
<bmx-pagination>A page window that never changes width as you page through it.
<bmx-splitter>Two panes and a divider, moved by pointer or keyboard.
Dialogs and drawers over the browser's own top layer, the tooltip and popover pair — one describes, the other contains — and the shapes that hold a layout while you wait.
<bmx-dialog>A native modal in the browser's top layer.
<bmx-drawer>The same machinery, arriving from any of four edges.
<bmx-tooltip>All three of WCAG 2.2 SC 1.4.13's rules, kept.
<bmx-popover>Where anything interactive belongs.
<bmx-toast>A queue behind each corner, and nothing you are reading moves.
<bmx-progress>A bar or a ring, and "we don't know" as a state.
<bmx-skeleton>Holds the layout while the content is on its way.
The components that label what is already on the page: a count that reaches the control it belongs to, a chip that is three genuinely different elements, and a stack of faces that says who is behind it.
<bmx-badge>"99+" is drawn, and never spoken.
<bmx-chip>Three forms, three genuinely different elements.
<bmx-chip-set>One Tab stop, and focus that lands somewhere sensible.
<bmx-avatar>The same person is the same colour, everywhere.
<bmx-avatar-group>Never hides exactly one, because "+1" takes the same room as a face.
Applications in their own right rather than controls: a carousel over the platform's own scroller, a calendar whose layout is arithmetic rather than pixels, and an org chart that is a tidy-tree algorithm behind a diagram.
A Gantt chart, a PERT chart and a task board: three views of one plan, scheduled by the same critical-path engine as our WinForms and WPF editions, so a plan gives the same dates in a browser and on the desktop. Included in Hypernova Pro.
<bmx-gantt> Hypernova ProA task list and a timeline, scheduled by the critical path.
<bmx-pert-chart> Hypernova ProThe plan as a network, with the dates in every box.
<bmx-task-board> Hypernova ProKanban columns by status, with the application in charge.
Six of the components take their content as markup rather than as a data array — which is what a Razor page, a Blazor component, a Django template or an htmx swap can actually produce. These are the elements you write inside them. Two of them, Option and Menu Item, render nothing at all: the parent reads them once and draws the widget. The other four do render, and leave to the parent whatever is a question about the set rather than about one entry — the value, the keyboard, the tab order.
<bmx-option>One option for a <bmx-select>, written in markup rather than passed as data.
Written inside Select · API reference
<bmx-radio>One option inside a <bmx-radio-group>. It renders, and that is nearly all it does — the group owns the value, the keyboard and the validity.
Written inside Radio Group · API reference
<bmx-menu-item>One entry of a <bmx-menu>. Nest one inside another and it becomes a submenu.
Written inside Menu · API reference
<bmx-tab-panel>One panel inside a <bmx-tabs>, and the whole of what an author writes — the tab is drawn from this element's label.
Written inside Tabs · API reference
<bmx-accordion-item>A heading with a panel under it. Inside an accordion the accordion coordinates it; on its own, it is a disclosure.
Written inside Accordion · API reference
<bmx-breadcrumb-item>One step of a trail: a link, or — for the step you are standing on — a piece of text that is deliberately not one.
Written inside Breadcrumb · API reference
Nothing in the showcase is a screenshot. The upload rows filling in are the component's own queue against a stand-in server; the five thousand options in the select are really there, and really windowed.