@xmachines/docs 4.0.0 → 5.0.0

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 (483) hide show
  1. package/README.md +8 -6
  2. package/api/@xmachines/play/README.md +21 -21
  3. package/api/@xmachines/play/errors/classes/NonNullableError.md +4 -4
  4. package/api/@xmachines/play/errors/classes/PlayError.md +5 -4
  5. package/api/@xmachines/play/index/README.md +2 -2
  6. package/api/@xmachines/play/index/functions/asCleanup.md +4 -5
  7. package/api/@xmachines/play/index/functions/assertNonNullable.md +1 -1
  8. package/api/@xmachines/play/index/functions/shallowEqualExcept.md +1 -1
  9. package/api/@xmachines/play/index/type-aliases/Cleanup.md +3 -3
  10. package/api/@xmachines/play/index/type-aliases/DisposeKey.md +1 -1
  11. package/api/@xmachines/play/index/type-aliases/PlayEvent.md +2 -2
  12. package/api/@xmachines/play/index/variables/DISPOSE.md +1 -1
  13. package/api/@xmachines/play-actor/README.md +9 -9
  14. package/api/@xmachines/play-actor/interfaces/ActorEvent.md +2 -2
  15. package/api/@xmachines/play-actor/interfaces/PlayActor.md +6 -6
  16. package/api/@xmachines/play-atom/README.md +281 -0
  17. package/api/@xmachines/play-atom/functions/watchAtom.md +79 -0
  18. package/api/@xmachines/play-atom/interfaces/AsyncAtomOptions.md +16 -0
  19. package/api/@xmachines/play-atom/interfaces/Atom.md +149 -0
  20. package/api/@xmachines/play-atom/interfaces/AtomObserver.md +25 -0
  21. package/api/@xmachines/play-atom/interfaces/AtomOptions.md +33 -0
  22. package/api/@xmachines/play-atom/interfaces/AtomSubscription.md +23 -0
  23. package/api/@xmachines/play-atom/interfaces/BaseAtom.md +97 -0
  24. package/api/@xmachines/play-atom/interfaces/CreateAtom.md +91 -0
  25. package/api/@xmachines/play-atom/interfaces/Readable.md +93 -0
  26. package/api/@xmachines/play-atom/interfaces/ReadonlyAtom.md +108 -0
  27. package/api/@xmachines/play-atom/type-aliases/AnyAtom.md +13 -0
  28. package/api/@xmachines/play-atom/type-aliases/AsyncAtomState.md +32 -0
  29. package/api/@xmachines/{play-signals → play-atom}/type-aliases/Cleanup.md +4 -4
  30. package/api/@xmachines/play-atom/variables/createAsyncAtom.md +42 -0
  31. package/api/@xmachines/play-atom/variables/createAtom.md +18 -0
  32. package/api/@xmachines/play-atom/variables/createWritableAtom.md +70 -0
  33. package/api/@xmachines/play-dom/README.md +21 -17
  34. package/api/@xmachines/play-dom/classes/PlayRenderer.md +10 -10
  35. package/api/@xmachines/play-dom/functions/asCleanup.md +4 -5
  36. package/api/@xmachines/play-dom/functions/createPlayUI.md +1 -1
  37. package/api/@xmachines/play-dom/functions/createRenderer.md +1 -1
  38. package/api/@xmachines/play-dom/interfaces/CreatePlayUIOptions.md +3 -3
  39. package/api/@xmachines/play-dom/interfaces/MountOptions.md +3 -3
  40. package/api/@xmachines/play-dom/interfaces/PlayDomOptions.md +6 -6
  41. package/api/@xmachines/play-dom/type-aliases/Cleanup.md +3 -3
  42. package/api/@xmachines/play-dom/type-aliases/MountFn.md +1 -1
  43. package/api/@xmachines/play-dom-router/README.md +24 -24
  44. package/api/@xmachines/play-dom-router/classes/DomRouterBridge.md +15 -15
  45. package/api/@xmachines/play-dom-router/classes/RouteMap.md +11 -11
  46. package/api/@xmachines/play-dom-router/functions/asCleanup.md +4 -5
  47. package/api/@xmachines/play-dom-router/functions/connectRouter.md +1 -1
  48. package/api/@xmachines/play-dom-router/functions/createBrowserHistory.md +1 -1
  49. package/api/@xmachines/play-dom-router/functions/createRouter.md +1 -1
  50. package/api/@xmachines/play-dom-router/interfaces/BasePathOptions.md +3 -7
  51. package/api/@xmachines/play-dom-router/interfaces/BrowserHistory.md +15 -15
  52. package/api/@xmachines/play-dom-router/interfaces/BrowserWindow.md +14 -14
  53. package/api/@xmachines/play-dom-router/interfaces/ConnectRouterOptions.md +11 -9
  54. package/api/@xmachines/play-dom-router/interfaces/PlayRouteEvent.md +7 -7
  55. package/api/@xmachines/play-dom-router/interfaces/RoutableActor.md +6 -6
  56. package/api/@xmachines/play-dom-router/interfaces/RouteLookupContract.md +3 -3
  57. package/api/@xmachines/play-dom-router/interfaces/RouteMapOptions.md +10 -4
  58. package/api/@xmachines/play-dom-router/interfaces/RouteMapping.md +3 -3
  59. package/api/@xmachines/play-dom-router/interfaces/RouterBridge.md +15 -17
  60. package/api/@xmachines/play-dom-router/interfaces/RouterConnection.md +7 -7
  61. package/api/@xmachines/play-dom-router/interfaces/VanillaRouter.md +5 -5
  62. package/api/@xmachines/play-dom-router/type-aliases/Cleanup.md +3 -3
  63. package/api/@xmachines/play-dom-router/variables/DISPOSE.md +1 -1
  64. package/api/@xmachines/play-pattern/README.md +115 -0
  65. package/api/@xmachines/play-pattern/functions/buildPath.md +46 -0
  66. package/api/@xmachines/play-pattern/functions/createPatternCache.md +47 -0
  67. package/api/@xmachines/play-pattern/functions/getIndexKey.md +30 -0
  68. package/api/@xmachines/play-pattern/functions/isDotSegment.md +40 -0
  69. package/api/@xmachines/play-pattern/functions/parsePattern.md +28 -0
  70. package/api/@xmachines/play-pattern/interfaces/GroupPart.md +15 -0
  71. package/api/@xmachines/play-pattern/interfaces/LiteralPart.md +14 -0
  72. package/api/@xmachines/play-pattern/interfaces/ParamPart.md +21 -0
  73. package/api/@xmachines/play-pattern/interfaces/ParseOptions.md +19 -0
  74. package/api/@xmachines/play-pattern/interfaces/ParsedPattern.md +23 -0
  75. package/api/@xmachines/play-pattern/interfaces/PatternCache.md +65 -0
  76. package/api/@xmachines/play-pattern/interfaces/PatternParam.md +15 -0
  77. package/api/@xmachines/play-pattern/type-aliases/PathBuildResult.md +74 -0
  78. package/api/@xmachines/play-pattern/type-aliases/PathParams.md +15 -0
  79. package/api/@xmachines/play-pattern/type-aliases/PatternModifier.md +11 -0
  80. package/api/@xmachines/play-pattern/type-aliases/PatternPart.md +9 -0
  81. package/api/@xmachines/play-react/README.md +31 -21
  82. package/api/@xmachines/play-react/classes/PlayErrorBoundary.md +6 -6
  83. package/api/@xmachines/play-react/functions/useActor.md +1 -1
  84. package/api/@xmachines/play-react/functions/useAtomEffect.md +103 -0
  85. package/api/@xmachines/play-react/functions/usePlayView.md +1 -1
  86. package/api/@xmachines/play-react/interfaces/ActorProviderProps.md +8 -8
  87. package/api/@xmachines/play-react/interfaces/PlayErrorBoundaryProps.md +6 -6
  88. package/api/@xmachines/play-react/interfaces/PlayErrorBoundaryState.md +4 -4
  89. package/api/@xmachines/play-react/interfaces/PlayUIProviderProps.md +8 -8
  90. package/api/@xmachines/play-react/interfaces/ViewContextValue.md +5 -5
  91. package/api/@xmachines/play-react/type-aliases/AnyPlayActor.md +1 -1
  92. package/api/@xmachines/play-react/variables/ActorProvider.md +2 -2
  93. package/api/@xmachines/play-react/variables/PlayRenderer.md +1 -1
  94. package/api/@xmachines/play-react/variables/PlayUIProvider.md +1 -1
  95. package/api/@xmachines/play-react-router/README.md +3 -3
  96. package/api/@xmachines/play-react-router/classes/ReactRouterBridge.md +15 -15
  97. package/api/@xmachines/play-react-router/classes/RouteMap.md +11 -11
  98. package/api/@xmachines/play-react-router/functions/createPlayRouterProvider.md +1 -1
  99. package/api/@xmachines/play-react-router/functions/createRouteMapFromTree.md +5 -5
  100. package/api/@xmachines/play-react-router/interfaces/PlayRouteEvent.md +7 -7
  101. package/api/@xmachines/play-react-router/interfaces/PlayRouterProviderProps.md +11 -9
  102. package/api/@xmachines/play-react-router/interfaces/RoutableActor.md +6 -6
  103. package/api/@xmachines/play-react-router/interfaces/RouteMapOptions.md +10 -4
  104. package/api/@xmachines/play-react-router/interfaces/RouteMapping.md +3 -3
  105. package/api/@xmachines/play-react-router/interfaces/RouterBridge.md +15 -17
  106. package/api/@xmachines/play-react-router/type-aliases/PlayRouterBridgeConstructor.md +14 -7
  107. package/api/@xmachines/play-react-router/type-aliases/PlayRouterProviderBaseProps.md +1 -1
  108. package/api/@xmachines/play-react-router/variables/PlayRouterProvider.md +1 -1
  109. package/api/@xmachines/play-router/README.md +25 -14
  110. package/api/@xmachines/play-router/errors/classes/DuplicateBridgeError.md +4 -4
  111. package/api/@xmachines/play-router/errors/classes/DuplicateRoutePathError.md +5 -5
  112. package/api/@xmachines/play-router/errors/classes/EmptyRoutePathError.md +5 -5
  113. package/api/@xmachines/play-router/errors/classes/InvalidBasePathError.md +5 -5
  114. package/api/@xmachines/play-router/errors/classes/InvalidRoutePatternError.md +5 -5
  115. package/api/@xmachines/play-router/errors/classes/InvalidStateIdError.md +5 -5
  116. package/api/@xmachines/play-router/errors/classes/MissingBasePathParamError.md +6 -6
  117. package/api/@xmachines/play-router/errors/classes/RouterSyncError.md +4 -4
  118. package/api/@xmachines/play-router/errors/classes/UnknownStateTypeError.md +6 -6
  119. package/api/@xmachines/play-router/index/README.md +10 -2
  120. package/api/@xmachines/play-router/index/classes/RouteMap.md +11 -11
  121. package/api/@xmachines/play-router/index/classes/RouterBridgeBase.md +10 -10
  122. package/api/@xmachines/play-router/index/functions/buildPlayRouteEvent.md +1 -1
  123. package/api/@xmachines/play-router/index/functions/buildRouteTree.md +1 -1
  124. package/api/@xmachines/play-router/index/functions/cleanFrameworkParams.md +1 -1
  125. package/api/@xmachines/play-router/index/functions/createPatternCache.md +47 -0
  126. package/api/@xmachines/play-router/index/functions/createRouteMapFromTree.md +5 -5
  127. package/api/@xmachines/play-router/index/functions/createRouterConnection.md +1 -1
  128. package/api/@xmachines/play-router/index/functions/detectDuplicateRoutes.md +1 -1
  129. package/api/@xmachines/play-router/index/functions/extractQuery.md +1 -1
  130. package/api/@xmachines/play-router/index/functions/extractRouteParams.md +7 -6
  131. package/api/@xmachines/play-router/index/functions/findRouteById.md +1 -1
  132. package/api/@xmachines/play-router/index/functions/findRouteByPath.md +13 -6
  133. package/api/@xmachines/play-router/index/functions/isMountableBridge.md +1 -1
  134. package/api/@xmachines/play-router/index/functions/joinBasePath.md +2 -1
  135. package/api/@xmachines/play-router/index/functions/mountKey.md +1 -1
  136. package/api/@xmachines/play-router/index/functions/normalizeBasePath.md +1 -1
  137. package/api/@xmachines/play-router/index/functions/openProviderBridge.md +3 -3
  138. package/api/@xmachines/play-router/index/functions/parsePattern.md +28 -0
  139. package/api/@xmachines/play-router/index/functions/pickOwnParams.md +1 -1
  140. package/api/@xmachines/play-router/index/functions/repointProviderBridge.md +1 -1
  141. package/api/@xmachines/play-router/index/functions/resolveBasePath.md +1 -1
  142. package/api/@xmachines/play-router/index/functions/resolveFrameworkParams.md +5 -5
  143. package/api/@xmachines/play-router/index/functions/sanitizePathname.md +9 -24
  144. package/api/@xmachines/play-router/index/functions/splitLocation.md +37 -0
  145. package/api/@xmachines/play-router/index/functions/stripBasePath.md +1 -1
  146. package/api/@xmachines/play-router/index/functions/validateRouteFormat.md +1 -1
  147. package/api/@xmachines/play-router/index/functions/validateStateExists.md +1 -1
  148. package/api/@xmachines/play-router/index/interfaces/BasePathOptions.md +4 -4
  149. package/api/@xmachines/play-router/index/interfaces/BuildPlayRouteEventOptions.md +4 -4
  150. package/api/@xmachines/play-router/index/interfaces/CompileOptions.md +35 -0
  151. package/api/@xmachines/play-router/index/interfaces/FrameworkParamsSource.md +13 -8
  152. package/api/@xmachines/play-router/index/interfaces/LocationLike.md +3 -3
  153. package/api/@xmachines/play-router/index/interfaces/MountableRouterBridge.md +9 -9
  154. package/api/@xmachines/play-router/index/interfaces/OpenProviderBridgeArgs.md +11 -9
  155. package/api/@xmachines/play-router/index/interfaces/ParseOptions.md +24 -0
  156. package/api/@xmachines/play-router/index/interfaces/ParsedPattern.md +23 -0
  157. package/api/@xmachines/play-router/index/interfaces/PatternCache.md +65 -0
  158. package/api/@xmachines/play-router/index/interfaces/PlayRouteEvent.md +7 -7
  159. package/api/@xmachines/play-router/index/interfaces/PlayRouterProviderBaseProps.md +15 -9
  160. package/api/@xmachines/play-router/index/interfaces/ResolvedBasePath.md +3 -3
  161. package/api/@xmachines/play-router/index/interfaces/ResolvedRoutePath.md +3 -3
  162. package/api/@xmachines/play-router/index/interfaces/Routable.md +5 -5
  163. package/api/@xmachines/play-router/index/interfaces/RoutableActor.md +6 -6
  164. package/api/@xmachines/play-router/index/interfaces/RouteInfo.md +8 -8
  165. package/api/@xmachines/play-router/index/interfaces/RouteMapOptions.md +10 -4
  166. package/api/@xmachines/play-router/index/interfaces/RouteMapping.md +3 -3
  167. package/api/@xmachines/play-router/index/interfaces/RouteMatch.md +3 -3
  168. package/api/@xmachines/play-router/index/interfaces/RouteNode.md +10 -10
  169. package/api/@xmachines/play-router/index/interfaces/RouteObject.md +5 -5
  170. package/api/@xmachines/play-router/index/interfaces/RouteTree.md +5 -5
  171. package/api/@xmachines/play-router/index/interfaces/RouteWatcherHandle.md +11 -11
  172. package/api/@xmachines/play-router/index/interfaces/RouterBridge.md +15 -17
  173. package/api/@xmachines/play-router/index/interfaces/RouterBridgeOptions.md +31 -0
  174. package/api/@xmachines/play-router/index/interfaces/RouterConnection.md +7 -7
  175. package/api/@xmachines/play-router/index/interfaces/SplitLocation.md +16 -0
  176. package/api/@xmachines/play-router/index/interfaces/WindowLike.md +3 -3
  177. package/api/@xmachines/play-router/index/type-aliases/PlayRouterBridgeConstructor.md +14 -7
  178. package/api/@xmachines/play-router/index/type-aliases/RouteData.md +1 -1
  179. package/api/@xmachines/play-router/index/type-aliases/RouteDataResolver.md +1 -1
  180. package/api/@xmachines/play-router/index/type-aliases/RouteMetadata.md +1 -1
  181. package/api/@xmachines/play-router/index/type-aliases/URLPatternLike.md +68 -0
  182. package/api/@xmachines/play-router/index/variables/DISPOSE.md +1 -1
  183. package/api/@xmachines/play-router/index/variables/NO_BASE_PATH.md +1 -1
  184. package/api/@xmachines/play-router/index/variables/ROOT_NODE_ID.md +1 -1
  185. package/api/@xmachines/play-router/xstate/functions/createRouteMap.md +5 -5
  186. package/api/@xmachines/play-router/xstate/functions/extractMachineRoutes.md +6 -5
  187. package/api/@xmachines/play-router/xstate/functions/getNavigableRoutes.md +1 -1
  188. package/api/@xmachines/play-router/xstate/functions/getRoutableRoutes.md +1 -1
  189. package/api/@xmachines/play-router/xstate/functions/getRouteMappings.md +1 -1
  190. package/api/@xmachines/play-router/xstate/functions/getTransitionReachableRoutes.md +1 -1
  191. package/api/@xmachines/play-router/xstate/functions/isRouteReachable.md +1 -1
  192. package/api/@xmachines/play-router/xstate/functions/machineToGraph.md +1 -1
  193. package/api/@xmachines/play-router/xstate/functions/routeExists.md +1 -1
  194. package/api/@xmachines/play-router/xstate/interfaces/MachineEdgeData.md +3 -3
  195. package/api/@xmachines/play-router/xstate/interfaces/MachineNodeData.md +5 -5
  196. package/api/@xmachines/play-router/xstate/type-aliases/MachineGraph.md +1 -1
  197. package/api/@xmachines/play-solid/README.md +9 -5
  198. package/api/@xmachines/play-solid/functions/useActor.md +1 -1
  199. package/api/@xmachines/play-solid/functions/usePlayView.md +1 -1
  200. package/api/@xmachines/play-solid/interfaces/ActorProviderProps.md +8 -8
  201. package/api/@xmachines/play-solid/interfaces/PlayUIProviderProps.md +8 -8
  202. package/api/@xmachines/play-solid/interfaces/ViewContextValue.md +5 -5
  203. package/api/@xmachines/play-solid/type-aliases/AnyPlayActor.md +1 -1
  204. package/api/@xmachines/play-solid/variables/ActorContext.md +1 -1
  205. package/api/@xmachines/play-solid/variables/ActorProvider.md +2 -2
  206. package/api/@xmachines/play-solid/variables/PlayRenderer.md +1 -1
  207. package/api/@xmachines/play-solid/variables/PlayUIProvider.md +1 -1
  208. package/api/@xmachines/play-solid-router/README.md +14 -14
  209. package/api/@xmachines/play-solid-router/classes/RouteMap.md +11 -11
  210. package/api/@xmachines/play-solid-router/classes/SolidRouterBridge.md +18 -18
  211. package/api/@xmachines/play-solid-router/functions/createPlayRouterProvider.md +1 -1
  212. package/api/@xmachines/play-solid-router/interfaces/PlayActor.md +6 -6
  213. package/api/@xmachines/play-solid-router/interfaces/PlayRouteEvent.md +7 -7
  214. package/api/@xmachines/play-solid-router/interfaces/PlayRouterProviderProps.md +11 -9
  215. package/api/@xmachines/play-solid-router/interfaces/RoutableActor.md +6 -6
  216. package/api/@xmachines/play-solid-router/interfaces/RouteMapOptions.md +10 -4
  217. package/api/@xmachines/play-solid-router/interfaces/RouteMapping.md +3 -3
  218. package/api/@xmachines/play-solid-router/interfaces/RouterBridge.md +15 -17
  219. package/api/@xmachines/play-solid-router/type-aliases/PlayRouterBridgeConstructor.md +14 -7
  220. package/api/@xmachines/play-solid-router/type-aliases/PlayRouterProviderBaseProps.md +1 -1
  221. package/api/@xmachines/play-solid-router/type-aliases/SolidRouterHooks.md +4 -4
  222. package/api/@xmachines/play-solid-router/variables/PlayRouterProvider.md +1 -1
  223. package/api/@xmachines/play-svelte/README.md +11 -7
  224. package/api/@xmachines/play-svelte/functions/defineRegistry.md +1 -1
  225. package/api/@xmachines/play-svelte/functions/getActorContext.md +1 -1
  226. package/api/@xmachines/play-svelte/functions/getPlayViewContext.md +1 -1
  227. package/api/@xmachines/play-svelte/functions/setActorContext.md +1 -1
  228. package/api/@xmachines/play-svelte/interfaces/ActorProviderProps.md +8 -8
  229. package/api/@xmachines/play-svelte/interfaces/DefineRegistryOptions.md +4 -4
  230. package/api/@xmachines/play-svelte/interfaces/PlayUIProviderProps.md +11 -11
  231. package/api/@xmachines/play-svelte/interfaces/ViewContextValue.md +5 -5
  232. package/api/@xmachines/play-svelte/type-aliases/AnyPlayActor.md +1 -1
  233. package/api/@xmachines/play-svelte-spa-router/README.md +14 -14
  234. package/api/@xmachines/play-svelte-spa-router/classes/RouteMap.md +11 -11
  235. package/api/@xmachines/play-svelte-spa-router/classes/SvelteSpaRouterBridge.md +15 -15
  236. package/api/@xmachines/play-svelte-spa-router/functions/connectRouter.md +1 -1
  237. package/api/@xmachines/play-svelte-spa-router/interfaces/BasePathOptions.md +3 -7
  238. package/api/@xmachines/play-svelte-spa-router/interfaces/ConnectRouterOptions.md +11 -9
  239. package/api/@xmachines/play-svelte-spa-router/interfaces/PlayRouteEvent.md +7 -7
  240. package/api/@xmachines/play-svelte-spa-router/interfaces/RoutableActor.md +6 -6
  241. package/api/@xmachines/play-svelte-spa-router/interfaces/RouteMapOptions.md +10 -4
  242. package/api/@xmachines/play-svelte-spa-router/interfaces/RouteMapping.md +3 -3
  243. package/api/@xmachines/play-svelte-spa-router/interfaces/RouterBridge.md +15 -17
  244. package/api/@xmachines/play-svelte-spa-router/interfaces/RouterConnection.md +7 -7
  245. package/api/@xmachines/play-svelte-spa-router/interfaces/WindowLike.md +3 -3
  246. package/api/@xmachines/play-sveltekit-router/README.md +17 -17
  247. package/api/@xmachines/play-sveltekit-router/classes/RouteMap.md +11 -11
  248. package/api/@xmachines/play-sveltekit-router/classes/SvelteKitRouterBridge.md +15 -15
  249. package/api/@xmachines/play-sveltekit-router/functions/connectRouter.md +1 -1
  250. package/api/@xmachines/play-sveltekit-router/interfaces/BasePathOptions.md +3 -7
  251. package/api/@xmachines/play-sveltekit-router/interfaces/ConnectRouterOptions.md +15 -23
  252. package/api/@xmachines/play-sveltekit-router/interfaces/LocationLike.md +3 -3
  253. package/api/@xmachines/play-sveltekit-router/interfaces/PlayRouteEvent.md +7 -7
  254. package/api/@xmachines/play-sveltekit-router/interfaces/RoutableActor.md +6 -6
  255. package/api/@xmachines/play-sveltekit-router/interfaces/RouteMapOptions.md +10 -4
  256. package/api/@xmachines/play-sveltekit-router/interfaces/RouteMapping.md +3 -3
  257. package/api/@xmachines/play-sveltekit-router/interfaces/RouterBridge.md +15 -17
  258. package/api/@xmachines/play-sveltekit-router/interfaces/RouterConnection.md +7 -7
  259. package/api/@xmachines/play-tanstack-react-router/README.md +7 -7
  260. package/api/@xmachines/play-tanstack-react-router/classes/RouteMap.md +11 -11
  261. package/api/@xmachines/play-tanstack-react-router/classes/TanStackReactRouterBridge.md +11 -11
  262. package/api/@xmachines/play-tanstack-react-router/functions/createPlayRouterProvider.md +1 -1
  263. package/api/@xmachines/play-tanstack-react-router/functions/createRouteMapFromTree.md +5 -5
  264. package/api/@xmachines/play-tanstack-react-router/interfaces/PlayRouteEvent.md +7 -7
  265. package/api/@xmachines/play-tanstack-react-router/interfaces/PlayRouterProviderProps.md +11 -9
  266. package/api/@xmachines/play-tanstack-react-router/interfaces/RoutableActor.md +6 -6
  267. package/api/@xmachines/play-tanstack-react-router/interfaces/RouteMapOptions.md +10 -4
  268. package/api/@xmachines/play-tanstack-react-router/interfaces/RouteMapping.md +3 -3
  269. package/api/@xmachines/play-tanstack-react-router/interfaces/RouterBridge.md +15 -17
  270. package/api/@xmachines/play-tanstack-react-router/type-aliases/PlayRouterBridgeConstructor.md +14 -7
  271. package/api/@xmachines/play-tanstack-react-router/type-aliases/PlayRouterProviderBaseProps.md +1 -1
  272. package/api/@xmachines/play-tanstack-react-router/type-aliases/TanStackRouterInstance.md +1 -1
  273. package/api/@xmachines/play-tanstack-react-router/type-aliases/TanStackRouterLike.md +5 -5
  274. package/api/@xmachines/play-tanstack-react-router/variables/PlayRouterProvider.md +1 -1
  275. package/api/@xmachines/play-tanstack-router/README.md +1 -1
  276. package/api/@xmachines/play-tanstack-router/classes/TanStackRouterBridgeBase.md +16 -16
  277. package/api/@xmachines/play-tanstack-router/type-aliases/TanStackRouteMapLike.md +3 -3
  278. package/api/@xmachines/play-tanstack-router/type-aliases/TanStackRouterLike.md +5 -5
  279. package/api/@xmachines/play-tanstack-solid-router/README.md +7 -7
  280. package/api/@xmachines/play-tanstack-solid-router/classes/RouteMap.md +11 -11
  281. package/api/@xmachines/play-tanstack-solid-router/classes/TanStackSolidRouterBridge.md +11 -11
  282. package/api/@xmachines/play-tanstack-solid-router/functions/createPlayRouterProvider.md +1 -1
  283. package/api/@xmachines/play-tanstack-solid-router/interfaces/PlayRouteEvent.md +7 -7
  284. package/api/@xmachines/play-tanstack-solid-router/interfaces/PlayRouterProviderProps.md +11 -9
  285. package/api/@xmachines/play-tanstack-solid-router/interfaces/RoutableActor.md +6 -6
  286. package/api/@xmachines/play-tanstack-solid-router/interfaces/RouteMapOptions.md +10 -4
  287. package/api/@xmachines/play-tanstack-solid-router/interfaces/RouteMapping.md +3 -3
  288. package/api/@xmachines/play-tanstack-solid-router/interfaces/RouterBridge.md +15 -17
  289. package/api/@xmachines/play-tanstack-solid-router/type-aliases/PlayRouterBridgeConstructor.md +14 -7
  290. package/api/@xmachines/play-tanstack-solid-router/type-aliases/PlayRouterProviderBaseProps.md +1 -1
  291. package/api/@xmachines/play-tanstack-solid-router/type-aliases/TanStackRouterInstance.md +1 -1
  292. package/api/@xmachines/play-tanstack-solid-router/type-aliases/TanStackRouterLike.md +5 -5
  293. package/api/@xmachines/play-tanstack-solid-router/variables/PlayRouterProvider.md +1 -1
  294. package/api/@xmachines/play-url/README.md +21 -15
  295. package/api/@xmachines/play-url/errors/classes/InvalidBasePathError.md +5 -5
  296. package/api/@xmachines/play-url/errors/classes/InvalidRoutePatternError.md +5 -5
  297. package/api/@xmachines/play-url/errors/classes/MissingBasePathParamError.md +6 -6
  298. package/api/@xmachines/play-url/index/README.md +15 -8
  299. package/api/@xmachines/play-url/index/functions/buildPath.md +46 -0
  300. package/api/@xmachines/play-url/index/functions/cleanFrameworkParams.md +1 -1
  301. package/api/@xmachines/play-url/index/functions/createPatternCache.md +47 -0
  302. package/api/@xmachines/play-url/index/functions/getCandidates.md +1 -1
  303. package/api/@xmachines/play-url/index/functions/getCompiledPattern.md +8 -7
  304. package/api/@xmachines/play-url/index/functions/getIndexKey.md +1 -1
  305. package/api/@xmachines/play-url/index/functions/holdsUnsubstitutedParam.md +2 -2
  306. package/api/@xmachines/play-url/index/functions/isDotSegment.md +40 -0
  307. package/api/@xmachines/play-url/index/functions/joinBasePath.md +2 -1
  308. package/api/@xmachines/play-url/index/functions/normalizeBasePath.md +1 -1
  309. package/api/@xmachines/play-url/index/functions/parsePattern.md +6 -5
  310. package/api/@xmachines/play-url/index/functions/pickOwnParams.md +1 -1
  311. package/api/@xmachines/play-url/index/functions/resolveBasePath.md +1 -1
  312. package/api/@xmachines/play-url/index/functions/resolveFrameworkParams.md +5 -5
  313. package/api/@xmachines/play-url/index/functions/sanitizePathname.md +27 -0
  314. package/api/@xmachines/play-url/index/functions/splitLocation.md +37 -0
  315. package/api/@xmachines/play-url/index/functions/stripBasePath.md +1 -1
  316. package/api/@xmachines/play-url/index/interfaces/BasePathOptions.md +3 -3
  317. package/api/@xmachines/play-url/index/interfaces/CompileOptions.md +21 -0
  318. package/api/@xmachines/play-url/index/interfaces/FrameworkParamsSource.md +13 -8
  319. package/api/@xmachines/play-url/index/interfaces/GroupPart.md +6 -6
  320. package/api/@xmachines/play-url/index/interfaces/LiteralPart.md +5 -5
  321. package/api/@xmachines/play-url/index/interfaces/ParamPart.md +9 -9
  322. package/api/@xmachines/play-url/index/interfaces/ParseOptions.md +24 -0
  323. package/api/@xmachines/play-url/index/interfaces/ParsedPattern.md +14 -14
  324. package/api/@xmachines/play-url/index/interfaces/PatternCache.md +65 -0
  325. package/api/@xmachines/play-url/index/interfaces/PatternParam.md +6 -6
  326. package/api/@xmachines/play-url/index/interfaces/ResolvedBasePath.md +3 -3
  327. package/api/@xmachines/play-url/index/interfaces/SplitLocation.md +16 -0
  328. package/api/@xmachines/play-url/index/type-aliases/PathBuildResult.md +74 -0
  329. package/api/@xmachines/play-url/index/type-aliases/PathParams.md +15 -0
  330. package/api/@xmachines/play-url/index/type-aliases/PatternModifier.md +1 -1
  331. package/api/@xmachines/play-url/index/type-aliases/PatternPart.md +1 -1
  332. package/api/@xmachines/play-url/index/type-aliases/URLPatternCtor.md +1 -1
  333. package/api/@xmachines/play-url/index/type-aliases/URLPatternLike.md +3 -3
  334. package/api/@xmachines/play-url/index/variables/NO_BASE_PATH.md +1 -1
  335. package/api/@xmachines/play-url/index/variables/URLPattern.md +1 -1
  336. package/api/@xmachines/play-view/README.md +19 -8
  337. package/api/@xmachines/play-view/errors/classes/ReadOnlyContextError.md +5 -5
  338. package/api/@xmachines/play-view/index/functions/attachRenderErrorHandler.md +1 -1
  339. package/api/@xmachines/play-view/index/functions/composePlayState.md +1 -1
  340. package/api/@xmachines/play-view/index/functions/createFailureLatch.md +1 -1
  341. package/api/@xmachines/play-view/index/functions/createReportGuard.md +1 -1
  342. package/api/@xmachines/play-view/index/functions/createViewStoreLifecycle.md +1 -1
  343. package/api/@xmachines/play-view/index/functions/guardContextWrites.md +4 -28
  344. package/api/@xmachines/play-view/index/functions/refreshContextSubtree.md +1 -1
  345. package/api/@xmachines/play-view/index/functions/reuseComposedState.md +1 -1
  346. package/api/@xmachines/play-view/index/functions/sameViewInputs.md +1 -1
  347. package/api/@xmachines/play-view/index/functions/toAtomState.md +1 -1
  348. package/api/@xmachines/play-view/index/functions/typedSpec.md +1 -1
  349. package/api/@xmachines/play-view/index/interfaces/BaseActorProviderProps.md +5 -5
  350. package/api/@xmachines/play-view/index/interfaces/BaseViewContextValue.md +5 -5
  351. package/api/@xmachines/play-view/index/interfaces/FailureLatch.md +3 -3
  352. package/api/@xmachines/play-view/index/interfaces/PlaySpec.md +2 -2
  353. package/api/@xmachines/play-view/index/interfaces/ReportGuard.md +5 -5
  354. package/api/@xmachines/play-view/index/interfaces/ReportGuardMessages.md +3 -3
  355. package/api/@xmachines/play-view/index/interfaces/ResolveViewStoreOptions.md +2 -2
  356. package/api/@xmachines/play-view/index/interfaces/ViewInputs.md +4 -4
  357. package/api/@xmachines/play-view/index/interfaces/ViewStoreLifecycle.md +3 -3
  358. package/api/@xmachines/play-view/index/interfaces/ViewStoreResolution.md +4 -4
  359. package/api/@xmachines/play-view/index/interfaces/Viewable.md +5 -5
  360. package/api/@xmachines/play-view/index/type-aliases/ViewActor.md +1 -1
  361. package/api/@xmachines/play-view/index/variables/CONTEXT_STATE_KEY.md +1 -1
  362. package/api/@xmachines/play-vue/README.md +13 -9
  363. package/api/@xmachines/play-vue/functions/defineRegistry.md +1 -1
  364. package/api/@xmachines/play-vue/functions/useActor.md +1 -1
  365. package/api/@xmachines/play-vue/functions/usePlayView.md +1 -1
  366. package/api/@xmachines/play-vue/interfaces/ActorProviderProps.md +6 -6
  367. package/api/@xmachines/play-vue/interfaces/PlayUIProviderProps.md +9 -9
  368. package/api/@xmachines/play-vue/interfaces/ViewContextValue.md +5 -5
  369. package/api/@xmachines/play-vue/type-aliases/AnyPlayActor.md +1 -1
  370. package/api/@xmachines/play-vue/type-aliases/ComponentEntry.md +1 -1
  371. package/api/@xmachines/play-vue/type-aliases/ComponentsMap.md +1 -1
  372. package/api/@xmachines/play-vue/type-aliases/DefineRegistryOptions.md +2 -2
  373. package/api/@xmachines/play-vue/variables/PlayRenderer.md +1 -1
  374. package/api/@xmachines/play-vue-router/README.md +12 -11
  375. package/api/@xmachines/play-vue-router/errors/classes/VueRouterNavigationError.md +4 -4
  376. package/api/@xmachines/play-vue-router/errors/classes/VueRouterSendError.md +4 -4
  377. package/api/@xmachines/play-vue-router/index/classes/RouteMap.md +11 -11
  378. package/api/@xmachines/play-vue-router/index/classes/VueRouterBridge.md +15 -15
  379. package/api/@xmachines/play-vue-router/index/interfaces/PlayRouteEvent.md +7 -7
  380. package/api/@xmachines/play-vue-router/index/interfaces/RoutableActor.md +6 -6
  381. package/api/@xmachines/play-vue-router/index/interfaces/RouteMapOptions.md +10 -4
  382. package/api/@xmachines/play-vue-router/index/interfaces/RouteMapping.md +3 -3
  383. package/api/@xmachines/play-vue-router/index/interfaces/RouterBridge.md +15 -17
  384. package/api/@xmachines/play-vue-router/index/variables/PlayRouterProvider.md +23 -1
  385. package/api/@xmachines/play-xstate/README.md +61 -30
  386. package/api/@xmachines/play-xstate/errors/README.md +1 -0
  387. package/api/@xmachines/play-xstate/errors/classes/ActorThrewNonErrorError.md +4 -4
  388. package/api/@xmachines/play-xstate/errors/classes/InvalidEventError.md +5 -5
  389. package/api/@xmachines/play-xstate/errors/classes/InvalidMachineError.md +4 -4
  390. package/api/@xmachines/play-xstate/errors/classes/InvalidRouteHandlerError.md +5 -5
  391. package/api/@xmachines/play-xstate/errors/classes/InvalidRouteMetadataError.md +5 -5
  392. package/api/@xmachines/play-xstate/errors/classes/InvalidRouteParamError.md +207 -0
  393. package/api/@xmachines/play-xstate/errors/classes/MissingRouteParamError.md +6 -6
  394. package/api/@xmachines/play-xstate/errors/classes/MissingStateIdError.md +6 -6
  395. package/api/@xmachines/play-xstate/index/README.md +2 -2
  396. package/api/@xmachines/play-xstate/index/classes/PlayerActor.md +41 -42
  397. package/api/@xmachines/play-xstate/index/functions/compose.md +4 -4
  398. package/api/@xmachines/play-xstate/index/functions/definePlayer.md +2 -2
  399. package/api/@xmachines/play-xstate/index/interfaces/PlayerConfig.md +4 -4
  400. package/api/@xmachines/play-xstate/index/interfaces/PlayerFactoryResumeOptions.md +2 -2
  401. package/api/@xmachines/play-xstate/index/interfaces/PlayerOptions.md +9 -9
  402. package/api/@xmachines/play-xstate/index/type-aliases/Capability.md +1 -1
  403. package/api/@xmachines/play-xstate/index/type-aliases/PlayerConstructor.md +1 -1
  404. package/api/@xmachines/play-xstate/index/type-aliases/PlayerFactory.md +1 -1
  405. package/api/@xmachines/play-xstate/index/variables/DISPOSE.md +1 -1
  406. package/api/@xmachines/play-xstate/with-routing/functions/buildRouteUrl.md +13 -6
  407. package/api/@xmachines/play-xstate/with-routing/functions/deriveRoute.md +1 -1
  408. package/api/@xmachines/play-xstate/with-routing/functions/formatPlayRouteTransitions.md +1 -1
  409. package/api/@xmachines/play-xstate/with-routing/functions/isAbsoluteRoute.md +1 -1
  410. package/api/@xmachines/play-xstate/with-routing/functions/withRouting.md +1 -1
  411. package/api/@xmachines/play-xstate/with-routing/interfaces/RouteContext.md +5 -5
  412. package/api/@xmachines/play-xstate/with-routing/interfaces/RouteObject.md +5 -5
  413. package/api/@xmachines/play-xstate/with-routing/type-aliases/RouteData.md +1 -1
  414. package/api/@xmachines/play-xstate/with-routing/type-aliases/RouteDataResolver.md +1 -1
  415. package/api/@xmachines/play-xstate/with-routing/type-aliases/RouteMachineConfig.md +4 -4
  416. package/api/@xmachines/play-xstate/with-routing/type-aliases/RouteMetadata.md +1 -1
  417. package/api/@xmachines/play-xstate/with-routing/type-aliases/RouteStateNode.md +5 -5
  418. package/api/@xmachines/play-xstate/with-view/functions/withView.md +6 -5
  419. package/api/@xmachines/shared/vite-aliases/functions/xmAliases.md +1 -1
  420. package/api/@xmachines/shared/vite-aliases/functions/xmCacheDir.md +1 -1
  421. package/api/@xmachines/shared/vite-aliases/functions/xmOptimizeDeps.md +1 -1
  422. package/api/@xmachines/shared/vite-aliases/functions/xmResolve.md +1 -1
  423. package/api/@xmachines/shared/vite-aliases/functions/xmSvelteRunes.md +2 -2
  424. package/api/@xmachines/shared/vitest/functions/defineXmBrowserConfig.md +1 -1
  425. package/api/@xmachines/shared/vitest/functions/defineXmVitestConfig.md +1 -1
  426. package/api/@xmachines/shared/vitest/interfaces/XmBrowserConfigOptions.md +4 -4
  427. package/api/README.md +2 -1
  428. package/api/llms.txt +4 -3
  429. package/contributing/architecture.md +105 -124
  430. package/contributing/configuration.md +15 -15
  431. package/contributing/deployment.md +82 -6
  432. package/contributing/development.md +58 -30
  433. package/contributing/migrating-to-play-atom.md +209 -0
  434. package/contributing/testing.md +61 -64
  435. package/examples/README.md +3 -3
  436. package/examples/basic-state-machine.md +4 -4
  437. package/examples/form-validation.md +1 -1
  438. package/examples/multi-router-integration.md +23 -23
  439. package/examples/routing-patterns.md +5 -5
  440. package/examples/traffic-light.md +6 -6
  441. package/guides/README.md +1 -1
  442. package/guides/actor-model.md +26 -17
  443. package/guides/atoms.md +264 -0
  444. package/guides/getting-started.md +52 -17
  445. package/guides/inspector.md +3 -3
  446. package/guides/routing.md +67 -47
  447. package/guides/state-machines.md +4 -4
  448. package/package.json +3 -3
  449. package/rfc/play.md +83 -52
  450. package/api/@xmachines/play-react/functions/useSignalEffect.md +0 -77
  451. package/api/@xmachines/play-router/index/functions/getPatternParamNames.md +0 -29
  452. package/api/@xmachines/play-router/index/functions/getRequiredPatternParamNames.md +0 -39
  453. package/api/@xmachines/play-signals/README.md +0 -209
  454. package/api/@xmachines/play-signals/functions/watchSignal.md +0 -65
  455. package/api/@xmachines/play-signals/interfaces/ComputedOptions.md +0 -36
  456. package/api/@xmachines/play-signals/interfaces/SignalComputed.md +0 -49
  457. package/api/@xmachines/play-signals/interfaces/SignalOptions.md +0 -37
  458. package/api/@xmachines/play-signals/interfaces/SignalState.md +0 -68
  459. package/api/@xmachines/play-signals/interfaces/SignalWatcher.md +0 -97
  460. package/api/@xmachines/play-signals/namespaces/Signal/README.md +0 -22
  461. package/api/@xmachines/play-signals/namespaces/Signal/classes/Computed.md +0 -52
  462. package/api/@xmachines/play-signals/namespaces/Signal/classes/State.md +0 -72
  463. package/api/@xmachines/play-signals/namespaces/Signal/interfaces/Options.md +0 -19
  464. package/api/@xmachines/play-signals/namespaces/Signal/namespaces/subtle/README.md +0 -21
  465. package/api/@xmachines/play-signals/namespaces/Signal/namespaces/subtle/classes/Watcher.md +0 -85
  466. package/api/@xmachines/play-signals/namespaces/Signal/namespaces/subtle/functions/currentComputed.md +0 -13
  467. package/api/@xmachines/play-signals/namespaces/Signal/namespaces/subtle/functions/hasSinks.md +0 -19
  468. package/api/@xmachines/play-signals/namespaces/Signal/namespaces/subtle/functions/hasSources.md +0 -19
  469. package/api/@xmachines/play-signals/namespaces/Signal/namespaces/subtle/functions/introspectSinks.md +0 -19
  470. package/api/@xmachines/play-signals/namespaces/Signal/namespaces/subtle/functions/introspectSources.md +0 -19
  471. package/api/@xmachines/play-signals/namespaces/Signal/namespaces/subtle/functions/untrack.md +0 -25
  472. package/api/@xmachines/play-signals/namespaces/Signal/namespaces/subtle/variables/unwatched.md +0 -9
  473. package/api/@xmachines/play-signals/namespaces/Signal/namespaces/subtle/variables/watched.md +0 -9
  474. package/api/@xmachines/play-signals/namespaces/Signal/variables/isComputed.md +0 -19
  475. package/api/@xmachines/play-signals/namespaces/Signal/variables/isState.md +0 -19
  476. package/api/@xmachines/play-signals/namespaces/Signal/variables/isWatcher.md +0 -19
  477. package/api/@xmachines/play-signals/type-aliases/WatcherNotify.md +0 -33
  478. package/api/@xmachines/play-url/index/functions/getNormalizedParamNameMap.md +0 -32
  479. package/api/@xmachines/play-url/index/functions/getPatternParamNames.md +0 -29
  480. package/api/@xmachines/play-url/index/functions/getRequiredPatternParamNames.md +0 -39
  481. package/api/@xmachines/play-url/index/functions/isParameterizedPattern.md +0 -36
  482. package/api/@xmachines/play-url/index/functions/normalizeParamNames.md +0 -36
  483. package/guides/signals.md +0 -209
