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.