Skip to content
Layers
Esc
navigateopen⌘Jpreview
On this page

Adapters

One framework, one page — per-adapter guides and parity matrix.

Pick a framework binding — same engine, native reactivity. The core stays UI-free; see Overview for the model.

Adapter ergonomics

Same primitives on every adapter: client context, useStack, drive handles, observe hooks. Engine parity; wrappers (StackOutlet, createStackHook, …) are sugar and diverge by design. React/Preact/Solid/Angular/Vue/Lit/Alpine re-export the full core; Svelte re-exports selectively. Angular, Alpine, and Svelte ship compiler-free — markup in your templates, no component registry on layerOptions. Lit: <stack-provider> is shadow + <slot>; outlet / subscribe / app-host are light DOM.

Capability React Preact Solid Angular Vue Lit Alpine Svelte (runes) Svelte (store)
Primitives + core re-export
Drive: useLayer / injectLayer / createLayer
Observe: useLayerState / injectLayerState / createLayerState
StackOutlet (built-in host) ✅¹ ✅⁷ —⁴ —⁴
StackSubscribe (render-prop / scoped slot) —² —⁷ —⁴ —⁴
useStackHandles (headless { states, getCall }) —⁷ —⁵ —⁵
useMutationFlow (async-action helper)
useLayerGroup (nested-stack hook) ✅³ ✅⁷ ✅⁶ ✅⁶
createStackHook (useAppStack/AppHost/AppLayer) ✅³ ✅⁷ —⁴ —⁴

¹ Angular ships renderStack(vcr) — a compiler-free imperative outlet (ViewContainerRef.createComponent + setInput, id-keyed so state changes update inputs without recreating components). ² Angular has no StackSubscribe; useStack({ stack, select }) as a signal is the idiomatic equivalent. ³ Angular’s useLayerGroup/createStackHook expose renderInto(vcr) instead of an Outlet component; createStackHook returns { provideClient, useAppStack, renderInto } (no AppHost/AppLayer). ⁴ Svelte ships no .svelte components: render with {#each useStack({ stack }).current as s} + callFor(s) (runes) / {#each $stack} + callFor(client, stackId, s) (store) in your own markup. ⁵ Svelte’s useStack({ stack }) already returns the headless pair — .current (states) + callFor. ⁶ Svelte’s useLayerGroup exposes the child stack (SvelteStack / Readable) instead of an Outlet. ⁷ Alpine: x-layer-outlet + $layer bag; Rank-2 Alpine.data('layerStack') + x-for + callFor instead of StackSubscribe / useStackHandles; no component on layerOptions; createStackHook{ setClient, useAppStack } (no AppHost/AppLayer); getLayerClient / setLayerClient in plugin closure (not Alpine.store).

Name map: Angular injectLayer (useLayer alias); Alpine createLayer / createLayerState / useQueuedStack / createLayerQueuedState; Svelte createLayer / createLayerState; Solid also aliases createLayerState. Full signatures: Adapter hooks.

Adapter pages

For lifecycle, blockers, and type inference, see Concepts. For a full walkthrough, see Getting started.

Last updated on July 17, 2026

Was this page helpful?