@xmachines/docs 1.0.0-beta.33 → 1.0.0-beta.34

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (366) hide show
  1. package/api/@xmachines/play/classes/NonNullableError.md +4 -4
  2. package/api/@xmachines/play/classes/PlayError.md +4 -4
  3. package/api/@xmachines/play/functions/assertNonNullable.md +1 -1
  4. package/api/@xmachines/play/type-aliases/PlayEvent.md +2 -2
  5. package/api/@xmachines/play-actor/README.md +9 -10
  6. package/api/@xmachines/play-actor/classes/AbstractActor.md +3 -3
  7. package/api/@xmachines/play-actor/functions/typedSpec.md +7 -10
  8. package/api/@xmachines/play-actor/interfaces/BaseActorProviderProps.md +46 -0
  9. package/api/@xmachines/play-actor/interfaces/BaseViewContextValue.md +33 -0
  10. package/api/@xmachines/play-actor/interfaces/PlaySpec.md +2 -2
  11. package/api/@xmachines/play-actor/interfaces/Routable.md +3 -3
  12. package/api/@xmachines/play-actor/interfaces/Viewable.md +4 -4
  13. package/api/@xmachines/play-dom/README.md +98 -15
  14. package/api/@xmachines/play-dom/classes/PlayRenderer.md +4 -4
  15. package/api/@xmachines/play-dom/functions/connectRenderer.md +1 -1
  16. package/api/@xmachines/play-dom/functions/createPlayUI.md +28 -0
  17. package/api/@xmachines/play-dom/functions/createRenderer.md +1 -1
  18. package/api/@xmachines/play-dom/functions/defineRegistry.md +1 -1
  19. package/api/@xmachines/play-dom/functions/renderSpec.md +1 -1
  20. package/api/@xmachines/play-dom/interfaces/ComponentContext.md +9 -9
  21. package/api/@xmachines/play-dom/interfaces/ConnectRendererOptions.md +19 -11
  22. package/api/@xmachines/play-dom/interfaces/CreatePlayUIOptions.md +29 -0
  23. package/api/@xmachines/play-dom/interfaces/DefineRegistryResult.md +6 -6
  24. package/api/@xmachines/play-dom/interfaces/DomRenderContext.md +14 -14
  25. package/api/@xmachines/play-dom/interfaces/EventHandle.md +6 -6
  26. package/api/@xmachines/play-dom/interfaces/MountOptions.md +14 -0
  27. package/api/@xmachines/play-dom/interfaces/PlayDomOptions.md +7 -7
  28. package/api/@xmachines/play-dom/interfaces/UIProviderOptions.md +27 -0
  29. package/api/@xmachines/play-dom/type-aliases/ActionFn.md +1 -1
  30. package/api/@xmachines/play-dom/type-aliases/Actions.md +1 -1
  31. package/api/@xmachines/play-dom/type-aliases/BaseComponentProps.md +7 -7
  32. package/api/@xmachines/play-dom/type-aliases/CatalogHasActions.md +1 -1
  33. package/api/@xmachines/play-dom/type-aliases/ComponentFn.md +1 -1
  34. package/api/@xmachines/play-dom/type-aliases/ComponentRegistry.md +1 -1
  35. package/api/@xmachines/play-dom/type-aliases/DefineRegistryOptions.md +4 -4
  36. package/api/@xmachines/play-dom/type-aliases/DomComponentRenderer.md +1 -1
  37. package/api/@xmachines/play-dom/type-aliases/DomRegistry.md +1 -1
  38. package/api/@xmachines/play-dom/type-aliases/DomSchema.md +1 -1
  39. package/api/@xmachines/play-dom/type-aliases/MountFn.md +25 -0
  40. package/api/@xmachines/play-dom/type-aliases/RenderErrorHandler.md +23 -0
  41. package/api/@xmachines/play-dom/type-aliases/SetState.md +1 -1
  42. package/api/@xmachines/play-dom/variables/schema.md +1 -1
  43. package/api/@xmachines/play-dom-router/functions/connectRouter.md +1 -1
  44. package/api/@xmachines/play-dom-router/functions/createBrowserHistory.md +1 -1
  45. package/api/@xmachines/play-dom-router/functions/createRouteMap.md +1 -1
  46. package/api/@xmachines/play-dom-router/functions/createRouter.md +1 -1
  47. package/api/@xmachines/play-dom-router/interfaces/BrowserHistory.md +14 -14
  48. package/api/@xmachines/play-dom-router/interfaces/BrowserWindow.md +14 -14
  49. package/api/@xmachines/play-dom-router/interfaces/ConnectRouterOptions.md +4 -4
  50. package/api/@xmachines/play-dom-router/interfaces/PlayRouteEvent.md +6 -6
  51. package/api/@xmachines/play-dom-router/interfaces/RouteMap.md +3 -3
  52. package/api/@xmachines/play-dom-router/interfaces/RouteMapLike.md +3 -3
  53. package/api/@xmachines/play-dom-router/interfaces/RouteMapping.md +3 -3
  54. package/api/@xmachines/play-dom-router/interfaces/RouterBridge.md +3 -3
  55. package/api/@xmachines/play-dom-router/interfaces/VanillaRouter.md +4 -4
  56. package/api/@xmachines/play-dom-router/type-aliases/RoutableActor.md +1 -1
  57. package/api/@xmachines/play-react/README.md +165 -48
  58. package/api/@xmachines/play-react/classes/PlayErrorBoundary.md +5 -5
  59. package/api/@xmachines/play-react/functions/ActionProvider.md +21 -0
  60. package/api/@xmachines/play-react/functions/JSONUIProvider.md +21 -0
  61. package/api/@xmachines/play-react/functions/Renderer.md +21 -0
  62. package/api/@xmachines/play-react/functions/StateProvider.md +27 -0
  63. package/api/@xmachines/play-react/functions/ValidationProvider.md +21 -0
  64. package/api/@xmachines/play-react/functions/VisibilityProvider.md +21 -0
  65. package/api/@xmachines/play-react/functions/useActor.md +1 -1
  66. package/api/@xmachines/play-react/functions/usePlayView.md +32 -0
  67. package/api/@xmachines/play-react/functions/useSignalEffect.md +1 -1
  68. package/api/@xmachines/play-react/interfaces/ActionProviderProps.md +15 -0
  69. package/api/@xmachines/play-react/interfaces/ActorProviderProps.md +27 -0
  70. package/api/@xmachines/play-react/interfaces/JSONUIProviderProps.md +21 -0
  71. package/api/@xmachines/play-react/interfaces/PlayErrorBoundaryProps.md +4 -4
  72. package/api/@xmachines/play-react/interfaces/PlayErrorBoundaryState.md +3 -3
  73. package/api/@xmachines/play-react/interfaces/PlayUIProviderProps.md +26 -0
  74. package/api/@xmachines/play-react/interfaces/RendererProps.md +17 -0
  75. package/api/@xmachines/play-react/interfaces/StateProviderProps.md +16 -0
  76. package/api/@xmachines/play-react/interfaces/ValidationProviderProps.md +14 -0
  77. package/api/@xmachines/play-react/interfaces/ViewContextValue.md +20 -0
  78. package/api/@xmachines/play-react/interfaces/VisibilityProviderProps.md +13 -0
  79. package/api/@xmachines/play-react/type-aliases/PlayActor.md +1 -1
  80. package/api/@xmachines/play-react/type-aliases/RenderErrorHandler.md +3 -2
  81. package/api/@xmachines/play-react/variables/ActorProvider.md +33 -0
  82. package/api/@xmachines/play-react/variables/PlayRenderer.md +5 -50
  83. package/api/@xmachines/play-react/variables/PlayUIProvider.md +43 -0
  84. package/api/@xmachines/play-react-router/classes/ReactRouterBridge.md +23 -23
  85. package/api/@xmachines/play-react-router/classes/RouteMap.md +4 -4
  86. package/api/@xmachines/play-react-router/functions/PlayRouterProvider.md +1 -1
  87. package/api/@xmachines/play-react-router/functions/createRouteMapFromTree.md +1 -1
  88. package/api/@xmachines/play-react-router/interfaces/PlayRouteEvent.md +6 -6
  89. package/api/@xmachines/play-react-router/interfaces/PlayRouterProviderProps.md +5 -5
  90. package/api/@xmachines/play-react-router/interfaces/RouteMapping.md +3 -3
  91. package/api/@xmachines/play-react-router/interfaces/RouterBridge.md +3 -3
  92. package/api/@xmachines/play-router/classes/BaseRouteMap.md +4 -4
  93. package/api/@xmachines/play-router/classes/RouterBridgeBase.md +23 -23
  94. package/api/@xmachines/play-router/functions/buildPlayRouteEvent.md +1 -1
  95. package/api/@xmachines/play-router/functions/buildRouteTree.md +1 -1
  96. package/api/@xmachines/play-router/functions/createRouteMap.md +1 -1
  97. package/api/@xmachines/play-router/functions/createRouteMapFromMachine.md +1 -1
  98. package/api/@xmachines/play-router/functions/createRouteMapFromTree.md +1 -1
  99. package/api/@xmachines/play-router/functions/detectDuplicateRoutes.md +1 -1
  100. package/api/@xmachines/play-router/functions/extractMachineRoutes.md +1 -1
  101. package/api/@xmachines/play-router/functions/extractQuery.md +1 -1
  102. package/api/@xmachines/play-router/functions/extractRouteParams.md +1 -1
  103. package/api/@xmachines/play-router/functions/findRouteById.md +1 -1
  104. package/api/@xmachines/play-router/functions/findRouteByPath.md +1 -1
  105. package/api/@xmachines/play-router/functions/getNavigableRoutes.md +1 -1
  106. package/api/@xmachines/play-router/functions/getRoutableRoutes.md +1 -1
  107. package/api/@xmachines/play-router/functions/getTransitionReachableRoutes.md +1 -1
  108. package/api/@xmachines/play-router/functions/isRouteReachable.md +1 -1
  109. package/api/@xmachines/play-router/functions/machineToGraph.md +1 -1
  110. package/api/@xmachines/play-router/functions/routeExists.md +1 -1
  111. package/api/@xmachines/play-router/functions/sanitizePathname.md +1 -1
  112. package/api/@xmachines/play-router/functions/validateRouteFormat.md +1 -1
  113. package/api/@xmachines/play-router/functions/validateStateExists.md +1 -1
  114. package/api/@xmachines/play-router/interfaces/BuildPlayRouteEventOptions.md +4 -4
  115. package/api/@xmachines/play-router/interfaces/LocationLike.md +3 -3
  116. package/api/@xmachines/play-router/interfaces/MachineEdgeData.md +3 -3
  117. package/api/@xmachines/play-router/interfaces/MachineNodeData.md +5 -5
  118. package/api/@xmachines/play-router/interfaces/PlayRouteEvent.md +6 -6
  119. package/api/@xmachines/play-router/interfaces/RouteInfo.md +8 -8
  120. package/api/@xmachines/play-router/interfaces/RouteMap.md +4 -4
  121. package/api/@xmachines/play-router/interfaces/RouteMapping.md +3 -3
  122. package/api/@xmachines/play-router/interfaces/RouteMatch.md +3 -3
  123. package/api/@xmachines/play-router/interfaces/RouteNode.md +10 -10
  124. package/api/@xmachines/play-router/interfaces/RouteObject.md +2 -2
  125. package/api/@xmachines/play-router/interfaces/RouteTree.md +5 -5
  126. package/api/@xmachines/play-router/interfaces/RouteWatcherHandle.md +3 -3
  127. package/api/@xmachines/play-router/interfaces/RouterBridge.md +3 -3
  128. package/api/@xmachines/play-router/interfaces/WindowLike.md +3 -3
  129. package/api/@xmachines/play-router/type-aliases/MachineGraph.md +1 -1
  130. package/api/@xmachines/play-router/type-aliases/RouteMetadata.md +1 -1
  131. package/api/@xmachines/play-signals/functions/watchSignal.md +1 -1
  132. package/api/@xmachines/play-signals/interfaces/ComputedOptions.md +2 -2
  133. package/api/@xmachines/play-signals/interfaces/SignalComputed.md +2 -2
  134. package/api/@xmachines/play-signals/interfaces/SignalOptions.md +2 -2
  135. package/api/@xmachines/play-signals/interfaces/SignalState.md +3 -3
  136. package/api/@xmachines/play-signals/interfaces/SignalWatcher.md +4 -4
  137. package/api/@xmachines/play-signals/type-aliases/WatcherNotify.md +1 -1
  138. package/api/@xmachines/play-solid/README.md +158 -42
  139. package/api/@xmachines/play-solid/functions/ActionProvider.md +19 -0
  140. package/api/@xmachines/play-solid/functions/JSONUIProvider.md +21 -0
  141. package/api/@xmachines/play-solid/functions/Renderer.md +21 -0
  142. package/api/@xmachines/play-solid/functions/StateProvider.md +19 -0
  143. package/api/@xmachines/play-solid/functions/ValidationProvider.md +19 -0
  144. package/api/@xmachines/play-solid/functions/VisibilityProvider.md +20 -0
  145. package/api/@xmachines/play-solid/functions/defineRegistry.md +1 -1
  146. package/api/@xmachines/play-solid/functions/useAction.md +24 -0
  147. package/api/@xmachines/play-solid/functions/useActions.md +13 -0
  148. package/api/@xmachines/play-solid/functions/useActor.md +1 -1
  149. package/api/@xmachines/play-solid/functions/useFieldValidation.md +29 -0
  150. package/api/@xmachines/play-solid/functions/useIsVisible.md +19 -0
  151. package/api/@xmachines/play-solid/functions/useOptionalValidation.md +13 -0
  152. package/api/@xmachines/play-solid/functions/usePlayView.md +30 -0
  153. package/api/@xmachines/play-solid/functions/useStateBinding.md +25 -0
  154. package/api/@xmachines/play-solid/functions/useStateStore.md +13 -0
  155. package/api/@xmachines/play-solid/functions/useStateValue.md +25 -0
  156. package/api/@xmachines/play-solid/functions/useVisibility.md +13 -0
  157. package/api/@xmachines/play-solid/interfaces/ActionProviderProps.md +12 -0
  158. package/api/@xmachines/play-solid/interfaces/ActorProviderProps.md +30 -0
  159. package/api/@xmachines/play-solid/interfaces/DefineRegistryResult.md +15 -0
  160. package/api/@xmachines/play-solid/interfaces/JSONUIProviderProps.md +21 -0
  161. package/api/@xmachines/play-solid/interfaces/PlayUIProviderProps.md +26 -0
  162. package/api/@xmachines/play-solid/interfaces/RendererProps.md +17 -0
  163. package/api/@xmachines/play-solid/interfaces/StateProviderProps.md +13 -0
  164. package/api/@xmachines/play-solid/interfaces/ValidationProviderProps.md +11 -0
  165. package/api/@xmachines/play-solid/interfaces/ViewContextValue.md +21 -0
  166. package/api/@xmachines/play-solid/type-aliases/ComponentRegistry.md +17 -0
  167. package/api/@xmachines/play-solid/type-aliases/PlayActor.md +1 -1
  168. package/api/@xmachines/play-solid/type-aliases/RenderErrorHandler.md +3 -2
  169. package/api/@xmachines/play-solid/type-aliases/SetState.md +21 -0
  170. package/api/@xmachines/play-solid/type-aliases/VisibilityProviderProps.md +9 -0
  171. package/api/@xmachines/play-solid/variables/ActorContext.md +13 -0
  172. package/api/@xmachines/play-solid/variables/ActorProvider.md +27 -0
  173. package/api/@xmachines/play-solid/variables/PlayRenderer.md +5 -18
  174. package/api/@xmachines/play-solid/variables/PlayUIProvider.md +26 -0
  175. package/api/@xmachines/play-solid-router/classes/RouteMap.md +4 -4
  176. package/api/@xmachines/play-solid-router/classes/SolidRouterBridge.md +24 -24
  177. package/api/@xmachines/play-solid-router/functions/PlayRouterProvider.md +1 -1
  178. package/api/@xmachines/play-solid-router/functions/createRouteMap.md +1 -1
  179. package/api/@xmachines/play-solid-router/interfaces/AbstractActor.md +3 -3
  180. package/api/@xmachines/play-solid-router/interfaces/PlayRouteEvent.md +6 -6
  181. package/api/@xmachines/play-solid-router/interfaces/PlayRouterProviderProps.md +5 -5
  182. package/api/@xmachines/play-solid-router/interfaces/RouteMapping.md +3 -3
  183. package/api/@xmachines/play-solid-router/interfaces/RouterBridge.md +3 -3
  184. package/api/@xmachines/play-solid-router/type-aliases/RoutableActor.md +1 -1
  185. package/api/@xmachines/play-solid-router/type-aliases/SolidRouterHooks.md +4 -4
  186. package/api/@xmachines/play-svelte/README.md +105 -25
  187. package/api/@xmachines/play-svelte/functions/defineRegistry.md +1 -1
  188. package/api/@xmachines/play-svelte/functions/getActorContext.md +21 -0
  189. package/api/@xmachines/play-svelte/functions/getPlayViewContext.md +19 -0
  190. package/api/@xmachines/play-svelte/functions/setActorContext.md +19 -0
  191. package/api/@xmachines/play-svelte/interfaces/ActorProviderProps.md +40 -0
  192. package/api/@xmachines/play-svelte/interfaces/DefineRegistryOptions.md +6 -6
  193. package/api/@xmachines/play-svelte/interfaces/ViewContextValue.md +24 -0
  194. package/api/@xmachines/play-svelte/type-aliases/PlayActor.md +9 -0
  195. package/api/@xmachines/play-svelte/type-aliases/RenderErrorHandler.md +1 -17
  196. package/api/@xmachines/play-svelte-spa-router/classes/RouteMap.md +4 -4
  197. package/api/@xmachines/play-svelte-spa-router/functions/connectRouter.md +1 -1
  198. package/api/@xmachines/play-svelte-spa-router/functions/createRouteMap.md +1 -1
  199. package/api/@xmachines/play-svelte-spa-router/interfaces/ConnectRouterOptions.md +4 -4
  200. package/api/@xmachines/play-svelte-spa-router/interfaces/PlayRouteEvent.md +6 -6
  201. package/api/@xmachines/play-svelte-spa-router/interfaces/RouteMapping.md +3 -3
  202. package/api/@xmachines/play-svelte-spa-router/interfaces/RouterBridge.md +3 -3
  203. package/api/@xmachines/play-svelte-spa-router/interfaces/WindowLike.md +3 -3
  204. package/api/@xmachines/play-svelte-spa-router/type-aliases/RoutableActor.md +1 -1
  205. package/api/@xmachines/play-sveltekit-router/classes/RouteMap.md +4 -4
  206. package/api/@xmachines/play-sveltekit-router/functions/connectRouter.md +1 -1
  207. package/api/@xmachines/play-sveltekit-router/functions/createRouteMap.md +1 -1
  208. package/api/@xmachines/play-sveltekit-router/interfaces/ConnectRouterOptions.md +4 -4
  209. package/api/@xmachines/play-sveltekit-router/interfaces/LocationLike.md +3 -3
  210. package/api/@xmachines/play-sveltekit-router/interfaces/PlayRouteEvent.md +6 -6
  211. package/api/@xmachines/play-sveltekit-router/interfaces/RouteMapping.md +3 -3
  212. package/api/@xmachines/play-sveltekit-router/interfaces/RouterBridge.md +3 -3
  213. package/api/@xmachines/play-sveltekit-router/type-aliases/RoutableActor.md +1 -1
  214. package/api/@xmachines/play-tanstack-react-router/classes/RouteMap.md +4 -4
  215. package/api/@xmachines/play-tanstack-react-router/classes/TanStackReactRouterBridge.md +23 -23
  216. package/api/@xmachines/play-tanstack-react-router/functions/PlayRouterProvider.md +1 -1
  217. package/api/@xmachines/play-tanstack-react-router/functions/createRouteMap.md +1 -1
  218. package/api/@xmachines/play-tanstack-react-router/functions/createRouteMapFromTree.md +1 -1
  219. package/api/@xmachines/play-tanstack-react-router/functions/extractMachineRoutes.md +1 -1
  220. package/api/@xmachines/play-tanstack-react-router/interfaces/PlayRouteEvent.md +6 -6
  221. package/api/@xmachines/play-tanstack-react-router/interfaces/PlayRouterProviderProps.md +5 -5
  222. package/api/@xmachines/play-tanstack-react-router/interfaces/RouteMapping.md +3 -3
  223. package/api/@xmachines/play-tanstack-react-router/interfaces/RouteNavigateEvent.md +3 -3
  224. package/api/@xmachines/play-tanstack-react-router/interfaces/RouterBridge.md +3 -3
  225. package/api/@xmachines/play-tanstack-react-router/type-aliases/TanStackRouterInstance.md +1 -1
  226. package/api/@xmachines/play-tanstack-react-router/type-aliases/TanStackRouterLike.md +4 -4
  227. package/api/@xmachines/play-tanstack-solid-router/classes/RouteMap.md +4 -4
  228. package/api/@xmachines/play-tanstack-solid-router/classes/SolidRouterBridge.md +24 -24
  229. package/api/@xmachines/play-tanstack-solid-router/functions/PlayRouterProvider.md +1 -1
  230. package/api/@xmachines/play-tanstack-solid-router/functions/createRouteMap.md +1 -1
  231. package/api/@xmachines/play-tanstack-solid-router/interfaces/PlayRouteEvent.md +6 -6
  232. package/api/@xmachines/play-tanstack-solid-router/interfaces/PlayRouterProviderProps.md +5 -5
  233. package/api/@xmachines/play-tanstack-solid-router/interfaces/RouteMapping.md +3 -3
  234. package/api/@xmachines/play-tanstack-solid-router/interfaces/RouterBridge.md +3 -3
  235. package/api/@xmachines/play-tanstack-solid-router/type-aliases/RoutableActor.md +1 -1
  236. package/api/@xmachines/play-tanstack-solid-router/type-aliases/TanStackRouterInstance.md +1 -1
  237. package/api/@xmachines/play-tanstack-solid-router/type-aliases/TanStackRouterLike.md +3 -3
  238. package/api/@xmachines/play-vue/README.md +136 -40
  239. package/api/@xmachines/play-vue/functions/defineRegistry.md +2 -2
  240. package/api/@xmachines/play-vue/functions/getPlayViewContext.md +28 -0
  241. package/api/@xmachines/play-vue/functions/useActor.md +1 -1
  242. package/api/@xmachines/play-vue/interfaces/ActionProviderProps.md +12 -0
  243. package/api/@xmachines/play-vue/interfaces/ActorProviderProps.md +25 -0
  244. package/api/@xmachines/play-vue/interfaces/DefineRegistryResult.md +15 -0
  245. package/api/@xmachines/play-vue/interfaces/JSONUIProviderProps.md +20 -0
  246. package/api/@xmachines/play-vue/interfaces/PlayUIProviderProps.md +24 -0
  247. package/api/@xmachines/play-vue/interfaces/RendererProps.md +17 -0
  248. package/api/@xmachines/play-vue/interfaces/StateProviderProps.md +15 -0
  249. package/api/@xmachines/play-vue/interfaces/ValidationProviderProps.md +11 -0
  250. package/api/@xmachines/play-vue/interfaces/ViewContextValue.md +21 -0
  251. package/api/@xmachines/play-vue/type-aliases/ComponentEntry.md +1 -1
  252. package/api/@xmachines/play-vue/type-aliases/ComponentsMap.md +1 -1
  253. package/api/@xmachines/play-vue/type-aliases/DefineRegistryOptions.md +2 -2
  254. package/api/@xmachines/play-vue/type-aliases/PlayActor.md +1 -1
  255. package/api/@xmachines/play-vue/type-aliases/RenderErrorHandler.md +3 -2
  256. package/api/@xmachines/play-vue/variables/ActionProvider.md +64 -0
  257. package/api/@xmachines/play-vue/variables/JSONUIProvider.md +96 -0
  258. package/api/@xmachines/play-vue/variables/PlayRenderer.md +1 -1
  259. package/api/@xmachines/play-vue/variables/Renderer.md +79 -0
  260. package/api/@xmachines/play-vue/variables/StateProvider.md +79 -0
  261. package/api/@xmachines/play-vue/variables/ValidationProvider.md +55 -0
  262. package/api/@xmachines/play-vue/variables/VisibilityProvider.md +40 -0
  263. package/api/@xmachines/play-vue-router/classes/RouteMap.md +4 -4
  264. package/api/@xmachines/play-vue-router/classes/VueBaseRouteMap.md +4 -4
  265. package/api/@xmachines/play-vue-router/classes/VueRouterBridge.md +24 -24
  266. package/api/@xmachines/play-vue-router/functions/createRouteMap.md +1 -1
  267. package/api/@xmachines/play-vue-router/interfaces/PlayRouteEvent.md +6 -6
  268. package/api/@xmachines/play-vue-router/interfaces/RouteMapping.md +3 -3
  269. package/api/@xmachines/play-vue-router/interfaces/RouterBridge.md +3 -3
  270. package/api/@xmachines/play-vue-router/type-aliases/RoutableActor.md +1 -1
  271. package/api/@xmachines/play-vue-router/variables/PlayRouterProvider.md +1 -1
  272. package/api/@xmachines/play-xstate/classes/PlayerActor.md +24 -24
  273. package/api/@xmachines/play-xstate/functions/buildRouteUrl.md +1 -1
  274. package/api/@xmachines/play-xstate/functions/composeGuards.md +1 -1
  275. package/api/@xmachines/play-xstate/functions/composeGuardsOr.md +1 -1
  276. package/api/@xmachines/play-xstate/functions/contextFieldMatches.md +1 -1
  277. package/api/@xmachines/play-xstate/functions/definePlayer.md +1 -1
  278. package/api/@xmachines/play-xstate/functions/deriveRoute.md +1 -1
  279. package/api/@xmachines/play-xstate/functions/eventMatches.md +1 -1
  280. package/api/@xmachines/play-xstate/functions/formatPlayRouteTransitions.md +1 -1
  281. package/api/@xmachines/play-xstate/functions/hasContext.md +1 -1
  282. package/api/@xmachines/play-xstate/functions/isAbsoluteRoute.md +1 -1
  283. package/api/@xmachines/play-xstate/functions/negateGuard.md +1 -1
  284. package/api/@xmachines/play-xstate/interfaces/PlayerConfig.md +3 -3
  285. package/api/@xmachines/play-xstate/interfaces/PlayerFactoryResumeOptions.md +2 -2
  286. package/api/@xmachines/play-xstate/interfaces/PlayerOptions.md +6 -6
  287. package/api/@xmachines/play-xstate/interfaces/RouteContext.md +5 -5
  288. package/api/@xmachines/play-xstate/type-aliases/ComposedGuard.md +1 -1
  289. package/api/@xmachines/play-xstate/type-aliases/Guard.md +1 -1
  290. package/api/@xmachines/play-xstate/type-aliases/GuardArray.md +1 -1
  291. package/api/@xmachines/play-xstate/type-aliases/PlayerFactory.md +1 -1
  292. package/api/@xmachines/play-xstate/type-aliases/RouteMachineConfig.md +4 -4
  293. package/api/@xmachines/play-xstate/type-aliases/RouteStateNode.md +4 -4
  294. package/api/@xmachines/shared/functions/defineXmVitestConfig.md +1 -1
  295. package/api/@xmachines/shared/functions/xmAliases.md +1 -1
  296. package/api/_media/README.md +98 -15
  297. package/examples/@xmachines/play-dom-demo/README.md +42 -22
  298. package/examples/@xmachines/play-dom-demo/functions/createNavBar.md +1 -1
  299. package/examples/@xmachines/play-dom-demo/functions/initShell.md +1 -1
  300. package/examples/@xmachines/play-dom-demo/type-aliases/AuthCatalog.md +1 -1
  301. package/examples/@xmachines/play-dom-demo/variables/About.md +1 -1
  302. package/examples/@xmachines/play-dom-demo/variables/Contact.md +1 -1
  303. package/examples/@xmachines/play-dom-demo/variables/Dashboard.md +1 -1
  304. package/examples/@xmachines/play-dom-demo/variables/Home.md +1 -1
  305. package/examples/@xmachines/play-dom-demo/variables/Login.md +1 -1
  306. package/examples/@xmachines/play-dom-demo/variables/NavBarView.md +1 -1
  307. package/examples/@xmachines/play-dom-demo/variables/Navigation.md +1 -1
  308. package/examples/@xmachines/play-dom-demo/variables/Overview.md +1 -1
  309. package/examples/@xmachines/play-dom-demo/variables/Profile.md +1 -1
  310. package/examples/@xmachines/play-dom-demo/variables/Settings.md +1 -1
  311. package/examples/@xmachines/play-dom-demo/variables/Stats.md +1 -1
  312. package/examples/@xmachines/play-dom-demo/variables/authCatalog.md +1 -1
  313. package/examples/@xmachines/play-react-demo/README.md +53 -46
  314. package/examples/@xmachines/play-react-demo/functions/App.md +1 -1
  315. package/examples/@xmachines/play-react-demo/type-aliases/AuthCatalog.md +1 -1
  316. package/examples/@xmachines/play-react-demo/variables/About.md +1 -1
  317. package/examples/@xmachines/play-react-demo/variables/Contact.md +1 -1
  318. package/examples/@xmachines/play-react-demo/variables/Dashboard.md +1 -1
  319. package/examples/@xmachines/play-react-demo/variables/DebugPanel.md +1 -1
  320. package/examples/@xmachines/play-react-demo/variables/Home.md +1 -1
  321. package/examples/@xmachines/play-react-demo/variables/Login.md +1 -1
  322. package/examples/@xmachines/play-react-demo/variables/NavBar.md +1 -1
  323. package/examples/@xmachines/play-react-demo/variables/NavBarView.md +1 -1
  324. package/examples/@xmachines/play-react-demo/variables/Navigation.md +1 -1
  325. package/examples/@xmachines/play-react-demo/variables/Overview.md +1 -1
  326. package/examples/@xmachines/play-react-demo/variables/Profile.md +1 -1
  327. package/examples/@xmachines/play-react-demo/variables/Settings.md +1 -1
  328. package/examples/@xmachines/play-react-demo/variables/Shell.md +1 -1
  329. package/examples/@xmachines/play-react-demo/variables/Stats.md +1 -1
  330. package/examples/@xmachines/play-react-demo/variables/authCatalog.md +1 -1
  331. package/examples/@xmachines/play-solid-demo/README.md +53 -34
  332. package/examples/@xmachines/play-solid-demo/functions/App.md +1 -1
  333. package/examples/@xmachines/play-solid-demo/type-aliases/AuthCatalog.md +1 -1
  334. package/examples/@xmachines/play-solid-demo/variables/About.md +1 -1
  335. package/examples/@xmachines/play-solid-demo/variables/Contact.md +1 -1
  336. package/examples/@xmachines/play-solid-demo/variables/Dashboard.md +1 -1
  337. package/examples/@xmachines/play-solid-demo/variables/DebugPanel.md +1 -1
  338. package/examples/@xmachines/play-solid-demo/variables/Home.md +1 -1
  339. package/examples/@xmachines/play-solid-demo/variables/Login.md +1 -1
  340. package/examples/@xmachines/play-solid-demo/variables/NavBar.md +1 -1
  341. package/examples/@xmachines/play-solid-demo/variables/NavBarView.md +1 -1
  342. package/examples/@xmachines/play-solid-demo/variables/Navigation.md +1 -1
  343. package/examples/@xmachines/play-solid-demo/variables/Overview.md +1 -1
  344. package/examples/@xmachines/play-solid-demo/variables/Profile.md +1 -1
  345. package/examples/@xmachines/play-solid-demo/variables/Settings.md +1 -1
  346. package/examples/@xmachines/play-solid-demo/variables/Shell.md +1 -1
  347. package/examples/@xmachines/play-solid-demo/variables/Stats.md +1 -1
  348. package/examples/@xmachines/play-solid-demo/variables/authCatalog.md +1 -1
  349. package/examples/@xmachines/play-svelte-demo/README.md +23 -20
  350. package/examples/@xmachines/play-svelte-spa-router-demo/README.md +8 -10
  351. package/examples/@xmachines/play-sveltekit-router-demo/README.md +10 -12
  352. package/examples/@xmachines/play-vue-demo/README.md +55 -37
  353. package/examples/form-validation.md +33 -42
  354. package/guides/README.md +8 -0
  355. package/guides/actor-model.md +180 -0
  356. package/guides/getting-started.md +18 -14
  357. package/guides/signals.md +166 -0
  358. package/guides/state-machines.md +288 -0
  359. package/package.json +2 -2
  360. package/rfc/play.md +62 -35
  361. package/api/@xmachines/play-actor/interfaces/ViewMetadata.md +0 -17
  362. package/api/@xmachines/play-react/interfaces/PlayRendererProps.md +0 -24
  363. package/api/@xmachines/play-solid/interfaces/PlayRendererProps.md +0 -24
  364. package/api/@xmachines/play-svelte/interfaces/PlayRendererProps.md +0 -22
  365. package/api/@xmachines/play-svelte/variables/getBoundProp.md +0 -7
  366. package/api/@xmachines/play-vue/interfaces/PlayRendererProps.md +0 -22
