ExodeUI

EXODEUI DESKTOP

A little space for good ideas.

Choose your platform to get the official ExodeUI installer.

Looking for Intel Mac or other builds? Explore the web studio or check all download options.

Prefer the browser? Open web studio →
Logic Architecture11 min read·By ExodeUI Motion Labs

State Machine UI: Building Deterministic, Bug-Free Interfaces

Learn how visual state machines eliminate impossible UI states, simplify complex interactive components, and create deterministic, bug-free interfaces in React.

Direct Summary & Definition

Core Takeaway

A UI state machine is a mathematical model that describes all valid states an interface component can occupy, and the explicit transitions between those states triggered by user events or system conditions. State machines eliminate entire categories of UI bugs by making "impossible states impossible" — your loading spinner and success checkmark cannot both appear simultaneously if your state machine forbids that combination.

The Problem State Machines Solve

Most UI bugs originate from components that can enter logically impossible states. A classic example: a form submission button that has no explicit state model can simultaneously be in a "loading" state and a "disabled" state from two separate boolean flags. A state machine prevents this by requiring that the component is always in exactly one well-defined state at any moment.

  • "Boolean flag hell" — isLoading, isDisabled, isError, isSuccess all conflicting
  • Race conditions where fast users trigger multiple states simultaneously
  • Transition bugs where animations start from incorrect intermediate positions
  • Developer cognitive load from tracking n × n flag combinations in code review

Core State Machine Concepts

State machines consist of a finite set of states, a vocabulary of events that can trigger transitions, and guard conditions that determine whether a transition is allowed.

States

Each state represents a specific condition of the component. Example for a data-fetching component: idle, loading, success, error, refreshing.

Events / Transitions

Events trigger state changes. "SUBMIT" transitions a form from idle to loading. "SUCCESS" transitions from loading to success. "ERROR" transitions from loading to error.

Guards

Conditions that must be true for a transition to fire. A "SUBMIT" event can only trigger the idle → loading transition if the form validation guard passes.

Context / Extended State

Auxiliary data that the machine carries (user input values, error messages, loaded data) alongside the current state name.

State Machines in ExodeUI

ExodeUI provides a visual node-graph state machine editor. You draw states as circles, connect them with labeled arrows representing events, and attach spring animations and visual property changes to each state. The machine compiles to a useExodeMachine hook in React or an @Observable class in Swift.

Production Implementation Snippet

Interactive Component Implementation
import { useExodeMachine } from '@exodeui/react';

// Impossible states are impossible with state machines
const authMachine = {
  initial: 'idle',
  states: {
    idle:    { on: { SUBMIT: 'loading' } },
    loading: { on: { SUCCESS: 'welcome', FAIL: 'error' } },
    error:   { on: { RETRY: 'loading', RESET: 'idle' } },
    welcome: { terminal: true }
  }
};

export function AuthFlow() {
  const [state, send] = useExodeMachine(authMachine);

  return (
    <div className="space-y-4">
      {state === 'idle'    && <button onClick={() => send('SUBMIT')}>Sign In</button>}
      {state === 'loading' && <Spinner />}
      {state === 'error'   && <ErrorMessage onRetry={() => send('RETRY')} />}
      {state === 'welcome' && <WelcomeScreen />}
    </div>
  );
}

Frequently Asked Questions

Build with motion. Export directly to code.

Stop drawing static vectors. Author living spring physics and state machines in ExodeUI Studio.

Try Exode Free