@banksia/signals decouples your application's domain logic and state management from UI rendering layers.
By designing your domain stores with standard TypeScript classes, objects, and collections wrapped in makeReactive(), your business logic remains 100% framework-agnostic. You can then connect that single reactive source of truth to any modern UI framework using dedicated, zero-overhead adapter subpaths.
| Framework | Subpath | Key Primitives | Best For |
|---|---|---|---|
| React | @banksia/signals/react |
useReactive, observer, useSignal, useComputed |
React 18 concurrent mode, React 19 apps, Next.js, Remix |
| Lit | @banksia/signals/lit |
SignalsController |
Web Components, Design Systems, Shadow DOM Custom Elements |
| SolidJS | @banksia/signals/solid |
createSolidSignalBridge |
High-frequency data streams, compile-time fine-grained reactive UIs |
| Vanilla DOM | @banksia/signals/vanilla |
bindText, bindDOM |
Zero-framework microfrontends, canvas overlays, high-speed widgets |
In multi-framework codebases, microfrontend architectures, or incremental migration projects (e.g., migrating from React to Lit or Solid), domain logic, API clients, and calculation models remain identical across all applications.
All adapters tap into the core microtask batch scheduler. When multiple properties mutate in a single synchronous tick, your UI framework only re-renders once, eliminating layout thrashing and unnecessary render cascades.
Adapters automatically manage subscription lifecycles. When a React component unmounts, a Lit element disconnects from the DOM, or a SolidJS scope is disposed, all internal listener callbacks and dependency edges are automatically torn down to guarantee zero memory leaks.
useReactive and observer in functional components.ReactiveController lifecycles.