62 components · precompiled CSS · React 19

Interfaces with a
stellar finish

A React component library on semantic tokens — one brand color restyles everything at runtime. Try it: this whole section is listening.

#eab308

Mission control

Recolored by the swatches — no rebuild

Live
NS
AK
ML
+1
v0.1
Weekly downloads48,12018.9% vs last week

Built on tokens, not guesses

Every cell below is live — the same components and tokens you'd ship.

Dark mode built in

Semantic tokens flip with one class on the root. Flip it now:

Eleven color schemes

One accent channel recolors any component — no per-hue CSS.

Zero build step

Precompiled CSS. No plugins, no config — your bundler just serves a stylesheet.

pnpm add astralis-ui

Responsive props

Breakpoint maps on every style prop — resize the window.

p={{ base: '3', md: '4' }} — this box changes at the md breakpoint.

Design tokens end to end

Named roles resolve per theme; components never see a hex.

  • --astralis-color-surface-base
  • --astralis-color-label-base
  • --astralis-color-accent-solid
  • --astralis-color-stroke-subtle

Fifty components, all real

Nothing below is a screenshot — hover to pause, then go meet them in the docs.

Component docs →
Design
Active
NS
AK
ML
+1
pnpm add astralis-ui
Beta
v0.1
Pending
JE
@jo

The code is the demo

Each snippet is the literal source of the preview beside it — the same guarantee every docs page makes.

One invalid flag restyles the field and swaps the message.

"use client";

import { useState } from "react";
import { Field, Input, Switch, VStack } from "astralis-ui";

export function FieldError() {
  const [invalid, setInvalid] = useState(true);

  return (
    <VStack gap="5" alignItems="stretch" w="full" maxW="xs">
      <Switch checked={invalid} onChange={(e) => setInvalid(e.target.checked)} size="sm">
        Simulate a validation error
      </Switch>

      {/* One `invalid` flag restyles the input and swaps the message. */}
      <Field invalid={invalid} required>
        <Field.Label>Username</Field.Label>
        <Input placeholder="astro_naut" />
        {invalid ? (
          <Field.ErrorText>That username is already taken.</Field.ErrorText>
        ) : (
          <Field.HelpText>Letters, numbers and underscores only.</Field.HelpText>
        )}
      </Field>
    </VStack>
  );
}
0Components
0Color schemes
0+Live examples
0Build steps

Ship something stellar

Install the package, wrap your app in the provider, and every component on this site is yours.