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

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 (391) 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 +18 -19
  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 +102 -18
  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 -23
  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/README.md +3 -3
  44. package/api/@xmachines/play-dom-router/functions/connectRouter.md +1 -1
  45. package/api/@xmachines/play-dom-router/functions/createBrowserHistory.md +1 -1
  46. package/api/@xmachines/play-dom-router/functions/createRouteMap.md +3 -3
  47. package/api/@xmachines/play-dom-router/functions/createRouter.md +1 -1
  48. package/api/@xmachines/play-dom-router/interfaces/BrowserHistory.md +14 -14
  49. package/api/@xmachines/play-dom-router/interfaces/BrowserWindow.md +14 -14
  50. package/api/@xmachines/play-dom-router/interfaces/ConnectRouterOptions.md +4 -4
  51. package/api/@xmachines/play-dom-router/interfaces/PlayRouteEvent.md +6 -6
  52. package/api/@xmachines/play-dom-router/interfaces/{RouteMapLike.md → RouteLookupContract.md} +7 -7
  53. package/api/@xmachines/play-dom-router/interfaces/RouteMap.md +6 -11
  54. package/api/@xmachines/play-dom-router/interfaces/RouteMapping.md +8 -8
  55. package/api/@xmachines/play-dom-router/interfaces/RouterBridge.md +3 -3
  56. package/api/@xmachines/play-dom-router/interfaces/VanillaRouter.md +4 -4
  57. package/api/@xmachines/play-dom-router/type-aliases/RoutableActor.md +1 -1
  58. package/api/@xmachines/play-react/README.md +165 -48
  59. package/api/@xmachines/play-react/classes/PlayErrorBoundary.md +5 -5
  60. package/api/@xmachines/play-react/functions/ActionProvider.md +21 -0
  61. package/api/@xmachines/play-react/functions/JSONUIProvider.md +21 -0
  62. package/api/@xmachines/play-react/functions/Renderer.md +21 -0
  63. package/api/@xmachines/play-react/functions/StateProvider.md +27 -0
  64. package/api/@xmachines/play-react/functions/ValidationProvider.md +21 -0
  65. package/api/@xmachines/play-react/functions/VisibilityProvider.md +21 -0
  66. package/api/@xmachines/play-react/functions/useActor.md +1 -1
  67. package/api/@xmachines/play-react/functions/usePlayView.md +32 -0
  68. package/api/@xmachines/play-react/functions/useSignalEffect.md +1 -1
  69. package/api/@xmachines/play-react/interfaces/ActionProviderProps.md +15 -0
  70. package/api/@xmachines/play-react/interfaces/ActorProviderProps.md +27 -0
  71. package/api/@xmachines/play-react/interfaces/JSONUIProviderProps.md +21 -0
  72. package/api/@xmachines/play-react/interfaces/PlayErrorBoundaryProps.md +4 -4
  73. package/api/@xmachines/play-react/interfaces/PlayErrorBoundaryState.md +3 -3
  74. package/api/@xmachines/play-react/interfaces/PlayUIProviderProps.md +26 -0
  75. package/api/@xmachines/play-react/interfaces/RendererProps.md +17 -0
  76. package/api/@xmachines/play-react/interfaces/StateProviderProps.md +16 -0
  77. package/api/@xmachines/play-react/interfaces/ValidationProviderProps.md +14 -0
  78. package/api/@xmachines/play-react/interfaces/ViewContextValue.md +20 -0
  79. package/api/@xmachines/play-react/interfaces/VisibilityProviderProps.md +13 -0
  80. package/api/@xmachines/play-react/type-aliases/PlayActor.md +1 -1
  81. package/api/@xmachines/play-react/type-aliases/RenderErrorHandler.md +3 -2
  82. package/api/@xmachines/play-react/variables/ActorProvider.md +33 -0
  83. package/api/@xmachines/play-react/variables/PlayRenderer.md +5 -50
  84. package/api/@xmachines/play-react/variables/PlayUIProvider.md +43 -0
  85. package/api/@xmachines/play-react-router/README.md +1 -0
  86. package/api/@xmachines/play-react-router/classes/ReactRouterBridge.md +24 -24
  87. package/api/@xmachines/play-react-router/classes/RouteMap.md +38 -22
  88. package/api/@xmachines/play-react-router/functions/PlayRouterProvider.md +1 -1
  89. package/api/@xmachines/play-react-router/functions/createRouteMap.md +21 -0
  90. package/api/@xmachines/play-react-router/functions/createRouteMapFromTree.md +5 -5
  91. package/api/@xmachines/play-react-router/interfaces/PlayRouteEvent.md +6 -6
  92. package/api/@xmachines/play-react-router/interfaces/PlayRouterProviderProps.md +5 -5
  93. package/api/@xmachines/play-react-router/interfaces/RouteMapping.md +8 -8
  94. package/api/@xmachines/play-react-router/interfaces/RouterBridge.md +3 -3
  95. package/api/@xmachines/play-router/README.md +6 -6
  96. package/api/@xmachines/play-router/classes/{BaseRouteMap.md → RouteMap.md} +11 -11
  97. package/api/@xmachines/play-router/classes/RouterBridgeBase.md +24 -24
  98. package/api/@xmachines/play-router/functions/buildPlayRouteEvent.md +2 -2
  99. package/api/@xmachines/play-router/functions/buildRouteTree.md +1 -1
  100. package/api/@xmachines/play-router/functions/createRouteMap.md +6 -6
  101. package/api/@xmachines/play-router/functions/createRouteMapFromMachine.md +5 -5
  102. package/api/@xmachines/play-router/functions/createRouteMapFromTree.md +6 -6
  103. package/api/@xmachines/play-router/functions/detectDuplicateRoutes.md +1 -1
  104. package/api/@xmachines/play-router/functions/extractMachineRoutes.md +1 -1
  105. package/api/@xmachines/play-router/functions/extractQuery.md +1 -1
  106. package/api/@xmachines/play-router/functions/extractRouteParams.md +1 -1
  107. package/api/@xmachines/play-router/functions/findRouteById.md +1 -1
  108. package/api/@xmachines/play-router/functions/findRouteByPath.md +1 -1
  109. package/api/@xmachines/play-router/functions/getNavigableRoutes.md +1 -1
  110. package/api/@xmachines/play-router/functions/getRoutableRoutes.md +1 -1
  111. package/api/@xmachines/play-router/functions/getTransitionReachableRoutes.md +1 -1
  112. package/api/@xmachines/play-router/functions/isRouteReachable.md +1 -1
  113. package/api/@xmachines/play-router/functions/machineToGraph.md +1 -1
  114. package/api/@xmachines/play-router/functions/routeExists.md +1 -1
  115. package/api/@xmachines/play-router/functions/sanitizePathname.md +1 -1
  116. package/api/@xmachines/play-router/functions/validateRouteFormat.md +1 -1
  117. package/api/@xmachines/play-router/functions/validateStateExists.md +1 -1
  118. package/api/@xmachines/play-router/interfaces/BuildPlayRouteEventOptions.md +4 -4
  119. package/api/@xmachines/play-router/interfaces/LocationLike.md +3 -3
  120. package/api/@xmachines/play-router/interfaces/MachineEdgeData.md +3 -3
  121. package/api/@xmachines/play-router/interfaces/MachineNodeData.md +5 -5
  122. package/api/@xmachines/play-router/interfaces/PlayRouteEvent.md +6 -6
  123. package/api/@xmachines/play-router/interfaces/RouteInfo.md +8 -8
  124. package/api/@xmachines/play-router/interfaces/RouteMapping.md +8 -8
  125. package/api/@xmachines/play-router/interfaces/RouteMatch.md +3 -3
  126. package/api/@xmachines/play-router/interfaces/{RouteMap.md → RouteMatcher.md} +13 -13
  127. package/api/@xmachines/play-router/interfaces/RouteNode.md +10 -10
  128. package/api/@xmachines/play-router/interfaces/RouteObject.md +2 -2
  129. package/api/@xmachines/play-router/interfaces/RouteTree.md +5 -5
  130. package/api/@xmachines/play-router/interfaces/RouteWatcherHandle.md +3 -3
  131. package/api/@xmachines/play-router/interfaces/RouterBridge.md +3 -3
  132. package/api/@xmachines/play-router/interfaces/WindowLike.md +3 -3
  133. package/api/@xmachines/play-router/type-aliases/MachineGraph.md +1 -1
  134. package/api/@xmachines/play-router/type-aliases/RouteMetadata.md +1 -1
  135. package/api/@xmachines/play-signals/functions/watchSignal.md +1 -1
  136. package/api/@xmachines/play-signals/interfaces/ComputedOptions.md +2 -2
  137. package/api/@xmachines/play-signals/interfaces/SignalComputed.md +2 -2
  138. package/api/@xmachines/play-signals/interfaces/SignalOptions.md +2 -2
  139. package/api/@xmachines/play-signals/interfaces/SignalState.md +3 -3
  140. package/api/@xmachines/play-signals/interfaces/SignalWatcher.md +4 -4
  141. package/api/@xmachines/play-signals/type-aliases/WatcherNotify.md +1 -1
  142. package/api/@xmachines/play-solid/README.md +158 -42
  143. package/api/@xmachines/play-solid/functions/ActionProvider.md +19 -0
  144. package/api/@xmachines/play-solid/functions/JSONUIProvider.md +21 -0
  145. package/api/@xmachines/play-solid/functions/Renderer.md +21 -0
  146. package/api/@xmachines/play-solid/functions/StateProvider.md +19 -0
  147. package/api/@xmachines/play-solid/functions/ValidationProvider.md +19 -0
  148. package/api/@xmachines/play-solid/functions/VisibilityProvider.md +20 -0
  149. package/api/@xmachines/play-solid/functions/defineRegistry.md +1 -1
  150. package/api/@xmachines/play-solid/functions/useAction.md +24 -0
  151. package/api/@xmachines/play-solid/functions/useActions.md +13 -0
  152. package/api/@xmachines/play-solid/functions/useActor.md +1 -1
  153. package/api/@xmachines/play-solid/functions/useFieldValidation.md +29 -0
  154. package/api/@xmachines/play-solid/functions/useIsVisible.md +19 -0
  155. package/api/@xmachines/play-solid/functions/useOptionalValidation.md +13 -0
  156. package/api/@xmachines/play-solid/functions/usePlayView.md +30 -0
  157. package/api/@xmachines/play-solid/functions/useStateBinding.md +25 -0
  158. package/api/@xmachines/play-solid/functions/useStateStore.md +13 -0
  159. package/api/@xmachines/play-solid/functions/useStateValue.md +25 -0
  160. package/api/@xmachines/play-solid/functions/useVisibility.md +13 -0
  161. package/api/@xmachines/play-solid/interfaces/ActionProviderProps.md +12 -0
  162. package/api/@xmachines/play-solid/interfaces/ActorProviderProps.md +30 -0
  163. package/api/@xmachines/play-solid/interfaces/DefineRegistryResult.md +15 -0
  164. package/api/@xmachines/play-solid/interfaces/JSONUIProviderProps.md +21 -0
  165. package/api/@xmachines/play-solid/interfaces/PlayUIProviderProps.md +26 -0
  166. package/api/@xmachines/play-solid/interfaces/RendererProps.md +17 -0
  167. package/api/@xmachines/play-solid/interfaces/StateProviderProps.md +13 -0
  168. package/api/@xmachines/play-solid/interfaces/ValidationProviderProps.md +11 -0
  169. package/api/@xmachines/play-solid/interfaces/ViewContextValue.md +21 -0
  170. package/api/@xmachines/play-solid/type-aliases/ComponentRegistry.md +17 -0
  171. package/api/@xmachines/play-solid/type-aliases/PlayActor.md +1 -1
  172. package/api/@xmachines/play-solid/type-aliases/RenderErrorHandler.md +3 -2
  173. package/api/@xmachines/play-solid/type-aliases/SetState.md +21 -0
  174. package/api/@xmachines/play-solid/type-aliases/VisibilityProviderProps.md +9 -0
  175. package/api/@xmachines/play-solid/variables/ActorContext.md +13 -0
  176. package/api/@xmachines/play-solid/variables/ActorProvider.md +27 -0
  177. package/api/@xmachines/play-solid/variables/PlayRenderer.md +5 -18
  178. package/api/@xmachines/play-solid/variables/PlayUIProvider.md +26 -0
  179. package/api/@xmachines/play-solid-router/README.md +2 -2
  180. package/api/@xmachines/play-solid-router/classes/RouteMap.md +9 -9
  181. package/api/@xmachines/play-solid-router/classes/SolidRouterBridge.md +25 -25
  182. package/api/@xmachines/play-solid-router/functions/PlayRouterProvider.md +1 -1
  183. package/api/@xmachines/play-solid-router/functions/createRouteMap.md +3 -3
  184. package/api/@xmachines/play-solid-router/interfaces/AbstractActor.md +3 -3
  185. package/api/@xmachines/play-solid-router/interfaces/PlayRouteEvent.md +6 -6
  186. package/api/@xmachines/play-solid-router/interfaces/PlayRouterProviderProps.md +5 -5
  187. package/api/@xmachines/play-solid-router/interfaces/RouteMapping.md +8 -8
  188. package/api/@xmachines/play-solid-router/interfaces/RouterBridge.md +3 -3
  189. package/api/@xmachines/play-solid-router/type-aliases/RoutableActor.md +1 -1
  190. package/api/@xmachines/play-solid-router/type-aliases/SolidRouterHooks.md +4 -4
  191. package/api/@xmachines/play-svelte/README.md +105 -25
  192. package/api/@xmachines/play-svelte/functions/defineRegistry.md +1 -1
  193. package/api/@xmachines/play-svelte/functions/getActorContext.md +21 -0
  194. package/api/@xmachines/play-svelte/functions/getPlayViewContext.md +19 -0
  195. package/api/@xmachines/play-svelte/functions/setActorContext.md +19 -0
  196. package/api/@xmachines/play-svelte/interfaces/ActorProviderProps.md +40 -0
  197. package/api/@xmachines/play-svelte/interfaces/DefineRegistryOptions.md +6 -6
  198. package/api/@xmachines/play-svelte/interfaces/ViewContextValue.md +24 -0
  199. package/api/@xmachines/play-svelte/type-aliases/PlayActor.md +9 -0
  200. package/api/@xmachines/play-svelte/type-aliases/RenderErrorHandler.md +1 -17
  201. package/api/@xmachines/play-svelte-spa-router/classes/RouteMap.md +9 -9
  202. package/api/@xmachines/play-svelte-spa-router/functions/connectRouter.md +1 -1
  203. package/api/@xmachines/play-svelte-spa-router/functions/createRouteMap.md +3 -3
  204. package/api/@xmachines/play-svelte-spa-router/interfaces/ConnectRouterOptions.md +4 -4
  205. package/api/@xmachines/play-svelte-spa-router/interfaces/PlayRouteEvent.md +6 -6
  206. package/api/@xmachines/play-svelte-spa-router/interfaces/RouteMapping.md +8 -8
  207. package/api/@xmachines/play-svelte-spa-router/interfaces/RouterBridge.md +3 -3
  208. package/api/@xmachines/play-svelte-spa-router/interfaces/WindowLike.md +3 -3
  209. package/api/@xmachines/play-svelte-spa-router/type-aliases/RoutableActor.md +1 -1
  210. package/api/@xmachines/play-sveltekit-router/classes/RouteMap.md +9 -9
  211. package/api/@xmachines/play-sveltekit-router/functions/connectRouter.md +1 -1
  212. package/api/@xmachines/play-sveltekit-router/functions/createRouteMap.md +3 -3
  213. package/api/@xmachines/play-sveltekit-router/interfaces/ConnectRouterOptions.md +4 -4
  214. package/api/@xmachines/play-sveltekit-router/interfaces/LocationLike.md +3 -3
  215. package/api/@xmachines/play-sveltekit-router/interfaces/PlayRouteEvent.md +6 -6
  216. package/api/@xmachines/play-sveltekit-router/interfaces/RouteMapping.md +8 -8
  217. package/api/@xmachines/play-sveltekit-router/interfaces/RouterBridge.md +3 -3
  218. package/api/@xmachines/play-sveltekit-router/type-aliases/RoutableActor.md +1 -1
  219. package/api/@xmachines/play-tanstack-react-router/README.md +1 -1
  220. package/api/@xmachines/play-tanstack-react-router/classes/RouteMap.md +38 -22
  221. package/api/@xmachines/play-tanstack-react-router/classes/TanStackReactRouterBridge.md +24 -24
  222. package/api/@xmachines/play-tanstack-react-router/functions/PlayRouterProvider.md +1 -1
  223. package/api/@xmachines/play-tanstack-react-router/functions/createRouteMap.md +7 -39
  224. package/api/@xmachines/play-tanstack-react-router/functions/createRouteMapFromTree.md +5 -5
  225. package/api/@xmachines/play-tanstack-react-router/functions/extractMachineRoutes.md +1 -1
  226. package/api/@xmachines/play-tanstack-react-router/interfaces/PlayRouteEvent.md +6 -6
  227. package/api/@xmachines/play-tanstack-react-router/interfaces/PlayRouterProviderProps.md +5 -5
  228. package/api/@xmachines/play-tanstack-react-router/interfaces/RouteMapping.md +8 -8
  229. package/api/@xmachines/play-tanstack-react-router/interfaces/RouteNavigateEvent.md +3 -3
  230. package/api/@xmachines/play-tanstack-react-router/interfaces/RouterBridge.md +3 -3
  231. package/api/@xmachines/play-tanstack-react-router/type-aliases/TanStackRouterInstance.md +1 -1
  232. package/api/@xmachines/play-tanstack-react-router/type-aliases/TanStackRouterLike.md +4 -4
  233. package/api/@xmachines/play-tanstack-solid-router/README.md +1 -1
  234. package/api/@xmachines/play-tanstack-solid-router/classes/RouteMap.md +9 -9
  235. package/api/@xmachines/play-tanstack-solid-router/classes/SolidRouterBridge.md +25 -25
  236. package/api/@xmachines/play-tanstack-solid-router/functions/PlayRouterProvider.md +1 -1
  237. package/api/@xmachines/play-tanstack-solid-router/functions/createRouteMap.md +3 -3
  238. package/api/@xmachines/play-tanstack-solid-router/interfaces/PlayRouteEvent.md +6 -6
  239. package/api/@xmachines/play-tanstack-solid-router/interfaces/PlayRouterProviderProps.md +5 -5
  240. package/api/@xmachines/play-tanstack-solid-router/interfaces/RouteMapping.md +8 -8
  241. package/api/@xmachines/play-tanstack-solid-router/interfaces/RouterBridge.md +3 -3
  242. package/api/@xmachines/play-tanstack-solid-router/type-aliases/RoutableActor.md +1 -1
  243. package/api/@xmachines/play-tanstack-solid-router/type-aliases/TanStackRouterInstance.md +1 -1
  244. package/api/@xmachines/play-tanstack-solid-router/type-aliases/TanStackRouterLike.md +3 -3
  245. package/api/@xmachines/play-vue/README.md +136 -40
  246. package/api/@xmachines/play-vue/functions/defineRegistry.md +2 -2
  247. package/api/@xmachines/play-vue/functions/getPlayViewContext.md +28 -0
  248. package/api/@xmachines/play-vue/functions/useActor.md +1 -1
  249. package/api/@xmachines/play-vue/interfaces/ActionProviderProps.md +12 -0
  250. package/api/@xmachines/play-vue/interfaces/ActorProviderProps.md +25 -0
  251. package/api/@xmachines/play-vue/interfaces/DefineRegistryResult.md +15 -0
  252. package/api/@xmachines/play-vue/interfaces/JSONUIProviderProps.md +20 -0
  253. package/api/@xmachines/play-vue/interfaces/PlayUIProviderProps.md +24 -0
  254. package/api/@xmachines/play-vue/interfaces/RendererProps.md +17 -0
  255. package/api/@xmachines/play-vue/interfaces/StateProviderProps.md +15 -0
  256. package/api/@xmachines/play-vue/interfaces/ValidationProviderProps.md +11 -0
  257. package/api/@xmachines/play-vue/interfaces/ViewContextValue.md +21 -0
  258. package/api/@xmachines/play-vue/type-aliases/ComponentEntry.md +1 -1
  259. package/api/@xmachines/play-vue/type-aliases/ComponentsMap.md +1 -1
  260. package/api/@xmachines/play-vue/type-aliases/DefineRegistryOptions.md +2 -2
  261. package/api/@xmachines/play-vue/type-aliases/PlayActor.md +1 -1
  262. package/api/@xmachines/play-vue/type-aliases/RenderErrorHandler.md +3 -2
  263. package/api/@xmachines/play-vue/variables/ActionProvider.md +64 -0
  264. package/api/@xmachines/play-vue/variables/JSONUIProvider.md +96 -0
  265. package/api/@xmachines/play-vue/variables/PlayRenderer.md +1 -1
  266. package/api/@xmachines/play-vue/variables/Renderer.md +79 -0
  267. package/api/@xmachines/play-vue/variables/StateProvider.md +79 -0
  268. package/api/@xmachines/play-vue/variables/ValidationProvider.md +55 -0
  269. package/api/@xmachines/play-vue/variables/VisibilityProvider.md +40 -0
  270. package/api/@xmachines/play-vue-router/README.md +9 -4
  271. package/api/@xmachines/play-vue-router/classes/RouteMap.md +38 -20
  272. package/api/@xmachines/play-vue-router/classes/VueRouterBridge.md +25 -25
  273. package/api/@xmachines/play-vue-router/functions/createRouteMap.md +1 -1
  274. package/api/@xmachines/play-vue-router/interfaces/PlayRouteEvent.md +6 -6
  275. package/api/@xmachines/play-vue-router/interfaces/RouteMapping.md +8 -8
  276. package/api/@xmachines/play-vue-router/interfaces/RouterBridge.md +3 -3
  277. package/api/@xmachines/play-vue-router/type-aliases/RoutableActor.md +1 -1
  278. package/api/@xmachines/play-vue-router/variables/PlayRouterProvider.md +1 -1
  279. package/api/@xmachines/play-xstate/README.md +1 -1
  280. package/api/@xmachines/play-xstate/classes/PlayerActor.md +26 -26
  281. package/api/@xmachines/play-xstate/functions/buildRouteUrl.md +1 -1
  282. package/api/@xmachines/play-xstate/functions/composeGuards.md +1 -1
  283. package/api/@xmachines/play-xstate/functions/composeGuardsOr.md +1 -1
  284. package/api/@xmachines/play-xstate/functions/contextFieldMatches.md +1 -1
  285. package/api/@xmachines/play-xstate/functions/definePlayer.md +1 -1
  286. package/api/@xmachines/play-xstate/functions/deriveRoute.md +1 -1
  287. package/api/@xmachines/play-xstate/functions/eventMatches.md +1 -1
  288. package/api/@xmachines/play-xstate/functions/formatPlayRouteTransitions.md +1 -1
  289. package/api/@xmachines/play-xstate/functions/hasContext.md +1 -1
  290. package/api/@xmachines/play-xstate/functions/isAbsoluteRoute.md +1 -1
  291. package/api/@xmachines/play-xstate/functions/negateGuard.md +1 -1
  292. package/api/@xmachines/play-xstate/interfaces/PlayerConfig.md +3 -3
  293. package/api/@xmachines/play-xstate/interfaces/PlayerFactoryResumeOptions.md +2 -2
  294. package/api/@xmachines/play-xstate/interfaces/PlayerOptions.md +6 -6
  295. package/api/@xmachines/play-xstate/interfaces/RouteContext.md +5 -5
  296. package/api/@xmachines/play-xstate/type-aliases/ComposedGuard.md +1 -1
  297. package/api/@xmachines/play-xstate/type-aliases/Guard.md +1 -1
  298. package/api/@xmachines/play-xstate/type-aliases/GuardArray.md +1 -1
  299. package/api/@xmachines/play-xstate/type-aliases/PlayerFactory.md +1 -1
  300. package/api/@xmachines/play-xstate/type-aliases/RouteMachineConfig.md +4 -4
  301. package/api/@xmachines/play-xstate/type-aliases/RouteStateNode.md +4 -4
  302. package/api/@xmachines/shared/README.md +47 -47
  303. package/api/@xmachines/shared/functions/defineXmVitestConfig.md +1 -1
  304. package/api/@xmachines/shared/functions/xmAliases.md +1 -1
  305. package/api/llms.txt +4 -2
  306. package/examples/@xmachines/play-dom-demo/README.md +44 -24
  307. package/examples/@xmachines/play-dom-demo/functions/createNavBar.md +4 -3
  308. package/examples/@xmachines/play-dom-demo/functions/initShell.md +5 -1
  309. package/examples/@xmachines/play-dom-demo/type-aliases/AuthCatalog.md +1 -1
  310. package/examples/@xmachines/play-dom-demo/variables/About.md +4 -1
  311. package/examples/@xmachines/play-dom-demo/variables/Contact.md +4 -1
  312. package/examples/@xmachines/play-dom-demo/variables/Dashboard.md +5 -1
  313. package/examples/@xmachines/play-dom-demo/variables/Home.md +5 -1
  314. package/examples/@xmachines/play-dom-demo/variables/Login.md +5 -1
  315. package/examples/@xmachines/play-dom-demo/variables/NavBarView.md +8 -1
  316. package/examples/@xmachines/play-dom-demo/variables/Navigation.md +5 -1
  317. package/examples/@xmachines/play-dom-demo/variables/Overview.md +5 -1
  318. package/examples/@xmachines/play-dom-demo/variables/Profile.md +5 -1
  319. package/examples/@xmachines/play-dom-demo/variables/Settings.md +5 -1
  320. package/examples/@xmachines/play-dom-demo/variables/Stats.md +5 -1
  321. package/examples/@xmachines/play-dom-demo/variables/authCatalog.md +1 -1
  322. package/examples/@xmachines/play-dom-router-demo/README.md +26 -22
  323. package/examples/@xmachines/play-react-demo/README.md +55 -48
  324. package/examples/@xmachines/play-react-demo/functions/App.md +1 -1
  325. package/examples/@xmachines/play-react-demo/type-aliases/AuthCatalog.md +1 -1
  326. package/examples/@xmachines/play-react-demo/variables/About.md +6 -1
  327. package/examples/@xmachines/play-react-demo/variables/Contact.md +6 -1
  328. package/examples/@xmachines/play-react-demo/variables/Dashboard.md +7 -1
  329. package/examples/@xmachines/play-react-demo/variables/DebugPanel.md +5 -1
  330. package/examples/@xmachines/play-react-demo/variables/Home.md +6 -1
  331. package/examples/@xmachines/play-react-demo/variables/Login.md +8 -1
  332. package/examples/@xmachines/play-react-demo/variables/NavBar.md +6 -1
  333. package/examples/@xmachines/play-react-demo/variables/NavBarView.md +7 -1
  334. package/examples/@xmachines/play-react-demo/variables/Navigation.md +6 -1
  335. package/examples/@xmachines/play-react-demo/variables/Overview.md +6 -1
  336. package/examples/@xmachines/play-react-demo/variables/Profile.md +6 -1
  337. package/examples/@xmachines/play-react-demo/variables/Settings.md +6 -1
  338. package/examples/@xmachines/play-react-demo/variables/Shell.md +6 -1
  339. package/examples/@xmachines/play-react-demo/variables/Stats.md +6 -1
  340. package/examples/@xmachines/play-react-demo/variables/authCatalog.md +1 -1
  341. package/examples/@xmachines/play-react-router-demo/README.md +5 -3
  342. package/examples/@xmachines/play-solid-demo/README.md +55 -36
  343. package/examples/@xmachines/play-solid-demo/functions/App.md +1 -1
  344. package/examples/@xmachines/play-solid-demo/type-aliases/AuthCatalog.md +1 -1
  345. package/examples/@xmachines/play-solid-demo/variables/About.md +1 -1
  346. package/examples/@xmachines/play-solid-demo/variables/Contact.md +1 -1
  347. package/examples/@xmachines/play-solid-demo/variables/Dashboard.md +1 -1
  348. package/examples/@xmachines/play-solid-demo/variables/DebugPanel.md +5 -1
  349. package/examples/@xmachines/play-solid-demo/variables/Home.md +1 -1
  350. package/examples/@xmachines/play-solid-demo/variables/Login.md +1 -1
  351. package/examples/@xmachines/play-solid-demo/variables/NavBar.md +1 -1
  352. package/examples/@xmachines/play-solid-demo/variables/NavBarView.md +6 -3
  353. package/examples/@xmachines/play-solid-demo/variables/Navigation.md +1 -1
  354. package/examples/@xmachines/play-solid-demo/variables/Overview.md +1 -1
  355. package/examples/@xmachines/play-solid-demo/variables/Profile.md +1 -1
  356. package/examples/@xmachines/play-solid-demo/variables/Settings.md +1 -1
  357. package/examples/@xmachines/play-solid-demo/variables/Shell.md +5 -1
  358. package/examples/@xmachines/play-solid-demo/variables/Stats.md +1 -1
  359. package/examples/@xmachines/play-solid-demo/variables/authCatalog.md +1 -1
  360. package/examples/@xmachines/play-solid-router-demo/README.md +6 -4
  361. package/examples/@xmachines/play-svelte-demo/README.md +34 -21
  362. package/examples/@xmachines/play-svelte-demo/type-aliases/App.md +9 -0
  363. package/examples/@xmachines/play-svelte-demo/type-aliases/AuthCatalog.md +9 -0
  364. package/examples/@xmachines/play-svelte-demo/variables/App.md +9 -0
  365. package/examples/@xmachines/play-svelte-demo/variables/authCatalog.md +172 -0
  366. package/examples/@xmachines/play-svelte-spa-router-demo/README.md +10 -12
  367. package/examples/@xmachines/play-sveltekit-router-demo/README.md +12 -14
  368. package/examples/@xmachines/play-tanstack-react-router-demo/README.md +3 -3
  369. package/examples/@xmachines/play-tanstack-solid-router-demo/README.md +4 -4
  370. package/examples/@xmachines/play-vue-demo/README.md +66 -39
  371. package/examples/@xmachines/play-vue-demo/type-aliases/AuthCatalog.md +9 -0
  372. package/examples/@xmachines/play-vue-demo/variables/App.md +9 -0
  373. package/examples/@xmachines/play-vue-demo/variables/authCatalog.md +172 -0
  374. package/examples/@xmachines/play-vue-router-demo/README.md +21 -24
  375. package/examples/README.md +2 -0
  376. package/examples/form-validation.md +33 -42
  377. package/guides/README.md +8 -0
  378. package/guides/actor-model.md +180 -0
  379. package/guides/getting-started.md +18 -14
  380. package/guides/signals.md +166 -0
  381. package/guides/state-machines.md +288 -0
  382. package/package.json +2 -2
  383. package/rfc/play.md +81 -54
  384. package/api/@xmachines/play-actor/interfaces/ViewMetadata.md +0 -17
  385. package/api/@xmachines/play-react/interfaces/PlayRendererProps.md +0 -24
  386. package/api/@xmachines/play-solid/interfaces/PlayRendererProps.md +0 -24
  387. package/api/@xmachines/play-svelte/interfaces/PlayRendererProps.md +0 -22
  388. package/api/@xmachines/play-svelte/variables/getBoundProp.md +0 -7
  389. package/api/@xmachines/play-vue/interfaces/PlayRendererProps.md +0 -22
  390. package/api/@xmachines/play-vue-router/classes/VueBaseRouteMap.md +0 -141
  391. package/api/_media/README.md +0 -321
