Headless,
primitive
components.

Accessible building blocks for PraxisJS. Keyboard nav, ARIA support, and state through data-* attributes. Zero CSS included.

Zero styles39 componentsTypeScriptARIA-readyPraxisJS
Philosophy
03 principles
01

Headless by design

Zero built-in styles. Components own the behavior — keyboard navigation, ARIA, focus management. You own the look. Apply any design system via CSS or the class prop.

02

Accessible out of the box

Every component ships with the correct ARIA roles, attributes, and keyboard interactions. Screen reader support, focus trapping, and scroll locking — included.

03

State as data attributes

Interactive state is exposed as data-* attributes on the root element — data-open, data-disabled, data-selected. Style with plain CSS selectors. No class toggling.

Quick start
03 steps
01Install

Add only what you need

Install @morphos/core plus any category package. Only bring in what your project requires.

npm install @morphos/inputs @morphos/overlays
02Import

Compose with class components

Instantiate the root component, then pass it as a prop to the compound parts. No context, no hooks.

@State() dialog = new Dialog()
03Style

Target data-* with CSS

Components set data-open, data-disabled, data-selected and more. Write CSS selectors — no className juggling.

[data-open] { display: block }