@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.
- package/api/@xmachines/play/classes/NonNullableError.md +4 -4
- package/api/@xmachines/play/classes/PlayError.md +4 -4
- package/api/@xmachines/play/functions/assertNonNullable.md +1 -1
- package/api/@xmachines/play/type-aliases/PlayEvent.md +2 -2
- package/api/@xmachines/play-actor/README.md +18 -19
- package/api/@xmachines/play-actor/classes/AbstractActor.md +3 -3
- package/api/@xmachines/play-actor/functions/typedSpec.md +7 -10
- package/api/@xmachines/play-actor/interfaces/BaseActorProviderProps.md +46 -0
- package/api/@xmachines/play-actor/interfaces/BaseViewContextValue.md +33 -0
- package/api/@xmachines/play-actor/interfaces/PlaySpec.md +2 -2
- package/api/@xmachines/play-actor/interfaces/Routable.md +3 -3
- package/api/@xmachines/play-actor/interfaces/Viewable.md +4 -4
- package/api/@xmachines/play-dom/README.md +102 -18
- package/api/@xmachines/play-dom/classes/PlayRenderer.md +4 -4
- package/api/@xmachines/play-dom/functions/connectRenderer.md +1 -1
- package/api/@xmachines/play-dom/functions/createPlayUI.md +28 -0
- package/api/@xmachines/play-dom/functions/createRenderer.md +1 -1
- package/api/@xmachines/play-dom/functions/defineRegistry.md +1 -23
- package/api/@xmachines/play-dom/functions/renderSpec.md +1 -1
- package/api/@xmachines/play-dom/interfaces/ComponentContext.md +9 -9
- package/api/@xmachines/play-dom/interfaces/ConnectRendererOptions.md +19 -11
- package/api/@xmachines/play-dom/interfaces/CreatePlayUIOptions.md +29 -0
- package/api/@xmachines/play-dom/interfaces/DefineRegistryResult.md +6 -6
- package/api/@xmachines/play-dom/interfaces/DomRenderContext.md +14 -14
- package/api/@xmachines/play-dom/interfaces/EventHandle.md +6 -6
- package/api/@xmachines/play-dom/interfaces/MountOptions.md +14 -0
- package/api/@xmachines/play-dom/interfaces/PlayDomOptions.md +7 -7
- package/api/@xmachines/play-dom/interfaces/UIProviderOptions.md +27 -0
- package/api/@xmachines/play-dom/type-aliases/ActionFn.md +1 -1
- package/api/@xmachines/play-dom/type-aliases/Actions.md +1 -1
- package/api/@xmachines/play-dom/type-aliases/BaseComponentProps.md +7 -7
- package/api/@xmachines/play-dom/type-aliases/CatalogHasActions.md +1 -1
- package/api/@xmachines/play-dom/type-aliases/ComponentFn.md +1 -1
- package/api/@xmachines/play-dom/type-aliases/ComponentRegistry.md +1 -1
- package/api/@xmachines/play-dom/type-aliases/DefineRegistryOptions.md +4 -4
- package/api/@xmachines/play-dom/type-aliases/DomComponentRenderer.md +1 -1
- package/api/@xmachines/play-dom/type-aliases/DomRegistry.md +1 -1
- package/api/@xmachines/play-dom/type-aliases/DomSchema.md +1 -1
- package/api/@xmachines/play-dom/type-aliases/MountFn.md +25 -0
- package/api/@xmachines/play-dom/type-aliases/RenderErrorHandler.md +23 -0
- package/api/@xmachines/play-dom/type-aliases/SetState.md +1 -1
- package/api/@xmachines/play-dom/variables/schema.md +1 -1
- package/api/@xmachines/play-dom-router/README.md +3 -3
- package/api/@xmachines/play-dom-router/functions/connectRouter.md +1 -1
- package/api/@xmachines/play-dom-router/functions/createBrowserHistory.md +1 -1
- package/api/@xmachines/play-dom-router/functions/createRouteMap.md +3 -3
- package/api/@xmachines/play-dom-router/functions/createRouter.md +1 -1
- package/api/@xmachines/play-dom-router/interfaces/BrowserHistory.md +14 -14
- package/api/@xmachines/play-dom-router/interfaces/BrowserWindow.md +14 -14
- package/api/@xmachines/play-dom-router/interfaces/ConnectRouterOptions.md +4 -4
- package/api/@xmachines/play-dom-router/interfaces/PlayRouteEvent.md +6 -6
- package/api/@xmachines/play-dom-router/interfaces/{RouteMapLike.md → RouteLookupContract.md} +7 -7
- package/api/@xmachines/play-dom-router/interfaces/RouteMap.md +6 -11
- package/api/@xmachines/play-dom-router/interfaces/RouteMapping.md +8 -8
- package/api/@xmachines/play-dom-router/interfaces/RouterBridge.md +3 -3
- package/api/@xmachines/play-dom-router/interfaces/VanillaRouter.md +4 -4
- package/api/@xmachines/play-dom-router/type-aliases/RoutableActor.md +1 -1
- package/api/@xmachines/play-react/README.md +165 -48
- package/api/@xmachines/play-react/classes/PlayErrorBoundary.md +5 -5
- package/api/@xmachines/play-react/functions/ActionProvider.md +21 -0
- package/api/@xmachines/play-react/functions/JSONUIProvider.md +21 -0
- package/api/@xmachines/play-react/functions/Renderer.md +21 -0
- package/api/@xmachines/play-react/functions/StateProvider.md +27 -0
- package/api/@xmachines/play-react/functions/ValidationProvider.md +21 -0
- package/api/@xmachines/play-react/functions/VisibilityProvider.md +21 -0
- package/api/@xmachines/play-react/functions/useActor.md +1 -1
- package/api/@xmachines/play-react/functions/usePlayView.md +32 -0
- package/api/@xmachines/play-react/functions/useSignalEffect.md +1 -1
- package/api/@xmachines/play-react/interfaces/ActionProviderProps.md +15 -0
- package/api/@xmachines/play-react/interfaces/ActorProviderProps.md +27 -0
- package/api/@xmachines/play-react/interfaces/JSONUIProviderProps.md +21 -0
- package/api/@xmachines/play-react/interfaces/PlayErrorBoundaryProps.md +4 -4
- package/api/@xmachines/play-react/interfaces/PlayErrorBoundaryState.md +3 -3
- package/api/@xmachines/play-react/interfaces/PlayUIProviderProps.md +26 -0
- package/api/@xmachines/play-react/interfaces/RendererProps.md +17 -0
- package/api/@xmachines/play-react/interfaces/StateProviderProps.md +16 -0
- package/api/@xmachines/play-react/interfaces/ValidationProviderProps.md +14 -0
- package/api/@xmachines/play-react/interfaces/ViewContextValue.md +20 -0
- package/api/@xmachines/play-react/interfaces/VisibilityProviderProps.md +13 -0
- package/api/@xmachines/play-react/type-aliases/PlayActor.md +1 -1
- package/api/@xmachines/play-react/type-aliases/RenderErrorHandler.md +3 -2
- package/api/@xmachines/play-react/variables/ActorProvider.md +33 -0
- package/api/@xmachines/play-react/variables/PlayRenderer.md +5 -50
- package/api/@xmachines/play-react/variables/PlayUIProvider.md +43 -0
- package/api/@xmachines/play-react-router/README.md +1 -0
- package/api/@xmachines/play-react-router/classes/ReactRouterBridge.md +24 -24
- package/api/@xmachines/play-react-router/classes/RouteMap.md +38 -22
- package/api/@xmachines/play-react-router/functions/PlayRouterProvider.md +1 -1
- package/api/@xmachines/play-react-router/functions/createRouteMap.md +21 -0
- package/api/@xmachines/play-react-router/functions/createRouteMapFromTree.md +5 -5
- package/api/@xmachines/play-react-router/interfaces/PlayRouteEvent.md +6 -6
- package/api/@xmachines/play-react-router/interfaces/PlayRouterProviderProps.md +5 -5
- package/api/@xmachines/play-react-router/interfaces/RouteMapping.md +8 -8
- package/api/@xmachines/play-react-router/interfaces/RouterBridge.md +3 -3
- package/api/@xmachines/play-router/README.md +6 -6
- package/api/@xmachines/play-router/classes/{BaseRouteMap.md → RouteMap.md} +11 -11
- package/api/@xmachines/play-router/classes/RouterBridgeBase.md +24 -24
- package/api/@xmachines/play-router/functions/buildPlayRouteEvent.md +2 -2
- package/api/@xmachines/play-router/functions/buildRouteTree.md +1 -1
- package/api/@xmachines/play-router/functions/createRouteMap.md +6 -6
- package/api/@xmachines/play-router/functions/createRouteMapFromMachine.md +5 -5
- package/api/@xmachines/play-router/functions/createRouteMapFromTree.md +6 -6
- package/api/@xmachines/play-router/functions/detectDuplicateRoutes.md +1 -1
- package/api/@xmachines/play-router/functions/extractMachineRoutes.md +1 -1
- package/api/@xmachines/play-router/functions/extractQuery.md +1 -1
- package/api/@xmachines/play-router/functions/extractRouteParams.md +1 -1
- package/api/@xmachines/play-router/functions/findRouteById.md +1 -1
- package/api/@xmachines/play-router/functions/findRouteByPath.md +1 -1
- package/api/@xmachines/play-router/functions/getNavigableRoutes.md +1 -1
- package/api/@xmachines/play-router/functions/getRoutableRoutes.md +1 -1
- package/api/@xmachines/play-router/functions/getTransitionReachableRoutes.md +1 -1
- package/api/@xmachines/play-router/functions/isRouteReachable.md +1 -1
- package/api/@xmachines/play-router/functions/machineToGraph.md +1 -1
- package/api/@xmachines/play-router/functions/routeExists.md +1 -1
- package/api/@xmachines/play-router/functions/sanitizePathname.md +1 -1
- package/api/@xmachines/play-router/functions/validateRouteFormat.md +1 -1
- package/api/@xmachines/play-router/functions/validateStateExists.md +1 -1
- package/api/@xmachines/play-router/interfaces/BuildPlayRouteEventOptions.md +4 -4
- package/api/@xmachines/play-router/interfaces/LocationLike.md +3 -3
- package/api/@xmachines/play-router/interfaces/MachineEdgeData.md +3 -3
- package/api/@xmachines/play-router/interfaces/MachineNodeData.md +5 -5
- package/api/@xmachines/play-router/interfaces/PlayRouteEvent.md +6 -6
- package/api/@xmachines/play-router/interfaces/RouteInfo.md +8 -8
- package/api/@xmachines/play-router/interfaces/RouteMapping.md +8 -8
- package/api/@xmachines/play-router/interfaces/RouteMatch.md +3 -3
- package/api/@xmachines/play-router/interfaces/{RouteMap.md → RouteMatcher.md} +13 -13
- package/api/@xmachines/play-router/interfaces/RouteNode.md +10 -10
- package/api/@xmachines/play-router/interfaces/RouteObject.md +2 -2
- package/api/@xmachines/play-router/interfaces/RouteTree.md +5 -5
- package/api/@xmachines/play-router/interfaces/RouteWatcherHandle.md +3 -3
- package/api/@xmachines/play-router/interfaces/RouterBridge.md +3 -3
- package/api/@xmachines/play-router/interfaces/WindowLike.md +3 -3
- package/api/@xmachines/play-router/type-aliases/MachineGraph.md +1 -1
- package/api/@xmachines/play-router/type-aliases/RouteMetadata.md +1 -1
- package/api/@xmachines/play-signals/functions/watchSignal.md +1 -1
- package/api/@xmachines/play-signals/interfaces/ComputedOptions.md +2 -2
- package/api/@xmachines/play-signals/interfaces/SignalComputed.md +2 -2
- package/api/@xmachines/play-signals/interfaces/SignalOptions.md +2 -2
- package/api/@xmachines/play-signals/interfaces/SignalState.md +3 -3
- package/api/@xmachines/play-signals/interfaces/SignalWatcher.md +4 -4
- package/api/@xmachines/play-signals/type-aliases/WatcherNotify.md +1 -1
- package/api/@xmachines/play-solid/README.md +158 -42
- package/api/@xmachines/play-solid/functions/ActionProvider.md +19 -0
- package/api/@xmachines/play-solid/functions/JSONUIProvider.md +21 -0
- package/api/@xmachines/play-solid/functions/Renderer.md +21 -0
- package/api/@xmachines/play-solid/functions/StateProvider.md +19 -0
- package/api/@xmachines/play-solid/functions/ValidationProvider.md +19 -0
- package/api/@xmachines/play-solid/functions/VisibilityProvider.md +20 -0
- package/api/@xmachines/play-solid/functions/defineRegistry.md +1 -1
- package/api/@xmachines/play-solid/functions/useAction.md +24 -0
- package/api/@xmachines/play-solid/functions/useActions.md +13 -0
- package/api/@xmachines/play-solid/functions/useActor.md +1 -1
- package/api/@xmachines/play-solid/functions/useFieldValidation.md +29 -0
- package/api/@xmachines/play-solid/functions/useIsVisible.md +19 -0
- package/api/@xmachines/play-solid/functions/useOptionalValidation.md +13 -0
- package/api/@xmachines/play-solid/functions/usePlayView.md +30 -0
- package/api/@xmachines/play-solid/functions/useStateBinding.md +25 -0
- package/api/@xmachines/play-solid/functions/useStateStore.md +13 -0
- package/api/@xmachines/play-solid/functions/useStateValue.md +25 -0
- package/api/@xmachines/play-solid/functions/useVisibility.md +13 -0
- package/api/@xmachines/play-solid/interfaces/ActionProviderProps.md +12 -0
- package/api/@xmachines/play-solid/interfaces/ActorProviderProps.md +30 -0
- package/api/@xmachines/play-solid/interfaces/DefineRegistryResult.md +15 -0
- package/api/@xmachines/play-solid/interfaces/JSONUIProviderProps.md +21 -0
- package/api/@xmachines/play-solid/interfaces/PlayUIProviderProps.md +26 -0
- package/api/@xmachines/play-solid/interfaces/RendererProps.md +17 -0
- package/api/@xmachines/play-solid/interfaces/StateProviderProps.md +13 -0
- package/api/@xmachines/play-solid/interfaces/ValidationProviderProps.md +11 -0
- package/api/@xmachines/play-solid/interfaces/ViewContextValue.md +21 -0
- package/api/@xmachines/play-solid/type-aliases/ComponentRegistry.md +17 -0
- package/api/@xmachines/play-solid/type-aliases/PlayActor.md +1 -1
- package/api/@xmachines/play-solid/type-aliases/RenderErrorHandler.md +3 -2
- package/api/@xmachines/play-solid/type-aliases/SetState.md +21 -0
- package/api/@xmachines/play-solid/type-aliases/VisibilityProviderProps.md +9 -0
- package/api/@xmachines/play-solid/variables/ActorContext.md +13 -0
- package/api/@xmachines/play-solid/variables/ActorProvider.md +27 -0
- package/api/@xmachines/play-solid/variables/PlayRenderer.md +5 -18
- package/api/@xmachines/play-solid/variables/PlayUIProvider.md +26 -0
- package/api/@xmachines/play-solid-router/README.md +2 -2
- package/api/@xmachines/play-solid-router/classes/RouteMap.md +9 -9
- package/api/@xmachines/play-solid-router/classes/SolidRouterBridge.md +25 -25
- package/api/@xmachines/play-solid-router/functions/PlayRouterProvider.md +1 -1
- package/api/@xmachines/play-solid-router/functions/createRouteMap.md +3 -3
- package/api/@xmachines/play-solid-router/interfaces/AbstractActor.md +3 -3
- package/api/@xmachines/play-solid-router/interfaces/PlayRouteEvent.md +6 -6
- package/api/@xmachines/play-solid-router/interfaces/PlayRouterProviderProps.md +5 -5
- package/api/@xmachines/play-solid-router/interfaces/RouteMapping.md +8 -8
- package/api/@xmachines/play-solid-router/interfaces/RouterBridge.md +3 -3
- package/api/@xmachines/play-solid-router/type-aliases/RoutableActor.md +1 -1
- package/api/@xmachines/play-solid-router/type-aliases/SolidRouterHooks.md +4 -4
- package/api/@xmachines/play-svelte/README.md +105 -25
- package/api/@xmachines/play-svelte/functions/defineRegistry.md +1 -1
- package/api/@xmachines/play-svelte/functions/getActorContext.md +21 -0
- package/api/@xmachines/play-svelte/functions/getPlayViewContext.md +19 -0
- package/api/@xmachines/play-svelte/functions/setActorContext.md +19 -0
- package/api/@xmachines/play-svelte/interfaces/ActorProviderProps.md +40 -0
- package/api/@xmachines/play-svelte/interfaces/DefineRegistryOptions.md +6 -6
- package/api/@xmachines/play-svelte/interfaces/ViewContextValue.md +24 -0
- package/api/@xmachines/play-svelte/type-aliases/PlayActor.md +9 -0
- package/api/@xmachines/play-svelte/type-aliases/RenderErrorHandler.md +1 -17
- package/api/@xmachines/play-svelte-spa-router/classes/RouteMap.md +9 -9
- package/api/@xmachines/play-svelte-spa-router/functions/connectRouter.md +1 -1
- package/api/@xmachines/play-svelte-spa-router/functions/createRouteMap.md +3 -3
- package/api/@xmachines/play-svelte-spa-router/interfaces/ConnectRouterOptions.md +4 -4
- package/api/@xmachines/play-svelte-spa-router/interfaces/PlayRouteEvent.md +6 -6
- package/api/@xmachines/play-svelte-spa-router/interfaces/RouteMapping.md +8 -8
- package/api/@xmachines/play-svelte-spa-router/interfaces/RouterBridge.md +3 -3
- package/api/@xmachines/play-svelte-spa-router/interfaces/WindowLike.md +3 -3
- package/api/@xmachines/play-svelte-spa-router/type-aliases/RoutableActor.md +1 -1
- package/api/@xmachines/play-sveltekit-router/classes/RouteMap.md +9 -9
- package/api/@xmachines/play-sveltekit-router/functions/connectRouter.md +1 -1
- package/api/@xmachines/play-sveltekit-router/functions/createRouteMap.md +3 -3
- package/api/@xmachines/play-sveltekit-router/interfaces/ConnectRouterOptions.md +4 -4
- package/api/@xmachines/play-sveltekit-router/interfaces/LocationLike.md +3 -3
- package/api/@xmachines/play-sveltekit-router/interfaces/PlayRouteEvent.md +6 -6
- package/api/@xmachines/play-sveltekit-router/interfaces/RouteMapping.md +8 -8
- package/api/@xmachines/play-sveltekit-router/interfaces/RouterBridge.md +3 -3
- package/api/@xmachines/play-sveltekit-router/type-aliases/RoutableActor.md +1 -1
- package/api/@xmachines/play-tanstack-react-router/README.md +1 -1
- package/api/@xmachines/play-tanstack-react-router/classes/RouteMap.md +38 -22
- package/api/@xmachines/play-tanstack-react-router/classes/TanStackReactRouterBridge.md +24 -24
- package/api/@xmachines/play-tanstack-react-router/functions/PlayRouterProvider.md +1 -1
- package/api/@xmachines/play-tanstack-react-router/functions/createRouteMap.md +7 -39
- package/api/@xmachines/play-tanstack-react-router/functions/createRouteMapFromTree.md +5 -5
- package/api/@xmachines/play-tanstack-react-router/functions/extractMachineRoutes.md +1 -1
- package/api/@xmachines/play-tanstack-react-router/interfaces/PlayRouteEvent.md +6 -6
- package/api/@xmachines/play-tanstack-react-router/interfaces/PlayRouterProviderProps.md +5 -5
- package/api/@xmachines/play-tanstack-react-router/interfaces/RouteMapping.md +8 -8
- package/api/@xmachines/play-tanstack-react-router/interfaces/RouteNavigateEvent.md +3 -3
- package/api/@xmachines/play-tanstack-react-router/interfaces/RouterBridge.md +3 -3
- package/api/@xmachines/play-tanstack-react-router/type-aliases/TanStackRouterInstance.md +1 -1
- package/api/@xmachines/play-tanstack-react-router/type-aliases/TanStackRouterLike.md +4 -4
- package/api/@xmachines/play-tanstack-solid-router/README.md +1 -1
- package/api/@xmachines/play-tanstack-solid-router/classes/RouteMap.md +9 -9
- package/api/@xmachines/play-tanstack-solid-router/classes/SolidRouterBridge.md +25 -25
- package/api/@xmachines/play-tanstack-solid-router/functions/PlayRouterProvider.md +1 -1
- package/api/@xmachines/play-tanstack-solid-router/functions/createRouteMap.md +3 -3
- package/api/@xmachines/play-tanstack-solid-router/interfaces/PlayRouteEvent.md +6 -6
- package/api/@xmachines/play-tanstack-solid-router/interfaces/PlayRouterProviderProps.md +5 -5
- package/api/@xmachines/play-tanstack-solid-router/interfaces/RouteMapping.md +8 -8
- package/api/@xmachines/play-tanstack-solid-router/interfaces/RouterBridge.md +3 -3
- package/api/@xmachines/play-tanstack-solid-router/type-aliases/RoutableActor.md +1 -1
- package/api/@xmachines/play-tanstack-solid-router/type-aliases/TanStackRouterInstance.md +1 -1
- package/api/@xmachines/play-tanstack-solid-router/type-aliases/TanStackRouterLike.md +3 -3
- package/api/@xmachines/play-vue/README.md +136 -40
- package/api/@xmachines/play-vue/functions/defineRegistry.md +2 -2
- package/api/@xmachines/play-vue/functions/getPlayViewContext.md +28 -0
- package/api/@xmachines/play-vue/functions/useActor.md +1 -1
- package/api/@xmachines/play-vue/interfaces/ActionProviderProps.md +12 -0
- package/api/@xmachines/play-vue/interfaces/ActorProviderProps.md +25 -0
- package/api/@xmachines/play-vue/interfaces/DefineRegistryResult.md +15 -0
- package/api/@xmachines/play-vue/interfaces/JSONUIProviderProps.md +20 -0
- package/api/@xmachines/play-vue/interfaces/PlayUIProviderProps.md +24 -0
- package/api/@xmachines/play-vue/interfaces/RendererProps.md +17 -0
- package/api/@xmachines/play-vue/interfaces/StateProviderProps.md +15 -0
- package/api/@xmachines/play-vue/interfaces/ValidationProviderProps.md +11 -0
- package/api/@xmachines/play-vue/interfaces/ViewContextValue.md +21 -0
- package/api/@xmachines/play-vue/type-aliases/ComponentEntry.md +1 -1
- package/api/@xmachines/play-vue/type-aliases/ComponentsMap.md +1 -1
- package/api/@xmachines/play-vue/type-aliases/DefineRegistryOptions.md +2 -2
- package/api/@xmachines/play-vue/type-aliases/PlayActor.md +1 -1
- package/api/@xmachines/play-vue/type-aliases/RenderErrorHandler.md +3 -2
- package/api/@xmachines/play-vue/variables/ActionProvider.md +64 -0
- package/api/@xmachines/play-vue/variables/JSONUIProvider.md +96 -0
- package/api/@xmachines/play-vue/variables/PlayRenderer.md +1 -1
- package/api/@xmachines/play-vue/variables/Renderer.md +79 -0
- package/api/@xmachines/play-vue/variables/StateProvider.md +79 -0
- package/api/@xmachines/play-vue/variables/ValidationProvider.md +55 -0
- package/api/@xmachines/play-vue/variables/VisibilityProvider.md +40 -0
- package/api/@xmachines/play-vue-router/README.md +9 -4
- package/api/@xmachines/play-vue-router/classes/RouteMap.md +38 -20
- package/api/@xmachines/play-vue-router/classes/VueRouterBridge.md +25 -25
- package/api/@xmachines/play-vue-router/functions/createRouteMap.md +1 -1
- package/api/@xmachines/play-vue-router/interfaces/PlayRouteEvent.md +6 -6
- package/api/@xmachines/play-vue-router/interfaces/RouteMapping.md +8 -8
- package/api/@xmachines/play-vue-router/interfaces/RouterBridge.md +3 -3
- package/api/@xmachines/play-vue-router/type-aliases/RoutableActor.md +1 -1
- package/api/@xmachines/play-vue-router/variables/PlayRouterProvider.md +1 -1
- package/api/@xmachines/play-xstate/README.md +1 -1
- package/api/@xmachines/play-xstate/classes/PlayerActor.md +26 -26
- package/api/@xmachines/play-xstate/functions/buildRouteUrl.md +1 -1
- package/api/@xmachines/play-xstate/functions/composeGuards.md +1 -1
- package/api/@xmachines/play-xstate/functions/composeGuardsOr.md +1 -1
- package/api/@xmachines/play-xstate/functions/contextFieldMatches.md +1 -1
- package/api/@xmachines/play-xstate/functions/definePlayer.md +1 -1
- package/api/@xmachines/play-xstate/functions/deriveRoute.md +1 -1
- package/api/@xmachines/play-xstate/functions/eventMatches.md +1 -1
- package/api/@xmachines/play-xstate/functions/formatPlayRouteTransitions.md +1 -1
- package/api/@xmachines/play-xstate/functions/hasContext.md +1 -1
- package/api/@xmachines/play-xstate/functions/isAbsoluteRoute.md +1 -1
- package/api/@xmachines/play-xstate/functions/negateGuard.md +1 -1
- package/api/@xmachines/play-xstate/interfaces/PlayerConfig.md +3 -3
- package/api/@xmachines/play-xstate/interfaces/PlayerFactoryResumeOptions.md +2 -2
- package/api/@xmachines/play-xstate/interfaces/PlayerOptions.md +6 -6
- package/api/@xmachines/play-xstate/interfaces/RouteContext.md +5 -5
- package/api/@xmachines/play-xstate/type-aliases/ComposedGuard.md +1 -1
- package/api/@xmachines/play-xstate/type-aliases/Guard.md +1 -1
- package/api/@xmachines/play-xstate/type-aliases/GuardArray.md +1 -1
- package/api/@xmachines/play-xstate/type-aliases/PlayerFactory.md +1 -1
- package/api/@xmachines/play-xstate/type-aliases/RouteMachineConfig.md +4 -4
- package/api/@xmachines/play-xstate/type-aliases/RouteStateNode.md +4 -4
- package/api/@xmachines/shared/README.md +47 -47
- package/api/@xmachines/shared/functions/defineXmVitestConfig.md +1 -1
- package/api/@xmachines/shared/functions/xmAliases.md +1 -1
- package/api/llms.txt +4 -2
- package/examples/@xmachines/play-dom-demo/README.md +44 -24
- package/examples/@xmachines/play-dom-demo/functions/createNavBar.md +4 -3
- package/examples/@xmachines/play-dom-demo/functions/initShell.md +5 -1
- package/examples/@xmachines/play-dom-demo/type-aliases/AuthCatalog.md +1 -1
- package/examples/@xmachines/play-dom-demo/variables/About.md +4 -1
- package/examples/@xmachines/play-dom-demo/variables/Contact.md +4 -1
- package/examples/@xmachines/play-dom-demo/variables/Dashboard.md +5 -1
- package/examples/@xmachines/play-dom-demo/variables/Home.md +5 -1
- package/examples/@xmachines/play-dom-demo/variables/Login.md +5 -1
- package/examples/@xmachines/play-dom-demo/variables/NavBarView.md +8 -1
- package/examples/@xmachines/play-dom-demo/variables/Navigation.md +5 -1
- package/examples/@xmachines/play-dom-demo/variables/Overview.md +5 -1
- package/examples/@xmachines/play-dom-demo/variables/Profile.md +5 -1
- package/examples/@xmachines/play-dom-demo/variables/Settings.md +5 -1
- package/examples/@xmachines/play-dom-demo/variables/Stats.md +5 -1
- package/examples/@xmachines/play-dom-demo/variables/authCatalog.md +1 -1
- package/examples/@xmachines/play-dom-router-demo/README.md +26 -22
- package/examples/@xmachines/play-react-demo/README.md +55 -48
- package/examples/@xmachines/play-react-demo/functions/App.md +1 -1
- package/examples/@xmachines/play-react-demo/type-aliases/AuthCatalog.md +1 -1
- package/examples/@xmachines/play-react-demo/variables/About.md +6 -1
- package/examples/@xmachines/play-react-demo/variables/Contact.md +6 -1
- package/examples/@xmachines/play-react-demo/variables/Dashboard.md +7 -1
- package/examples/@xmachines/play-react-demo/variables/DebugPanel.md +5 -1
- package/examples/@xmachines/play-react-demo/variables/Home.md +6 -1
- package/examples/@xmachines/play-react-demo/variables/Login.md +8 -1
- package/examples/@xmachines/play-react-demo/variables/NavBar.md +6 -1
- package/examples/@xmachines/play-react-demo/variables/NavBarView.md +7 -1
- package/examples/@xmachines/play-react-demo/variables/Navigation.md +6 -1
- package/examples/@xmachines/play-react-demo/variables/Overview.md +6 -1
- package/examples/@xmachines/play-react-demo/variables/Profile.md +6 -1
- package/examples/@xmachines/play-react-demo/variables/Settings.md +6 -1
- package/examples/@xmachines/play-react-demo/variables/Shell.md +6 -1
- package/examples/@xmachines/play-react-demo/variables/Stats.md +6 -1
- package/examples/@xmachines/play-react-demo/variables/authCatalog.md +1 -1
- package/examples/@xmachines/play-react-router-demo/README.md +5 -3
- package/examples/@xmachines/play-solid-demo/README.md +55 -36
- package/examples/@xmachines/play-solid-demo/functions/App.md +1 -1
- package/examples/@xmachines/play-solid-demo/type-aliases/AuthCatalog.md +1 -1
- package/examples/@xmachines/play-solid-demo/variables/About.md +1 -1
- package/examples/@xmachines/play-solid-demo/variables/Contact.md +1 -1
- package/examples/@xmachines/play-solid-demo/variables/Dashboard.md +1 -1
- package/examples/@xmachines/play-solid-demo/variables/DebugPanel.md +5 -1
- package/examples/@xmachines/play-solid-demo/variables/Home.md +1 -1
- package/examples/@xmachines/play-solid-demo/variables/Login.md +1 -1
- package/examples/@xmachines/play-solid-demo/variables/NavBar.md +1 -1
- package/examples/@xmachines/play-solid-demo/variables/NavBarView.md +6 -3
- package/examples/@xmachines/play-solid-demo/variables/Navigation.md +1 -1
- package/examples/@xmachines/play-solid-demo/variables/Overview.md +1 -1
- package/examples/@xmachines/play-solid-demo/variables/Profile.md +1 -1
- package/examples/@xmachines/play-solid-demo/variables/Settings.md +1 -1
- package/examples/@xmachines/play-solid-demo/variables/Shell.md +5 -1
- package/examples/@xmachines/play-solid-demo/variables/Stats.md +1 -1
- package/examples/@xmachines/play-solid-demo/variables/authCatalog.md +1 -1
- package/examples/@xmachines/play-solid-router-demo/README.md +6 -4
- package/examples/@xmachines/play-svelte-demo/README.md +34 -21
- package/examples/@xmachines/play-svelte-demo/type-aliases/App.md +9 -0
- package/examples/@xmachines/play-svelte-demo/type-aliases/AuthCatalog.md +9 -0
- package/examples/@xmachines/play-svelte-demo/variables/App.md +9 -0
- package/examples/@xmachines/play-svelte-demo/variables/authCatalog.md +172 -0
- package/examples/@xmachines/play-svelte-spa-router-demo/README.md +10 -12
- package/examples/@xmachines/play-sveltekit-router-demo/README.md +12 -14
- package/examples/@xmachines/play-tanstack-react-router-demo/README.md +3 -3
- package/examples/@xmachines/play-tanstack-solid-router-demo/README.md +4 -4
- package/examples/@xmachines/play-vue-demo/README.md +66 -39
- package/examples/@xmachines/play-vue-demo/type-aliases/AuthCatalog.md +9 -0
- package/examples/@xmachines/play-vue-demo/variables/App.md +9 -0
- package/examples/@xmachines/play-vue-demo/variables/authCatalog.md +172 -0
- package/examples/@xmachines/play-vue-router-demo/README.md +21 -24
- package/examples/README.md +2 -0
- package/examples/form-validation.md +33 -42
- package/guides/README.md +8 -0
- package/guides/actor-model.md +180 -0
- package/guides/getting-started.md +18 -14
- package/guides/signals.md +166 -0
- package/guides/state-machines.md +288 -0
- package/package.json +2 -2
- package/rfc/play.md +81 -54
- package/api/@xmachines/play-actor/interfaces/ViewMetadata.md +0 -17
- package/api/@xmachines/play-react/interfaces/PlayRendererProps.md +0 -24
- package/api/@xmachines/play-solid/interfaces/PlayRendererProps.md +0 -24
- package/api/@xmachines/play-svelte/interfaces/PlayRendererProps.md +0 -22
- package/api/@xmachines/play-svelte/variables/getBoundProp.md +0 -7
- package/api/@xmachines/play-vue/interfaces/PlayRendererProps.md +0 -22
- package/api/@xmachines/play-vue-router/classes/VueBaseRouteMap.md +0 -141
- package/api/_media/README.md +0 -321
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
# Understanding State Machines in XMachines
|
|
2
|
+
|
|
3
|
+
XMachines uses XState v5 as its state machine engine. This page explains what finite state machines are, how XMachines extends them with routing and view metadata, and why this design eliminates an entire category of bugs common in traditional frontend architecture.
|
|
4
|
+
|
|
5
|
+
After reading this, you will understand what a machine definition actually encodes — and why state machines are a better unit of business logic than component-level state or ad-hoc if/else trees.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## What a finite state machine is
|
|
10
|
+
|
|
11
|
+
A finite state machine (FSM) is a model of computation with three properties:
|
|
12
|
+
|
|
13
|
+
1. **It is always in exactly one state** from a finite set of possible states.
|
|
14
|
+
2. **It transitions between states only in response to events**.
|
|
15
|
+
3. **The same event in different states can produce different outcomes** (or no transition at all).
|
|
16
|
+
|
|
17
|
+
These three properties, taken together, make behavior _deterministic and exhaustive_. You cannot end up in an unlisted state. You cannot receive an event that produces an unspecified outcome — unhandled events are simply ignored.
|
|
18
|
+
|
|
19
|
+
In traditional component-level state (e.g., boolean flags, `useState` combinations), you typically end up managing _n_ booleans for _n_ conditions. With _n_ booleans, you have 2^n possible combinations — and only a handful of them are actually valid. State machines force you to enumerate only the valid states.
|
|
20
|
+
|
|
21
|
+
**Example:** A login flow with two booleans (`isLoading`, `isError`) has four combinations: `{false,false}`, `{true,false}`, `{false,true}`, `{true,true}`. The last one — loading and error simultaneously — is impossible in practice, but the code has no way to rule it out. A state machine with states `idle | loading | success | error` makes the impossible unrepresentable.
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## How XMachines uses XState v5
|
|
26
|
+
|
|
27
|
+
XMachines wraps XState v5 via `@xmachines/play-xstate`. You define machines using XState's `setup().createMachine()` API:
|
|
28
|
+
|
|
29
|
+
```typescript
|
|
30
|
+
import { setup } from "xstate";
|
|
31
|
+
|
|
32
|
+
const authSetup = setup({
|
|
33
|
+
types: {
|
|
34
|
+
context: {} as { username: string | null },
|
|
35
|
+
events: {} as { type: "auth.login"; username: string } | { type: "auth.logout" },
|
|
36
|
+
input: {} as undefined,
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
const authMachine = authSetup.createMachine({
|
|
41
|
+
id: "auth",
|
|
42
|
+
initial: "unauthenticated",
|
|
43
|
+
context: { username: null },
|
|
44
|
+
states: {
|
|
45
|
+
unauthenticated: {
|
|
46
|
+
on: {
|
|
47
|
+
"auth.login": {
|
|
48
|
+
target: "authenticated",
|
|
49
|
+
actions: authSetup.assign({
|
|
50
|
+
username: ({ event }) => event.username,
|
|
51
|
+
}),
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
authenticated: {
|
|
56
|
+
on: {
|
|
57
|
+
"auth.logout": {
|
|
58
|
+
target: "unauthenticated",
|
|
59
|
+
actions: authSetup.assign({ username: null }),
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
});
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Key patterns:
|
|
68
|
+
|
|
69
|
+
- **Always use `setup({ types })`** before `createMachine`. The type declarations let TypeScript check that your events, context fields, and actions are consistent throughout the machine.
|
|
70
|
+
- **Use `setup.assign()`**, not the bare `assign` from xstate. This keeps the type checker aware of which context fields the action touches.
|
|
71
|
+
- **Event names use lowercase dot-separated namespaces**: `"auth.login"`, `"play.route"`, `"form.submit"`. This convention makes the event log readable and avoids collisions.
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## State node metadata: routing and views
|
|
76
|
+
|
|
77
|
+
XMachines extends XState's `meta` field on each state node. This is where routing intent and view structure live:
|
|
78
|
+
|
|
79
|
+
```typescript
|
|
80
|
+
import { typedSpec } from "@xmachines/play-actor";
|
|
81
|
+
|
|
82
|
+
const appMachine = setup({
|
|
83
|
+
/* ... */
|
|
84
|
+
}).createMachine({
|
|
85
|
+
id: "app",
|
|
86
|
+
initial: "home",
|
|
87
|
+
states: {
|
|
88
|
+
home: {
|
|
89
|
+
meta: {
|
|
90
|
+
route: "/",
|
|
91
|
+
view: typedSpec({
|
|
92
|
+
root: "root",
|
|
93
|
+
elements: {
|
|
94
|
+
root: { type: "HomePage", props: { title: "Welcome" }, children: [] },
|
|
95
|
+
},
|
|
96
|
+
}),
|
|
97
|
+
},
|
|
98
|
+
},
|
|
99
|
+
login: {
|
|
100
|
+
meta: {
|
|
101
|
+
route: "/login",
|
|
102
|
+
view: typedSpec({
|
|
103
|
+
root: "root",
|
|
104
|
+
elements: {
|
|
105
|
+
root: { type: "LoginPage", props: { title: "Sign in" }, children: [] },
|
|
106
|
+
},
|
|
107
|
+
}),
|
|
108
|
+
},
|
|
109
|
+
},
|
|
110
|
+
dashboard: {
|
|
111
|
+
meta: {
|
|
112
|
+
route: "/dashboard",
|
|
113
|
+
view: typedSpec({
|
|
114
|
+
root: "root",
|
|
115
|
+
elements: {
|
|
116
|
+
root: { type: "DashboardPage", props: { title: "Overview" }, children: [] },
|
|
117
|
+
},
|
|
118
|
+
}),
|
|
119
|
+
},
|
|
120
|
+
},
|
|
121
|
+
},
|
|
122
|
+
});
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
`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.
|
|
126
|
+
|
|
127
|
+
`meta.view` is a `PlaySpec` — a `@json-render/core` spec object describing what to render. Use `typedSpec<TContext>(...)` from `@xmachines/play-actor` to validate `contextProps` entries at compile time. When the machine enters a state, `actor.currentView` is updated with this spec. The renderer reads it and projects it through framework components.
|
|
128
|
+
|
|
129
|
+
**The machine is the single source of truth for both routing and views.** There is no separate route configuration file. There is no switch statement in a component deciding what to render based on the URL. The state machine encodes all of that.
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
## `formatPlayRouteTransitions` — automatic route event wiring
|
|
134
|
+
|
|
135
|
+
For routing to work, the machine must respond to `play.route` events (sent by router bridges when the user navigates). Writing these transitions by hand is mechanical:
|
|
136
|
+
|
|
137
|
+
```typescript
|
|
138
|
+
// Without formatPlayRouteTransitions — verbose and repetitive
|
|
139
|
+
states: {
|
|
140
|
+
home: {
|
|
141
|
+
on: {
|
|
142
|
+
"play.route": [
|
|
143
|
+
{ guard: ({ event }) => event.to === "#login", target: "login" },
|
|
144
|
+
{ guard: ({ event }) => event.to === "#dashboard", target: "dashboard" },
|
|
145
|
+
],
|
|
146
|
+
},
|
|
147
|
+
meta: { route: "/" },
|
|
148
|
+
},
|
|
149
|
+
// ... repeated for every state
|
|
150
|
+
}
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
`formatPlayRouteTransitions` from `@xmachines/play-xstate` generates these transitions automatically from the `id` and `meta.route` fields you already have:
|
|
154
|
+
|
|
155
|
+
```typescript
|
|
156
|
+
import { formatPlayRouteTransitions } from "@xmachines/play-xstate";
|
|
157
|
+
|
|
158
|
+
const appMachine = setup({
|
|
159
|
+
/* ... */
|
|
160
|
+
}).createMachine(
|
|
161
|
+
formatPlayRouteTransitions({
|
|
162
|
+
id: "app",
|
|
163
|
+
initial: "home",
|
|
164
|
+
states: {
|
|
165
|
+
home: { id: "home", meta: { route: "/" } },
|
|
166
|
+
login: { id: "login", meta: { route: "/login" } },
|
|
167
|
+
dashboard: { id: "dashboard", meta: { route: "/dashboard" } },
|
|
168
|
+
},
|
|
169
|
+
}),
|
|
170
|
+
);
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
`formatPlayRouteTransitions` inspects all state nodes with a `meta.route` and generates the corresponding `play.route` guard transitions. The machine's context must include `params` and `query` fields (populated by the router bridge when params or query strings are present):
|
|
174
|
+
|
|
175
|
+
```typescript
|
|
176
|
+
types: {
|
|
177
|
+
context: {} as {
|
|
178
|
+
params: Record<string, string>;
|
|
179
|
+
query: Record<string, string>;
|
|
180
|
+
// ... other context fields
|
|
181
|
+
},
|
|
182
|
+
events: {} as PlayRouteEvent | OtherEvents,
|
|
183
|
+
}
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
---
|
|
187
|
+
|
|
188
|
+
## Guards — the actor's authority
|
|
189
|
+
|
|
190
|
+
Guards are the mechanism by which the actor controls whether a transition occurs. They are pure functions of `{ context, event }` that return a boolean.
|
|
191
|
+
|
|
192
|
+
```typescript
|
|
193
|
+
const authSetup = setup({
|
|
194
|
+
guards: {
|
|
195
|
+
isAuthenticated: ({ context }) => context.isAuthenticated,
|
|
196
|
+
isAdmin: ({ context }) => context.role === "admin",
|
|
197
|
+
},
|
|
198
|
+
});
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
Guards are evaluated by XState before a transition fires. If the guard returns `false`, the transition does not occur — the machine stays in its current state and the `play.route` event is discarded. The router bridge then sees that `actor.currentRoute` has not changed and corrects the URL back to the current valid route.
|
|
202
|
+
|
|
203
|
+
This is the **Actor Authority** invariant in practice: the machine decides, infrastructure adjusts.
|
|
204
|
+
|
|
205
|
+
XMachines provides guard combinators in `@xmachines/play-xstate` for composing complex conditions:
|
|
206
|
+
|
|
207
|
+
| Function | What it does |
|
|
208
|
+
| --------------------------------- | --------------------------------------- |
|
|
209
|
+
| `composeGuards(...guards)` | AND — all guards must pass |
|
|
210
|
+
| `composeGuardsOr(...guards)` | OR — any guard must pass |
|
|
211
|
+
| `negateGuard(guard)` | NOT — inverts the guard result |
|
|
212
|
+
| `hasContext(key)` | Checks that a context field is non-null |
|
|
213
|
+
| `contextFieldMatches(key, value)` | Checks a context field against a value |
|
|
214
|
+
| `eventMatches(type)` | Checks the event type |
|
|
215
|
+
|
|
216
|
+
---
|
|
217
|
+
|
|
218
|
+
## Context — persistent state across transitions
|
|
219
|
+
|
|
220
|
+
Context is the machine's persistent data store. It survives transitions and can be read and updated by actions:
|
|
221
|
+
|
|
222
|
+
```typescript
|
|
223
|
+
// Context is defined in setup({ types })
|
|
224
|
+
types: {
|
|
225
|
+
context: {} as {
|
|
226
|
+
isAuthenticated: boolean;
|
|
227
|
+
username: string | null;
|
|
228
|
+
loginAttempts: number;
|
|
229
|
+
},
|
|
230
|
+
},
|
|
231
|
+
|
|
232
|
+
// Actions mutate context via assign
|
|
233
|
+
actions: {
|
|
234
|
+
recordLoginFailure: assign({
|
|
235
|
+
loginAttempts: ({ context }) => context.loginAttempts + 1,
|
|
236
|
+
}),
|
|
237
|
+
},
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
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`.
|
|
241
|
+
|
|
242
|
+
---
|
|
243
|
+
|
|
244
|
+
## Snapshots and restoration
|
|
245
|
+
|
|
246
|
+
A snapshot is a point-in-time serialisation of the machine's current state and context. XState produces snapshots in a JSON-compatible format:
|
|
247
|
+
|
|
248
|
+
```typescript
|
|
249
|
+
const snapshot = actor.getSnapshot();
|
|
250
|
+
// snapshot.value → current state node name, e.g. "dashboard"
|
|
251
|
+
// snapshot.context → current context object
|
|
252
|
+
|
|
253
|
+
// Stop and serialize
|
|
254
|
+
actor.stop();
|
|
255
|
+
const saved = JSON.stringify(snapshot);
|
|
256
|
+
|
|
257
|
+
// Restore
|
|
258
|
+
const restored = JSON.parse(saved);
|
|
259
|
+
const actor = createPlayer(undefined, { snapshot: restored });
|
|
260
|
+
actor.start();
|
|
261
|
+
// Actor resumes from where it left off
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
`definePlayer` accepts an optional `restore` argument for this purpose. Restoration is useful for server-side rendering (hydrate with the server's snapshot), session persistence (resume after page reload), and testing (start from a known mid-flow state).
|
|
265
|
+
|
|
266
|
+
---
|
|
267
|
+
|
|
268
|
+
## What state machines replace
|
|
269
|
+
|
|
270
|
+
| Traditional pattern | State machine equivalent | Why the machine version is better |
|
|
271
|
+
| ----------------------------------------------------- | -------------------------------------------- | ----------------------------------------------------------- |
|
|
272
|
+
| Boolean flags (`isLoading`, `isError`) | Explicit states (`idle \| loading \| error`) | Impossible state combinations are unrepresentable |
|
|
273
|
+
| Switch on URL path in component | `meta.route` on state nodes | Routing intent lives with the state that owns it |
|
|
274
|
+
| `if (user.role === "admin")` scattered in components | Guards on transitions | Auth logic is co-located with the transitions it governs |
|
|
275
|
+
| `useEffect` on route changes to decide what to render | `meta.view` on state nodes | View structure is declared alongside the state that owns it |
|
|
276
|
+
| Shared mutable state across components | Context + signals | Mutations are explicit, traceable, and test-covered |
|
|
277
|
+
|
|
278
|
+
---
|
|
279
|
+
|
|
280
|
+
## See also
|
|
281
|
+
|
|
282
|
+
- [Understanding the Actor Model](actor-model.md) — how the machine definition becomes a live actor
|
|
283
|
+
- [Understanding TC39 Signals](signals.md) — how the actor's state is observed by infrastructure
|
|
284
|
+
- [Getting Started](getting-started.md) — step-by-step walkthrough building your first machine and actor
|
|
285
|
+
- [Routing Patterns](../examples/routing-patterns.md) — worked examples of `meta.route` and guards
|
|
286
|
+
- [@xmachines/play-xstate README](../api/@xmachines/play-xstate/README.md) — full API reference for `definePlayer`, `PlayerActor`, guard combinators
|
|
287
|
+
- [XState v5 documentation](https://stately.ai/docs/xstate) — upstream state machine library documentation
|
|
288
|
+
- [Play RFC](../rfc/play.md) — complete architectural specification
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xmachines/docs",
|
|
3
|
-
"version": "1.0.0-beta.
|
|
3
|
+
"version": "1.0.0-beta.35",
|
|
4
4
|
"description": "Documentation for XMachines",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"documentation",
|
|
@@ -49,7 +49,7 @@
|
|
|
49
49
|
"test": "vitest run"
|
|
50
50
|
},
|
|
51
51
|
"devDependencies": {
|
|
52
|
-
"@xmachines/shared": "1.0.0-beta.
|
|
52
|
+
"@xmachines/shared": "1.0.0-beta.35",
|
|
53
53
|
"oxfmt": "^0.45.0",
|
|
54
54
|
"oxlint": "^1.60.0",
|
|
55
55
|
"typedoc": "^0.28.19",
|
package/rfc/play.md
CHANGED
|
@@ -20,24 +20,24 @@ The reference implementation provides a modular monorepo that satisfies the arch
|
|
|
20
20
|
### 2.1 Roles
|
|
21
21
|
|
|
22
22
|
- **The Actor (Logic Engine)**
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
23
|
+
- Pure, environment-agnostic logic runtime
|
|
24
|
+
- Owns state, guards, errors, and route validity
|
|
25
|
+
- Emits _Virtual Routes_ as derived intent
|
|
26
26
|
|
|
27
27
|
- **The Runtime Adapter (Infrastructure Layer)**
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
28
|
+
- Environment-specific adapter (Browser, Native, Server, Test Runner)
|
|
29
|
+
- Reflects Actor output into the environment
|
|
30
|
+
- Forwards environment events to the Actor without interpretation
|
|
31
31
|
|
|
32
32
|
- **The View**
|
|
33
|
-
|
|
34
|
-
|
|
33
|
+
- Passive consumer of Actor state
|
|
34
|
+
- No business rules or routing authority
|
|
35
35
|
|
|
36
36
|
### 2.2 Communication Medium
|
|
37
37
|
|
|
38
38
|
- **Signals (TC39 Proposal)**
|
|
39
|
-
|
|
40
|
-
|
|
39
|
+
- Used exclusively for Actor ↔ Adapter communication
|
|
40
|
+
- Enables synchronous, glitch-free propagation
|
|
41
41
|
|
|
42
42
|
---
|
|
43
43
|
|
|
@@ -75,9 +75,9 @@ The reference implementation provides a modular monorepo that satisfies the arch
|
|
|
75
75
|
- Defines **Virtual Routes** as metadata on state nodes
|
|
76
76
|
- Validates all incoming navigation intents
|
|
77
77
|
- On invalid intent:
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
78
|
+
1. Transitions to an error or fallback state
|
|
79
|
+
2. Emits a corresponding Virtual Route (e.g. `/error`, `/login`)
|
|
80
|
+
3. Forces the environment to realign with Actor state
|
|
81
81
|
|
|
82
82
|
The Actor has zero knowledge of:
|
|
83
83
|
|
|
@@ -114,9 +114,9 @@ Wraps the TC39 Signals (Stage 1) polyfill. By isolating the reactive primitive w
|
|
|
114
114
|
**Exports:**
|
|
115
115
|
|
|
116
116
|
- `Signal` — Re-exported namespace from `signal-polyfill`:
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
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
120
|
- `watchSignal` — Convenience function: subscribes to a single signal with a one-shot watcher lifecycle and microtask batching; returns a cleanup function
|
|
121
121
|
|
|
122
122
|
#### 5.1.2 `@xmachines/play`
|
|
@@ -156,13 +156,8 @@ export interface PlaySpec extends Spec {
|
|
|
156
156
|
contextProps?: string[];
|
|
157
157
|
}
|
|
158
158
|
|
|
159
|
-
export interface ViewMetadata {
|
|
160
|
-
component: string;
|
|
161
|
-
spec: PlaySpec;
|
|
162
|
-
}
|
|
163
|
-
|
|
164
159
|
export interface Viewable {
|
|
165
|
-
readonly currentView: Signal.State<
|
|
160
|
+
readonly currentView: Signal.State<PlaySpec | null>;
|
|
166
161
|
}
|
|
167
162
|
|
|
168
163
|
// The Base Protocol — minimal contract
|
|
@@ -231,7 +226,7 @@ class PlayerActor<TMachine extends AnyStateMachine>
|
|
|
231
226
|
{
|
|
232
227
|
public state: Signal.State<AnyMachineSnapshot>;
|
|
233
228
|
public currentRoute: Signal.Computed<string | null>;
|
|
234
|
-
public currentView: Signal.State<
|
|
229
|
+
public currentView: Signal.State<PlaySpec | null>;
|
|
235
230
|
public readonly initialRoute: string | null;
|
|
236
231
|
}
|
|
237
232
|
```
|
|
@@ -251,9 +246,9 @@ Provides the complete routing infrastructure: route extraction from state machin
|
|
|
251
246
|
- `RouterBridge` — Interface: `{ connect(): void; disconnect(): void }`
|
|
252
247
|
- `PlayRouteEvent` — Routing event: `{ type: 'play.route'; to: string; params?; query?; match? }`
|
|
253
248
|
- `RouterBridgeBase` — Abstract base class that encapsulates common bridge logic (signal watching, route synchronization, param/query extraction). Subclasses implement only three methods:
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
249
|
+
- `navigateRouter(path)` — Push a path into the framework router
|
|
250
|
+
- `watchRouterChanges()` — Subscribe to framework router navigation events
|
|
251
|
+
- `unwatchRouterChanges()` — Unsubscribe from framework router events
|
|
257
252
|
|
|
258
253
|
**Route Extraction Exports:**
|
|
259
254
|
|
|
@@ -317,27 +312,44 @@ Each view renderer provides a `PlayRenderer` component that passively observes t
|
|
|
317
312
|
**`@xmachines/play-react` exports (representative):**
|
|
318
313
|
|
|
319
314
|
```ts
|
|
320
|
-
//
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
315
|
+
// Batteries-included composite — standard entry point
|
|
316
|
+
// Props: actor, registryResult, store?, fallback?, onError?, onRenderError?,
|
|
317
|
+
// validationFunctions?, navigate?, functions?
|
|
318
|
+
export { PlayUIProvider } from "./PlayUIProvider";
|
|
319
|
+
export type { PlayUIProviderProps } from "./PlayUIProvider";
|
|
320
|
+
|
|
321
|
+
// Escape-hatch primitive — owns actor lifecycle, signal bridge, ViewContext
|
|
322
|
+
// Props: actor, registryResult, store?, fallback?, onError?, onRenderError?, children (required)
|
|
323
|
+
export { ActorProvider } from "./ActorProvider";
|
|
324
|
+
export type { ActorProviderProps } from "./ActorProvider";
|
|
325
|
+
|
|
326
|
+
// Zero-prop leaf — reads usePlayView() from ActorProvider tree; renders <Renderer spec={...} />
|
|
327
|
+
// Must be rendered inside <ActorProvider> or <PlayUIProvider>
|
|
328
|
+
export const PlayRenderer: React.FC = () => {
|
|
329
|
+
/* ... */
|
|
330
|
+
};
|
|
328
331
|
|
|
329
332
|
// Hooks
|
|
330
|
-
export {
|
|
331
|
-
export {
|
|
333
|
+
export { usePlayView } from "./ActorProvider"; // returns ViewContextValue | null
|
|
334
|
+
export { useSignalEffect } from "./useSignalEffect";
|
|
335
|
+
export { useActor } from "./useActor";
|
|
332
336
|
|
|
333
337
|
// Error handling
|
|
334
|
-
export { PlayErrorBoundary } from
|
|
338
|
+
export { PlayErrorBoundary } from "./PlayErrorBoundary";
|
|
335
339
|
|
|
336
340
|
// Re-exports from @json-render/react
|
|
337
|
-
export {
|
|
341
|
+
export {
|
|
342
|
+
defineRegistry,
|
|
343
|
+
JSONUIProvider,
|
|
344
|
+
StateProvider,
|
|
345
|
+
ActionProvider,
|
|
346
|
+
VisibilityProvider,
|
|
347
|
+
ValidationProvider,
|
|
348
|
+
Renderer,
|
|
349
|
+
} from "@json-render/react";
|
|
338
350
|
```
|
|
339
351
|
|
|
340
|
-
**Design Rationale:**
|
|
352
|
+
**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 `@json-render/*` and makes the separation of concerns explicit.
|
|
341
353
|
|
|
342
354
|
### 5.5 Schema Layer (External)
|
|
343
355
|
|
|
@@ -383,11 +395,17 @@ export const machine = setup({
|
|
|
383
395
|
overview: {
|
|
384
396
|
meta: {
|
|
385
397
|
route: "/dashboard",
|
|
386
|
-
view: {
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
398
|
+
view: typedSpec<DashboardCtx>({
|
|
399
|
+
root: "root",
|
|
400
|
+
elements: {
|
|
401
|
+
root: {
|
|
402
|
+
type: "Dashboard",
|
|
403
|
+
props: { title: "Q4 Performance" },
|
|
404
|
+
children: ["metric"],
|
|
405
|
+
},
|
|
406
|
+
metric: { type: "Metric", props: { value: 100, label: "Sales" } },
|
|
407
|
+
},
|
|
408
|
+
}),
|
|
391
409
|
},
|
|
392
410
|
},
|
|
393
411
|
},
|
|
@@ -404,7 +422,7 @@ Binds Logic to a View Renderer and Router Adapter.
|
|
|
404
422
|
```tsx
|
|
405
423
|
import { createDashboard, machine } from "./features/dashboard/player";
|
|
406
424
|
import { catalog } from "./catalog";
|
|
407
|
-
import { PlayRenderer, defineRegistry } from "@xmachines/play-react";
|
|
425
|
+
import { PlayUIProvider, PlayRenderer, defineRegistry } from "@xmachines/play-react";
|
|
408
426
|
import { TanStackReactRouterBridge } from "@xmachines/play-tanstack-react-router";
|
|
409
427
|
import { extractMachineRoutes, createRouteMap } from "@xmachines/play-router";
|
|
410
428
|
|
|
@@ -412,13 +430,18 @@ import { extractMachineRoutes, createRouteMap } from "@xmachines/play-router";
|
|
|
412
430
|
const actor = createDashboard();
|
|
413
431
|
|
|
414
432
|
// 2. Define component implementations (type-checked against catalog)
|
|
415
|
-
const
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
433
|
+
const registryResult = defineRegistry(catalog, {
|
|
434
|
+
components: {
|
|
435
|
+
Dashboard: ({ props, children }) => <div className="p-4">{children}</div>,
|
|
436
|
+
Metric: ({ props }) => (
|
|
437
|
+
<span>
|
|
438
|
+
{props.label}: {props.value}
|
|
439
|
+
</span>
|
|
440
|
+
),
|
|
441
|
+
},
|
|
442
|
+
actions: {
|
|
443
|
+
submit: async () => actor.send({ type: "form.submit" }),
|
|
444
|
+
},
|
|
422
445
|
});
|
|
423
446
|
|
|
424
447
|
// 3. Build route map from machine definition
|
|
@@ -429,9 +452,13 @@ const routeMap = createRouteMap(routeTree);
|
|
|
429
452
|
const bridge = new TanStackReactRouterBridge(tanstackRouter, actor, routeMap);
|
|
430
453
|
bridge.connect();
|
|
431
454
|
|
|
432
|
-
// 5. Render
|
|
455
|
+
// 5. Render — PlayUIProvider is the batteries-included composite; PlayRenderer is the zero-prop leaf
|
|
433
456
|
function App() {
|
|
434
|
-
return
|
|
457
|
+
return (
|
|
458
|
+
<PlayUIProvider actor={actor} registryResult={registryResult}>
|
|
459
|
+
<PlayRenderer />
|
|
460
|
+
</PlayUIProvider>
|
|
461
|
+
);
|
|
435
462
|
}
|
|
436
463
|
```
|
|
437
464
|
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
[Documentation](../../../README.md) / [@xmachines/play-actor](../README.md) / ViewMetadata
|
|
2
|
-
|
|
3
|
-
# Interface: ViewMetadata
|
|
4
|
-
|
|
5
|
-
Defined in: [packages/play-actor/src/abstract-actor.ts:100](https://gitlab.com/xmachin-es/xmachines-js/-/blob/v1.0.0-beta.33/packages/play-actor/src/abstract-actor.ts#L100)
|
|
6
|
-
|
|
7
|
-
View metadata for rendering.
|
|
8
|
-
|
|
9
|
-
Describes the component to be rendered and the json-render Spec to use.
|
|
10
|
-
Used by PlayRenderer to dynamically render UI based on actor state.
|
|
11
|
-
|
|
12
|
-
## Properties
|
|
13
|
-
|
|
14
|
-
| Property | Type | Description | Defined in |
|
|
15
|
-
| ------------------------------------------- | ------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
16
|
-
| <a id="property-component"></a> `component` | `string` | Root element type name (for diagnostics and component resolution) | [packages/play-actor/src/abstract-actor.ts:102](https://gitlab.com/xmachin-es/xmachines-js/-/blob/v1.0.0-beta.33/packages/play-actor/src/abstract-actor.ts#L102) |
|
|
17
|
-
| <a id="property-spec"></a> `spec` | [`PlaySpec`](PlaySpec.md) | XMachines view spec — extends `@json-render/core` Spec with `contextProps` for explicit context field exposure. Use `typedSpec<TContext>(...)` at the definition site to validate `contextProps` entries against the machine context type. | [packages/play-actor/src/abstract-actor.ts:110](https://gitlab.com/xmachin-es/xmachines-js/-/blob/v1.0.0-beta.33/packages/play-actor/src/abstract-actor.ts#L110) |
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
[Documentation](../../../README.md) / [@xmachines/play-react](../README.md) / PlayRendererProps
|
|
2
|
-
|
|
3
|
-
# Interface: PlayRendererProps\<TLogic\>
|
|
4
|
-
|
|
5
|
-
Defined in: [packages/play-react/src/types.ts:27](https://gitlab.com/xmachin-es/xmachines-js/-/blob/v1.0.0-beta.33/packages/play-react/src/types.ts#L27)
|
|
6
|
-
|
|
7
|
-
Props for PlayRenderer component
|
|
8
|
-
|
|
9
|
-
## Type Parameters
|
|
10
|
-
|
|
11
|
-
| Type Parameter | Default type | Description |
|
|
12
|
-
| ---------------------------------------------------------------------------------------- | --------------------------------------------------------------------- | ------------------------------------------------------------------------------- |
|
|
13
|
-
| `TLogic` _extends_ [`AnyActorLogic`](https://www.jsdocs.io/package/xstate#AnyActorLogic) | [`AnyActorLogic`](https://www.jsdocs.io/package/xstate#AnyActorLogic) | The XState actor logic type. Defaults to `AnyActorLogic` for non-generic usage. |
|
|
14
|
-
|
|
15
|
-
## Properties
|
|
16
|
-
|
|
17
|
-
| Property | Type | Description | Defined in |
|
|
18
|
-
| ----------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
19
|
-
| <a id="property-actor"></a> `actor` | [`AbstractActor`](../../play-actor/classes/AbstractActor.md)\<`TLogic`, [`EventObject`](https://www.jsdocs.io/package/xstate#EventObject)\> & [`Viewable`](../../play-actor/interfaces/Viewable.md) | Actor instance with currentView signal (requires Viewable capability) | [packages/play-react/src/types.ts:29](https://gitlab.com/xmachin-es/xmachines-js/-/blob/v1.0.0-beta.33/packages/play-react/src/types.ts#L29) |
|
|
20
|
-
| <a id="property-fallback"></a> `fallback?` | `ReactNode` | Optional component shown when currentView is null | [packages/play-react/src/types.ts:60](https://gitlab.com/xmachin-es/xmachines-js/-/blob/v1.0.0-beta.33/packages/play-react/src/types.ts#L60) |
|
|
21
|
-
| <a id="property-onerror"></a> `onError?` | (`error`, `info`) => `void` | Optional callback invoked when a catalog component throws during render. | [packages/play-react/src/types.ts:72](https://gitlab.com/xmachin-es/xmachines-js/-/blob/v1.0.0-beta.33/packages/play-react/src/types.ts#L72) |
|
|
22
|
-
| <a id="property-onrendererror"></a> `onRenderError?` | [`RenderErrorHandler`](../type-aliases/RenderErrorHandler.md) | Called when an individual catalog component throws during render. Caught by the inner error boundary inside each rendered element — the failed component is silently removed while the rest of the spec continues rendering. Unlike `onError`, this does not receive a reset callback. Takes precedence over any `onRenderError` set via `defineRegistry`. When not provided, `@json-render/react` logs the error to `console.error`. | [packages/play-react/src/types.ts:84](https://gitlab.com/xmachin-es/xmachines-js/-/blob/v1.0.0-beta.33/packages/play-react/src/types.ts#L84) |
|
|
23
|
-
| <a id="property-registryresult"></a> `registryResult` | `DefineRegistryResult` | Full result from defineRegistry() in @json-render/react. Contains both the component registry and the action handlers factory. Action handlers are real async functions dispatching to the actor (not string-mapped event types). | [packages/play-react/src/types.ts:48](https://gitlab.com/xmachin-es/xmachines-js/-/blob/v1.0.0-beta.33/packages/play-react/src/types.ts#L48) |
|
|
24
|
-
| <a id="property-store"></a> `store?` | `StateStore` | Optional external StateStore (controlled mode). | [packages/play-react/src/types.ts:57](https://gitlab.com/xmachin-es/xmachines-js/-/blob/v1.0.0-beta.33/packages/play-react/src/types.ts#L57) |
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
[Documentation](../../../README.md) / [@xmachines/play-solid](../README.md) / PlayRendererProps
|
|
2
|
-
|
|
3
|
-
# Interface: PlayRendererProps\<TLogic\>
|
|
4
|
-
|
|
5
|
-
Defined in: [packages/play-solid/src/types.ts:26](https://gitlab.com/xmachin-es/xmachines-js/-/blob/v1.0.0-beta.33/packages/play-solid/src/types.ts#L26)
|
|
6
|
-
|
|
7
|
-
Props for PlayRenderer component
|
|
8
|
-
|
|
9
|
-
## Type Parameters
|
|
10
|
-
|
|
11
|
-
| Type Parameter | Default type | Description |
|
|
12
|
-
| ---------------------------------------------------------------------------------------- | --------------------------------------------------------------------- | ------------------------------------------------------------------------------- |
|
|
13
|
-
| `TLogic` _extends_ [`AnyActorLogic`](https://www.jsdocs.io/package/xstate#AnyActorLogic) | [`AnyActorLogic`](https://www.jsdocs.io/package/xstate#AnyActorLogic) | The XState actor logic type. Defaults to `AnyActorLogic` for non-generic usage. |
|
|
14
|
-
|
|
15
|
-
## Properties
|
|
16
|
-
|
|
17
|
-
| Property | Type | Description | Defined in |
|
|
18
|
-
| ----------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
19
|
-
| <a id="property-actor"></a> `actor` | [`AbstractActor`](../../play-actor/classes/AbstractActor.md)\<`TLogic`, [`EventObject`](https://www.jsdocs.io/package/xstate#EventObject)\> & [`Viewable`](../../play-actor/interfaces/Viewable.md) | Actor instance with currentView signal (requires Viewable capability) | [packages/play-solid/src/types.ts:28](https://gitlab.com/xmachin-es/xmachines-js/-/blob/v1.0.0-beta.33/packages/play-solid/src/types.ts#L28) |
|
|
20
|
-
| <a id="property-fallback"></a> `fallback?` | `any` | Optional element shown when currentView is null or a component throws | [packages/play-solid/src/types.ts:38](https://gitlab.com/xmachin-es/xmachines-js/-/blob/v1.0.0-beta.33/packages/play-solid/src/types.ts#L38) |
|
|
21
|
-
| <a id="property-onerror"></a> `onError?` | (`error`) => `void` | Optional callback invoked when a catalog component throws during render. | [packages/play-solid/src/types.ts:45](https://gitlab.com/xmachin-es/xmachines-js/-/blob/v1.0.0-beta.33/packages/play-solid/src/types.ts#L45) |
|
|
22
|
-
| <a id="property-onrendererror"></a> `onRenderError?` | [`RenderErrorHandler`](../type-aliases/RenderErrorHandler.md) | Called when an individual catalog component throws during render. Caught by the inner error boundary inside each rendered element — the failed component is silently removed while the rest of the spec continues rendering. Unlike `onError`, this does not receive a reset callback. Takes precedence over any `onRenderError` set via `defineRegistry`. When not provided, `@json-render/solid` logs the error to `console.error`. | [packages/play-solid/src/types.ts:57](https://gitlab.com/xmachin-es/xmachines-js/-/blob/v1.0.0-beta.33/packages/play-solid/src/types.ts#L57) |
|
|
23
|
-
| <a id="property-registryresult"></a> `registryResult` | `DefineRegistryResult` | Full result from defineRegistry() in @json-render/solid. Contains both the component registry and the action handlers factory. Action handlers are real async functions dispatching to the actor (not string-mapped event types). | [packages/play-solid/src/types.ts:35](https://gitlab.com/xmachin-es/xmachines-js/-/blob/v1.0.0-beta.33/packages/play-solid/src/types.ts#L35) |
|
|
24
|
-
| <a id="property-store"></a> `store?` | `StateStore` | Optional external StateStore (e.g. from `xstateStoreStateStore` in @json-render/xstate). When provided, PlayRenderer operates in controlled mode — spec.state is ignored and this store is the single source of truth for UI state (form values, etc.). When omitted, a fresh @xstate/store atom is created internally per view transition, seeded from spec.state. | [packages/play-solid/src/types.ts:66](https://gitlab.com/xmachin-es/xmachines-js/-/blob/v1.0.0-beta.33/packages/play-solid/src/types.ts#L66) |
|