@@ -31,7 +31,7 @@ Use this order to understand the implementation:
31
31
  2. `src/lib/router.ts` creates the actor, builds the registry, calls `createRouteMap(authMachine)`, and wires `connectRouter({ actor, routeMap })`.
32
32
  3. `connectRouter` synchronizes hash URL changes with the actor via `play.route` events and reflects actor-approved routes back to the hash URL.
33
33
  4. `src/App.svelte` imports the singleton `actor` and `registry` from `src/lib/router.ts` and delegates to the shared `Shell.svelte`.
34
- 5. `Shell.svelte` renders `<PlayRenderer>` with the actor and registry and provides the shared UI shell (nav, debug panel).
34
+ 5. `Shell.svelte` renders `<PlayUIProvider>` + `<PlayRenderer />` with the actor and registryResult and provides the shared UI shell (nav, debug panel).
35
35
  6. Browser tests in `test/browser/` validate startup and auth route transitions.
36
36
 
37
37
  ```ts
@@ -52,20 +52,18 @@ export function cleanupDemo(): void {
52
52
  ```svelte
53
53
  <!-- src/App.svelte (shape) -->
54
54
  <script lang="ts">
55
- import Shell from "@xmachines/play-svelte-demo/src/components/Shell.svelte";
56
- import { actor, registry } from "./lib/router.js";
55
+ import { Shell } from "@xmachines/play-svelte-demo";
56
+ import { actor, registryResult } from "./lib/router.js";
57
57
  </script>
