Morphos & Kosmesis are here.Explore
PraxisJS

Ecosystem

PraxisJS first-party packages — Head, Content, Router, Store, DI, Motion, FSM, and async concurrency.

Ecosystem

All first-party packages use the same signal system and decorator conventions as core. They're completely independent of each other — install only what your project needs. For versions and stability status, see the Packages reference.

Document Head

@Head reactively manages document title, meta tags, og:*, and twitter:* per component. Stack-based with automatic cleanup on unmount.

Content

Markdown content collections. @Collection registers a schema and its glob path. @PagedCollection wires pagination to any composable. Build-time loading via the bundled Vite plugin.

Router

Signal-based client-side routing. @Router sets up routes and layouts. @Route co-locates path with the page component. Reactive injectors for params, query, and navigation.

Store

Class-based singleton state management. @Storable marks a class as a singleton store. @Store injects the shared instance into any component.

Dependency Injection

@Injectable, @Inject, @Scope, and token-based injection. Scoped child containers per component instance. Circular dependency detection.

Motion

Animated field decorators. @Tween for duration-based easing. @Spring for physics-based spring animation. Assign a value — the transition plays automatically.

State Machines

Finite state machines via @StateMachine and @Transition. @StateMachine is a field decorator — declare the machine as a typed field and @Transition binds methods to valid transitions.

Concurrency

@Task, @Queue, and @Pool for async concurrency control. Reactive .loading(), .error(), and .pending() state directly on each decorated field.

CSS

@Styled for typed scoped CSS with this.$css autocomplete. @Style for reactive CSS properties that update the DOM directly — no re-renders, no class toggling.

UI Libraries

Morphos (headless primitives) and Kosmesis (copy-paste components) — companion projects that bring a full UI layer to PraxisJS.


Installation

Each package is independent. Install only what you need:

Head

npm install @praxisjs/head
pnpm add @praxisjs/head
yarn add @praxisjs/head
bun add @praxisjs/head

Content

npm install @praxisjs/content
pnpm add @praxisjs/content
yarn add @praxisjs/content
bun add @praxisjs/content

Router

npm install @praxisjs/router
pnpm add @praxisjs/router
yarn add @praxisjs/router
bun add @praxisjs/router

Store

npm install @praxisjs/store
pnpm add @praxisjs/store
yarn add @praxisjs/store
bun add @praxisjs/store

DI

npm install @praxisjs/di
pnpm add @praxisjs/di
yarn add @praxisjs/di
bun add @praxisjs/di

Motion

npm install @praxisjs/motion
pnpm add @praxisjs/motion
yarn add @praxisjs/motion
bun add @praxisjs/motion

FSM

npm install @praxisjs/fsm
pnpm add @praxisjs/fsm
yarn add @praxisjs/fsm
bun add @praxisjs/fsm

Concurrency

npm install @praxisjs/concurrent
pnpm add @praxisjs/concurrent
yarn add @praxisjs/concurrent
bun add @praxisjs/concurrent

CSS

npm install @praxisjs/css
pnpm add @praxisjs/css
yarn add @praxisjs/css
bun add @praxisjs/css

Choosing a package

I need to…Use
Set page title and meta tags per routeHead
Load and render markdown filesContent
Navigate between pagesRouter
Share state across componentsStore
Inject services into componentsDI
Animate a value when it changesMotion
Model complex state transitionsFSM
Track loading/error state on async methodsConcurrency
Build accessible UI without writing behavior from scratchUI Libraries

On this page