1d755c1: External state store, store adapters, and bug fixes.### New: External State Store
The StateStore interface lets you plug in your own state management (Redux, Zustand, Jotai, XState, etc.) instead of the built-in internal store. Pass a store prop to StateProvider, JSONUIProvider, or createRenderer for controlled mode.
StateStore interface and createStateStore() factory to @json-render/coreStateProvider, JSONUIProvider, and createRenderer now accept an optional store prop for controlled modestore is provided, it becomes the single source of truth (initialState/onStateChange are ignored)store is omitted, everything works exactly as before (fully backward compatible)createStoreAdapter, immutableSetByPath, flattenToPointers) available via @json-render/core/store-utils for building custom adapters### New: Store Adapter Packages
@json-render/zustand — Zustand adapter for StateStore@json-render/redux — Redux / Redux Toolkit adapter for StateStore@json-render/jotai — Jotai adapter for StateStore### Changed: onStateChange signature updated (breaking)
The onStateChange callback now receives a single array of changed entries instead of being called once per path:
// Before
onStateChange?: (path: string, value: unknown) => void
// After
onStateChange?: (changes: Array<{ path: string; value: unknown }>) => void
### Fixed
@json-render/react/schema subpath, avoiding createContext crashes in Next.js App Router API routes@json-render/react, @json-render/react-native, and @json-render/react-pdf1d755c1]
09376db]
2d70fab: New @json-render/shadcn package, event handles, built-in actions, and stream improvements.### New: @json-render/shadcn Package
Pre-built shadcn/ui component library for json-render. 30+ components built on Radix UI + Tailwind CSS, ready to use with defineCatalog and defineRegistry.
shadcnComponentDefinitions — Zod-based catalog definitions for all components (server-safe, no React dependency via @json-render/shadcn/catalog)shadcnComponents — React implementations for all components### New: Event Handles (on())
Components now receive an on(event) function in addition to emit(event). The on() function returns an EventHandle with metadata:
emit() — fire the eventshouldPreventDefault — whether any action binding requested preventDefaultbound — whether any handler is bound to this event### New: BaseComponentProps
Catalog-agnostic base type for component render functions. Use when building reusable component libraries (like @json-render/shadcn) that are not tied to a specific catalog.
### New: Built-in Actions in Schema
Schemas can now declare builtInActions — actions that are always available at runtime and automatically injected into prompts. The React schema declares setState, pushState, and removeState as built-in, so they appear in prompts without needing to be listed in catalog actions.
### New: preventDefault on ActionBinding
Action bindings now support a preventDefault boolean field, allowing the LLM to request that default browser behavior (e.g. navigation on links) be prevented.
### Improved: Stream Transform Text Block Splitting
createJsonRenderTransform() now properly splits text blocks around spec data by emitting text-end/text-start pairs. This ensures the AI SDK creates separate text parts, preserving correct interleaving of prose and UI in message.parts.
### Improved: defineRegistry Actions Requirement
defineRegistry now conditionally requires the actions field only when the catalog declares actions. Catalogs with no actions (e.g. actions: {}) no longer need to pass an empty actions object.
2d70fab]