58
58
 
59
- <Shell {actor} {registry} />
59
+ <Shell {actor} {registryResult} />
60
60
  ```
61
61
 
62
62
  ```svelte
63
- <!-- Shell.svelte — sending events (shape) -->
64
- <PlayRenderer
65
- actor={props.actor}
66
- registry={props.registry}
67
- actions={{ login: "auth.login", logout: "auth.logout" }}
68
- />
63
+ <!-- Shell.svelte — rendering (shape) -->
64
+ <PlayUIProvider actor={props.actor} registryResult={props.registryResult}>
65
+ <PlayRenderer />
66
+ </PlayUIProvider>
69
67
  ```
70
68
 
71
69
  ## Key Files
@@ -8,7 +8,7 @@ Svelte 5 + SvelteKit router adapter integration demo for the XMachines Play arch
8
8
 
9
9
  - Shared auth machine reused without framework-specific business logic
10
10
  - `connectRouter` pathname URL ↔ actor sync via `@xmachines/play-sveltekit-router`
11
- - Shell-driven rendering via `PlayRenderer` with actor-authoritative navigation
11
+ - Shell-driven rendering via `PlayUIProvider` + `PlayRenderer` with actor-authoritative navigation
12
12
  - Canonical TC39 Signals lifecycle integrated with Svelte 5 runes
13
13
  - Non-browser invariant tests plus browser E2E coverage
14
14
 
@@ -30,8 +30,8 @@ Use this order to understand the implementation:
30
30
  1. `src/main.ts` mounts `App.svelte` and registers HMR cleanup via `cleanupDemo`.
31
31
  2. `src/lib/router.ts` creates the actor, builds the registry, calls `createRouteMap(authMachine)`, and wires `connectRouter({ actor, routeMap })`.
32
32
  3. `connectRouter` synchronizes browser pathname changes with the actor via `play.route` events and reflects actor-approved routes back to the pathname URL.
33
- 4. `src/App.svelte` imports the singleton `actor` and `registry` from `src/lib/router.ts` and delegates to the shared `Shell.svelte`.
34
- 5. `Shell.svelte` renders `<PlayRenderer>` with the actor and registry and provides the shared UI shell (nav, debug panel).
33
+ 4. `src/App.svelte` imports the singleton `actor` and `registryResult` from `src/lib/router.ts` and delegates to the shared `Shell.svelte`.
34
+ 5. `Shell.svelte` renders `<PlayUIProvider>` + `<PlayRenderer />` with the actor and registryResult and provides the shared UI shell (nav, debug panel).
35
35
  6. Browser tests in `test/browser/` validate startup and auth route transitions.
36
36
 
37
37
  ```ts
