npm 0.16.0Angular 21.2+ and 22

Behaviour for the interfaces you own.

Quartz is a set of unstyled, accessible Angular primitives: focus, keyboard, ARIA, overlays and state, shipped as two npm packages. You write the markup and the styles; Quartz owns the behaviour.

  • signals-first
  • zoneless
  • SSR-safe
  • 0 bytes of CSS

The lens shows what Quartz ships: structure, not skin.

Headless, shown

One behaviour. Any skin.

These are the real Quartz Slider and Switch. Pick a skin: the markup and the class map change, the keyboard, pointer, ARIA and state handling do not.

volume-demo.component.ts
Volume 40%
Mute
  • Keyboard

    ← → Home End

    Arrow keys step, Home and End jump. Space toggles mute.

  • Accessibility

    role=slider · switch

    aria-valuenow, valuetext and aria-disabled are kept in sync.

  • CSS shipped by Quartz

    0 bytes

    Every visual is a class in the file under Code.

Composition

Layers that stack without a fight.

A Select lives inside a Dialog here. Quartz traps focus in the dialog, lets the popup layer above it, closes only the top layer on Escape and returns focus to the button that opened it. Every pixel of the visuals is the consumer's.

  • Opens from the keyboard with EnterSpace
  • Escape closes the top layer only, popup first, then the dialog Esc
  • Focus is trapped while open and returns to the opener Tab
  • The dialog is named by its title; the select by its label

Read more: DialogSelectRecipes

settings-dialog-demo.component.ts
Loading the interactive example…

Architecture

Core is the engine. Primitives are the patterns.

Build your own widget on Core, or take a finished accessible pattern from Primitives. Primitives depends on Core as a peer dependency; Core never depends on Primitives.

@quartz-headless/core
10 Core APIs
@quartz-headless/primitives
34 primitive families

Also documented: 1 alias backed by Core and 1 native-HTML recipe, labelled as such in the catalogue. Not sure which to install? Core versus Primitives.

  1. Your code

    Your design system

    Markup, Tailwind, CSS, tokens, Volt UI. Every pixel.

  2. @quartz-headless/primitives

    Accessible patterns

    Dialog, Menu, Select, Combobox, Tabs, Slider, DatePicker, FormField, Toast…

    Browse Primitives →
  3. @quartz-headless/core

    Interaction engine

    Overlay, dismiss, focus, collection, direction, viewport, scroll lock, drag and drop, virtual scroll, splitter.

    Browse Core APIs →
  4. Angular 21.2+ and 22

    Signals, zoneless change detection, SSR and hydration.

The whole surface

46 building blocks. None of them has a look.

Every documented Core API and primitive, grouped by what it is for. Each one is a page with a playground and live examples, one click from its documentation.

Search the catalogue

@quartz-headless/core @quartz-headless/primitives

Use cases

The interfaces teams actually build.

Real screens are compositions. Each one below names the Quartz pieces it is made of; the wireframe is everything Quartz cares about.

Developer experience

Built for the Angular you write today.

Signals in, signals out. No zone.js, no NgModules, no CSS to override, and every claim below links to the page that proves it.

  • A typed public API

    Every export, selector, input and output is listed in a generated reference, and a guard fails CI when the surface changes unexpectedly.

    Example: SliderDirective
  • Signals and controlled state

    State is model() and signal() all the way down. Bind it two-way or control it yourself; user commits are separate outputs.

    Signals guide
  • Angular Forms, opt-in

    Adapters live in a secondary entry point, so the main entry never imports @angular/forms.

    Forms adapters
  • SSR and hydration

    No DOM side effects at import time, deterministic ids per request, and an SSR/hydration test suite against packed tarballs.

    SSR and lifecycle
  • Copy the source instead

    The CLI copies raw TypeScript for a primitive into your repo when you would rather own and edit it.

    CLI guide
  • Verified compatibility

    Tested as installed packages in AOT-compiled apps on Angular 21.2 (minimum and current) and 22.

    Compatibility

Install

Install what you need.

Latest on npm: 0.16.0. Requires Angular 21.2+ or 22 with zoneless change detection.

On npm: @quartz-headless/core, @quartz-headless/primitives. Prefer owning the code? Copy the source with the CLI.

Core only

Overlay, focus, dismiss, collection and the other infrastructure.

npm install @quartz-headless/core

Core + Primitives

The accessible patterns. Primitives needs Core installed beside it.

npm install @quartz-headless/core @quartz-headless/primitives

Own every pixel.
Keep the behaviour.

Start with one primitive in an existing app. Nothing to theme, nothing to override.