Workflow UI

Canvas & Node System

A React Flow-based graph editor for building, inspecting, and shipping AI workflows. Three panels. One accent. Zero decorative chrome.

Canvas preview

Toggle light / dark. Click the Publish button. Three panels: palette · canvas · inspector.

Enterprise Policy Workflow Draft

Nodes

Start

Node

LLM Reasoning

Qwen3-Max · 0.3

Node

Guardrail

Citation check

Node

Direct Reply

Webhook · 200 OK

72%

Inspector

LLM Reasoning

Model

Qwen3-Max

Temperature

0.3

Streaming

On

Output

draft_answer

Three-panel layout

The grid is 248px · 1fr · 340px. Both sidebars collapse independently — palette to 56px icon-only, inspector to 64px.

Node Palette

248px

Drag-to-place node library. Dark bg — a tool, not a canvas element.

Canvas

minmax(0, 1fr)

Warm canvas bg · 20px dot grid · bezier edges · zoom + pan.

Inspector

340px

Context-sensitive property panel. Shows selected node or edge config.

Node color groups

Color encodes group membership — not decoration. Each group has a consistent hue family. Never mix hues across groups.

Flow control

Teal · Blue · Cyan

Condition Branch

#0369a1

Iteration

#0f766e

Loop

#0e7490

AI capability

Rose · Pink · Violet

Agent

#1d4ed8

LLM

#be185d

Guardrail

#7c3aed

Data processing

Orange family

Transform

#ea580c

Classify

#b45309

Search

#a16207

Edge types

Edges are 1.5px bezier curves. Style encodes path semantics — never use color for decoration.

Active edge

Required connection. Always solid.

Conditional edge

Branch path. 4 3 dash pattern.

Selected edge

#2A6FDB. 2px wide.

Error edge

Invalid connection or failed node.

CSS token contract

All theme-sensitive values use CSS variables. Never hardcode light or dark colors inside components.

TokenLightDarkRole
--workflow-page
Canvas background
--workflow-surface
Node / panel bg
--workflow-panel
Palette / inspector bg
--workflow-text
Primary text
--workflow-muted
Secondary text
--workflow-border
Structural borders
--workflow-grid
Canvas dot grid

Specifications

Canvas bg#fbfaf8 · dot-grid 20px
Node width200–240px
Node radius10px
Node border1px rgba(10,11,13,0.10)
Selected border1.5px #2A6FDB · ring rgba(42,111,219,0.12)
Port dot10px · white 2px border · #c8cdd6
Edge width1.5px bezier
Palette width248px (expanded) · 56px (collapsed)
Inspector width340px (expanded) · 64px (collapsed)
Toolbar height44px · centered, floating
Grid size20px
MiniMap160×100px · bottom-right corner

Rules

  • All theme colors come from CSS variables. No hardcoded light/dark hex inside node or panel components.
  • The palette sidebar is always dark — it is a tool container, not a canvas surface.
  • Dashed edges mark conditional or inactive paths. Solid edges are always-active connections.
  • Blue (#2A6FDB) appears only on selected nodes, selected edges, and the primary action button.
  • MiniMap always sits at the bottom-right of the canvas. It is never inside a panel.
  • Both sidebars collapse to icon-only mode. Layout uses CSS grid columns, not JS-driven flex width.
  • Do not add a third sidebar. If a feature needs more surface, use a drawer over the inspector.