PraxisJS

Composables

Reactive DOM and browser utilities from @praxisjs/composables — used via the @Compose decorator.

Composables

Composables are class-based reactive utilities. Attach them to any component with @Compose — their reactive properties and lifecycle hooks are wired automatically.

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

How @Compose works

import { Compose } from '@praxisjs/decorators'
import { WindowSize } from '@praxisjs/composables'

@Component()
class App extends StatefulComponent {
  @Compose(WindowSize)
  window!: WindowSize

  render() {
    return <p>Viewport: {() => this.window.width} × {() => this.window.height}</p>
  }
}

@Compose does three things:

  1. Creates an instance of the composable class per component instance
  2. Calls setup() and binds reactive properties onto the field (this.window)
  3. Hooks the composable's onMount and onUnmount into the component lifecycle automatically

No manual setup or teardown needed.


Available composables


Quick reference

ComposablePropertiesPackage
WindowSizewidth, height@praxisjs/composables
ScrollPositionx, y@praxisjs/composables
ElementSizewidth, height@praxisjs/composables
Intersectionvisible@praxisjs/composables
Focusfocused@praxisjs/composables
MediaQuerymatches@praxisjs/composables
ColorSchemeisDark, isLight@praxisjs/composables
Mousex, y@praxisjs/composables
KeyCombopressed@praxisjs/composables
Idleidle@praxisjs/composables
Clipboardcopied, content, copy()@praxisjs/composables
Geolocationlat, lng, error, loading@praxisjs/composables
TimeAgovalue@praxisjs/composables
Paginationpage, totalPages, hasPrev, hasNext, prev(), next(), goTo()@praxisjs/composables
VirtualListvisibleItems, totalHeight, offsetTop, offsetBottom@praxisjs/composables

Async concurrency

@Task, @Queue, and @Pool are not composables — they're decorators from @praxisjs/concurrent. See Concurrency.

Build your own

The Composable base class and @Compose decorator are public APIs. See Creating Composables to build reusable reactive classes with the same ergonomics as the built-ins.

On this page