The Qazana design system

One foundation.
Every product.

Semantic tokens plus vanilla, data-attribute components. Theme the tokens once per brand and the marketing site, the app shell and the checkout all follow — in React, Ember or plain HTML.

Browse the demos

v0.0.1 · 7 kits · no build step · zero dependencies

AUVENO themed by three products
100%
auroravermeilnocturneyour next product
7kits
2schemes
0dependencies
100%token-driven
Why Strata

Rules, not vibes

Every component is bound by the same contract: tokens are the single source of truth, behaviors are framework-free, and accessibility is not optional.

Tokens first

No component hardcodes a color, radius, space or duration. Override --primary once and every fill, ring and border re-tints.

Two schemes, one palette

Canonical dark plus the warm Désert Dunes light scheme. Borders flow through a channel variable, so both flip cleanly.

Data-attribute behaviors

JS attaches to rendered DOM via data-* hooks — combobox, drawer, OTP, theme toggle — and works under React, Ember or nothing at all.

Accessible by default

Keyboard-operable components with sensible ARIA, and every animation respects prefers-reduced-motion.

RTL & density aware

Logical properties throughout, plus a density axis for data-heavy screens. Flip the direction; nothing breaks.

Type discipline

The display face is reserved for big headings and brand; body text stays on the body face; data and code stay mono.

Theming

Re-brand in one override

Brand colors are semantic — --primary, --danger, --accent — never literal. Alpha tints use the channel form, so a single per-app override re-tints everything, including soft fills and focus rings.

/* any stack, no build step */
@import "@qazana/strata/tokens";
@import "@qazana/strata/site";

<!-- behaviors attach to the DOM -->
<script src="qazana.js" defer></script>
Integration

Plain CSS in, product out

Strata is stylesheets and one script. There is no runtime to adopt and no compiler to appease — the components are the rendered markup itself.

The kits

Load only what the page needs

Each kit is scoped and independently importable, sharing the same token foundation. Every tile below is a live demo.

Appshells, tables, inputs Siteheroes, pricing, FAQ Authsign-in, OTP, 2FA Commercecatalog to order Contentblogs & articles Mediavideo, audio, social Emailnewsletter, transactional
In production

Three products, one surface

We override five tokens and the whole library reads as ours. The domain UI we built on top never fights the foundation.

AU
auroravanilla JS

The tokens map straight into Tailwind config. Our React components use Strata variables and stay in sync with everyone else for free.

VE
vermeilReact + Tailwind

Ember imports the CSS and references the variables. When Strata ships a new kit, our app picks it up with a version bump — no rewrite.

NO
nocturneEmber
FAQ

Common questions

Does it work with my framework?

Yes — Strata is plain CSS plus data-attribute JS that binds to the rendered DOM. It is consumed today by vanilla, React + Tailwind and Ember apps, with no adapters.

How does theming work?

Every component references semantic tokens. A product ships one override file that re-points --primary, --accent and friends; alpha tints are channel-based so they re-tint automatically.

What about dark and light modes?

Both schemes ship in the tokens. Switch by attribute or follow the OS — components never know which scheme is active.

Where do product-specific components live?

In the product. Strata holds only generic primitives; anything that encodes business vocabulary stays in the consuming app, themed by the same tokens.

Build the next Qazana product on Strata

Start from the demos, theme the tokens, and ship a cohesive frontend without re-deciding a single radius.