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/composablespnpm add @praxisjs/composablesyarn add @praxisjs/composablesbun add @praxisjs/composablesHow @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:
- Creates an instance of the composable class per component instance
- Calls
setup()and binds reactive properties onto the field (this.window) - Hooks the composable's
onMountandonUnmountinto the component lifecycle automatically
No manual setup or teardown needed.
Available composables
DOM Utilities
WindowSize, ScrollPosition, ElementSize, Intersection, Focus — reactive DOM state via ResizeObserver, IntersectionObserver, and focus/blur events.
Browser APIs
MediaQuery, ColorScheme, Mouse, KeyCombo, Idle, Clipboard, Geolocation, TimeAgo, Pagination — browser APIs as reactive class properties.
List Utilities
VirtualList — renders only the visible window of a large list. Reactive items source, full JSX rendering, configurable buffer rows.
Quick reference
| Composable | Properties | Package |
|---|---|---|
WindowSize | width, height | @praxisjs/composables |
ScrollPosition | x, y | @praxisjs/composables |
ElementSize | width, height | @praxisjs/composables |
Intersection | visible | @praxisjs/composables |
Focus | focused | @praxisjs/composables |
MediaQuery | matches | @praxisjs/composables |
ColorScheme | isDark, isLight | @praxisjs/composables |
Mouse | x, y | @praxisjs/composables |
KeyCombo | pressed | @praxisjs/composables |
Idle | idle | @praxisjs/composables |
Clipboard | copied, content, copy() | @praxisjs/composables |
Geolocation | lat, lng, error, loading | @praxisjs/composables |
TimeAgo | value | @praxisjs/composables |
Pagination | page, totalPages, hasPrev, hasNext, prev(), next(), goTo() | @praxisjs/composables |
VirtualList | visibleItems, 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.
DevTools Decorators
Developer experience decorators — @Debug to expose signals, computed values, and methods in DevTools, and @Trace to instrument component performance.
DOM Utilities
@praxisjs/composables DOM composable classes — WindowSize, ScrollPosition, ElementSize, Intersection, and Focus. Used via the @Compose decorator.