@@ -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
 
@@ -0,0 +1,166 @@
1
+ # Understanding TC39 Signals in XMachines
2
+
3
+ TC39 Signals are the reactive substrate connecting actors to the outside world in XMachines. This page explains what they are, why XMachines uses them instead of observables or callbacks, and how the three Signal primitives map to distinct roles in the architecture.
4
+
5
+ After reading this, you will understand why infrastructure never reads state directly from an actor — and what it does instead.
6
+
7
+ ---
8
+
9
+ ## What problem Signals solve
10
+
11
+ When a state machine transitions, several things may need to react: the URL bar might update, a router might navigate, a renderer might swap views. The naive approach is to let each of those consumers call `actor.getSnapshot()` whenever they feel like it — or to have the actor call back into each consumer via callbacks.
12
+
13
+ Both approaches break down:
14
+
15
+ - **Polling** (`getSnapshot()` on a timer or event) is racy: consumers can observe inconsistent intermediate states during a transition sequence.
16
+ - **Callbacks** create direct dependencies between the actor and infrastructure, violating the architectural invariant that business logic must not depend on runtime APIs.
17
+
18
+ TC39 Signals solve this with a **push–pull model**:
19
+
20
+ - The actor **pushes** state changes into signals synchronously on every transition.
21
+ - Consumers **pull** computed values lazily from signals — only when they actually need the value.
22
+ - Changes propagate **atomically**, so no consumer ever sees a half-updated state.
23
+
24
+ This model is sometimes called _glitch-free reactivity_: intermediate invalid states never escape to the environment.
25
+
26
+ ---
27
+
28
+ ## The three Signal primitives
29
+
30
+ XMachines uses three primitives from the [TC39 Signals proposal](https://github.com/tc39/proposal-signals), accessed via `@xmachines/play-signals`:
31
+
32
+ ### `Signal.State` — writable values
33
+
34
+ `Signal.State<T>` holds a single mutable value. Only the actor (or code it explicitly delegates to) writes to it. Everything else reads from it.
35
+
36
+ ```typescript
37
+ import { Signal } from "@xmachines/play-signals";
38
+
39
+ const count = new Signal.State(0);
40
+
41
+ count.set(1); // write
42
+ count.get(); // read → 1
43
+ ```
44
+
45
+ In XMachines, `actor.state` is a `Signal.State<Snapshot>`. The actor updates it on every XState transition. Infrastructure reads it — never writes it.
46
+
47
+ ### `Signal.Computed` — derived values
48
+
49
+ `Signal.Computed<T>` derives a value from one or more other signals. It recomputes only when its dependencies change — and only when something reads it (lazy evaluation).
50
+
51
+ ```typescript
52
+ const route = new Signal.Computed(() => {
53
+ const snapshot = actor.state.get();
54
+ return snapshot.getMeta()?.route ?? null;
55
+ });
56
+ ```
57
+
58
+ In XMachines, `actor.currentRoute` is a `Signal.Computed<string | null>`. Router adapters read it to know which URL to push — they do not compute the route themselves. Route derivation stays in the actor where the business logic lives.
59
+
60
+ ### `Signal.subtle.Watcher` — reactive observation
61
+
62
+ `Signal.subtle.Watcher` is the low-level primitive for reacting to signal changes. When a watched signal's value changes, the watcher's `notify` callback fires synchronously. You then schedule the actual work with `queueMicrotask` to avoid re-entrant signal reads.
63
+
64
+ ```typescript
65
+ const watcher = new Signal.subtle.Watcher(() => {
66
+ queueMicrotask(() => {
67
+ const pending = watcher.getPending();
68
+ for (const signal of pending) {
69
+ signal.get(); // re-read to flush
70
+ }
71
+ watcher.watch(...pending); // re-arm for next change
72
+ });
73
+ });
74
+
75
+ watcher.watch(actor.currentRoute);
76
+ actor.currentRoute.get(); // initial read required to arm the watcher
77
+ ```
78
+
79
+ Watcher notifications are **one-shot**: if you do not call `watch()` again after draining pending signals, you will miss subsequent changes.
80
+
81
+ Router bridges and renderers use `Signal.subtle.Watcher` internally. For most application code, the `watchSignal()` helper covers the common case.
82
+
83
+ ---
84
+
85
+ ## `watchSignal()` — the safe helper
86
+
87
+ `@xmachines/play-signals` exports `watchSignal(signal, onValue)` as a lifecycle-safe wrapper around the raw watcher pattern. It returns a cleanup function:
88
+
89
+ ```typescript
90
+ import { watchSignal } from "@xmachines/play-signals";
91
+
92
+ const stop = watchSignal(actor.currentRoute, (route) => {
93
+ console.log("Route is now:", route);
94
+ });
95
+
96
+ // Later — stops observing and prevents use-after-free
97
+ stop();
98
+ ```
99
+
100
+ `watchSignal()` handles three subtle correctness concerns for you:
101
+
102
+ | Concern | What happens without it | How `watchSignal` handles it |
103
+ | ---------------------- | -------------------------------------------------- | ---------------------------------------------------------------------- |
104
+ | **Use-after-free** | Callback fires after component unmounts | `disposed` flag checked before invoking callback |
105
+ | **Coalescing** | Rapid synchronous changes cause multiple callbacks | `needsEnqueue` guard — only one microtask queued per synchronous burst |
106
+ | **Idempotent cleanup** | Calling the cleanup twice throws | Safe to call multiple times |
107
+
108
+ Use `watchSignal()` in framework adapters and application code. Use the raw `Signal.subtle.Watcher` only when building infrastructure that needs to watch multiple signals independently.
109
+
110
+ ---
111
+
112
+ ## Why not observables (RxJS) or event emitters?
113
+
114
+ The XMachines architecture chose TC39 Signals over observable libraries and event emitters for three reasons:
115
+
116
+ **1. Standardization.** Signals are a Stage 1 TC39 proposal. They are not tied to any library, bundler, or framework. Isolating the polyfill behind `@xmachines/play-signals` means the entire ecosystem can migrate to native signals when the proposal lands, with a single package update.
117
+
118
+ **2. Synchronous atomic propagation.** RxJS streams are asynchronous by default. Event emitters fire immediately but serially — a listener registered halfway through a sequence can see inconsistent state. Signals propagate atomically: all computeds update before any watcher fires.
119
+
120
+ **3. Pull-based evaluation.** Observables push values to every subscriber immediately. Signals are lazy: `Signal.Computed` does not recompute until something reads it. An adapter that is not currently mounted does not pay the cost of computing derived values.
121
+
122
+ ---
123
+
124
+ ## The five Signal invariants in XMachines
125
+
126
+ The Play RFC defines five invariants that govern how signals are used:
127
+
128
+ | Invariant | What it means in practice |
129
+ | ---------------------------------- | ----------------------------------------------------------------------------------------------------------- |
130
+ | **INV-01: Actor Authority** | Only actor code writes to `actor.state`. Never write to it from infrastructure. |
131
+ | **INV-04: Passive Infrastructure** | Routers and renderers read signals and forward events. They never decide state transitions. |
132
+ | **INV-05: Signal-Only Reactivity** | Cross-boundary communication uses signals. Infrastructure does not poll `getSnapshot()`. |
133
+ | **INV-03: No Direct Queries** | Infrastructure reads from signals, not from snapshot methods, outside of actor code. |
134
+ | **INV-02: Strict Separation** | Business logic (`machine` definition) never imports browser APIs, routing libraries, or framework packages. |
135
+
136
+ ---
137
+
138
+ ## Cleanup is mandatory
139
+
140
+ Signals do not clean themselves up when they go out of scope. Every watcher you create must be explicitly disposed when the consuming component or adapter unmounts.
141
+
142
+ - Framework lifecycle hooks (`useEffect` cleanup in React, `onUnmounted` in Vue, `onCleanup` in Solid) must call `unwatch()` or the cleanup returned by `watchSignal()`.
143
+ - Router bridge `disconnect()` methods must unwatch all signal subscriptions.
144
+ - If you use the raw `Signal.subtle.Watcher` API, pair every `watch()` call with `unwatch()` in teardown.
145
+
146
+ Failing to clean up watchers causes memory leaks and stale callbacks firing after the consumer is gone.
147
+
148
+ ---
149
+
150
+ ## Summary
151
+
152
+ | Primitive | Role in XMachines | Who uses it |
153
+ | ----------------------- | ---------------------------------------------- | ---------------------------------- |
154
+ | `Signal.State` | Actor output: writable snapshot and view state | Actor writes; infrastructure reads |
155
+ | `Signal.Computed` | Lazy derivations: routes, view specs | Actor defines; adapters read |
156
+ | `Signal.subtle.Watcher` | Low-level reactive observation | Framework adapters, router bridges |
157
+ | `watchSignal()` | Lifecycle-safe single-signal subscription | Application code, adapter code |
158
+
159
+ ## See also
160
+
161
+ - [Understanding the Actor Model](concepts-actor-model.md) — why the actor owns all signal writes
162
+ - [Understanding State Machines](concepts-state-machines.md) — how state nodes produce the metadata that signals derive
163
+ - [Getting Started](getting-started.md) — hands-on walkthrough using signals to observe an actor
164
+ - [@xmachines/play-signals README](../api/@xmachines/play-signals/README.md) — API reference
165
+ - [Play RFC](../rfc/play.md) — architectural specification
166
+ - [TC39 Signals proposal](https://github.com/tc39/proposal-signals) — upstream proposal