@@ -52,20 +52,18 @@ export function cleanupDemo(): void {
52
52
  ```svelte
53
53
  <!-- src/App.svelte (shape) -->
54
54
  <script lang="ts">
55
- import Shell from "@xmachines/play-svelte-demo/src/components/Shell.svelte";
56
- import { actor, registry } from "./lib/router.js";
55
+ import { Shell } from "@xmachines/play-svelte-demo";
56
+ import { actor, registryResult } from "./lib/router.js";
57
57
  </script>
58
58
 
59
- <Shell {actor} {registry} />
59
+ <Shell {actor} {registryResult} />
60
60
  ```
61
61
 
62
62
  ```svelte
63
- <!-- Shell.svelte — sending events (shape) -->
64
- <PlayRenderer
65
- actor={props.actor}
66
- registry={props.registry}
67
- actions={{ login: "auth.login", logout: "auth.logout" }}
68
- />
63
+ <!-- Shell.svelte — rendering (shape) -->
64
+ <PlayUIProvider actor={props.actor} registryResult={props.registryResult}>
65
+ <PlayRenderer />
66
+ </PlayUIProvider>
69
67
  ```
70
68
 
71
69
  ## Key Files
@@ -29,15 +29,16 @@ Use this order to understand the implementation:
29
29
 
30
30
  1. `src/main.ts` calls `definePlayer({ machine: authMachine })`, starts the actor, and mounts the Vue app.
31
31
  2. The actor is provided to all components via `app.provide("actor", actor)`.
32
- 3. `src/App.vue` injects the actor and builds the component registry with `defineRegistry(authCatalog, { components, actions })`.
33
- 4. `<PlayRenderer :actor="actor" :registry="registry" :actions="..." />` observes actor view signals and renders the active view component.
34
- 5. HMR cleanup calls `actor.stop()` via `import.meta.hot.dispose`.
35
- 6. Browser tests in `test/browser/` validate startup and interaction behavior.
32
+ 3. `src/App.vue` injects the actor and builds the typed `registryResult` with `defineRegistry(authCatalog, { components, actions })` inside `computed` — real async action handlers dispatching to `actor.send()`.
33
+ 4. `<PlayUIProvider :actor="actor" :registryResult="registryResult"><PlayRenderer /></PlayUIProvider>` observes `actor.currentView` and renders the active spec.
34
+ 5. A `NavBar` SFC observes `actor` signals directly for nav visibility.
35
+ 6. `<DebugPanel :actor="actor" />` shows live state, auth status, and current route.
36
+ 7. HMR cleanup calls `actor.stop()` via `import.meta.hot.dispose`.
37
+ 8. Browser tests in `test/browser/` validate startup and interaction behavior.
36
38
 
37
39
  ```ts
38
40
  // src/main.ts (shape)
39
- const createPlayer = definePlayer({ machine: authMachine });
40
- const actor = createPlayer();
41
+ const actor = definePlayer({ machine: authMachine })();
41
42
  actor.start();
42
43
 
43
44
  const app = createApp(App);
@@ -48,46 +49,63 @@ app.mount("#app");
48
49
  ```vue
49
50
  <!-- src/App.vue (shape) -->
50
51
  <script setup lang="ts">
51
- const actor = inject<AuthActor>("actor")!;
52
-
53
- const { registry } = defineRegistry(authCatalog, {
54
- components: {
55
- Home,
56
- About,
57
- Contact,
58
- Login,
59
- Dashboard,
60
- Overview,
61
- Stats,
62
- Profile,
63
- Settings,
64
- Navigation,
65
- },
66
- actions: { login: async () => {}, logout: async () => {} },
67
- });
52
+ const typedActor = assertNonNullable(inject<AuthActor>("actor"), "actor");
53
+
54
+ const registryResult = computed(() =>
55
+ defineRegistry(authCatalog, {
56
+ components: {
57
+ Home: HomeSFC,
58
+ About: AboutSFC,
59
+ Contact: ContactSFC,
60
+ Login: LoginSFC,
61
+ Dashboard: DashboardSFC,
62
+ Overview: OverviewSFC,
63
+ Stats: StatsSFC,
64
+ Profile: ProfileSFC,
65
+ Settings: SettingsSFC,
66
+ Navigation: NavigationSFC,
67
+ NavBar: NavBarViewSFC,
68
+ },
69
+ actions: {
70
+ login: async (args) =>
71
+ typedActor.send({
72
+ type: "auth.login",
73
+ username: assertNonNullable(args, "args").username,
74
+ }),
75
+ logout: async () => typedActor.send({ type: "auth.logout" }),
76
+ route: async (args) => {
77
+ const { to, params } = assertNonNullable(args, "args");
78
+ typedActor.send({
79
+ type: "play.route",
80
+ to,
81
+ ...(params != null && { params }),
82
+ });
83
+ },
84
+ },
85
+ }),
86
+ );
68
87
  </script>
69
88
 
70
89
  <template>
71
- <PlayRenderer
72
- :actor="actor"
73
- :registry="registry"
74
- :actions="{ login: 'auth.login', logout: 'auth.logout' }"
75
- />
90
+ <div class="demo-app" data-demo-shell>
91
+ <header class="demo-header">
92
+ <h1 class="demo-title">XMachines Play Vue Demo</h1>
93
+ <NavBar :actor="typedActor" />
94
+ </header>
95
+ <main class="demo-content" data-demo-content>
96
+ <PlayUIProvider :actor="typedActor" :registryResult="registryResult">
97
+ <PlayRenderer />
98
+ </PlayUIProvider>
99
+ </main>
100
+ <DebugPanel :actor="typedActor" />
101
+ </div>
76
102
  </template>
77
103
  ```
78
104
 
79
- ```vue
80
- <!-- src/components/Login.vue (shape) -->
81
- <script setup lang="ts">
82
- const actor = inject("actor")!;
83
- const login = () => actor.send({ type: "auth.login", username: "demo" });
84
- </script>
85
- ```
86
-
87
105
  ## Key Files
88
106
 
89
107
  - `src/main.ts` - actor creation/start and Vue app mount with actor injection
90
- - `src/App.vue` - registry construction and `PlayRenderer` composition
108
+ - `src/App.vue` - registry construction and `PlayUIProvider` + `PlayRenderer` composition
91
109
  - `src/components/` - demo view components bound to catalog component keys (Home, Login, Dashboard, Profile, etc.)
92
110
  - `test/library-pattern.test.ts` - architecture boundary and invariant assertions
93
111
  - `test/browser/renderer-demo.browser.test.ts` - browser-mode renderer coverage
@@ -90,12 +90,9 @@ const loginMachine = loginSetup.createMachine(
90
90
  meta: {
91
91
  route: "/",
92
92
  view: {
93
- component: "Home",
94
- spec: {
95
- root: "root",
96
- elements: {
97
- root: { type: "Home", props: { title: "Welcome" }, children: [] },
98
- },
93
+ root: "root",
94
+ elements: {
95
+ root: { type: "Home", props: { title: "Welcome" }, children: [] },
99
96
  },
100
97
  },
101
98
  },
@@ -106,26 +103,23 @@ const loginMachine = loginSetup.createMachine(
106
103
  meta: {
107
104
  route: "/login",
108
105
  view: {
109
- component: "Login",
110
- spec: {
111
- root: "root",
112
- // Local state store — initial value shown in the form field
113
- state: { username: "" },
114
- elements: {
115
- root: {
116
- type: "Login",
117
- props: {
118
- title: "Sign In",
119
- // $bindState wires the prop to the local state store (two-way)
120
- username: { $bindState: "/username" },
121
- },
122
- children: [],
123
- on: {
124
- // emit("submit") → resolves username from $state, calls login action
125
- submit: {
126
- action: "login",
127
- params: { username: { $state: "/username" } },
128
- },
106
+ root: "root",
107
+ // Local state store — initial value shown in the form field
108
+ state: { username: "" },
109
+ elements: {
110
+ root: {
111
+ type: "Login",
112
+ props: {
113
+ title: "Sign In",
114
+ // $bindState wires the prop to the local state store (two-way)
115
+ username: { $bindState: "/username" },
116
+ },
117
+ children: [],
118
+ on: {
119
+ // emit("submit") → resolves username from $state, calls login action
120
+ submit: {
121
+ action: "login",
122
+ params: { username: { $state: "/username" } },
129
123
  },
130
124
  },
131
125
  },
@@ -139,17 +133,14 @@ const loginMachine = loginSetup.createMachine(
139
133
  meta: {
140
134
  route: "/dashboard",
141
135
  view: {
142
- component: "Dashboard",
143
- spec: {
144
- root: "root",
145
- elements: {
146
- root: {
147
- type: "Dashboard",
148
- props: { title: "Dashboard" },
149
- children: [],
150
- on: {
151
- logout: { action: "logout" },
152
- },
136
+ root: "root",
137
+ elements: {
138
+ root: {
139
+ type: "Dashboard",
140
+ props: { title: "Dashboard" },
141
+ children: [],
142
+ on: {
143
+ logout: { action: "logout" },
153
144
  },
154
145
  },
155
146
  },
@@ -193,18 +184,18 @@ actor.stop();
193
184
 
194
185
  ## `$bindState` and `$state` Pattern
195
186
 
196
- `meta.view.spec` uses the `@json-render/core` spec format. Two special directives wire the component to a local per-state state store:
187
+ `meta.view` uses the `@json-render/core` spec format (`PlaySpec`). Two special directives wire the component to a local per-state state store:
197
188
 
198
189
  | Directive | Direction | Usage |
199
190
  | ----------------------------- | --------- | ----------------------------------------------------------- |
200
191
  | `{ $bindState: "/username" }` | Two-way | Prop reads and writes the state store key `/username` |
201
192
  | `{ $state: "/username" }` | Read-only | Reads the current value from the state store at `/username` |
202
193
 
203
- The `state:` object in the spec sets the initial values for the local store. When the user types in the form field, the renderer keeps the store in sync. On submit, action params read the final value via `$state`.
194
+ The `state:` key in `meta.view` sets the initial values for the local store. When the user types in the form field, the renderer keeps the store in sync. On submit, action params read the final value via `$state`.
204
195
 
205
196
  ```typescript
206
- // In the machine spec — the renderer handles the rest:
207
- spec: {
197
+ // In the machine meta.view — the renderer handles the rest:
198
+ view: {
208
199
  root: "root",
209
200
  state: { username: "" }, // initial store value
210
201
  elements: {
@@ -307,7 +298,7 @@ window.addEventListener("beforeunload", () => {
307
298
 
308
299
  **Key points:**
309
300
 
310
- - `actions` in `defineCatalog` must include every action name referenced in `meta.view` spec `on:` bindings. TypeScript enforces this via `CatalogHasActions`.
301
+ - `actions` in `defineCatalog` must include every action name referenced in `meta.view` `on:` bindings. TypeScript enforces this via `CatalogHasActions`.
311
302
  - `on("submit").emit()` resolves `params` from the current state store at call time — the `$state: "/username"` in the spec is read at that moment, not at render time.
312
303
  - `ctx.store.update(fn)` is the standard write path for two-way binding. The spec's `$bindState` directive only wires the read direction (prop ← store); the write direction (store ← input) must be implemented in the component.
313
304
 
package/guides/README.md CHANGED
@@ -9,6 +9,14 @@ Entry points for the current XMachines Play architecture.
9
9
  - **[Installation](installation.md)** — Core packages, framework-specific additions, TypeScript config, ESM setup
10
10
  - **[Getting Started](getting-started.md)** — `setup().createMachine()` → `definePlayer()` → `actor.start()` → TC39 Signals
11
11
 
12
+ ## Concepts
13
+
14
+ Background reading that explains the _why_ behind XMachines design decisions. Read these when you want to understand the architecture, not just use the API.
15
+
16
+ - **[Understanding State Machines](state-machines.md)** — What finite state machines are, how `meta.route` and `meta.view` extend them, and why they replace boolean flags, scattered guards, and component-level routing logic
17
+ - **[Understanding the Actor Model](actor-model.md)** — The actor/infrastructure split, what `AbstractActor` enforces, why the machine has zero framework imports, and how the reset invariant works
18
+ - **[Understanding TC39 Signals](signals.md)** — The three signal primitives (`Signal.State`, `Signal.Computed`, `Signal.subtle.Watcher`), why XMachines uses them instead of observables, and the five architectural invariants they enforce
19
+
12
20
  ## Examples
13
21
 
14
22
  - **[Examples Index](../examples/README.md)** — Conceptual patterns and complete runnable demo applications
@@ -0,0 +1,180 @@
1
+ # Understanding the Actor Model and the Actor/Infrastructure Split
2
+
3
+ XMachines is built around one central design principle: **business logic must never depend on infrastructure**. This page explains what that means, why the split is enforced the way it is, and what concrete responsibilities belong to each side of the boundary.
4
+
5
+ After reading this, you will understand why a state machine in XMachines has no import from React, Vue, or any router — and why that constraint is a feature, not a limitation.
6
+
7
+ ---
8
+
9
+ ## Two roles, one boundary
10
+
11
+ Every XMachines application has exactly two roles:
12
+
13
+ **The Actor** — owns state, guards, routing intent, and view structure. It has zero knowledge of browsers, routing libraries, or UI frameworks.
14
+
15
+ **Infrastructure** — the runtime environment. It reflects actor state into the world and forwards world events to the actor. It has no opinion on whether a transition is valid.
16
+
17
+ The boundary between them is enforced by the signal protocol: the actor exposes `Signal.State` and `Signal.Computed` properties; infrastructure observes them. The actor never calls into infrastructure; infrastructure never mutates actor state directly.
18
+
19
+ ```
20
+ Actor (business logic)
21
+
22
+ │ emits signals: state, currentRoute, currentView
23
+
24
+ Infrastructure (runtime adapters)
25
+ ├── Router Bridge — reflects currentRoute into the URL bar
26
+ ├── Renderer — renders currentView into framework components
27
+ └── ... (any other observer)
28
+
29
+ Infrastructure → actor: only via actor.send({ type: "..." })
30
+ ```
31
+
32
+ ---
33
+
34
+ ## What the actor owns
35
+
36
+ An actor in XMachines is a `PlayerActor` — a concrete class that extends XState's `Actor` class via `AbstractActor`. It implements three reactive properties:
37
+
38
+ | Property | Type | What it is |
39
+ | -------------------- | --------------------------------- | ----------------------------------------------------------------------- |
40
+ | `actor.state` | `Signal.State<Snapshot>` | Updated on every XState transition. The full machine snapshot. |
41
+ | `actor.currentRoute` | `Signal.Computed<string \| null>` | Derived from the active state node's `meta.route`. |
42
+ | `actor.currentView` | `Signal.State<PlaySpec \| null>` | Updated on each transition. Holds the `PlaySpec` that drives renderers. |
43
+
44
+ All three are set by the actor, never by infrastructure. Infrastructure reads them via signals.
45
+
46
+ The actor also owns:
47
+
48
+ - **Guards** — it decides whether a transition is valid. If a router sends a `play.route` event for a path the actor's guards reject, the actor does not transition. It then emits its current valid route back through `currentRoute`, and the router bridge overwrites the URL to match.
49
+ - **Error states** — structured errors (`PlayError`) are part of the actor's state graph, not thrown into the environment.
50
+ - **Initial route** — `actor.initialRoute` is the route the actor starts in. Router adapters use this for initial navigation, not the browser's current URL.
51
+
52
+ ---
53
+
54
+ ## What infrastructure owns
55
+
56
+ Infrastructure owns everything that touches the environment:
57
+
58
+ - **Pushing URLs**: reading `actor.currentRoute` and calling `history.pushState()` or a router's navigation API.
59
+ - **Forwarding navigation events**: listening to `popstate`, `routeChange`, or equivalent, then calling `actor.send({ type: "play.route", to: path })`.
60
+ - **Rendering**: reading `actor.currentView` and projecting the spec through framework components.
61
+ - **Lifecycle**: connecting on mount, disconnecting on unmount, explicitly cleaning up signal subscriptions.
62
+
63
+ Infrastructure does **not**:
64
+
65
+ - Decide whether a `play.route` event is valid (that is the actor's job via guards).
66
+ - Override the URL to something the actor did not emit.
67
+ - Read `actor.getSnapshot()` to make routing decisions (use `actor.currentRoute` instead).
68
+
69
+ ---
70
+
71
+ ## The reset invariant
72
+
73
+ One of the most important behaviors in XMachines falls out directly from this split.
74
+
75
+ If a user navigates directly to `/admin` in the browser but the actor's guards reject that route (because the user is not authenticated), the actor:
76
+
77
+ 1. Receives `{ type: "play.route", to: "/admin" }` from the router bridge.
78
+ 2. Evaluates its guards. The guard fails.
79
+ 3. Does not transition. It remains in its current state (e.g., `/login`).
80
+ 4. `actor.currentRoute` still signals `"/login"`.
81
+ 5. The router bridge, watching `currentRoute`, calls its `navigateRouter("/login")` method.
82
+ 6. The URL bar resets to `/login`.
83
+
84
+ The environment is always made to match actor reality. The router bridge does not need any special "auth guard" logic — the state machine already has it.
85
+
86
+ This is why the invariant is called **State-Driven Reset** in the Play RFC.
87
+
88
+ ---
89
+
90
+ ## `AbstractActor` — the enforced contract
91
+
92
+ `AbstractActor` (from `@xmachines/play-actor`) is the abstract base class that all actor implementations must extend. It extends XState's `Actor`, which means:
93
+
94
+ - XState's inspection API works (`@xstate/inspect`)
95
+ - XState DevTools attach to actors normally
96
+ - The full XState ecosystem (testing utilities, visualization) is compatible
97
+
98
+ `AbstractActor` adds one abstract requirement: a reactive `state` property of type `Signal.State<unknown>`. This is the single point where XState's pull-based snapshot API is bridged to TC39's push-based signal system.
99
+
100
+ The two optional capability interfaces — `Routable` and `Viewable` — are deliberately separate:
101
+
102
+ - Not every actor needs routing (e.g., a background data-sync actor).
103
+ - Not every actor drives a view (e.g., a sub-actor composed inside a parent).
104
+
105
+ An actor implements only the capabilities it actually uses:
106
+
107
+ ```typescript
108
+ // Minimal actor: just reactive state
109
+ class MinimalActor extends AbstractActor<SomeLogic> {
110
+ state = new Signal.State(this.getSnapshot());
111
+ }
112
+
113
+ // Full actor: state + routing + view
114
+ class PlayerActor extends AbstractActor<SomeMachine> implements Routable, Viewable {
115
+ state = new Signal.State(this.getSnapshot());
116
+ currentRoute = new Signal.Computed(() => deriveRoute(this.state.get()));
117
+ currentView = new Signal.State<PlaySpec | null>(null);
118
+ }
119
+ ```
120
+
121
+ In practice you never write `PlayerActor` yourself — `definePlayer` from `@xmachines/play-xstate` creates one from your machine definition.
122
+
123
+ ---
124
+
125
+ ## `definePlayer` — the factory builder
126
+
127
+ `definePlayer({ machine })` is the primary entry point for creating actors:
128
+
129
+ ```typescript
130
+ import { definePlayer } from "@xmachines/play-xstate";
131
+ import { myMachine } from "./machine.js";
132
+
133
+ const createPlayer = definePlayer({ machine: myMachine });
134
+
135
+ // Each call creates an independent actor instance
136
+ const actor = createPlayer();
137
+ actor.start();
138
+ ```
139
+
140
+ `definePlayer` returns a **factory function**, not an actor. This is intentional: it lets you create multiple independent instances (e.g., one per test, one per user session) without re-processing the machine definition each time.
141
+
142
+ The factory accepts optional `input` (initial context overrides) and a `restore` snapshot (for resumable sessions):
143
+
144
+ ```typescript
145
+ const actor = createPlayer({ userId: "abc" }); // with input
146
+ const actor = createPlayer(undefined, { snapshot }); // restored from snapshot
147
+ ```
148
+
149
+ ---
150
+
151
+ ## Why the actor has no framework imports
152
+
153
+ The machine definition — the `setup().createMachine(...)` call — is pure TypeScript with zero runtime dependencies on browsers, routers, or UI frameworks. This is not a convention; it is enforced by the dependency graph.
154
+
155
+ `@xmachines/play-xstate` depends on `xstate` and `@xmachines/play-signals`. It does not depend on React, Vue, any router library, or any browser API. Your machine file inherits those same boundaries.
156
+
157
+ This has concrete practical benefits:
158
+
159
+ - **Portable**: the same machine runs in a browser, a Node.js server, a web worker, and a Vitest test suite — with zero modification.
160
+ - **Testable in isolation**: you test the machine with `actor.send()` and `actor.state.get()`. No DOM, no router, no React to mock.
161
+ - **Replaceable infrastructure**: swap the React renderer for a Vue renderer, or swap TanStack Router for React Router, without touching the machine file.
162
+
163
+ ---
164
+
165
+ ## The lock statement
166
+
167
+ The Play RFC captures the actor/infrastructure split in a single statement:
168
+
169
+ > _Logic is sovereign. Infrastructure reflects, never decides. Capabilities compose, never prescribe. Logic owns structure and flow. Adapters project, never decide. This is Universal Player._
170
+
171
+ ---
172
+
173
+ ## See also
174
+
175
+ - [Understanding TC39 Signals](signals.md) — how the actor communicates with infrastructure
176
+ - [Understanding State Machines](state-machines.md) — how the machine definition drives actor behavior
177
+ - [Getting Started](getting-started.md) — hands-on walkthrough creating and starting an actor
178
+ - [@xmachines/play-actor README](../api/@xmachines/play-actor/README.md) — API reference for `AbstractActor`
179
+ - [@xmachines/play-xstate README](../api/@xmachines/play-xstate/README.md) — API reference for `definePlayer` and `PlayerActor`
180
+ - [Play RFC](../rfc/play.md) — complete architectural specification
@@ -206,10 +206,10 @@ window.addEventListener("beforeunload", () => {
206
206
  });
207
207
  ```
208
208
 
209
- **React** — use `PlayRenderer` from `@xmachines/play-react`:
209
+ **React** — use `PlayUIProvider` + `PlayRenderer` from `@xmachines/play-react`:
210
210
 
211
211
  ```tsx
212
- import { PlayRenderer, defineRegistry } from "@xmachines/play-react";
212
+ import { PlayUIProvider, PlayRenderer, defineRegistry } from "@xmachines/play-react";
213
213
  import { authCatalog } from "@xmachines/play-actor-shared";
214
214
  import { Home, Login } from "./components/index.js";
215
215
 
@@ -222,7 +222,11 @@ const registryResult = defineRegistry(authCatalog, {
222
222
  });
223
223
 
224
224
  function App() {
225
- return <PlayRenderer actor={actor} registryResult={registryResult} />;
225
+ return (
226
+ <PlayUIProvider actor={actor} registryResult={registryResult}>
227
+ <PlayRenderer />
228
+ </PlayUIProvider>
229
+ );
226
230
  }
227
231
  ```
228
232
 
@@ -288,17 +292,17 @@ actor.stop();
288
292
 
289
293
  ## Glossary
290
294
 
291
- | Term | Description |
292
- | ---------------------------- | ------------------------------------------------------------------------------------------------------ |
293
- | `setup({ types })` | XState v5 entry point — declares TypeScript types for context, events, and input |
294
- | `definePlayer({ machine })` | Creates a factory that produces `PlayerActor` instances from the machine |
295
- | `actor.start()` | Activates the machine — always call before sending events |
296
- | `actor.send({ type })` | Sends an event to the machine |
297
- | `actor.getSnapshot()` | Synchronous snapshot of the current state and context |
298
- | `actor.state` | `Signal.State<Snapshot>` — TC39 Signal for reactive state observation |
299
- | `actor.currentRoute` | `Signal.Computed<string \| null>` — resolved URL from the active state's `meta.route` |
300
- | `actor.currentView` | `Signal.State<ViewMetadata \| null>` — view spec from the active state's `meta.view`; drives renderers |
301
- | `formatPlayRouteTransitions` | Utility that generates `play.route` handlers from `id` + `meta.route` state pairs |
295
+ | Term | Description |
296
+ | ---------------------------- | -------------------------------------------------------------------------------------------------- |
297
+ | `setup({ types })` | XState v5 entry point — declares TypeScript types for context, events, and input |
298
+ | `definePlayer({ machine })` | Creates a factory that produces `PlayerActor` instances from the machine |
299
+ | `actor.start()` | Activates the machine — always call before sending events |
300
+ | `actor.send({ type })` | Sends an event to the machine |
301
+ | `actor.getSnapshot()` | Synchronous snapshot of the current state and context |
302
+ | `actor.state` | `Signal.State<Snapshot>` — TC39 Signal for reactive state observation |
303
+ | `actor.currentRoute` | `Signal.Computed<string \| null>` — resolved URL from the active state's `meta.route` |
304
+ | `actor.currentView` | `Signal.State<PlaySpec \| null>` — view spec from the active state's `meta.view`; drives renderers |
305
+ | `formatPlayRouteTransitions` | Utility that generates `play.route` handlers from `id` + `meta.route` state pairs |
302
306
 
303
307
  ## Next Steps
304
308