package/guides/routing.md CHANGED
@@ -19,11 +19,11 @@ The first direction needs a matcher, and every router writes its own. Express us
19
19
 
20
20
  `URLPattern` is the WHATWG standard for this, its syntax comes from `path-to-regexp`, and it is a superset of it. XMachines takes it as the pattern language, and it reads the whole of it.
21
21
 
22
- This is the same decision that [`@xmachines/play-signals`](signals.md) makes for reactivity: one standard, isolated behind one module, present on every runtime. There is no `SignalsUnavailableError`, because the polyfill makes the question impossible to ask, and there is no URLPattern availability error for the same reason.
22
+ This is the same decision that [`@xmachines/play-atom`](atoms.md) makes for reactivity: one primitive, isolated behind one module, present on every runtime. There is no `AtomsUnavailableError`, because one package holds the reactive primitive and every consumer reads it from there, and there is no URLPattern availability error for the same reason.
23
23
 
24
24
  ### The API is always present
25
25
 
26
- `@xmachines/play-router` carries [`urlpattern-polyfill`](https://github.com/kenchris/urlpattern-polyfill) as an ordinary dependency. It uses the native `URLPattern` when the runtime has one, and the polyfill when it does not. **Install nothing, and load nothing.**
26
+ [`@xmachines/play-router`](../api/@xmachines/play-router/README.md) carries [`urlpattern-polyfill`](https://github.com/kenchris/urlpattern-polyfill) as an ordinary dependency. It uses the native `URLPattern` when the runtime has one, and the polyfill when it does not. **Install nothing, and load nothing.**
27
27
 
28
28
  The native API arrived in Chrome 95, in Firefox 142 and in Safari 26. The browser floor of this workspace is Chrome 110, Firefox 115 and Safari 16.4. Chrome carries the API at that floor, and Firefox and Safari carry it far above it, so a Firefox or a Safari at the floor runs the polyfill. `test/url-pattern-parity.test.ts` measures the two implementations against each other, form by form. They agree on every form of the grammar, and they disagree about one shape that no bridge can produce — see the prefix rule below.
29
29
 
@@ -67,40 +67,60 @@ const machine = createMachine({
67
67
 
68
68
  ### Which forms work in which direction
69
69
 
70
- The table above is what the route map MATCHES. The two directions are not the same size
71
- today, and a route that uses only the inbound half stops the URL silently.
72
-
73
- | Form | URL to state | state to URL |
74
- | ----------------------------- | ------------ | ---------------------------------------------------------------------- |
75
- | a literal, `:name`, `:name?` | yes | yes |
76
- | `:name*` | yes | **no** — the `*` stops the push, and the URL does not move |
77
- | `:name+` | yes | **no** — the `+` reaches the URL, and a value with a `/` is encoded |
78
- | `{…}` | yes | **no** — the braces reach the URL |
79
- | `:name(\d+)`, `(\d+)` | yes | **no** — the constraint reaches the URL, or it stops the push |
80
- | `*` | yes | **no** — the `*` stops the push, and the URL does not move |
81
- | `:cat-id`, a hyphen in a name | yes | **no** — the substitution throws, and the URL stops |
82
- | an escape, `\+` and `\(` | yes | yes — the bridge resolves the escape before it pushes |
83
- | an escape, `\:` | yes | **no** — the substitution reads the escaped `:` as a param, and throws |
84
-
85
- `buildRouteUrl` of `@xmachines/play-xstate` performs the outbound half, and it reads
86
- `:name` and `:name?` alone. A state whose route uses another form derives a URL that its
87
- own route matches never — or no URL at all, because `deriveCurrentRoute` catches the
88
- `MissingRouteParamError` and answers `null`.
89
-
90
- **Declare a route with a literal, `:name`, `:name?` and an escape until the outbound half
91
- reads the whole grammar.** The remaining forms are safe for a route that the machine never
92
- navigates TO, such as a catch-all that only receives a deep link. Issue #16 closes the
93
- difference.
94
-
95
- A constraint fails in one of two ways, and which one depends on a single character. The
96
- derived path carries the constraint whole — `/v/:major(\d+)` with `{ major: "2" }` gives
97
- `/v/2(\d+)` — and the bridge reads a path that holds a BACKSLASH through the grammar. It
98
- reads `(\d+)` as a param there, so the route resolves to no one path and the push stops.
99
- A constraint with no backslash, such as `([0-9]+)`, reaches the address bar as it stands.
100
-
101
- `buildRouteUrl` leaves an escape as the template writes it, and the bridge resolves it
102
- before the push. The actor route carries `/tags/c\+\+`, and the address bar receives
103
- `/tags/c++`, which is the path that the route matches.
70
+ Both directions read ONE parse. `parsePattern` of
71
+ [`@xmachines/play-pattern`](../api/@xmachines/play-pattern/README.md) answers the match,
72
+ and `buildPath` of the same package walks the same parts back into a path.
73
+ [`@xmachines/play-url`](../api/@xmachines/play-url/README.md) re-exports both, so the
74
+ match reads them from there. A form that the route map matches therefore derives a URL,
75
+ with the exceptions that the table names.
76
+
77
+ | Form | URL to state | state to URL |
78
+ | -------------------------------- | ------------ | -------------------------------------------------------------- |
79
+ | a literal, `:name`, `:name?` | yes | yes |
80
+ | `:name*` | yes | yes — the value keeps each `/` that it carries |
81
+ | `:name+` | yes | yes — the context must hold a value |
82
+ | `{…}` | yes | yes — an optional group with no value goes away |
83
+ | `:name(\d+)` | yes | yes — the build drops the constraint, and it tests nothing |
84
+ | `*`, `(\d+)`, an anonymous param | yes | **no** — the param has no name, so no value can fill it |
85
+ | `:cat-id`, a hyphen in a name | yes | yes |
86
+ | an escape, `\+`, `\(`, `\:` | yes | yes for `\+` and `\(` — `\:` derives a path the bridge refuses |
87
+
88
+ `buildRouteUrl` of [`@xmachines/play-xstate`](../api/@xmachines/play-xstate/README.md)
89
+ performs the outbound half. It throws `MissingRouteParamError` when a part needs a value
90
+ that the context has not, and `deriveCurrentRoute` answers `null` for that error — so the
91
+ address bar waits for the next snapshot that carries the value.
92
+
93
+ It throws `InvalidRouteParamError` when a param carries a dot segment: `.`, `..`, or any
94
+ percent-encoding of the two. A URL parser resolves such a segment away BEFORE it decodes
95
+ the escapes, so the derived path is one that the route matches never. `deriveCurrentRoute`
96
+ passes that error on, because the value corrects itself never: the derivation of
97
+ `currentRoute` reports it through `onError` of the actor and keeps the last route, and
98
+ `initialRoute` throws from the constructor. Check a param value that carries a name from a
99
+ user before the machine puts it in the context.
100
+
101
+ **An anonymous param is the one form that derives no URL.** URLPattern numbers such a
102
+ group from `0`, and this library reports that name to no machine, so a machine can put no
103
+ value under it. A route of this shape is correct for a state that only RECEIVES a deep
104
+ link, such as a catch-all. Give the param a name when the machine navigates to it.
105
+
106
+ **A constraint describes a value, and the build tests no value against it.** The derived
107
+ path carries the value alone — `/page/:number(\d+)` with `{ number: "12" }` gives
108
+ `/page/12` — so a value that the constraint refuses derives a path that the route matches
109
+ never. The machine owns the value.
110
+
111
+ A param that carries `*` or `+` matches across a separator, so its value holds a path and
112
+ not one segment. The build encodes each segment of such a value and it keeps the `/`
113
+ between them: `/files/:path*` with `{ path: "a/b" }` gives `/files/a/b`.
114
+
115
+ The build resolves every escape, so the derived path carries the character and not the
116
+ backslash that protects it. `/tags/c\+\+` derives `/tags/c++`, which is the path that the
117
+ route matches.
118
+
119
+ **An escaped `:` is the one escape that stops at the bridge.** The build derives
120
+ `/time/10:30` for `/time/10\:30`, and the route matches that path — but a bridge refuses
121
+ to push a path that holds a `:`, because a `:` in a CONCRETE path marks a param that
122
+ nothing substituted. `resolveNavigationPath` therefore answers `null`, and the address bar
123
+ follows that state never. Write `%3A` instead, as the section below prescribes.
104
124
 
105
125
  ### A literal that the grammar would read
106
126
 
@@ -120,7 +140,7 @@ and the paragraphs below give the form to write for each.
120
140
  /a%3Fb matches /a?b
121
141
  ```
122
142
 
123
- **An escaped `:` matches, and it derives no URL.** `substituteParams` of `buildRouteUrl` reads `:30` of `/time/10\:30` as a param placeholder, finds no value for the name `30`, and throws `MissingRouteParamError` — which `deriveCurrentRoute` answers with `null`, so the address bar follows that state never. `\+` and `\(` carry no such risk, because neither character starts a param name. Write `%3A` instead: `/time/10%3A30` is an ordinary literal path, and both halves read it. Issue #16 closes the difference.
143
+ **An escaped `:` matches, and it reaches no address bar.** The build resolves the escape, so `/time/10\:30` derives `/time/10:30`, which is the path that the route matches — but a bridge refuses a concrete path that holds a `:`, because that character marks a param that nothing substituted. Write `%3A` instead: `/time/10%3A30` is an ordinary literal path, and both halves read it end to end.
124
144
 
125
145
  A `?` has no literal form, and the escape does not give it one. A URL pathname ends at its first `?`, so `getStateIdByPath` cuts every location there. The route `/a\?b` compiles with no fault, and no location reaches it. Write `%3F` instead: `/a%3Fb` is an ordinary literal path, and it resolves.
126
146
 
@@ -198,7 +218,7 @@ A machine can own the whole router, or it can sit under a mount. `basePath` is t
198
218
 
199
219
  ### 3. `connect()` and `disconnect()` come in a pair, and one actor takes one bridge
200
220
 
201
- A bridge installs a signal watcher on the actor and a subscription on the router. Neither releases itself.
221
+ A bridge installs an atom subscription on the actor and a subscription on the router. Neither releases itself.
202
222
 
203
223
  - Call `disconnect()` from the teardown of your component: `useEffect` cleanup in React, `onUnmounted` in Vue, `onCleanup` in Solid.
204
224
  - A second `connect()` on an actor that already has a bridge throws `DuplicateBridgeError`. The actor takes one bridge, so that two bridges cannot drive it in opposite directions.
@@ -226,19 +246,19 @@ Two matchers that disagree is also a worse failure than one dependency. The matc
226
246
 
227
247
  ## Summary
228
248
 
229
- | Question | Answer |
230
- | ----------------------------------------- | --------------------------------------------------------------- |
231
- | What is the pattern language? | The `URLPattern` pathname grammar, plus hyphenated param names |
232
- | Do I install a polyfill? | No. `@xmachines/play-router` carries one |
233
- | Which side turns a URL into a state? | XMachines, in every adapter |
234
- | Which side turns a state into a URL? | XMachines, with no URLPattern at all |
235
- | When does the framework parse the params? | Vue Router and SolidJS Router, when the parse covers every name |
236
- | Who releases the bridge? | You, through `disconnect()` in the teardown of your component |
249
+ | Question | Answer |
250
+ | ----------------------------------------- | ----------------------------------------------------------------------------------- |
251
+ | What is the pattern language? | The `URLPattern` pathname grammar, plus hyphenated param names |
252
+ | Do I install a polyfill? | No. [`@xmachines/play-router`](../api/@xmachines/play-router/README.md) carries one |
253
+ | Which side turns a URL into a state? | XMachines, in every adapter |
254
+ | Which side turns a state into a URL? | XMachines, with no URLPattern at all |
255
+ | When does the framework parse the params? | Vue Router and SolidJS Router, when the parse covers every name |
256
+ | Who releases the bridge? | You, through `disconnect()` in the teardown of your component |
237
257
 
238
258
  ## See also
239
259
 
240
260
  - [Understanding State Machines](state-machines.md) — how `meta.route` reaches the route map
241
- - [Understanding TC39 Signals](signals.md) — the same decision, made for reactivity
261
+ - [Understanding Atoms](atoms.md) — the same decision, made for reactivity
242
262
  - [Multi-router integration](../examples/multi-router-integration.md) — the provider pattern and `basePath`, end to end
243
263
  - [Routing patterns](../examples/routing-patterns.md) — worked route maps
244
264
  - [@xmachines/play-router](../api/@xmachines/play-router/README.md) — API reference
@@ -120,7 +120,7 @@ const appMachine = setup({/* ... */}).createMachine({
120
120
  });
121
121
  ```
122
122
 
123
- `meta.route` is a string path. When the machine enters a state, `actor.currentRoute` (a `Signal.Computed`) derives this path and emits it. The router bridge reads it and updates the URL.
123
+ `meta.route` is a string path. When the machine enters a state, `actor.currentRoute` (a `ReadonlyAtom`) derives this path and emits it. The router bridge reads it and updates the URL.
124
124
 
125
125
  `meta.view` is a [`PlaySpec`](../api/@xmachines/play-view/index/interfaces/PlaySpec.md) — a `@xmachines/json-render-core` spec object describing what to render. Use `typedSpec(...)` from [`@xmachines/play-actor`](../api/@xmachines/play-actor/README.md) to type-check the spec literal at the definition site (XState's `meta` is untyped). When the machine enters a state, `actor.currentView` is updated with the derived spec. The renderer reads it and projects it through framework components.
126
126
 
@@ -234,7 +234,7 @@ actions: {
234
234
  },
235
235
  ```
236
236
 
237
- Context is accessed in guards, actions, and when computing routes or views. It is not directly observable from outside the actor via signals — only the derived signals (`state`, `currentRoute`, `currentView`) are public. If you need to expose a context field reactively, add a `Signal.Computed` to the actor that derives from `actor.state`.
237
+ Context is accessed in guards, actions, and when computing routes or views. It is not directly observable from outside the actor via atoms — only the derived atoms (`state`, `currentRoute`, `currentView`) are public. If you need to expose a context field reactively, add a computed atom to the actor that derives from `actor.state`.
238
238
 
239
239
  ---
240
240
 
@@ -270,14 +270,14 @@ actor.start();
270
270
  | Switch on URL path in component | `meta.route` on state nodes | Routing intent lives with the state that owns it |
271
271
  | `if (user.role === "admin")` scattered in components | Guards on transitions | Auth logic is co-located with the transitions it governs |
272
272
  | `useEffect` on route changes to decide what to render | `meta.view` on state nodes | View structure is declared alongside the state that owns it |
273
- | Shared mutable state across components | Context + signals | Mutations are explicit, traceable, and test-covered |
273
+ | Shared mutable state across components | Context + atoms | Mutations are explicit, traceable, and test-covered |
274
274
 
275
275
  ---
276
276
 
277
277
  ## See also
278
278
 
279
279
  - [Understanding the Actor Model](actor-model.md) — how the machine definition becomes a live actor
280
- - [Understanding TC39 Signals](signals.md) — how the actor's state is observed by infrastructure
280
+ - [Understanding Atoms](atoms.md) — how the actor's state is observed by infrastructure
281
281
  - [Getting Started](getting-started.md) — step-by-step walkthrough building your first machine and actor
282
282
  - [Routing Patterns](../examples/routing-patterns.md) — worked examples of `meta.route` and guards
283
283
  - [@xmachines/play-xstate](../api/@xmachines/play-xstate/README.md) — full API reference for [`definePlayer`](../api/@xmachines/play-xstate/index/functions/definePlayer.md), [`PlayerActor`](../api/@xmachines/play-xstate/index/classes/PlayerActor.md), and the routing utilities
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xmachines/docs",
3
- "version": "4.0.0",
3
+ "version": "5.0.0",
4
4
  "description": "Documentation for XMachines",
5
5
  "keywords": [
6
6
  "documentation",
@@ -56,8 +56,8 @@
56
56
  "devDependencies": {
57
57
  "@testing-library/jest-dom": "^7.0.1",
58
58
  "@types/node": "^26.6.2",
59
- "oxfmt": "^0.68.0",
60
- "oxlint": "^1.83.0",
59
+ "oxfmt": "^0.70.0",
60
+ "oxlint": "^1.85.0",
61
61
  "typedoc": "^0.28.20",
62
62
  "typedoc-plugin-llms-txt": "^0.1.2",
63
63
  "typedoc-plugin-markdown": "^4.13.0",
package/rfc/play.md CHANGED
@@ -3,7 +3,7 @@
3
3
  **Status:** Living
4
4
  **Version:** 1.1
5
5
  **Scope:** Universal runtime interoperability and reference implementation
6
- **Non-goals:** Persistence, transport protocols, alternative state engines, non-signal reactivity
6
+ **Non-goals:** Persistence, transport protocols, alternative state engines, non-atom reactivity
7
7
 
8
8
  ---
9
9
 
@@ -11,7 +11,7 @@
11
11
 
12
12
  This RFC defines the **Universal Player Architecture** and its reference implementation. The architecture establishes a design pattern that strictly separates **Business Logic (The Actor)** from **Infrastructure (The Runtime Adapter and View)**.
13
13
 
14
- The reference implementation provides a modular monorepo that satisfies the architectural constraints of **Runtime Agnosticism** and **Logic-Driven Guarding**. It leverages **Standardized Signals (TC39)** to glue a specific **State Engine (XState v5)** to multiple **Runtime Adapters** (TanStack Router, React Router, Vue Router, SolidJS Router) and **View Layers** (React, Vue, SolidJS, Vanilla DOM — all via JSON-Render), while ensuring that **business logic remains the single source of truth** for navigation, state, and UI structure.
14
+ The reference implementation provides a modular monorepo that satisfies the architectural constraints of **Runtime Agnosticism** and **Logic-Driven Guarding**. It leverages **atoms** to glue a specific **State Engine (XState v5)** to multiple **Runtime Adapters** (TanStack Router, React Router, Vue Router, SolidJS Router) and **View Layers** (React, Vue, SolidJS, Vanilla DOM — all via JSON-Render), while ensuring that **business logic remains the single source of truth** for navigation, state, and UI structure.
15
15
 
16
16
  ---
17
17
 
@@ -35,7 +35,7 @@ The reference implementation provides a modular monorepo that satisfies the arch
35
35
 
36
36
  ### 2.2 Communication Medium
37
37
 
38
- - **Signals (TC39 Proposal)**
38
+ - **Atoms (`@xstate/store`)**
39
39
  - Used exclusively for Actor ↔ Adapter communication
40
40
  - Enables synchronous, glitch-free propagation
41
41
 
@@ -43,26 +43,29 @@ The reference implementation provides a modular monorepo that satisfies the arch
43
43
 
44
44
  ## 3. Invariants
45
45
 
46
- 1. **Actor Authority**
46
+ This document DEFINES the identifier of each invariant. Every other document and every
47
+ source comment cites the identifier from this list, and it invents none of its own.
48
+
49
+ 1. **INV-01 — Actor Authority**
47
50
  The Actor is the final authority on state and route validity.
48
51
 
49
- 2. **Strict Separation**
52
+ 2. **INV-02 — Strict Separation**
50
53
  Business logic never depends on runtime APIs or routing libraries.
51
54
 
52
- 3. **Signal-Only Reactivity**
53
- All cross-boundary communication uses standardized Signals.
55
+ 3. **INV-03 — Atom-Only Reactivity**
56
+ All cross-boundary communication uses atoms.
54
57
 
55
- 4. **Passive Infrastructure**
58
+ 4. **INV-04 — Passive Infrastructure**
56
59
  Runtime Adapters do not enforce guards, validation, or business rules.
57
60
 
58
- 5. **State-Driven Reset**
61
+ 5. **INV-05 — State-Driven Reset**
59
62
  Invalid external navigation is always overwritten by Actor-derived state.
60
63
 
61
64
  ---
62
65
 
63
66
  ## 4. Core Mechanisms
64
67
 
65
- ### 4.1 Reactive Substrate (Signals)
68
+ ### 4.1 Reactive Substrate (Atoms)
66
69
 
67
70
  - **Push–Pull Model**
68
71
  The Actor pushes state updates; Adapters and Views pull computed values lazily.
@@ -89,7 +92,7 @@ The Actor has zero knowledge of:
89
92
  ### 4.3 Infrastructure Layer (Runtime Adapter)
90
93
 
91
94
  - **Watcher (Output)**
92
- Observes the Actor's _Intended Route_ signal and updates the environment accordingly.
95
+ Observes the Actor's _Intended Route_ atom and updates the environment accordingly.
93
96
 
94
97
  - **Reflector (Input)**
95
98
  Listens to environment events (e.g. back/forward navigation) and forwards them as intents to the Actor.
@@ -105,19 +108,35 @@ If an intent is rejected:
105
108
 
106
109
  ### 5.1 Core Layer
107
110
 
108
- #### 5.1.1 `@xmachines/play-signals`
111
+ #### 5.1.1 `@xmachines/play-atom`
109
112
 
110
113
  **Role:** Reactive Substrate
111
114
 
112
- Wraps the TC39 Signals (Stage 1) polyfill. By isolating the reactive primitive within this package, the ecosystem is protected from specification churn while providing the ergonomic API surface required by the rest of the architecture.
115
+ Re-exports the atom of `@xstate/store`, whose reactive core adapts the Alien Signals algorithm. By isolating the reactive primitive within this package, the ecosystem is protected from churn in the underlying library while providing the ergonomic API surface required by the rest of the architecture.
113
116
 
114
117
  **Exports:**
115
118
 
116
- - `Signal` — Re-exported namespace from `signal-polyfill`:
117
- - `Signal.State` — Actor output snapshot
118
- - `Signal.Computed` — Lazy, pull-based derivation of routes and views
119
- - `Signal.subtle.Watcher` — Synchronous observation for Runtime Adapters
120
- - `watchSignal` — Convenience function: subscribes to a single signal with a one-shot watcher lifecycle and microtask batching; returns a cleanup function
119
+ - `createAtom(value)` — The writable atom. It holds the Actor output snapshot, and the derived view
120
+ - `createAtom(fn)` — The computed atom. It derives a route from the snapshot, and it memoizes the result
121
+ - `createWritableAtom(value)` — The writable atom, with one signature. Use it when the value type is a type parameter: the overload pair of `createAtom` reads an unresolved conditional type as a possible function, and it returns a `ReadonlyAtom`
122
+ - `createAsyncAtom(fn)` — The computed atom of a promise, with a `pending`, `done` and `error` state
123
+ - `watchAtom(atom, onValue)` — Convenience function: subscribes to one atom, coalesces the notifications into one microtask, and returns a cleanup function
124
+ - The types `Atom`, `ReadonlyAtom`, `Readable`, `BaseAtom`, `AnyAtom` and `AtomOptions`
125
+
126
+ **One instance:** `@xstate/store` is a PEER dependency, and it must resolve to ONE copy. The library holds the active subscriber in a module variable, so two copies track no dependency across a package boundary. `tests/singleton-peers.test.ts` holds this rule true for the workspace.
127
+
128
+ **Two properties that a reader has to know:**
129
+
130
+ - A subscription EVALUATES a computed atom, and it does not merely notify. `@xstate/store` builds the subscription on an effect that reads the atom, so a computed atom with a subscriber is eager, and a derivation runs one time for each write of a dependency. A computed atom with NO subscriber stays lazy, and it derives when a reader calls `get()`.
131
+ - The propagation is SYNCHRONOUS, inside the `set` of the atom that changed, and the library exposes no batching. A callback that throws therefore throws inside that `set`, and an observer of two atoms is evaluated between two writes.
132
+
133
+ **Therefore the Actor writes ONE atom for each transition.** `state` is that atom. `currentRoute` and `currentView` are computed atoms over it, so one write reaches both in one propagation and the engine orders the evaluation. Two writes would flush two times, and an observer of `state` and `currentView` would read the new state beside the old view in between.
134
+
135
+ **A derivation of the Actor reports through `onError`, keeps its last good value, and throws never.** `currentRoute` and `currentView` both follow this rule. A subscriber makes a computed atom eager, so the derivation runs inside the `set` of `state`, inside the state-engine subscription: a throw that left it would unwind into the event dispatch and break the transition for every other observer. The containment therefore belongs to the derivation, and not to each subscriber — a consumer that writes its own `watchAtom(actor.currentRoute, …)` is protected by the same rule that protects a router bridge.
136
+
137
+ The rule covers the reactive path. A pure helper such as `deriveCurrentRoute` still throws, because it holds no error channel and no previous value; its callers decide. Construction is the other caller: an unbuildable `initialRoute` fails the construction, which is where a developer wants to see it.
138
+
139
+ Infrastructure that runs HOST code from a subscription contains that code by the same reasoning: `useAtomEffect` of [`@xmachines/play-react`](../api/@xmachines/play-react/README.md) catches a throw of the host callback and throws it again from a microtask.
121
140
 
122
141
  #### 5.1.2 `@xmachines/play`
123
142
 
@@ -130,26 +149,37 @@ Exports the minimal shared contracts that allow the Logic Engine and Infrastruct
130
149
  - `PlayEvent<TPayload>` — Generic intent event dispatched from Infrastructure to Actor. Any object with `{ readonly type: string }` plus optional typed payload fields.
131
150
  - `PlayError` — Structured error base with `scope` and `code` fields for consistent error handling across all `@xmachines/*` packages.
132
151
 
133
- > **Note:** Routing contracts (`RouterBridge`, `PlayRouteEvent`) live in `@xmachines/play-router`, not here. This keeps the core protocol package dependency-free.
152
+ > **Note:** Routing contracts (`RouterBridge`, `PlayRouteEvent`) live in [`@xmachines/play-router`](../api/@xmachines/play-router/README.md), not here. This keeps the core protocol package dependency-free.
134
153
 
135
154
  #### 5.1.3 `@xmachines/play-actor`
136
155
 
137
156
  **Role:** Abstract Logic Engine
138
157
 
139
- Defines the minimal base class that all logic adapters must implement. By extending the XState `Actor` class, the `PlayActor` remains fully compatible with the XState ecosystem (inspection, system registration, message passing) while enforcing the Play Architecture's **push–pull signal contract**.
158
+ Defines the minimal base class that all logic adapters must implement. By extending the XState `Actor` class, the `PlayActor` remains fully compatible with the XState ecosystem (inspection, system registration, message passing) while enforcing the Play Architecture's **push–pull atom contract**.
140
159
 
141
160
  The base class requires only two abstract members: **reactive state** and **typed event dispatch**. Routing and view rendering are opt-in via separate interfaces, allowing actors to compose only the capabilities they need.
142
161
 
143
- **Design Rationale:** The RFC declared an abstract `AbstractActor` CLASS that extended `Actor` of `xstate`, and it declared both capability interfaces in this package. The implementation made the contract an INTERFACE, `PlayActor`, because the class carried no implementation: both of its members were abstract, and its whole effect was to force the inheritance of XState on every consumer of the contract. `@xmachines/play-actor` names `xstate` nowhere now. The implementation also moved each capability interface to the package that holds its shared machinery: `Routable` is in `@xmachines/play-router`, beside the bridge that reads it, and `Viewable` and `PlaySpec` are in `@xmachines/play-view`, beside the view store lifecycle. A consumer who needs no routing and no view therefore installs neither package, and `@xmachines/play-actor` names the capability packages nowhere. The shape of each interface is unchanged.
162
+ **Design Rationale:** The RFC declared an abstract `AbstractActor` CLASS that extended `Actor` of `xstate`, and it declared both capability interfaces in this package. The implementation made the contract an INTERFACE, `PlayActor`, because the class carried no implementation: both of its members were abstract, and its whole effect was to force the inheritance of XState on every consumer of the contract. [`@xmachines/play-actor`](../api/@xmachines/play-actor/README.md) names `xstate` nowhere now. The implementation also moved each capability interface to the package that holds its shared machinery: `Routable` is in [`@xmachines/play-router`](../api/@xmachines/play-router/README.md), beside the bridge that reads it, and `Viewable` and `PlaySpec` are in [`@xmachines/play-view`](../api/@xmachines/play-view/README.md), beside the view store lifecycle. A consumer who needs no routing and no view therefore installs neither package, and [`@xmachines/play-actor`](../api/@xmachines/play-actor/README.md) names the capability packages nowhere. The shape of each interface is unchanged.
144
163
 
145
164
  ```ts
146
165
  import { Actor, type AnyActorLogic, type EventObject } from "xstate";
147
- import type { Signal } from "@xmachines/play-signals";
166
+ import type {
167
+ AnyAtom,
168
+ Atom,
169
+ AtomOptions,
170
+ BaseAtom,
171
+ Readable,
172
+ ReadonlyAtom,
173
+ createAsyncAtom,
174
+ createAtom,
175
+ createWritableAtom,
176
+ watchAtom,
177
+ } from "@xmachines/play-atom";
148
178
  import type { Spec } from "@xmachines/json-render-core";
149
179
 
150
180
  // Optional capability: Routing
151
181
  export interface Routable {
152
- readonly currentRoute: Signal.Computed<string | null>;
182
+ readonly currentRoute: ReadonlyAtom<string | null>;
153
183
  readonly initialRoute: string | null;
154
184
  }
155
185
 
@@ -168,7 +198,7 @@ export interface PlaySpec extends Spec {
168
198
  }
169
199
 
170
200
  export interface Viewable {
171
- readonly currentView: Signal.State<PlaySpec | null>;
201
+ readonly currentView: ReadonlyAtom<PlaySpec | null>;
172
202
  }
173
203
 
174
204
  // The Base Protocol — minimal contract
@@ -177,7 +207,7 @@ export abstract class PlayActor<
177
207
  TEvent extends EventObject = EventObject,
178
208
  > extends Actor<TLogic> {
179
209
  // Reactive Output (Snapshot)
180
- public abstract state: Signal.State<unknown>;
210
+ public abstract state: Atom<unknown>;
181
211
 
182
212
  // Input Channel (typed for specific event shapes)
183
213
  public abstract override send(event: TEvent): void;
@@ -211,7 +241,7 @@ Wraps XState v5 to satisfy the `PlayActor` contract. Provides the primary API fo
211
241
  **Responsibilities:**
212
242
 
213
243
  - Derive `currentRoute` and `currentView` from active state node metadata
214
- - Manage signal lifecycle (create on start, dispose on stop)
244
+ - Manage atom lifecycle (create on start, dispose on stop)
215
245
  - Support snapshot restore for resumable sessions
216
246
  - Provide XState DevTools compatibility
217
247
 
@@ -236,7 +266,7 @@ class PlayerActor<TMachine extends AnyStateMachine>
236
266
  extends Actor<AnyActorLogic>
237
267
  implements PlayActor<SnapshotFrom<TMachine>, EventFromLogic<TMachine>>
238
268
  {
239
- public state: Signal.State<SnapshotFrom<TMachine>>;
269
+ public state: Atom<SnapshotFrom<TMachine>>;
240
270
  }
241
271
 
242
272
  // A capability arrives through `compose`, and each one brings its own package
@@ -244,7 +274,7 @@ const RoutedPlayer = compose(PlayerActor, withRouting, withView);
244
274
  // RoutedPlayer instances hold `currentRoute`, `initialRoute` and `currentView`
245
275
  ```
246
276
 
247
- **Design Rationale:** The RFC made `PlayerActor` implement both capabilities directly. The implementation split them into mixins, because a direct implementation made `@xmachines/play-router` and `@xmachines/play-view` hard dependencies of every actor. Both packages are optional peer dependencies now: `definePlayer({ machine })` installs neither, `withRouting` needs `@xmachines/play-router`, and `withView` needs `@xmachines/play-view`.
277
+ **Design Rationale:** The RFC made `PlayerActor` implement both capabilities directly. The implementation split them into mixins, because a direct implementation made [`@xmachines/play-router`](../api/@xmachines/play-router/README.md) and [`@xmachines/play-view`](../api/@xmachines/play-view/README.md) hard dependencies of every actor. Both packages are optional peer dependencies now: `definePlayer({ machine })` installs neither, `withRouting` needs [`@xmachines/play-router`](../api/@xmachines/play-router/README.md), and `withView` needs [`@xmachines/play-view`](../api/@xmachines/play-view/README.md).
248
278
 
249
279
  **Design Rationale:** The original design passed a `catalog` to `definePlayer` and returned `{ create, catalog }`. The implementation decoupled catalogs entirely — component schemas are defined via `@xmachines/json-render-core`'s `defineCatalog` and bound to renderers via `defineRegistry`, not to actors. This means a single actor can be rendered by different component libraries without change.
250
280
 
@@ -258,9 +288,10 @@ Provides the complete routing infrastructure: route extraction from state machin
258
288
 
259
289
  **Design Rationale:** The RFC put the whole of the routing in one package. The implementation split it at two boundaries, because a consumer paid for both halves and used one:
260
290
 
261
- - `@xmachines/play-router/xstate` holds the machine half — `extractMachineRoutes`, `createRouteMap`, `machineToGraph`, and the queries over a route tree. That half alone needs `xstate` and `@statelyai/graph`.
262
- - `@xmachines/play-url` holds the URL language — the URLPattern grammar, a base path, and the params of a framework router. It knows no machine and no bridge, and BOTH directions of the routing read it.
263
- - `@xmachines/play-router` keeps the route map, the match of a location, `RouterBridgeBase`, the provider lifecycle, and the `Routable` capability. It names no state machine.
291
+ - [`@xmachines/play-router/xstate`](../api/@xmachines/play-router/README.md) holds the machine half — `extractMachineRoutes`, `createRouteMap`, `machineToGraph`, and the queries over a route tree. That half alone needs `xstate` and `@statelyai/graph`.
292
+ - [`@xmachines/play-pattern`](../api/@xmachines/play-pattern/README.md) holds the pattern LANGUAGE — one parse of the URLPattern pathname grammar, and the path that `buildPath` writes back from it. A parse is string work, so the package carries no URLPattern API and no polyfill. BOTH directions of the routing read it: the match of [`@xmachines/play-router`](../api/@xmachines/play-router/README.md) reads the parse, and the routing capability of [`@xmachines/play-xstate`](../api/@xmachines/play-xstate/README.md) reads the same parse to build a URL, so that package installs no matching machinery.
293
+ - [`@xmachines/play-url`](../api/@xmachines/play-url/README.md) holds the URL LAYER — the URLPattern API with its polyfill, a base path, a location splitter, and the params of a framework router. It reads [`@xmachines/play-pattern`](../api/@xmachines/play-pattern/README.md) for the language and re-exports it whole. It knows no machine and no bridge.
294
+ - [`@xmachines/play-router`](../api/@xmachines/play-router/README.md) keeps the route map, the match of a location, `RouterBridgeBase`, the provider lifecycle, and the `Routable` capability. It names no state machine.
264
295
 
265
296
  The export lists below name the original layout. Each package README names what it holds now.
266
297
 
@@ -268,7 +299,7 @@ The export lists below name the original layout. Each package README names what
268
299
 
269
300
  - `RouterBridge` — Interface: `{ connect(): void; disconnect(): void }`
270
301
  - `PlayRouteEvent` — Routing event: `{ type: 'play.route'; to: string; params?; query?; match? }`
271
- - `RouterBridgeBase` — Abstract base class that encapsulates common bridge logic (signal watching, route synchronization, param/query extraction). Subclasses implement only three methods:
302
+ - `RouterBridgeBase` — Abstract base class that encapsulates common bridge logic (atom watching, route synchronization, param/query extraction). Subclasses implement only three methods:
272
303
  - `navigateRouter(path)` — Push a path into the framework router
273
304
  - `watchRouterChanges()` — Subscribe to framework router navigation events
274
305
  - `unwatchRouterChanges()` — Unsubscribe from framework router events
@@ -297,41 +328,41 @@ The export lists below name the original layout. Each package README names what
297
328
 
298
329
  Each adapter extends `RouterBridgeBase` and implements the three abstract methods for its target router. All share the same architectural pattern:
299
330
 
300
- | Package | Router | Framework |
301
- | --------------------------------------- | ---------------- | --------- |
302
- | `@xmachines/play-tanstack-react-router` | TanStack Router | React |
303
- | `@xmachines/play-tanstack-solid-router` | TanStack Router | SolidJS |
304
- | `@xmachines/play-react-router` | React Router 7/8 | React |
305
- | `@xmachines/play-vue-router` | Vue Router 4/5 | Vue |
306
- | `@xmachines/play-solid-router` | SolidJS Router | SolidJS |
331
+ | Package | Router | Framework |
332
+ | ------------------------------------------------------------------------------------------------- | ---------------- | --------- |
333
+ | [`@xmachines/play-tanstack-react-router`](../api/@xmachines/play-tanstack-react-router/README.md) | TanStack Router | React |
334
+ | [`@xmachines/play-tanstack-solid-router`](../api/@xmachines/play-tanstack-solid-router/README.md) | TanStack Router | SolidJS |
335
+ | [`@xmachines/play-react-router`](../api/@xmachines/play-react-router/README.md) | React Router 7/8 | React |
336
+ | [`@xmachines/play-vue-router`](../api/@xmachines/play-vue-router/README.md) | Vue Router 4/5 | Vue |
337
+ | [`@xmachines/play-solid-router`](../api/@xmachines/play-solid-router/README.md) | SolidJS Router | SolidJS |
307
338
 
308
339
  **Runtime Adapter Responsibilities (all adapters):**
309
340
 
310
341
  - **Input (Reflector):** Listen to router navigation events, extract params/query, send `PlayRouteEvent` to Actor
311
- - **Output (Watcher):** Observe Actor's `currentRoute` signal, call `navigateRouter()` when it changes
342
+ - **Output (Watcher):** Observe Actor's `currentRoute` atom, call `navigateRouter()` when it changes
312
343
  - **Reset:** If Actor rejects a navigation (guard failure), the adapter overwrites the URL bar to match Actor state
313
344
 
314
345
  ### 5.4 View Layer
315
346
 
316
347
  #### 5.4.1 View Renderers
317
348
 
318
- Each view renderer provides a `PlayRenderer` component that passively observes the actor's `currentView` signal and projects the JSON spec into framework-native components via `@json-render`.
349
+ Each view renderer provides a `PlayRenderer` component that passively observes the actor's `currentView` atom and projects the JSON spec into framework-native components via `@json-render`.
319
350
 
320
- | Package | Framework | JSON-Render Backend |
321
- | ----------------------- | ----------- | ------------------------------ |
322
- | `@xmachines/play-react` | React | `@xmachines/json-render-react` |
323
- | `@xmachines/play-vue` | Vue 3 | `@xmachines/json-render-vue` |
324
- | `@xmachines/play-solid` | SolidJS | `@xmachines/json-render-solid` |
325
- | `@xmachines/play-dom` | Vanilla DOM | `@xmachines/json-render-core` |
351
+ | Package | Framework | JSON-Render Backend |
352
+ | ----------------------------------------------------------------- | ----------- | ------------------------------ |
353
+ | [`@xmachines/play-react`](../api/@xmachines/play-react/README.md) | React | `@xmachines/json-render-react` |
354
+ | [`@xmachines/play-vue`](../api/@xmachines/play-vue/README.md) | Vue 3 | `@xmachines/json-render-vue` |
355
+ | [`@xmachines/play-solid`](../api/@xmachines/play-solid/README.md) | SolidJS | `@xmachines/json-render-solid` |
356
+ | [`@xmachines/play-dom`](../api/@xmachines/play-dom/README.md) | Vanilla DOM | `@xmachines/json-render-core` |
326
357
 
327
358
  **Shared Architecture (all renderers):**
328
359
 
329
- 1. Subscribe to `actor.currentView` signal
360
+ 1. Subscribe to `actor.currentView` atom
330
361
  2. Resolve a `StateStore` (external or auto-created per view transition via `@xstate/store`)
331
362
  3. Wire `actions` prop to `actor.send()` via `ActionProvider`
332
363
  4. Render `spec` through the framework's `Renderer` with a `registry` (defined via `defineRegistry`)
333
364
 
334
- **`@xmachines/play-react` exports (representative):**
365
+ **[`@xmachines/play-react`](../api/@xmachines/play-react/README.md) exports (representative):**
335
366
 
336
367
  ```ts
337
368
  // Batteries-included composite — standard entry point
@@ -340,7 +371,7 @@ Each view renderer provides a `PlayRenderer` component that passively observes t
340
371
  export { PlayUIProvider } from "./PlayUIProvider";
341
372
  export type { PlayUIProviderProps } from "./PlayUIProvider";
342
373
 
343
- // Escape-hatch primitive — owns actor lifecycle, signal bridge, ViewContext
374
+ // Escape-hatch primitive — owns actor lifecycle, atom bridge, ViewContext
344
375
  // Props: actor, registryResult, store?, fallback?, onError?, onRenderError?, children (required)
345
376
  export { ActorProvider } from "./ActorProvider";
346
377
  export type { ActorProviderProps } from "./ActorProvider";
@@ -353,7 +384,7 @@ export const PlayRenderer: React.FC = () => {
353
384
 
354
385
  // Hooks
355
386
  export { usePlayView } from "./ActorProvider"; // returns ViewContextValue | null
356
- export { useSignalEffect } from "./useSignalEffect";
387
+ export { useAtomEffect } from "./useAtomEffect";
357
388
  export { useActor } from "./useActor";
358
389
 
359
390
  // Error handling
@@ -371,7 +402,7 @@ export {
371
402
  } from "@xmachines/json-render-react";
372
403
  ```
373
404
 
374
- **Design Rationale:** `PlayRenderer` is now a **zero-prop leaf component** — it reads view context from the enclosing `ActorProvider` via `usePlayView()`. All mount-time concerns (actor bridging, signal subscription, store lifecycle, `onRenderError` injection) are centralised in `ActorProvider`. `PlayUIProvider` is the batteries-included composite that wraps `ActorProvider` + `JSONUIProvider` with a handler bridge. This mirrors the provider/renderer split in `@xmachines/json-render-*` and makes the separation of concerns explicit.
405
+ **Design Rationale:** `PlayRenderer` is now a **zero-prop leaf component** — it reads view context from the enclosing `ActorProvider` via `usePlayView()`. All mount-time concerns (actor bridging, atom subscription, store lifecycle, `onRenderError` injection) are centralised in `ActorProvider`. `PlayUIProvider` is the batteries-included composite that wraps `ActorProvider` + `JSONUIProvider` with a handler bridge. This mirrors the provider/renderer split in `@xmachines/json-render-*` and makes the separation of concerns explicit.
375
406
 
376
407
  ### 5.5 Schema Layer (External)
377
408