Flow Studio
Designer Mode Store Overview
designerModeStore controls which mode the canvas is in — design, execution, or readonly. It holds the execution overlay data (per-node statuses, run progress) that drives the visual feedback components see when watching a live or past run.
Three Canvas Modes
| Mode | Value | Description |
|---|---|---|
| Design | "design" | Default — user can add, move, connect, and configure nodes |
| Execution | "execution" | Watching a live or past run — canvas is read-only, node statuses overlaid |
| Readonly | "readonly" | Locked canvas — no editing permitted (shared view, embedded viewer) |
What Changes Per Mode
| Feature | Design | Execution | Readonly |
|---|---|---|---|
| Add / remove nodes | Enabled | Disabled | Disabled |
| Connect edges | Enabled | Disabled | Disabled |
| Node config forms | Editable | Read-only | Read-only |
| Canvas panning | Enabled | Enabled | Enabled |
| Node status overlays | Hidden | Visible | Hidden |
| Run progress bar | Hidden | Visible | Hidden |
Store Architecture
// designerModeStore.ts
import { create } from 'zustand';
export type CanvasMode = 'design' | 'execution' | 'readonly';
export interface DesignerModeState {
currentMode : CanvasMode;
executionId : string | null;
nodeStatuses : Record<string, NodeExecutionStatus>;
runProgress : RunProgress;
isReadonly : boolean;
}
export interface DesignerModeActions {
enterExecutionMode : (executionId: string) => void;
exitExecutionMode : () => void;
enterReadonly : () => void;
exitReadonly : () => void;
setNodeStatus : (nodeId: string, status: NodeExecutionStatus) => void;
updateRunProgress : (progress: RunProgress) => void;
}
export const useDesignerModeStore =
create<DesignerModeState & DesignerModeActions>()((set) => ({
currentMode : 'design',
executionId : null,
nodeStatuses: {},
runProgress : { totalNodes: 0, completedNodes: 0, failedNodes: 0 },
isReadonly : false,
// ... actions
}));