HelixOverviewComponentsMapsGraphIntroductionInstallationDeriving a themeSandboxTheme builderVisual testingCortexDocsEngramBuildingTraceBuildingRecallDeclaredServicesInsightsGet in touchSource on GitHub
Getting started
Browser supportHelix uses browser features directly, with no compatibility layer. It has no
polyfills, no transpiled fallback, and no setting that trades features for
support in older browsers. Your browser needs every feature Helix uses.What we testWe test in Chromium and WebKit, through Playwright, on Linux, with the network
blocked.The DOM specs run in both.The pixel baselines are captured in Chromium only.WebKit is the engine in Safari, and the system webview a Tauri app draws with on
macOS and Linux. Playwright builds its own WebKit from the same source as
Safari, so a difference that only Safari shows can still get past our tests.We do not run the tests in Firefox. The rest of this page lists the browser
features Helix uses. If you ship Helix to Firefox or Safari and find something
broken, please report it.What differs in WebKitCheckbox Group, Radio Group, Option, Toast, and Tooltip name or describe their
host through ElementInternals, pointing into their own shadow root. WebKit
reads those references back as empty, so their specs for it fail there. We have
not yet checked whether VoiceOver still reads the name.Browser features Helix usesFeatureWhereCustom elements and shadow DOMEverythingElementInternalsForm participation, and ARIA that has to cross a shadow boundaryPopover APIEvery overlay: menu, tooltip, select, combobox, dialoglight-dark()Every color token, and each component color that differs between the modesoklch()Every color in the system:has()Relational styling, mostly of slotted content@starting-styleEntry transitions on overlays:state()Every boolean state the library publishes: open, checked, selected, invalid, read, has-label, settled, empty, controlsCSS.highlightsFilter-match highlighting, in Command and ComboboxPositioning uses @floating-ui/dom. We chose this on purpose, and it is the one
place Helix takes a dependency for something the browser could do. CSS anchor
positioning is not yet available in every browser that has the rest of these
features.Which features set the minimum browserCheck for light-dark() and the Popover API. They are the newest features
Helix requires, and everything else in the table has been available longer.
Helix depends on both. Every token uses light-dark() to set both color modes
in one declaration. Every overlay uses the Popover API to draw in the top layer.Neither one has a useful fallback:A browser without light-dark() shows no color at all.A browser without the Popover API renders overlays in the page flow.For that reason, this page has no support table with a fallback column. Helix
has no partial mode.Chromium 132 has both features. We measured on September 15, 2026 that it
does not support two things your stylesheet can do through ::part():It ignores a range input's ::-webkit-slider-thumb and
::-webkit-slider-runnable-track after a part.It looks for the @keyframes that a ::part() rule names inside the
component's shadow root, so no animation starts.The headless examples use neither.:state() is the third newest feature. It does not set the minimum browser,
because components still work without it. A component that cannot record a
state keeps the look of its resting rule, so a checkbox is drawn unchecked.
Helix tests for :state() support in the one place that records states.Browsers without CSS.highlightsCommand and Combobox use the CSS Custom Highlight API to highlight the
matched text in their filtered results. It is the least widely available
feature Helix uses, and it is the only one that degrades gracefully. Without it,
the results still filter, sort, and select correctly, and the match is not
highlighted.Nothing else in Helix uses it.Older browsersHelix does not support Internet Explorer and uses no polyfills. It has no
browserslist, no transpilation target, and no build flag for older browsers.
We decided this on purpose. Components that are custom elements cannot run in a
browser without custom elements, and every other feature in the table arrived in
the same generation of browsers.To support an older browser, use the base layer. @fusion.dev/helix-styles is
plain CSS with no JavaScript. Markup built from its recipes works in much older
browsers than the components do. See Without a bundler.