ProductsWeb ComponentsBMX library
Shipped — BMX Web Components v1.0.0

One <script> tag. Every framework.

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.

42 elements, all shipped One file, no build step WCAG 2.2 AA by construction 10 themes, retintable
Why it is built this way

Three commitments, in every component

A suite an enterprise team can adopt without adopting a philosophy.

One file, no ceremony

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.

The hard parts, done once

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.

Accessible by construction

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.

A quick look

This is the whole integration

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>

Framework-neutral

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.

Keyboard complete

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.

Ten themes

Switchable per page or per panel, and the whole library retints from a dozen CSS custom properties with no build step.

RTL ready

Right-to-left handled in the arithmetic where a logical property cannot reach it — an SVG path does not flip on its own.

The library

Forty-two elements, in eight families

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.

And the six that go with them

Companion elements

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. They render nothing themselves: the parent reads them once and draws the widget.

See it running before you decide

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.