Skip to content

FlowPad components and shells

This page enumerates every Matrix component shipped in @open-matrix/flowpad. Each entry lists the tag name (the custom-element registration), the actor class, the shell class, and the bus contract.

Pattern B reminder

Every component is a pair:

Shell (extends MatrixActorHtmlElement) ── owns DOM
   wraps
Actor (extends MatrixActor)            ── owns logic/state

Communication between them is bus-only (CQRS). The shell never calls actor methods directly.

Top-level

<flowpad-app>

FieldValue
ActorFlowpadApp (src/FlowpadApp.ts)
ShellFlowpadAppShell (src/shell/FlowpadAppShell.ts)
MountThe page mount (e.g., flowpad-page)
Childrendb, flow-runner, security-realm, topic-claims, lisp, scheme, bootstrap, vlm-router, vlm-join, vlm-atomizer, vlm-eval, vlm-node-0..4

Accepts: runFlow, runFromCode, selectExample, setTargetMount, loadExample, clearResults, snapshot.tree.oracle. Emits: flowStarted, executionPlanned, flowCompleted, flowError, exampleLoaded.

<flowpad-control>

FieldValue
ActorFlowpadControl (components/FlowpadControl.ts)
ShellFlowpadControlShell
DescriptionHeader bar showing the current label and mount address. Each pane that wants its own labelled frame wraps itself in <flowpad-control>.

Accepts: setLabel { label }, ping. Emits: labelChanged { label }, pong { mount }.

Workspace components

<pipeline-editor>

FieldValue
ActorPipelineEditor (components/PipelineEditor.ts)
ShellPipelineEditorShell

Accepts: setCode { code }, getCode, clear, focus, setMode { mode }, requestRun { code, mode? }. Emits: codeChanged { code }, runRequested { code, mode }, modeChanged { mode }, focusRequested.

The shell auto-detects mode (Flow vs LISP) on every input and pushes that back to the actor. Ctrl+Enter triggers requestRun. The shell holds a single <textarea id="codeArea"> in shadow DOM and tracks DOM-wired state with _domWired (Pattern A's anti-pattern of double-wiring is deliberately prevented).

<results-panel>

FieldValue
ActorResultsPanel (components/ResultsPanel.ts)
ShellResultsPanelShell

Accepts: addResult { data, type?, label?, query? }, removeResult { id }, clearResults. Emits: resultAdded { id, mount, type, label? }, resultRemoved { id }, resultsCleared { count }.

Each result becomes a real Matrix child at ./results.result-N. The class of each child depends on the result shape (DataResultActor, TableResultActor, ErrorResultActor, or TreeViewer-class).

<execution-status>

FieldValue
ActorExecutionStatus (components/ExecutionStatus.ts)
ShellExecutionStatusShell

Accepts: setStatus { state, message? }. Emits: statusChanged { state, message }.

The shell reads the data-runtime-root, data-authority-root, data-platform-root, data-target-source, data-target-kind, data-requested-root, data-target-unavailable-reason attributes from the host element. When any of those change, it emits HOSTED_RUNTIME_TARGET_CHANGED_EVENT and re-renders the topology tag.

<transport-log>

FieldValue
ActorTransportLog (components/TransportLog.ts)
ShellTransportLogShell

Accepts: addEntry { timestamp, direction, topic, payload }, clear. Emits: entryClicked { index }, entryAdded { entry, removedFirst }, cleared.

The actor caps its log at a fixed length and removes the oldest entry when the cap is reached (removedFirst: true lets the shell DOM-update without a full re-render). The shell colour-codes entries by direction.

<flowpad-sidebar>

FieldValue
ActorFlowpadSidebar (components/sidebar/FlowpadSidebar.ts) — extends MatrixActorHtmlElement (sidebar uses the no-actor variant)
Childrenpackages (<flowpad-package-browser>), actors (<flowpad-actor-tree>), examples (<flowpad-example-list>)

Accepts: setCatalog, setTree, setSelectedNode, setExamples, clearExamples, setStatus. Emits: filterChanged, collapseToggled, refreshRequested, nodeSelected, nodeToggled, exampleSelected, packageActorSelected, packageSelected.

The sidebar acts as a bridge: it re-emits its children's events (onNodeSelectedFromActors → emit('nodeSelected')) and forwards parent-bound commands to the right child.

<flowpad-actor-tree>

Accepts: setTree { roots, status? }, setSelectedNode { mount? }, setStatus { status }. Emits: nodeSelected { mount, componentClass }, refreshRequested, nodeToggled { mount, expanded }.

Type-dot colour rule (FlowpadActorTree.ts:335-346):

Component class includesDot
daemonblue
service, eval, runner, coordinator, atomizer, router, bootstrap, domain, projection, llm, mockgreen
control, editor, panel, viewer, shell, app, elementpurple
Anything elsegrey

<flowpad-package-browser>

Accepts: setCatalog { packages, entries, loading?, error? }, setFilter { filter }. Emits: packageSelected { packageName, mounts, types }, actorSelected { mount }.

<flowpad-example-list>

Accepts: setExamples { examples, actorMount?, actorClass? }, setSelectedExample { key? }, clear. Emits: exampleSelected { endpointMount, exampleIndex, operation, payload, label, rawCode? }.

Layout primitives (re-exported from @open-matrix/core)

The package re-registers three layout primitives so they're available without importing core directly:

  • <mx-split> — the resizable two-pane container used everywhere (MxSplitShell from @open-matrix/core/framework/components).
  • <mx-dock> — tabbed dock used at the bottom of the workspace.
  • <mx-theme> — design-token sink that listens for $tokens ops and applies them as CSS custom properties.

Result viewers (re-registered from @open-matrix/core/flow/viewers)

Registered for clarity at the bottom of index.ts:

  • <data-viewer>DataViewerShell
  • <tree-viewer>TreeViewerShell
  • <table-viewer>TableViewerShell
  • <error-viewer>ErrorViewerShell

These are the same viewers ResultsPanel mounts as result children.

VLM visualisation

  • <vlm-visualization>VLMVisualizationShell from src/vlm/VLMVisualization.ts. Renders distributed LISP execution across the bootstrap nodes.

See also

Source: projects/matrix-3/packages/flowpad/src/index.ts:36-101 is the authoritative custom-element registration list.