@pauloricca/spagbol 0.1.0 → 0.1.3
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/README.md +42 -4
- package/dist/core/controller.js +4 -4
- package/dist/core/controller.js.map +1 -1
- package/dist/core/model.d.ts +2 -1
- package/dist/core/model.d.ts.map +1 -1
- package/dist/core/model.js.map +1 -1
- package/dist/editors.css +157 -0
- package/dist/react/SpagbolCanvas.d.ts.map +1 -1
- package/dist/react/SpagbolCanvas.js +106 -29
- package/dist/react/SpagbolCanvas.js.map +1 -1
- package/dist/react/SpagbolCanvasControls.d.ts.map +1 -1
- package/dist/react/SpagbolCanvasControls.js +5 -5
- package/dist/react/SpagbolCanvasControls.js.map +1 -1
- package/dist/react/SpagbolControlJoystick.d.ts +9 -0
- package/dist/react/SpagbolControlJoystick.d.ts.map +1 -0
- package/dist/react/SpagbolControlJoystick.js +111 -0
- package/dist/react/SpagbolControlJoystick.js.map +1 -0
- package/dist/react/SpagbolControlZoom.d.ts.map +1 -1
- package/dist/react/SpagbolControlZoom.js +3 -2
- package/dist/react/SpagbolControlZoom.js.map +1 -1
- package/dist/react/SpagbolCurveEditor.d.ts +45 -0
- package/dist/react/SpagbolCurveEditor.d.ts.map +1 -0
- package/dist/react/SpagbolCurveEditor.js +142 -0
- package/dist/react/SpagbolCurveEditor.js.map +1 -0
- package/dist/react/SpagbolNodeFrame.d.ts.map +1 -1
- package/dist/react/SpagbolNodeFrame.js +18 -16
- package/dist/react/SpagbolNodeFrame.js.map +1 -1
- package/dist/react/SpagbolNodeFrameTypePicker.js +1 -1
- package/dist/react/SpagbolNodeFrameTypePicker.js.map +1 -1
- package/dist/react/SpagbolSequencer.d.ts +35 -0
- package/dist/react/SpagbolSequencer.d.ts.map +1 -0
- package/dist/react/SpagbolSequencer.js +166 -0
- package/dist/react/SpagbolSequencer.js.map +1 -0
- package/dist/react/index.d.ts +3 -0
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js +3 -0
- package/dist/react/index.js.map +1 -1
- package/dist/react/nodeDrag.d.ts +7 -0
- package/dist/react/nodeDrag.d.ts.map +1 -0
- package/dist/react/nodeDrag.js +27 -0
- package/dist/react/nodeDrag.js.map +1 -0
- package/dist/react/zoom.d.ts +5 -0
- package/dist/react/zoom.d.ts.map +1 -0
- package/dist/react/zoom.js +19 -0
- package/dist/react/zoom.js.map +1 -0
- package/dist/styles.css +112 -41
- package/docs/language/standard-node-comparison.md +92 -0
- package/docs/language/standard-node-contracts.md +237 -0
- package/docs/language/standard-nodes.md +198 -0
- package/docs/language/ui-components.md +79 -0
- package/package.json +5 -3
- package/src/core/controller.ts +4 -4
- package/src/core/model.ts +2 -1
- package/src/react/SpagbolCanvas.tsx +121 -31
- package/src/react/SpagbolCanvasControls.tsx +2 -7
- package/src/react/SpagbolControlJoystick.tsx +147 -0
- package/src/react/SpagbolControlZoom.tsx +3 -2
- package/src/react/SpagbolCurveEditor.tsx +166 -0
- package/src/react/SpagbolNodeFrame.tsx +30 -24
- package/src/react/SpagbolNodeFrameTypePicker.tsx +1 -1
- package/src/react/SpagbolSequencer.tsx +265 -0
- package/src/react/editors.css +157 -0
- package/src/react/index.ts +4 -0
- package/src/react/nodeDrag.ts +33 -0
- package/src/react/styles.css +112 -41
- package/src/react/zoom.ts +18 -0
package/README.md
CHANGED
|
@@ -1,14 +1,18 @@
|
|
|
1
1
|
# Spagbol
|
|
2
2
|
|
|
3
|
-
An extensible graph editor extracted from the interaction patterns in Teia and visual-visual. This repository is independent of both applications. Teia now consumes the complete shared canvas/controller through a patch codec and domain bindings;
|
|
3
|
+
An extensible graph editor extracted from the interaction patterns in Teia and visual-visual. This repository is independent of both applications. Teia now consumes the complete shared canvas/controller through a patch codec and domain bindings; Visual Visual consumes the shared canvas/controller through its shader patch codec and domain bindings.
|
|
4
4
|
|
|
5
5
|
Spagbol owns graph editing and presentation. Consumers own their node catalogues, node bodies, execution, persistence services, assets and runtime observations. There is no audio engine, shader compiler, MIDI access or server client in the package.
|
|
6
6
|
|
|
7
|
+
## Recommended node vocabulary
|
|
8
|
+
|
|
9
|
+
Spagbol applications use numeric signal connections while retaining their own catalogues and execution engines. The [standard-node proposal](docs/language/standard-nodes.md), [26 baseline contracts](docs/language/standard-node-contracts.md), and [Teia / Visual Visual comparison](docs/language/standard-node-comparison.md) document recommended semantics, defaults, edge cases and conformance examples. Envelope, Playhead and Time remain app-specific. These are draft conventions, not installed node definitions or runtime enforcement; the current editor API still permits consumer-defined port metadata and link modes. Controlled Curve, Sequencer and Joystick UI is available; apps own data models, storage and execution. See [component contracts and Teia adapters](docs/language/ui-components.md).
|
|
10
|
+
|
|
7
11
|
## Package
|
|
8
12
|
|
|
9
13
|
`@pauloricca/spagbol` contains the complete graph model, registries, atomic edits, undo/redo, graph transformations, nesting, areas, observations and codecs together with the extensible React canvas, node frames/ports and controls. All public model and UI symbols come from the same entry point. Import `@pauloricca/spagbol/styles.css` explicitly.
|
|
10
14
|
|
|
11
|
-
The package is version `0.1.
|
|
15
|
+
The package is version `0.1.3`, licensed under [MIT](LICENSE). React/React DOM 19 and React Flow 12.11 are peer dependencies. Source remains organised into internal `src/core` and `src/react` modules, with a single build, version and tarball. This is an initial implementation, not a claim of complete Teia interaction parity.
|
|
12
16
|
|
|
13
17
|
## Docker development
|
|
14
18
|
|
|
@@ -150,6 +154,12 @@ The slider accepts normalized values from 0 to 1 and an optional external `displ
|
|
|
150
154
|
|
|
151
155
|
Buttons support `toggle`, `trigger` and `temporary` modes. Toggle changes the pressed value on click; temporary emits 1 on press and 0 on release, cancellation or lost capture; trigger calls `onClickPulse` on press with a 120ms visual flash. External pressed-value rises also flash in trigger mode. Callbacks are controlled by the host: these components do not implement graph execution, MIDI, signal mapping or DSP timing. Consumers decide how values enter their model/history and how read-only UI is enforced.
|
|
152
156
|
|
|
157
|
+
## Curve, Sequencer and Joystick UI
|
|
158
|
+
|
|
159
|
+
`SpagbolCurveEditor`, `SpagbolSequencer` and `SpagbolControlJoystick` are controlled components extracted from Teia. They render view projections and emit edit intents; consumers own data models, normalization, persistence, undo, MIDI and execution. Teia uses them for Custom Wave, Sequencer, Roll and Joystick while retaining its existing models and musical controls. No shared curve/sequence schema or runtime is introduced.
|
|
160
|
+
|
|
161
|
+
Import them from `@pauloricca/spagbol`. Their CSS is included in `styles.css`, or import `@pauloricca/spagbol/editors.css` independently. Read the [component props, interaction contracts and adapter examples](docs/language/ui-components.md). Curve supports bank/background previews and chrome slots; Sequencer supports painting, moving/resizing intervals and levels with custom row chrome; Joystick supports normalized XY dragging and optional elastic return.
|
|
162
|
+
|
|
153
163
|
## Rich links
|
|
154
164
|
|
|
155
165
|
Standard descriptors are `set`, `add`, `multiply` and `bend`, with mode colours, labels, descriptions and shortcuts. Register more with `LinkModeRegistry`, and optionally constrain the offered modes using `policy.modes`. A descriptor does not implement execution: consumers supply their own arithmetic/compiler and capability policy.
|
|
@@ -169,8 +179,20 @@ To disable strength connections, supply `policy: { linkProperties: [] }`; `featu
|
|
|
169
179
|
|
|
170
180
|
Supply optional `linkPresentation` classifications for feedback/control/virtual drawing. Self links get the feedback geometry automatically. Virtual relations are display-only. Standard connected links support weights, enabling/disabling, mode editing, endpoint reconnection and insertion.
|
|
171
181
|
|
|
182
|
+
## Add-node picker
|
|
183
|
+
|
|
184
|
+
Double-click empty canvas to open the picker. Its heading uses the same spacing, typography and colours as a node header. The first filtered result is selected automatically; Up/Down moves the highlight while focus stays in the search field, and Enter creates the highlighted node. Typing a new query resets selection to the first result; Escape cancels. The selected result scrolls into view, and pointer movement/clicks select/create items too. With no matches, Enter does nothing. Inserting a node into a link uses the same picker.
|
|
185
|
+
|
|
186
|
+
Node pins are 8px squares centred on the node edge (`--spagbol-pin-size` controls the size). Selecting a link turns its endpoint pins green without changing their size or shape.
|
|
187
|
+
|
|
172
188
|
## Canvas controls
|
|
173
189
|
|
|
190
|
+
Checked menu items use the header colours (white fill/black text by default), without a tick icon or reserved checkmark column. They retain `menuitemcheckbox` roles and `aria-checked`; direct toggle actions retain `aria-pressed`. Host-owned buttons such as Teia’s SAVE/PLAY/REC keep their own state colours.
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
Zoom follows Teia’s scale: **100% is a raw viewport zoom of `0.5`** (`0.25` displays 50%, `1` displays 200%). The percentage button and Cmd/Ctrl+0 reset to `0.5`; header detail thresholds use this same baseline. Saved viewport values and graph/node coordinates remain raw values, so existing layouts need no conversion. Hosts passing `defaultViewport` should use `zoom: 0.5` for 100%. Fit-to-view still chooses the scale needed to fit the graph.
|
|
194
|
+
|
|
195
|
+
|
|
174
196
|
The default canvas includes a bottom-left zoom stack (in, out, fit), a percentage button that resets zoom to 100%, and bottom-right undo/redo buttons with a **MORE** menu containing the layout lock. Nested graphs also get an exit button and breadcrumbs. These controls use the shared theme and work without app callbacks.
|
|
175
197
|
|
|
176
198
|
Apps supply their own outside buttons and menu entries through `controls`. Saving, loading, transport and other domain actions remain app responsibilities:
|
|
@@ -216,7 +238,7 @@ The complete canvas enables areas, compact nodes, nesting and projected group co
|
|
|
216
238
|
/>
|
|
217
239
|
```
|
|
218
240
|
|
|
219
|
-
- **Areas:**
|
|
241
|
+
- **Areas (Container, Spread, Spawn and Conditional Execution):** Container is the plain visual kind; execution kinds are supplied by the host. Create, move, resize, title, collapse, clone and freeze membership. Unlocked membership follows top-left containment; locking snapshots node/nested-area membership. A `controlHeight` section stays visible on collapse. Hidden member links are projected to the area's header; internal links are hidden.
|
|
220
242
|
- **Nested graphs:** nodes may own `graph`; navigate through the header arrow and breadcrumb bar. `groupSelection()` uses Spagbol-owned Group, Ins and Outs kinds (`spagbolGroupKinds`), preserving original mode/strength at the destination. Existing custom boundary-kind options remain compatible. Spagbol does not flatten or execute groups.
|
|
221
243
|
- **Shared structure:** an explicit `sharedGraphId` synchronizes edited nested graph contents across linked instances. Each instance retains its own overrides. Cloning an already linked group retains that relationship; nodes without a shared ID remain independent.
|
|
222
244
|
- **Projected panels:** `panelNodeIds` selects nested controls; `overrides` stores instance values independently of shared defaults. `panels` requires `nestedGraphs`. A custom projected/body renderer receives `setValue` mapped to the parent override. Double-click a projected control label to reset it. Numeric and JSON payload overrides are instance-specific, including nested projected controls; double-click the projected header to reset them. UI/Controls areas determine the projected layout, matching Teia.
|
|
@@ -241,7 +263,7 @@ The complete canvas enables areas, compact nodes, nesting and projected group co
|
|
|
241
263
|
| Delete or Backspace | Delete selection and dependent modulation links. Deleting an area leaves its nodes. |
|
|
242
264
|
| Cmd/Ctrl+Z; Cmd/Ctrl+Shift+Z or Y | Undo; redo. |
|
|
243
265
|
| X | Toggle selected nodes, otherwise selected links. |
|
|
244
|
-
| Cmd/Ctrl-drag empty canvas | Draw
|
|
266
|
+
| Cmd/Ctrl-drag empty canvas | Draw a Container when enabled. |
|
|
245
267
|
| Double-click selected node name / area title | Change node type inline / edit the area title. |
|
|
246
268
|
| Drag numeric field / click | Scrub / type a value. Shift is finer; Cmd/Ctrl is coarser. |
|
|
247
269
|
| Shift/Alt-wheel on number | Scrub without panning. |
|
|
@@ -329,3 +351,19 @@ npm install @pauloricca/spagbol @xyflow/react react react-dom
|
|
|
329
351
|
Import `@pauloricca/spagbol/styles.css` once and mount `SpagbolCanvas` in a sized container, as above. Applications should declare the released npm version in their manifest and commit the registry-backed lockfile. The bundled example intentionally uses a local tarball so edits can be tested before a release.
|
|
330
352
|
|
|
331
353
|
For updates, change the version first (for example `npm version patch --no-git-tag-version`), rerun the checks and dry run, then publish again. Commit the manifest/lockfile through your normal release workflow. Published name/version pairs cannot be reused. Local example preparation reads the package version to select its tarball. See [npm publish](https://docs.npmjs.com/cli/v11/commands/npm-publish/).
|
|
354
|
+
|
|
355
|
+
## Node drag previews
|
|
356
|
+
|
|
357
|
+
Ordinary node movement is presented as transient canvas geometry. The immutable editor document keeps its previous positions until drop, when all moved nodes are committed as one layout edit and one undo entry. Escape, pointer cancellation, or controller cancellation discards the preview. Numeric controls still publish live value previews through the controller's gesture API. Hosts observing document changes should expect a layout change at drop rather than on each pointer movement.
|
|
358
|
+
|
|
359
|
+
## 0.1.1
|
|
360
|
+
|
|
361
|
+
Node dragging now previews native canvas positions and commits one document edit on drop. This removes per-pointer graph cloning, validation and redundant controlled-position updates. Selection subscriptions are scoped to the affected node, port or cable. Sliders and numeric controls retain live value updates and grouped undo. Escape, pointer cancellation, multi-selection and Alt duplication are covered by regression checks. See [the performance investigation](docs/node-drag-performance.md) for measurements and behavior details.
|
|
362
|
+
|
|
363
|
+
## Area kinds, headers and membership controls
|
|
364
|
+
|
|
365
|
+
Areas use Teia’s bold title, 32px aligned header, subtle background and dashed white selection outline. The padlock freezes membership: locked areas retain their saved nodes/nested areas; unlocked areas follow containment as content moves. The padlock is a membership control, and does not disable nodes or audio processing. Its pressed/closed state means locked. The +/− button collapses/expands the area.
|
|
366
|
+
|
|
367
|
+
Areas are the umbrella for **Container**, **Spread**, **Spawn** and **Conditional Execution**. Container only organises the graph visually; the other three are execution areas with app-owned semantics. Group is a separate nested graph. The creation/type picker calls the visual kind Container, and new or cleared default titles use Container. The compatible `GraphArea`, `areas`, `ownerNodeId`, `spagbol.area` and `GraphEditor.addArea()`/`convertNodeToArea()` names stay unchanged; existing saved/custom titles are not rewritten. See [area terminology](docs/language/standard-nodes.md#areas-and-their-kinds).
|
|
368
|
+
|
|
369
|
+
Version 0.1.3 includes live node-drag previews, labeled group breadcrumbs and a larger chevron navigation target, alongside the shared Curve, Sequencer and Joystick controls.
|
package/dist/core/controller.js
CHANGED
|
@@ -658,9 +658,9 @@ export class GraphEditor {
|
|
|
658
658
|
if (!this.editing || !this.graph.nodes.some(node => node.id === nodeId))
|
|
659
659
|
return;
|
|
660
660
|
const id = createId('area');
|
|
661
|
-
this.edit('Convert node to
|
|
661
|
+
this.edit('Convert node to Container', 'structure', graph => {
|
|
662
662
|
const node = graph.nodes.find(node => node.id === nodeId);
|
|
663
|
-
graph.areas.push({ id, title: node.label ?? '
|
|
663
|
+
graph.areas.push({ id, title: node.label ?? 'Container', position: { ...node.position }, size: node.size ?? { width: 420, height: 280 } });
|
|
664
664
|
removeNodes(graph, [nodeId]);
|
|
665
665
|
});
|
|
666
666
|
this.select({ areaIds: [id] });
|
|
@@ -670,10 +670,10 @@ export class GraphEditor {
|
|
|
670
670
|
if (!this.editing)
|
|
671
671
|
return;
|
|
672
672
|
const id = createId("area");
|
|
673
|
-
this.edit("Add
|
|
673
|
+
this.edit("Add Container", "layout", (graph) => {
|
|
674
674
|
graph.areas.push({
|
|
675
675
|
id,
|
|
676
|
-
title: "
|
|
676
|
+
title: "Container",
|
|
677
677
|
position: { ...position },
|
|
678
678
|
size: { ...size },
|
|
679
679
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"controller.js","sourceRoot":"","sources":["../../src/core/controller.ts"],"names":[],"mappings":"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","sourcesContent":["import { createEditablePort, resolveNewBoundaryPorts, spagbolNewPortId, createGroupPort, findGroupControl, groupControlKey, isGroupBoundary, normalizeGroupPortLabel, synchronizeGroupBoundaries } from \"./groups.js\";\nimport {\n clone,\n createId,\n emptyGraph,\n emptySelection,\n spagbolGroupKinds,\n graphAt,\n portsFor,\n validPath,\n LinkModeRegistry,\n NodeRegistry,\n type ChangeEvent,\n type ChangeKind,\n type GraphArea,\n type NodeData,\n type GraphDocument,\n type GraphLink,\n type GraphNode,\n type GraphPolicy,\n type LinkTarget,\n type Point,\n type Selection,\n type Size,\n} from \"./model.js\";\nimport {\n areaMembers,\n connectionError,\n copyFragment,\n pasteFragment,\n pruneInvalidPorts,\n removeLinks,\n removeNodes,\n synchronizeSharedGraph,\n validateGraph,\n type GraphFragment,\n} from \"./graph.js\";\nimport { assertDocument } from \"./serialization.js\";\nimport { groupNodes, type GroupOptions } from \"./grouping.js\";\n\nexport interface EditorSnapshot {\n document: GraphDocument;\n path: readonly string[];\n selection: Selection;\n canUndo: boolean;\n canRedo: boolean;\n gesture: string | null;\n mode: \"edit\" | \"controls\" | \"readonly\";\n}\nexport interface EditorOptions {\n document?: GraphDocument;\n nodes: NodeRegistry;\n modes?: LinkModeRegistry;\n policy?: GraphPolicy;\n historyLimit?: number;\n onCommit?(event: ChangeEvent): void;\n onPreview?(event: ChangeEvent | null): void;\n onPaste?(event: { fragment: GraphFragment; nodeIds: readonly string[]; areaIds: readonly string[]; path: readonly string[]; document: GraphDocument }): void;\n /** Pure domain invariants, applied within the same atomic edit/history entry. */\n normalizeDocument?(document: GraphDocument, previous: GraphDocument): void;\n}\ninterface HistoryEntry {\n before: GraphDocument;\n after: GraphDocument;\n label: string;\n kinds: ChangeKind[];\n path: string[];\n}\ninterface Gesture {\n before: GraphDocument;\n label: string;\n kinds: Set<ChangeKind>;\n path: string[];\n}\nfunction freeze<T>(value: T): T {\n if (value && typeof value === \"object\" && !Object.isFrozen(value)) {\n for (const child of Object.values(value)) freeze(child);\n Object.freeze(value);\n }\n return value;\n}\n/** Retain immutable identities for unchanged document branches after an atomic edit. */\nfunction shareUnchanged<T>(before: T, after: T): T {\n if (Object.is(before, after)) return before;\n if (after && typeof after === \"object\" && Object.isFrozen(after)) return after;\n if (!before || !after || typeof before !== 'object' || typeof after !== 'object' || Array.isArray(before) !== Array.isArray(after)) return after;\n const previous = before as Record<string, unknown>, next = after as Record<string, unknown>;\n const keys = Object.keys(next);\n let equal = keys.length === Object.keys(previous).length;\n for (const key of keys) {\n if (!(key in previous)) { equal = false; continue; }\n next[key] = shareUnchanged(previous[key], next[key]);\n if (!Object.is(previous[key], next[key])) equal = false;\n }\n return equal ? before : after;\n}\n/** One controller per document. Nothing is stored in module-level mutable state. */\nexport class GraphEditor {\n readonly nodes: NodeRegistry;\n readonly modes: LinkModeRegistry;\n readonly policy: GraphPolicy;\n readonly #options: EditorOptions;\n readonly #listeners = new Set<() => void>();\n readonly #commits = new Set<(event: ChangeEvent) => void>();\n #snapshot: EditorSnapshot;\n #past: HistoryEntry[] = [];\n #future: HistoryEntry[] = [];\n #gesture: Gesture | null = null;\n #clipboard: GraphFragment | null = null;\n\n constructor(options: EditorOptions) {\n this.#options = options;\n this.nodes = options.nodes;\n this.modes = options.modes ?? new LinkModeRegistry();\n this.policy = { linkProperties: ['weight'], ...options.policy };\n const source = options.document ?? emptyGraph();\n assertDocument(source);\n const document = clone(source);\n this.#snapshot = freeze({\n document,\n path: [],\n selection: emptySelection(),\n canUndo: false,\n canRedo: false,\n gesture: null,\n mode: \"edit\",\n });\n }\n getSnapshot = (): EditorSnapshot => this.#snapshot;\n subscribe = (listener: () => void): (() => void) => {\n this.#listeners.add(listener);\n return () => {\n this.#listeners.delete(listener);\n };\n };\n onCommit(listener: (event: ChangeEvent) => void): () => void {\n this.#commits.add(listener);\n return () => {\n this.#commits.delete(listener);\n };\n }\n get graph(): GraphDocument {\n return graphAt(this.#snapshot.document, this.#snapshot.path);\n }\n get editing(): boolean {\n return this.#snapshot.mode === \"edit\";\n }\n diagnostics() {\n return validateGraph(\n this.#snapshot.document,\n this.nodes,\n this.modes,\n this.policy,\n );\n }\n #publish(patch: Partial<EditorSnapshot> = {}): void {\n const document = patch.document ?? this.#snapshot.document;\n const path = shareUnchanged(this.#snapshot.path, validPath(document, patch.path ?? this.#snapshot.path));\n const graph = graphAt(document, path);\n const selection = patch.selection ?? this.#snapshot.selection;\n this.#snapshot = freeze({\n ...this.#snapshot,\n ...patch,\n document,\n path,\n selection: shareUnchanged(this.#snapshot.selection, {\n port: selection.port && graph.nodes.some(node => node.id === selection.port!.nodeId && portsFor(node, this.nodes).some(port => port.id === selection.port!.portId && port.direction === selection.port!.direction)) ? selection.port : undefined,\n nodeIds: selection.nodeIds.filter((id) =>\n graph.nodes.some((node) => node.id === id),\n ),\n linkIds: selection.linkIds.filter((id) =>\n graph.links.some((link) => link.id === id),\n ),\n areaIds: selection.areaIds.filter((id) =>\n graph.areas.some((area) => area.id === id),\n ),\n }),\n canUndo: this.#past.length > 0,\n canRedo: this.#future.length > 0,\n gesture: this.#gesture?.label ?? null,\n });\n for (const listener of this.#listeners) listener();\n }\n #event(\n entry: Pick<HistoryEntry, \"label\" | \"kinds\" | \"path\">,\n origin: ChangeEvent[\"origin\"],\n ): ChangeEvent {\n return {\n label: entry.label,\n kinds: [...entry.kinds],\n path: [...entry.path],\n document: this.#snapshot.document,\n origin,\n };\n }\n #emit(event: ChangeEvent): void {\n this.#options.onCommit?.(event);\n for (const listener of this.#commits) listener(event);\n }\n #remember(entry: HistoryEntry): void {\n this.#past = [...this.#past, entry].slice(\n -Math.max(1, this.#options.historyLimit ?? 100),\n );\n this.#future = [];\n }\n /** App transformations use this same atomic path as built-in commands. */\n edit(\n label: string,\n kinds: ChangeKind | readonly ChangeKind[],\n transform: (graph: GraphDocument) => void,\n ): void {\n if (this.#snapshot.mode === \"readonly\") return;\n const changes = typeof kinds === \"string\" ? [kinds] : [...kinds];\n if (!this.editing && changes.some((kind) => kind !== \"values\")) return;\n const before = this.#snapshot.document;\n let after = clone(before);\n transform(graphAt(after, this.#snapshot.path));\n this.#options.normalizeDocument?.(after, before);\n synchronizeSharedGraph(after, this.#snapshot.path);\n synchronizeGroupBoundaries(after, this.nodes);\n assertDocument(after);\n after = shareUnchanged(before, after);\n if (before === after) return;\n const entry: HistoryEntry = {\n before,\n after,\n label,\n kinds: changes,\n path: [...this.#snapshot.path],\n };\n if (this.#gesture)\n for (const kind of changes) this.#gesture.kinds.add(kind);\n else this.#remember(entry);\n this.#publish({ document: after });\n if (this.#gesture) this.#options.onPreview?.(this.#event(entry, \"edit\"));\n else this.#emit(this.#event(entry, \"edit\"));\n }\n beginGesture(label: string): void {\n if (this.#gesture)\n throw new Error(\"Finish or cancel the current gesture first.\");\n this.#gesture = {\n before: this.#snapshot.document,\n label,\n kinds: new Set(),\n path: [...this.#snapshot.path],\n };\n this.#publish();\n }\n commitGesture(): void {\n const gesture = this.#gesture;\n if (!gesture) return;\n this.#gesture = null;\n const entry: HistoryEntry = {\n ...gesture,\n after: this.#snapshot.document,\n kinds: [...gesture.kinds],\n };\n const changed =\n JSON.stringify(entry.before) !== JSON.stringify(entry.after);\n if (changed) this.#remember(entry);\n this.#publish();\n this.#options.onPreview?.(null);\n if (changed) this.#emit(this.#event(entry, \"edit\"));\n }\n cancelGesture(): void {\n const gesture = this.#gesture;\n if (!gesture) return;\n this.#gesture = null;\n this.#publish({ document: gesture.before, path: gesture.path });\n this.#options.onPreview?.(null);\n }\n setMode(mode: EditorSnapshot[\"mode\"]): void {\n this.cancelGesture();\n this.#publish({ mode, selection: emptySelection() });\n }\n select(selection: Partial<Selection>): void {\n const next = shareUnchanged(this.#snapshot.selection, { ...emptySelection(), port: undefined, ...selection });\n if (next !== this.#snapshot.selection) this.#publish({ selection: next });\n }\n enter(nodeId: string): void {\n if (!this.graph.nodes.find((node) => node.id === nodeId)?.graph) return;\n this.commitGesture();\n this.#publish({\n path: [...this.#snapshot.path, nodeId],\n selection: emptySelection(),\n });\n }\n navigate(path: readonly string[]): void {\n this.commitGesture();\n this.#publish({ path, selection: emptySelection() });\n }\n exit(): void {\n this.navigate(this.#snapshot.path.slice(0, -1));\n }\n undo(): void {\n if (!this.editing) return;\n this.cancelGesture();\n const entry = this.#past.pop();\n if (!entry) return;\n this.#future.push(entry);\n this.#publish({\n document: entry.before,\n path: entry.path,\n selection: emptySelection(),\n });\n this.#emit(this.#event(entry, \"undo\"));\n }\n redo(): void {\n if (!this.editing) return;\n this.cancelGesture();\n const entry = this.#future.pop();\n if (!entry) return;\n this.#past.push(entry);\n this.#publish({\n document: entry.after,\n path: entry.path,\n selection: emptySelection(),\n });\n this.#emit(this.#event(entry, \"redo\"));\n }\n replace(document: GraphDocument): void {\n if (!this.editing) return;\n assertDocument(document);\n this.cancelGesture();\n this.#past = [];\n this.#future = [];\n this.#publish({\n document: clone(document),\n path: [],\n selection: emptySelection(),\n });\n this.#emit({\n label: \"Load graph\",\n kinds: [\"structure\", \"values\", \"layout\", \"metadata\"],\n path: [],\n document: this.#snapshot.document,\n origin: \"replace\",\n });\n }\n addNode(kind: string, position: Point): string | undefined {\n if (!this.editing) return;\n const node = this.nodes.create(kind, position);\n this.edit(\"Add node\", \"structure\", (graph) => {\n graph.nodes.push(node);\n });\n this.select({ nodeIds: [node.id] });\n return node.id;\n }\n updateNode(\n id: string,\n update: Partial<Omit<GraphNode, \"id\" | \"graph\">>,\n kind: ChangeKind = \"metadata\",\n ): void {\n this.edit(\"Edit node\", kind, (graph) => {\n const node = graph.nodes.find((node) => node.id === id);\n if (!node) return;\n Object.assign(node, clone(update));\n if (kind === \"structure\") pruneInvalidPorts(graph, this.nodes, id);\n });\n }\n changeNodeKind(id: string, kind: string, data: NodeData = {}): void {\n if (!this.editing) return;\n const previous = this.graph.nodes.find(node => node.id === id);\n if (!previous || previous.kind === kind) return;\n const replacement = this.nodes.create(kind, previous.position, id);\n Object.assign(replacement.data, clone(data));\n const oldPorts = portsFor(previous, this.nodes);\n const newPorts = portsFor(replacement, this.nodes);\n if (previous.enabled !== undefined) replacement.enabled = previous.enabled;\n if (previous.compact !== undefined) replacement.compact = previous.compact;\n if (previous.compactLabel !== undefined) replacement.compactLabel = previous.compactLabel;\n if (previous.scale !== undefined) replacement.scale = previous.scale;\n if (!replacement.size && previous.size) replacement.size = { ...previous.size };\n for (const port of portsFor(replacement, this.nodes))\n if (port.direction === 'input' && previous.values[port.id] !== undefined)\n replacement.values[port.id] = port.integer\n ? Math.round(Math.max(port.min ?? -Infinity, Math.min(port.max ?? Infinity, previous.values[port.id]!)))\n : Math.max(port.min ?? -Infinity, Math.min(port.max ?? Infinity, previous.values[port.id]!));\n this.edit('Change node type', 'structure', graph => {\n graph.nodes = graph.nodes.map(node => node.id === id ? replacement : node);\n for (const link of graph.links) {\n for (const direction of ['input', 'output'] as const) {\n const endpoint = direction === 'output' ? link.source : link.target.type === 'port' ? link.target : undefined;\n if (!endpoint || endpoint.nodeId !== id) continue;\n const before = oldPorts.filter(port => port.direction === direction);\n const after = newPorts.filter(port => port.direction === direction);\n const next = after[Math.max(0, before.findIndex(port => port.id === endpoint.portId))];\n endpoint.portId = next?.id ?? '__spagbol_removed_port__';\n }\n }\n pruneInvalidPorts(graph, this.nodes, id);\n });\n }\n /** Scale selected nodes around their shared visual center in one undo entry. */\n scaleSelection(factor: number, measuredSizes: ReadonlyMap<string, Size> = new Map()): void {\n if (!this.editing || !Number.isFinite(factor) || factor <= 0 || factor === 1) return;\n const selected = this.graph.nodes.filter(node => this.getSnapshot().selection.nodeIds.includes(node.id));\n if (!selected.length) return;\n const bounds = selected.map(node => ({ node, size: measuredSizes.get(node.id) ?? {\n width: (node.size?.width ?? 180) * (node.scale ?? 1),\n height: (node.size?.height ?? 100) * (node.scale ?? 1),\n } }));\n const center = {\n x: (Math.min(...bounds.map(({node}) => node.position.x)) + Math.max(...bounds.map(({node, size}) => node.position.x + size.width))) / 2,\n y: (Math.min(...bounds.map(({node}) => node.position.y)) + Math.max(...bounds.map(({node, size}) => node.position.y + size.height))) / 2,\n };\n const ids = new Set(selected.map(node => node.id));\n this.edit('Scale selection', 'layout', graph => {\n for (const node of graph.nodes) if (ids.has(node.id)) {\n node.position = { x: center.x + (node.position.x - center.x) * factor, y: center.y + (node.position.y - center.y) * factor };\n node.scale = (node.scale ?? 1) * factor;\n }\n });\n }\n setValue(id: string, portId: string, value: number): void {\n this.setValues(id, { [portId]: value });\n }\n /** Several control values are one edit, with no intermediate document states. */\n setValues(id: string, values: Readonly<Record<string, number>>): void {\n const current = this.graph.nodes.find(node => node.id === id);\n if (!current) return;\n const ports = portsFor(current, this.nodes);\n const changes: Record<string, number> = {};\n for (const [portId, value] of Object.entries(values)) {\n if (!Number.isFinite(value)) continue;\n const port = ports.find(port => port.id === portId);\n const bounded = Math.min(port?.max ?? Infinity, Math.max(port?.min ?? -Infinity, value));\n const next = port?.integer ? Math.round(bounded) : bounded;\n if (current.values[portId] !== next) changes[portId] = next;\n }\n if (!Object.keys(changes).length) return;\n this.edit('Change values', 'values', graph => {\n const node = graph.nodes.find(node => node.id === id)!;\n Object.assign(node.values, changes);\n if (node.kind === spagbolGroupKinds.inputs) for (const port of node.ports ?? [])\n if (changes[port.id] !== undefined) port.defaultValue = changes[port.id];\n });\n }\n setOverride(\n groupId: string,\n nodeId: string | readonly string[],\n portId: string,\n value: number,\n ): void {\n const key = groupControlKey(nodeId);\n if (!Number.isFinite(value)) return;\n this.edit(\"Change instance control\", \"values\", (graph) => {\n const group = graph.nodes.find((node) => node.id === groupId);\n const node = group && findGroupControl(group, nodeId);\n if (!group || !node) return;\n const port = portsFor(node, this.nodes).find(\n (port) => port.id === portId,\n );\n const bounded = Math.max(\n port?.min ?? -Infinity,\n Math.min(port?.max ?? Infinity, value),\n );\n group.overrides ??= {};\n group.overrides[key] ??= {};\n group.overrides[key]![portId] = port?.integer\n ? Math.round(bounded)\n : bounded;\n });\n }\n resetOverride(groupId: string, nodeId: string | readonly string[]): void {\n const key = groupControlKey(nodeId);\n this.edit(\"Reset instance control\", \"values\", (graph) => {\n const group = graph.nodes.find((node) => node.id === groupId);\n if (group?.overrides) delete group.overrides[key];\n if (group?.dataOverrides) delete group.dataOverrides[key];\n });\n }\n addBoundaryPort(nodeId: string, label: string, defaultValue = 0): void {\n this.edit('Add group port', 'structure', graph => {\n const node = graph.nodes.find(item => item.id === nodeId);\n if (node) createEditablePort(node, this.nodes, label, defaultValue);\n });\n }\n renameBoundaryPort(nodeId: string, portId: string, label: string): void {\n const normalized = normalizeGroupPortLabel(label);\n this.edit('Rename group port', 'structure', graph => {\n const node = graph.nodes.find(item => item.id === nodeId);\n if (!node || !isGroupBoundary(node)) return;\n if (node.ports?.some(port => port.id !== portId && port.label === normalized)) throw new Error('That port name already exists.');\n const port = node.ports?.find(item => item.id === portId);\n if (port) port.label = normalized;\n });\n }\n removeBoundaryPort(nodeId: string, portId: string): void {\n this.edit('Remove group port', 'structure', graph => {\n const node = graph.nodes.find(item => item.id === nodeId);\n if (!node || !isGroupBoundary(node)) return;\n node.ports = node.ports?.filter(port => port.id !== portId);\n delete node.values[portId];\n pruneInvalidPorts(graph, this.nodes, nodeId);\n });\n }\n moveBoundaryPort(nodeId: string, portId: string, index: number): void {\n this.edit('Reorder group port', 'structure', graph => {\n const node = graph.nodes.find(item => item.id === nodeId);\n if (!node || !isGroupBoundary(node) || !node.ports) return;\n const previous = node.ports.findIndex(port => port.id === portId);\n if (previous < 0) return;\n const [port] = node.ports.splice(previous, 1);\n node.ports.splice(Math.max(0, Math.min(node.ports.length, index)), 0, port!);\n });\n }\n exposeSelection(exposed = true): void {\n this.edit('Expose group controls', 'metadata', graph => {\n const current = Array.isArray(graph.data?.exposedNodeIds) ? graph.data!.exposedNodeIds.filter((id): id is string => typeof id === 'string') : [];\n const ids = new Set(current);\n for (const id of this.#snapshot.selection.nodeIds) {\n const node = graph.nodes.find(item => item.id === id);\n if (!node || isGroupBoundary(node)) continue;\n if (exposed) ids.add(id); else ids.delete(id);\n }\n graph.data ??= {};\n graph.data.exposedNodeIds = [...ids];\n });\n }\n setDataOverride(groupId: string, nodeId: string | readonly string[], update: Partial<NodeData>): void {\n const key = groupControlKey(nodeId);\n this.edit('Change instance control', 'values', graph => {\n const group = graph.nodes.find(node => node.id === groupId);\n if (!group || !findGroupControl(group, nodeId)) return;\n group.dataOverrides ??= {};\n group.dataOverrides[key] = { ...group.dataOverrides[key], ...update } as NodeData;\n });\n }\n canConnect(\n source: GraphLink[\"source\"],\n target: LinkTarget,\n mode: string,\n replacingId?: string,\n ): string | undefined {\n const graph = source.portId === spagbolNewPortId || (target.type === 'port' && target.portId === spagbolNewPortId) ? clone(this.graph) : this.graph;\n const prepared = graph === this.graph ? { source, target } : resolveNewBoundaryPorts(graph, source, target, this.nodes);\n return connectionError(\n graph,\n this.nodes,\n this.modes,\n this.policy,\n prepared.source,\n prepared.target,\n mode,\n replacingId,\n );\n }\n connect(\n source: GraphLink[\"source\"],\n target: LinkTarget,\n mode = \"set\",\n settings: Partial<Pick<GraphLink, \"weight\" | \"enabled\" | \"data\">> = {},\n ): string | undefined {\n if (!this.editing) return;\n const error = this.canConnect(source, target, mode);\n if (error) throw new Error(error);\n const id = createId(\"link\");\n this.edit(\"Connect ports\", \"structure\", (graph) => {\n const prepared = resolveNewBoundaryPorts(graph, source, target, this.nodes);\n graph.links.push({\n id,\n source: prepared.source,\n target: prepared.target,\n mode,\n weight: 1,\n ...settings,\n });\n });\n this.select({ linkIds: [id] });\n return id;\n }\n reconnect(\n id: string,\n source: GraphLink[\"source\"],\n target: LinkTarget,\n duplicate = false,\n ): string | undefined {\n if (!this.editing) return;\n const original = this.graph.links.find((link) => link.id === id);\n if (!original) return;\n const error = this.canConnect(\n source,\n target,\n original.mode,\n duplicate ? undefined : id,\n );\n if (error) throw new Error(error);\n const newId = duplicate ? createId(\"link\") : id;\n this.edit(\n duplicate ? \"Duplicate connection\" : \"Reconnect link\",\n \"structure\",\n (graph) => {\n const prepared = resolveNewBoundaryPorts(graph, source, target, this.nodes);\n const next = {\n ...clone(original),\n id: newId,\n source: prepared.source,\n target: prepared.target,\n };\n if (duplicate) graph.links.push(next);\n else\n graph.links = graph.links.map((link) =>\n link.id === id ? next : link,\n );\n },\n );\n this.select({ linkIds: [newId] });\n return newId;\n }\n updateLink(\n id: string,\n update: Partial<Pick<GraphLink, \"mode\" | \"weight\" | \"enabled\" | \"data\">>,\n ): void {\n if (\n update.mode &&\n (!this.modes.get(update.mode) ||\n (this.policy.modes && !this.policy.modes.includes(update.mode)))\n )\n throw new Error(\"Unavailable link mode.\");\n if (update.weight !== undefined && !Number.isFinite(update.weight)) return;\n this.edit(\"Edit link\", \"values\", (graph) => {\n const link = graph.links.find((link) => link.id === id);\n if (link) Object.assign(link, clone(update));\n });\n }\n deleteSelection(bridge = false): void {\n const port = this.#snapshot.selection.port;\n if (port && this.graph.nodes.some(node => node.id === port.nodeId && isGroupBoundary(node))) {\n this.removeBoundaryPort(port.nodeId, port.portId);\n this.select({ nodeIds: [port.nodeId] });\n return;\n }\n if (port && this.policy.deletePort) {\n this.edit('Delete port', 'structure', graph => {\n const node = graph.nodes.find(node => node.id === port.nodeId);\n const definition = node && portsFor(node, this.nodes).find(item => item.id === port.portId && item.direction === port.direction);\n if (node && definition) { this.policy.deletePort!(node, definition); pruneInvalidPorts(graph, this.nodes, node.id); }\n });\n this.select({ nodeIds: [port.nodeId] });\n return;\n }\n const selection = this.#snapshot.selection;\n this.edit(bridge ? 'Delete and bridge' : 'Delete selection', 'structure', (graph) => {\n const selected = new Set(selection.nodeIds);\n const bridges = bridge ? graph.nodes.flatMap(node => {\n if (!selected.has(node.id)) return [];\n const incoming = graph.links.filter(link => link.target.type === 'port' && link.target.nodeId === node.id && !selected.has(link.source.nodeId));\n const outgoing = graph.links.filter(link => link.source.nodeId === node.id && link.target.type === 'port' && !selected.has(link.target.nodeId));\n return incoming.flatMap(input => outgoing.map(output => ({ id: createId('link'), source: { ...input.source }, target: { ...output.target }, mode: output.mode, weight: output.weight, enabled: input.enabled !== false && output.enabled !== false })));\n }) : [];\n const owned = graph.areas.filter(area => selection.areaIds.includes(area.id) && area.ownerNodeId).map(area => area.ownerNodeId!);\n removeNodes(graph, [...selection.nodeIds, ...owned]);\n for (const link of bridges) if (!connectionError(graph, this.nodes, this.modes, this.policy, link.source, link.target, link.mode)) graph.links.push(link);\n removeLinks(graph, selection.linkIds);\n graph.areas = graph.areas.filter(\n (area) => !selection.areaIds.includes(area.id),\n );\n for (const area of graph.areas)\n if (area.areaIds)\n area.areaIds = area.areaIds.filter(\n (id) => !selection.areaIds.includes(id),\n );\n });\n this.select({});\n }\n copy(): GraphFragment {\n this.#clipboard = copyFragment(\n this.graph,\n this.#snapshot.selection.nodeIds,\n this.#snapshot.selection.areaIds,\n );\n return clone(this.#clipboard);\n }\n paste(\n fragment = this.#clipboard,\n offset: Point = { x: 36, y: 36 },\n external = false,\n ): void {\n if (!fragment || !this.editing) return;\n let selection: Partial<Selection> = {};\n this.edit(\"Paste graph\", \"structure\", (graph) => {\n selection = pasteFragment(graph, fragment, this.nodes, offset, external);\n });\n this.select(selection);\n this.#options.onPaste?.({ fragment: clone(fragment), nodeIds: selection.nodeIds ?? [], areaIds: selection.areaIds ?? [], path: [...this.#snapshot.path], document: this.#snapshot.document });\n }\n duplicate(offset: Point = { x: 36, y: 36 }, external = false): void {\n this.paste(\n copyFragment(\n this.graph,\n this.#snapshot.selection.nodeIds,\n this.#snapshot.selection.areaIds,\n ),\n offset,\n external,\n );\n }\n groupSelection(options?: GroupOptions): string | undefined {\n if (!this.editing) return;\n let id: string | undefined;\n this.edit(\"Group selection\", \"structure\", (graph) => {\n id = groupNodes(\n graph,\n this.#snapshot.selection.nodeIds.filter(id => !isGroupBoundary(graph.nodes.find(node => node.id === id)!)),\n this.nodes,\n options,\n );\n });\n if (id) this.select({ nodeIds: [id] });\n return id;\n }\n insertNode(\n linkId: string,\n kind: string,\n position: Point,\n inputId: string,\n outputId: string,\n ): string | undefined {\n if (!this.editing) return;\n const old = this.graph.links.find((link) => link.id === linkId);\n if (!old) return;\n const node = this.nodes.create(kind, position);\n const ports = portsFor(node, this.nodes);\n if (\n !ports.some(\n (port) => port.id === inputId && port.direction === \"input\",\n ) ||\n !ports.some((port) => port.id === outputId && port.direction === \"output\")\n )\n throw new Error(\"Insertion requires an explicit input and output.\");\n const candidate = clone(this.graph);\n candidate.nodes.push(node);\n const source = { nodeId: node.id, portId: outputId };\n const input = { type: \"port\" as const, nodeId: node.id, portId: inputId };\n const error =\n connectionError(\n candidate,\n this.nodes,\n this.modes,\n this.policy,\n old.source,\n input,\n \"set\",\n ) ??\n connectionError(\n candidate,\n this.nodes,\n this.modes,\n this.policy,\n source,\n old.target,\n old.mode,\n old.id,\n );\n if (error) throw new Error(error);\n this.edit(\"Insert node\", \"structure\", (graph) => {\n graph.nodes.push(node);\n graph.links = graph.links.map((link) =>\n link.id === linkId ? { ...link, source } : link,\n );\n graph.links.push({\n id: createId(\"link\"),\n source: { ...old.source },\n target: input,\n mode: \"set\",\n weight: 1,\n });\n });\n this.select({ nodeIds: [node.id] });\n return node.id;\n }\n convertNodeToArea(nodeId: string): string | undefined {\n if (!this.editing || !this.graph.nodes.some(node => node.id === nodeId)) return;\n const id = createId('area');\n this.edit('Convert node to area', 'structure', graph => {\n const node = graph.nodes.find(node => node.id === nodeId)!;\n graph.areas.push({ id, title: node.label ?? 'Area', position: { ...node.position }, size: node.size ?? { width: 420, height: 280 } });\n removeNodes(graph, [nodeId]);\n });\n this.select({ areaIds: [id] });\n return id;\n }\n addArea(\n position: Point,\n size: Size = { width: 420, height: 280 },\n ): string | undefined {\n if (!this.editing) return;\n const id = createId(\"area\");\n this.edit(\"Add area\", \"layout\", (graph) => {\n graph.areas.push({\n id,\n title: \"Area\",\n position: { ...position },\n size: { ...size },\n });\n });\n this.select({ areaIds: [id] });\n return id;\n }\n updateArea(id: string, update: Partial<Omit<GraphArea, \"id\">>): void {\n this.edit(\"Edit area\", \"layout\", (graph) => {\n const area = graph.areas.find((area) => area.id === id);\n if (area) Object.assign(area, clone(update));\n });\n }\n lockArea(id: string, locked: boolean): void {\n this.edit(\"Lock area membership\", \"layout\", (graph) => {\n const area = graph.areas.find((area) => area.id === id);\n if (!area) return;\n const members = areaMembers(graph, id);\n area.locked = locked;\n if (locked) {\n area.nodeIds = [...members.nodeIds];\n area.areaIds = [...members.areaIds];\n } else {\n delete area.nodeIds;\n delete area.areaIds;\n }\n });\n }\n moveArea(id: string, position: Point): void {\n this.edit(\"Move area\", \"layout\", (graph) => {\n const area = graph.areas.find((area) => area.id === id);\n if (!area) return;\n const members = areaMembers(graph, id);\n const delta = {\n x: position.x - area.position.x,\n y: position.y - area.position.y,\n };\n area.position = { ...position };\n for (const node of graph.nodes)\n if (members.nodeIds.has(node.id)) {\n node.position.x += delta.x;\n node.position.y += delta.y;\n }\n for (const child of graph.areas)\n if (members.areaIds.has(child.id)) {\n child.position.x += delta.x;\n child.position.y += delta.y;\n }\n });\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"controller.js","sourceRoot":"","sources":["../../src/core/controller.ts"],"names":[],"mappings":"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","sourcesContent":["import { createEditablePort, resolveNewBoundaryPorts, spagbolNewPortId, createGroupPort, findGroupControl, groupControlKey, isGroupBoundary, normalizeGroupPortLabel, synchronizeGroupBoundaries } from \"./groups.js\";\nimport {\n clone,\n createId,\n emptyGraph,\n emptySelection,\n spagbolGroupKinds,\n graphAt,\n portsFor,\n validPath,\n LinkModeRegistry,\n NodeRegistry,\n type ChangeEvent,\n type ChangeKind,\n type GraphArea,\n type NodeData,\n type GraphDocument,\n type GraphLink,\n type GraphNode,\n type GraphPolicy,\n type LinkTarget,\n type Point,\n type Selection,\n type Size,\n} from \"./model.js\";\nimport {\n areaMembers,\n connectionError,\n copyFragment,\n pasteFragment,\n pruneInvalidPorts,\n removeLinks,\n removeNodes,\n synchronizeSharedGraph,\n validateGraph,\n type GraphFragment,\n} from \"./graph.js\";\nimport { assertDocument } from \"./serialization.js\";\nimport { groupNodes, type GroupOptions } from \"./grouping.js\";\n\nexport interface EditorSnapshot {\n document: GraphDocument;\n path: readonly string[];\n selection: Selection;\n canUndo: boolean;\n canRedo: boolean;\n gesture: string | null;\n mode: \"edit\" | \"controls\" | \"readonly\";\n}\nexport interface EditorOptions {\n document?: GraphDocument;\n nodes: NodeRegistry;\n modes?: LinkModeRegistry;\n policy?: GraphPolicy;\n historyLimit?: number;\n onCommit?(event: ChangeEvent): void;\n onPreview?(event: ChangeEvent | null): void;\n onPaste?(event: { fragment: GraphFragment; nodeIds: readonly string[]; areaIds: readonly string[]; path: readonly string[]; document: GraphDocument }): void;\n /** Pure domain invariants, applied within the same atomic edit/history entry. */\n normalizeDocument?(document: GraphDocument, previous: GraphDocument): void;\n}\ninterface HistoryEntry {\n before: GraphDocument;\n after: GraphDocument;\n label: string;\n kinds: ChangeKind[];\n path: string[];\n}\ninterface Gesture {\n before: GraphDocument;\n label: string;\n kinds: Set<ChangeKind>;\n path: string[];\n}\nfunction freeze<T>(value: T): T {\n if (value && typeof value === \"object\" && !Object.isFrozen(value)) {\n for (const child of Object.values(value)) freeze(child);\n Object.freeze(value);\n }\n return value;\n}\n/** Retain immutable identities for unchanged document branches after an atomic edit. */\nfunction shareUnchanged<T>(before: T, after: T): T {\n if (Object.is(before, after)) return before;\n if (after && typeof after === \"object\" && Object.isFrozen(after)) return after;\n if (!before || !after || typeof before !== 'object' || typeof after !== 'object' || Array.isArray(before) !== Array.isArray(after)) return after;\n const previous = before as Record<string, unknown>, next = after as Record<string, unknown>;\n const keys = Object.keys(next);\n let equal = keys.length === Object.keys(previous).length;\n for (const key of keys) {\n if (!(key in previous)) { equal = false; continue; }\n next[key] = shareUnchanged(previous[key], next[key]);\n if (!Object.is(previous[key], next[key])) equal = false;\n }\n return equal ? before : after;\n}\n/** One controller per document. Nothing is stored in module-level mutable state. */\nexport class GraphEditor {\n readonly nodes: NodeRegistry;\n readonly modes: LinkModeRegistry;\n readonly policy: GraphPolicy;\n readonly #options: EditorOptions;\n readonly #listeners = new Set<() => void>();\n readonly #commits = new Set<(event: ChangeEvent) => void>();\n #snapshot: EditorSnapshot;\n #past: HistoryEntry[] = [];\n #future: HistoryEntry[] = [];\n #gesture: Gesture | null = null;\n #clipboard: GraphFragment | null = null;\n\n constructor(options: EditorOptions) {\n this.#options = options;\n this.nodes = options.nodes;\n this.modes = options.modes ?? new LinkModeRegistry();\n this.policy = { linkProperties: ['weight'], ...options.policy };\n const source = options.document ?? emptyGraph();\n assertDocument(source);\n const document = clone(source);\n this.#snapshot = freeze({\n document,\n path: [],\n selection: emptySelection(),\n canUndo: false,\n canRedo: false,\n gesture: null,\n mode: \"edit\",\n });\n }\n getSnapshot = (): EditorSnapshot => this.#snapshot;\n subscribe = (listener: () => void): (() => void) => {\n this.#listeners.add(listener);\n return () => {\n this.#listeners.delete(listener);\n };\n };\n onCommit(listener: (event: ChangeEvent) => void): () => void {\n this.#commits.add(listener);\n return () => {\n this.#commits.delete(listener);\n };\n }\n get graph(): GraphDocument {\n return graphAt(this.#snapshot.document, this.#snapshot.path);\n }\n get editing(): boolean {\n return this.#snapshot.mode === \"edit\";\n }\n diagnostics() {\n return validateGraph(\n this.#snapshot.document,\n this.nodes,\n this.modes,\n this.policy,\n );\n }\n #publish(patch: Partial<EditorSnapshot> = {}): void {\n const document = patch.document ?? this.#snapshot.document;\n const path = shareUnchanged(this.#snapshot.path, validPath(document, patch.path ?? this.#snapshot.path));\n const graph = graphAt(document, path);\n const selection = patch.selection ?? this.#snapshot.selection;\n this.#snapshot = freeze({\n ...this.#snapshot,\n ...patch,\n document,\n path,\n selection: shareUnchanged(this.#snapshot.selection, {\n port: selection.port && graph.nodes.some(node => node.id === selection.port!.nodeId && portsFor(node, this.nodes).some(port => port.id === selection.port!.portId && port.direction === selection.port!.direction)) ? selection.port : undefined,\n nodeIds: selection.nodeIds.filter((id) =>\n graph.nodes.some((node) => node.id === id),\n ),\n linkIds: selection.linkIds.filter((id) =>\n graph.links.some((link) => link.id === id),\n ),\n areaIds: selection.areaIds.filter((id) =>\n graph.areas.some((area) => area.id === id),\n ),\n }),\n canUndo: this.#past.length > 0,\n canRedo: this.#future.length > 0,\n gesture: this.#gesture?.label ?? null,\n });\n for (const listener of this.#listeners) listener();\n }\n #event(\n entry: Pick<HistoryEntry, \"label\" | \"kinds\" | \"path\">,\n origin: ChangeEvent[\"origin\"],\n ): ChangeEvent {\n return {\n label: entry.label,\n kinds: [...entry.kinds],\n path: [...entry.path],\n document: this.#snapshot.document,\n origin,\n };\n }\n #emit(event: ChangeEvent): void {\n this.#options.onCommit?.(event);\n for (const listener of this.#commits) listener(event);\n }\n #remember(entry: HistoryEntry): void {\n this.#past = [...this.#past, entry].slice(\n -Math.max(1, this.#options.historyLimit ?? 100),\n );\n this.#future = [];\n }\n /** App transformations use this same atomic path as built-in commands. */\n edit(\n label: string,\n kinds: ChangeKind | readonly ChangeKind[],\n transform: (graph: GraphDocument) => void,\n ): void {\n if (this.#snapshot.mode === \"readonly\") return;\n const changes = typeof kinds === \"string\" ? [kinds] : [...kinds];\n if (!this.editing && changes.some((kind) => kind !== \"values\")) return;\n const before = this.#snapshot.document;\n let after = clone(before);\n transform(graphAt(after, this.#snapshot.path));\n this.#options.normalizeDocument?.(after, before);\n synchronizeSharedGraph(after, this.#snapshot.path);\n synchronizeGroupBoundaries(after, this.nodes);\n assertDocument(after);\n after = shareUnchanged(before, after);\n if (before === after) return;\n const entry: HistoryEntry = {\n before,\n after,\n label,\n kinds: changes,\n path: [...this.#snapshot.path],\n };\n if (this.#gesture)\n for (const kind of changes) this.#gesture.kinds.add(kind);\n else this.#remember(entry);\n this.#publish({ document: after });\n if (this.#gesture) this.#options.onPreview?.(this.#event(entry, \"edit\"));\n else this.#emit(this.#event(entry, \"edit\"));\n }\n beginGesture(label: string): void {\n if (this.#gesture)\n throw new Error(\"Finish or cancel the current gesture first.\");\n this.#gesture = {\n before: this.#snapshot.document,\n label,\n kinds: new Set(),\n path: [...this.#snapshot.path],\n };\n this.#publish();\n }\n commitGesture(): void {\n const gesture = this.#gesture;\n if (!gesture) return;\n this.#gesture = null;\n const entry: HistoryEntry = {\n ...gesture,\n after: this.#snapshot.document,\n kinds: [...gesture.kinds],\n };\n const changed =\n JSON.stringify(entry.before) !== JSON.stringify(entry.after);\n if (changed) this.#remember(entry);\n this.#publish();\n this.#options.onPreview?.(null);\n if (changed) this.#emit(this.#event(entry, \"edit\"));\n }\n cancelGesture(): void {\n const gesture = this.#gesture;\n if (!gesture) return;\n this.#gesture = null;\n this.#publish({ document: gesture.before, path: gesture.path });\n this.#options.onPreview?.(null);\n }\n setMode(mode: EditorSnapshot[\"mode\"]): void {\n this.cancelGesture();\n this.#publish({ mode, selection: emptySelection() });\n }\n select(selection: Partial<Selection>): void {\n const next = shareUnchanged(this.#snapshot.selection, { ...emptySelection(), port: undefined, ...selection });\n if (next !== this.#snapshot.selection) this.#publish({ selection: next });\n }\n enter(nodeId: string): void {\n if (!this.graph.nodes.find((node) => node.id === nodeId)?.graph) return;\n this.commitGesture();\n this.#publish({\n path: [...this.#snapshot.path, nodeId],\n selection: emptySelection(),\n });\n }\n navigate(path: readonly string[]): void {\n this.commitGesture();\n this.#publish({ path, selection: emptySelection() });\n }\n exit(): void {\n this.navigate(this.#snapshot.path.slice(0, -1));\n }\n undo(): void {\n if (!this.editing) return;\n this.cancelGesture();\n const entry = this.#past.pop();\n if (!entry) return;\n this.#future.push(entry);\n this.#publish({\n document: entry.before,\n path: entry.path,\n selection: emptySelection(),\n });\n this.#emit(this.#event(entry, \"undo\"));\n }\n redo(): void {\n if (!this.editing) return;\n this.cancelGesture();\n const entry = this.#future.pop();\n if (!entry) return;\n this.#past.push(entry);\n this.#publish({\n document: entry.after,\n path: entry.path,\n selection: emptySelection(),\n });\n this.#emit(this.#event(entry, \"redo\"));\n }\n replace(document: GraphDocument): void {\n if (!this.editing) return;\n assertDocument(document);\n this.cancelGesture();\n this.#past = [];\n this.#future = [];\n this.#publish({\n document: clone(document),\n path: [],\n selection: emptySelection(),\n });\n this.#emit({\n label: \"Load graph\",\n kinds: [\"structure\", \"values\", \"layout\", \"metadata\"],\n path: [],\n document: this.#snapshot.document,\n origin: \"replace\",\n });\n }\n addNode(kind: string, position: Point): string | undefined {\n if (!this.editing) return;\n const node = this.nodes.create(kind, position);\n this.edit(\"Add node\", \"structure\", (graph) => {\n graph.nodes.push(node);\n });\n this.select({ nodeIds: [node.id] });\n return node.id;\n }\n updateNode(\n id: string,\n update: Partial<Omit<GraphNode, \"id\" | \"graph\">>,\n kind: ChangeKind = \"metadata\",\n ): void {\n this.edit(\"Edit node\", kind, (graph) => {\n const node = graph.nodes.find((node) => node.id === id);\n if (!node) return;\n Object.assign(node, clone(update));\n if (kind === \"structure\") pruneInvalidPorts(graph, this.nodes, id);\n });\n }\n changeNodeKind(id: string, kind: string, data: NodeData = {}): void {\n if (!this.editing) return;\n const previous = this.graph.nodes.find(node => node.id === id);\n if (!previous || previous.kind === kind) return;\n const replacement = this.nodes.create(kind, previous.position, id);\n Object.assign(replacement.data, clone(data));\n const oldPorts = portsFor(previous, this.nodes);\n const newPorts = portsFor(replacement, this.nodes);\n if (previous.enabled !== undefined) replacement.enabled = previous.enabled;\n if (previous.compact !== undefined) replacement.compact = previous.compact;\n if (previous.compactLabel !== undefined) replacement.compactLabel = previous.compactLabel;\n if (previous.scale !== undefined) replacement.scale = previous.scale;\n if (!replacement.size && previous.size) replacement.size = { ...previous.size };\n for (const port of portsFor(replacement, this.nodes))\n if (port.direction === 'input' && previous.values[port.id] !== undefined)\n replacement.values[port.id] = port.integer\n ? Math.round(Math.max(port.min ?? -Infinity, Math.min(port.max ?? Infinity, previous.values[port.id]!)))\n : Math.max(port.min ?? -Infinity, Math.min(port.max ?? Infinity, previous.values[port.id]!));\n this.edit('Change node type', 'structure', graph => {\n graph.nodes = graph.nodes.map(node => node.id === id ? replacement : node);\n for (const link of graph.links) {\n for (const direction of ['input', 'output'] as const) {\n const endpoint = direction === 'output' ? link.source : link.target.type === 'port' ? link.target : undefined;\n if (!endpoint || endpoint.nodeId !== id) continue;\n const before = oldPorts.filter(port => port.direction === direction);\n const after = newPorts.filter(port => port.direction === direction);\n const next = after[Math.max(0, before.findIndex(port => port.id === endpoint.portId))];\n endpoint.portId = next?.id ?? '__spagbol_removed_port__';\n }\n }\n pruneInvalidPorts(graph, this.nodes, id);\n });\n }\n /** Scale selected nodes around their shared visual center in one undo entry. */\n scaleSelection(factor: number, measuredSizes: ReadonlyMap<string, Size> = new Map()): void {\n if (!this.editing || !Number.isFinite(factor) || factor <= 0 || factor === 1) return;\n const selected = this.graph.nodes.filter(node => this.getSnapshot().selection.nodeIds.includes(node.id));\n if (!selected.length) return;\n const bounds = selected.map(node => ({ node, size: measuredSizes.get(node.id) ?? {\n width: (node.size?.width ?? 180) * (node.scale ?? 1),\n height: (node.size?.height ?? 100) * (node.scale ?? 1),\n } }));\n const center = {\n x: (Math.min(...bounds.map(({node}) => node.position.x)) + Math.max(...bounds.map(({node, size}) => node.position.x + size.width))) / 2,\n y: (Math.min(...bounds.map(({node}) => node.position.y)) + Math.max(...bounds.map(({node, size}) => node.position.y + size.height))) / 2,\n };\n const ids = new Set(selected.map(node => node.id));\n this.edit('Scale selection', 'layout', graph => {\n for (const node of graph.nodes) if (ids.has(node.id)) {\n node.position = { x: center.x + (node.position.x - center.x) * factor, y: center.y + (node.position.y - center.y) * factor };\n node.scale = (node.scale ?? 1) * factor;\n }\n });\n }\n setValue(id: string, portId: string, value: number): void {\n this.setValues(id, { [portId]: value });\n }\n /** Several control values are one edit, with no intermediate document states. */\n setValues(id: string, values: Readonly<Record<string, number>>): void {\n const current = this.graph.nodes.find(node => node.id === id);\n if (!current) return;\n const ports = portsFor(current, this.nodes);\n const changes: Record<string, number> = {};\n for (const [portId, value] of Object.entries(values)) {\n if (!Number.isFinite(value)) continue;\n const port = ports.find(port => port.id === portId);\n const bounded = Math.min(port?.max ?? Infinity, Math.max(port?.min ?? -Infinity, value));\n const next = port?.integer ? Math.round(bounded) : bounded;\n if (current.values[portId] !== next) changes[portId] = next;\n }\n if (!Object.keys(changes).length) return;\n this.edit('Change values', 'values', graph => {\n const node = graph.nodes.find(node => node.id === id)!;\n Object.assign(node.values, changes);\n if (node.kind === spagbolGroupKinds.inputs) for (const port of node.ports ?? [])\n if (changes[port.id] !== undefined) port.defaultValue = changes[port.id];\n });\n }\n setOverride(\n groupId: string,\n nodeId: string | readonly string[],\n portId: string,\n value: number,\n ): void {\n const key = groupControlKey(nodeId);\n if (!Number.isFinite(value)) return;\n this.edit(\"Change instance control\", \"values\", (graph) => {\n const group = graph.nodes.find((node) => node.id === groupId);\n const node = group && findGroupControl(group, nodeId);\n if (!group || !node) return;\n const port = portsFor(node, this.nodes).find(\n (port) => port.id === portId,\n );\n const bounded = Math.max(\n port?.min ?? -Infinity,\n Math.min(port?.max ?? Infinity, value),\n );\n group.overrides ??= {};\n group.overrides[key] ??= {};\n group.overrides[key]![portId] = port?.integer\n ? Math.round(bounded)\n : bounded;\n });\n }\n resetOverride(groupId: string, nodeId: string | readonly string[]): void {\n const key = groupControlKey(nodeId);\n this.edit(\"Reset instance control\", \"values\", (graph) => {\n const group = graph.nodes.find((node) => node.id === groupId);\n if (group?.overrides) delete group.overrides[key];\n if (group?.dataOverrides) delete group.dataOverrides[key];\n });\n }\n addBoundaryPort(nodeId: string, label: string, defaultValue = 0): void {\n this.edit('Add group port', 'structure', graph => {\n const node = graph.nodes.find(item => item.id === nodeId);\n if (node) createEditablePort(node, this.nodes, label, defaultValue);\n });\n }\n renameBoundaryPort(nodeId: string, portId: string, label: string): void {\n const normalized = normalizeGroupPortLabel(label);\n this.edit('Rename group port', 'structure', graph => {\n const node = graph.nodes.find(item => item.id === nodeId);\n if (!node || !isGroupBoundary(node)) return;\n if (node.ports?.some(port => port.id !== portId && port.label === normalized)) throw new Error('That port name already exists.');\n const port = node.ports?.find(item => item.id === portId);\n if (port) port.label = normalized;\n });\n }\n removeBoundaryPort(nodeId: string, portId: string): void {\n this.edit('Remove group port', 'structure', graph => {\n const node = graph.nodes.find(item => item.id === nodeId);\n if (!node || !isGroupBoundary(node)) return;\n node.ports = node.ports?.filter(port => port.id !== portId);\n delete node.values[portId];\n pruneInvalidPorts(graph, this.nodes, nodeId);\n });\n }\n moveBoundaryPort(nodeId: string, portId: string, index: number): void {\n this.edit('Reorder group port', 'structure', graph => {\n const node = graph.nodes.find(item => item.id === nodeId);\n if (!node || !isGroupBoundary(node) || !node.ports) return;\n const previous = node.ports.findIndex(port => port.id === portId);\n if (previous < 0) return;\n const [port] = node.ports.splice(previous, 1);\n node.ports.splice(Math.max(0, Math.min(node.ports.length, index)), 0, port!);\n });\n }\n exposeSelection(exposed = true): void {\n this.edit('Expose group controls', 'metadata', graph => {\n const current = Array.isArray(graph.data?.exposedNodeIds) ? graph.data!.exposedNodeIds.filter((id): id is string => typeof id === 'string') : [];\n const ids = new Set(current);\n for (const id of this.#snapshot.selection.nodeIds) {\n const node = graph.nodes.find(item => item.id === id);\n if (!node || isGroupBoundary(node)) continue;\n if (exposed) ids.add(id); else ids.delete(id);\n }\n graph.data ??= {};\n graph.data.exposedNodeIds = [...ids];\n });\n }\n setDataOverride(groupId: string, nodeId: string | readonly string[], update: Partial<NodeData>): void {\n const key = groupControlKey(nodeId);\n this.edit('Change instance control', 'values', graph => {\n const group = graph.nodes.find(node => node.id === groupId);\n if (!group || !findGroupControl(group, nodeId)) return;\n group.dataOverrides ??= {};\n group.dataOverrides[key] = { ...group.dataOverrides[key], ...update } as NodeData;\n });\n }\n canConnect(\n source: GraphLink[\"source\"],\n target: LinkTarget,\n mode: string,\n replacingId?: string,\n ): string | undefined {\n const graph = source.portId === spagbolNewPortId || (target.type === 'port' && target.portId === spagbolNewPortId) ? clone(this.graph) : this.graph;\n const prepared = graph === this.graph ? { source, target } : resolveNewBoundaryPorts(graph, source, target, this.nodes);\n return connectionError(\n graph,\n this.nodes,\n this.modes,\n this.policy,\n prepared.source,\n prepared.target,\n mode,\n replacingId,\n );\n }\n connect(\n source: GraphLink[\"source\"],\n target: LinkTarget,\n mode = \"set\",\n settings: Partial<Pick<GraphLink, \"weight\" | \"enabled\" | \"data\">> = {},\n ): string | undefined {\n if (!this.editing) return;\n const error = this.canConnect(source, target, mode);\n if (error) throw new Error(error);\n const id = createId(\"link\");\n this.edit(\"Connect ports\", \"structure\", (graph) => {\n const prepared = resolveNewBoundaryPorts(graph, source, target, this.nodes);\n graph.links.push({\n id,\n source: prepared.source,\n target: prepared.target,\n mode,\n weight: 1,\n ...settings,\n });\n });\n this.select({ linkIds: [id] });\n return id;\n }\n reconnect(\n id: string,\n source: GraphLink[\"source\"],\n target: LinkTarget,\n duplicate = false,\n ): string | undefined {\n if (!this.editing) return;\n const original = this.graph.links.find((link) => link.id === id);\n if (!original) return;\n const error = this.canConnect(\n source,\n target,\n original.mode,\n duplicate ? undefined : id,\n );\n if (error) throw new Error(error);\n const newId = duplicate ? createId(\"link\") : id;\n this.edit(\n duplicate ? \"Duplicate connection\" : \"Reconnect link\",\n \"structure\",\n (graph) => {\n const prepared = resolveNewBoundaryPorts(graph, source, target, this.nodes);\n const next = {\n ...clone(original),\n id: newId,\n source: prepared.source,\n target: prepared.target,\n };\n if (duplicate) graph.links.push(next);\n else\n graph.links = graph.links.map((link) =>\n link.id === id ? next : link,\n );\n },\n );\n this.select({ linkIds: [newId] });\n return newId;\n }\n updateLink(\n id: string,\n update: Partial<Pick<GraphLink, \"mode\" | \"weight\" | \"enabled\" | \"data\">>,\n ): void {\n if (\n update.mode &&\n (!this.modes.get(update.mode) ||\n (this.policy.modes && !this.policy.modes.includes(update.mode)))\n )\n throw new Error(\"Unavailable link mode.\");\n if (update.weight !== undefined && !Number.isFinite(update.weight)) return;\n this.edit(\"Edit link\", \"values\", (graph) => {\n const link = graph.links.find((link) => link.id === id);\n if (link) Object.assign(link, clone(update));\n });\n }\n deleteSelection(bridge = false): void {\n const port = this.#snapshot.selection.port;\n if (port && this.graph.nodes.some(node => node.id === port.nodeId && isGroupBoundary(node))) {\n this.removeBoundaryPort(port.nodeId, port.portId);\n this.select({ nodeIds: [port.nodeId] });\n return;\n }\n if (port && this.policy.deletePort) {\n this.edit('Delete port', 'structure', graph => {\n const node = graph.nodes.find(node => node.id === port.nodeId);\n const definition = node && portsFor(node, this.nodes).find(item => item.id === port.portId && item.direction === port.direction);\n if (node && definition) { this.policy.deletePort!(node, definition); pruneInvalidPorts(graph, this.nodes, node.id); }\n });\n this.select({ nodeIds: [port.nodeId] });\n return;\n }\n const selection = this.#snapshot.selection;\n this.edit(bridge ? 'Delete and bridge' : 'Delete selection', 'structure', (graph) => {\n const selected = new Set(selection.nodeIds);\n const bridges = bridge ? graph.nodes.flatMap(node => {\n if (!selected.has(node.id)) return [];\n const incoming = graph.links.filter(link => link.target.type === 'port' && link.target.nodeId === node.id && !selected.has(link.source.nodeId));\n const outgoing = graph.links.filter(link => link.source.nodeId === node.id && link.target.type === 'port' && !selected.has(link.target.nodeId));\n return incoming.flatMap(input => outgoing.map(output => ({ id: createId('link'), source: { ...input.source }, target: { ...output.target }, mode: output.mode, weight: output.weight, enabled: input.enabled !== false && output.enabled !== false })));\n }) : [];\n const owned = graph.areas.filter(area => selection.areaIds.includes(area.id) && area.ownerNodeId).map(area => area.ownerNodeId!);\n removeNodes(graph, [...selection.nodeIds, ...owned]);\n for (const link of bridges) if (!connectionError(graph, this.nodes, this.modes, this.policy, link.source, link.target, link.mode)) graph.links.push(link);\n removeLinks(graph, selection.linkIds);\n graph.areas = graph.areas.filter(\n (area) => !selection.areaIds.includes(area.id),\n );\n for (const area of graph.areas)\n if (area.areaIds)\n area.areaIds = area.areaIds.filter(\n (id) => !selection.areaIds.includes(id),\n );\n });\n this.select({});\n }\n copy(): GraphFragment {\n this.#clipboard = copyFragment(\n this.graph,\n this.#snapshot.selection.nodeIds,\n this.#snapshot.selection.areaIds,\n );\n return clone(this.#clipboard);\n }\n paste(\n fragment = this.#clipboard,\n offset: Point = { x: 36, y: 36 },\n external = false,\n ): void {\n if (!fragment || !this.editing) return;\n let selection: Partial<Selection> = {};\n this.edit(\"Paste graph\", \"structure\", (graph) => {\n selection = pasteFragment(graph, fragment, this.nodes, offset, external);\n });\n this.select(selection);\n this.#options.onPaste?.({ fragment: clone(fragment), nodeIds: selection.nodeIds ?? [], areaIds: selection.areaIds ?? [], path: [...this.#snapshot.path], document: this.#snapshot.document });\n }\n duplicate(offset: Point = { x: 36, y: 36 }, external = false): void {\n this.paste(\n copyFragment(\n this.graph,\n this.#snapshot.selection.nodeIds,\n this.#snapshot.selection.areaIds,\n ),\n offset,\n external,\n );\n }\n groupSelection(options?: GroupOptions): string | undefined {\n if (!this.editing) return;\n let id: string | undefined;\n this.edit(\"Group selection\", \"structure\", (graph) => {\n id = groupNodes(\n graph,\n this.#snapshot.selection.nodeIds.filter(id => !isGroupBoundary(graph.nodes.find(node => node.id === id)!)),\n this.nodes,\n options,\n );\n });\n if (id) this.select({ nodeIds: [id] });\n return id;\n }\n insertNode(\n linkId: string,\n kind: string,\n position: Point,\n inputId: string,\n outputId: string,\n ): string | undefined {\n if (!this.editing) return;\n const old = this.graph.links.find((link) => link.id === linkId);\n if (!old) return;\n const node = this.nodes.create(kind, position);\n const ports = portsFor(node, this.nodes);\n if (\n !ports.some(\n (port) => port.id === inputId && port.direction === \"input\",\n ) ||\n !ports.some((port) => port.id === outputId && port.direction === \"output\")\n )\n throw new Error(\"Insertion requires an explicit input and output.\");\n const candidate = clone(this.graph);\n candidate.nodes.push(node);\n const source = { nodeId: node.id, portId: outputId };\n const input = { type: \"port\" as const, nodeId: node.id, portId: inputId };\n const error =\n connectionError(\n candidate,\n this.nodes,\n this.modes,\n this.policy,\n old.source,\n input,\n \"set\",\n ) ??\n connectionError(\n candidate,\n this.nodes,\n this.modes,\n this.policy,\n source,\n old.target,\n old.mode,\n old.id,\n );\n if (error) throw new Error(error);\n this.edit(\"Insert node\", \"structure\", (graph) => {\n graph.nodes.push(node);\n graph.links = graph.links.map((link) =>\n link.id === linkId ? { ...link, source } : link,\n );\n graph.links.push({\n id: createId(\"link\"),\n source: { ...old.source },\n target: input,\n mode: \"set\",\n weight: 1,\n });\n });\n this.select({ nodeIds: [node.id] });\n return node.id;\n }\n convertNodeToArea(nodeId: string): string | undefined {\n if (!this.editing || !this.graph.nodes.some(node => node.id === nodeId)) return;\n const id = createId('area');\n this.edit('Convert node to Container', 'structure', graph => {\n const node = graph.nodes.find(node => node.id === nodeId)!;\n graph.areas.push({ id, title: node.label ?? 'Container', position: { ...node.position }, size: node.size ?? { width: 420, height: 280 } });\n removeNodes(graph, [nodeId]);\n });\n this.select({ areaIds: [id] });\n return id;\n }\n addArea(\n position: Point,\n size: Size = { width: 420, height: 280 },\n ): string | undefined {\n if (!this.editing) return;\n const id = createId(\"area\");\n this.edit(\"Add Container\", \"layout\", (graph) => {\n graph.areas.push({\n id,\n title: \"Container\",\n position: { ...position },\n size: { ...size },\n });\n });\n this.select({ areaIds: [id] });\n return id;\n }\n updateArea(id: string, update: Partial<Omit<GraphArea, \"id\">>): void {\n this.edit(\"Edit area\", \"layout\", (graph) => {\n const area = graph.areas.find((area) => area.id === id);\n if (area) Object.assign(area, clone(update));\n });\n }\n lockArea(id: string, locked: boolean): void {\n this.edit(\"Lock area membership\", \"layout\", (graph) => {\n const area = graph.areas.find((area) => area.id === id);\n if (!area) return;\n const members = areaMembers(graph, id);\n area.locked = locked;\n if (locked) {\n area.nodeIds = [...members.nodeIds];\n area.areaIds = [...members.areaIds];\n } else {\n delete area.nodeIds;\n delete area.areaIds;\n }\n });\n }\n moveArea(id: string, position: Point): void {\n this.edit(\"Move area\", \"layout\", (graph) => {\n const area = graph.areas.find((area) => area.id === id);\n if (!area) return;\n const members = areaMembers(graph, id);\n const delta = {\n x: position.x - area.position.x,\n y: position.y - area.position.y,\n };\n area.position = { ...position };\n for (const node of graph.nodes)\n if (members.nodeIds.has(node.id)) {\n node.position.x += delta.x;\n node.position.y += delta.y;\n }\n for (const child of graph.areas)\n if (members.areaIds.has(child.id)) {\n child.position.x += delta.x;\n child.position.y += delta.y;\n }\n });\n }\n}\n"]}
|
package/dist/core/model.d.ts
CHANGED
|
@@ -68,9 +68,10 @@ export interface GraphLink {
|
|
|
68
68
|
enabled?: boolean;
|
|
69
69
|
data?: NodeData;
|
|
70
70
|
}
|
|
71
|
+
/** Shared area structure: plain visual Containers or application-owned execution areas. */
|
|
71
72
|
export interface GraphArea {
|
|
72
73
|
id: string;
|
|
73
|
-
/**
|
|
74
|
+
/** Optional owner supplies execution-area behaviour; no owner means a visual Container. */
|
|
74
75
|
ownerNodeId?: string;
|
|
75
76
|
title: string;
|
|
76
77
|
position: Point;
|
package/dist/core/model.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/core/model.ts"],"names":[],"mappings":"AAAA,wFAAwF;AACxF,MAAM,MAAM,SAAS,GACjB,IAAI,GACJ,OAAO,GACP,MAAM,GACN,MAAM,GACN,SAAS,EAAE,GACX;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AACjC,MAAM,MAAM,QAAQ,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AACpD,MAAM,WAAW,KAAK;IACpB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AACD,MAAM,WAAW,IAAI;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AACD,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,OAAO,GAAG,QAAQ,CAAC;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AACD,MAAM,WAAW,SAAS,CAAC,CAAC,SAAS,QAAQ,GAAG,QAAQ;IACtD,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,KAAK,CAAC;IAChB,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,CAAC,CAAC;IACR,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,8EAA8E;IAC9E,KAAK,CAAC,EAAE,cAAc,EAAE,CAAC;IACzB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,8EAA8E;IAC9E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kFAAkF;IAClF,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACnD,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;CAC1C;AACD,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AACD,MAAM,MAAM,UAAU,GAClB,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,YAAY,CAAC,GACjC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AACvD,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,EAAE,UAAU,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,QAAQ,CAAC;CACjB;AACD,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,
|
|
1
|
+
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/core/model.ts"],"names":[],"mappings":"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"}
|
package/dist/core/model.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model.js","sourceRoot":"","sources":["../../src/core/model.ts"],"names":[],"mappings":"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","sourcesContent":["/** Saved data is JSON only. Functions, observers and UI state never enter documents. */\nexport type JsonValue =\n | null\n | boolean\n | number\n | string\n | JsonValue[]\n | { [key: string]: JsonValue };\nexport type NodeData = { [key: string]: JsonValue };\nexport interface Point {\n x: number;\n y: number;\n}\nexport interface Size {\n width: number;\n height: number;\n}\nexport interface PortDefinition {\n id: string;\n label: string;\n direction: \"input\" | \"output\";\n dataType?: string;\n connectable?: boolean;\n valueEditor?: boolean;\n defaultValue?: number;\n min?: number;\n max?: number;\n step?: number;\n integer?: boolean;\n}\nexport interface GraphNode<D extends NodeData = NodeData> {\n id: string;\n kind: string;\n label?: string;\n position: Point;\n size?: Size;\n compact?: boolean;\n compactLabel?: string;\n scale?: number;\n enabled?: boolean;\n data: D;\n values: Record<string, number>;\n /** Explicit/dynamic instance ports; a definition may derive ports instead. */\n ports?: PortDefinition[];\n graph?: GraphDocument;\n /** Equal IDs opt into shared nested structure; instance values stay local. */\n sharedGraphId?: string;\n /** Explicit nested nodes to show on this parent. No title conventions in core. */\n panelNodeIds?: string[];\n overrides?: Record<string, Record<string, number>>;\n dataOverrides?: Record<string, NodeData>;\n}\nexport interface PortEndpoint {\n nodeId: string;\n portId: string;\n}\nexport type LinkTarget =\n | ({ type: \"port\" } & PortEndpoint)\n | { type: \"link\"; linkId: string; property: string };\nexport interface GraphLink {\n id: string;\n source: PortEndpoint;\n target: LinkTarget;\n mode: string;\n weight: number;\n enabled?: boolean;\n data?: NodeData;\n}\nexport interface GraphArea {\n id: string;\n /** A domain node whose UI/layout is owned by this area. */\n ownerNodeId?: string;\n title: string;\n position: Point;\n size: Size;\n collapsed?: boolean;\n locked?: boolean;\n nodeIds?: string[];\n areaIds?: string[];\n /** The top portion remains operable while the rest is collapsed. */\n controlHeight?: number;\n data?: NodeData;\n}\nexport interface GraphDocument {\n format: \"spagbol\";\n version: 1;\n nodes: GraphNode[];\n links: GraphLink[];\n areas: GraphArea[];\n data?: NodeData;\n}\nexport interface Selection {\n port?: { nodeId: string; portId: string; direction: \"input\" | \"output\" };\n nodeIds: string[];\n linkIds: string[];\n areaIds: string[];\n}\nexport interface Diagnostic {\n severity: \"info\" | \"warning\" | \"error\";\n code: string;\n message: string;\n path: readonly string[];\n nodeId?: string;\n linkId?: string;\n portId?: string;\n}\nexport interface LinkModeDefinition {\n id: string;\n label: string;\n color: string;\n shortcut?: string;\n description: string;\n}\nexport interface NodeDefinition<D extends NodeData = NodeData> {\n kind: string;\n label: string;\n category?: string;\n description?: string;\n keywords?: string[];\n createData(): D;\n createGraph?(): GraphDocument;\n editablePorts?: \"input\" | \"output\";\n newPortLabel?: string;\n createPort?(node: GraphNode<D>, label: string): PortDefinition;\n ports(node: GraphNode<D>): readonly PortDefinition[];\n defaultSize?: Size;\n validate?(node: GraphNode<D>): readonly string[];\n /** App code can remap asset or domain references when duplicating. */\n cloneData?(data: D, ids: ReadonlyMap<string, string>): D;\n}\nexport interface GraphPolicy {\n /** All registered modes are allowed unless the consumer supplies a subset. */\n modes?: readonly string[];\n linkProperties?: readonly string[];\n allowSelfLinks?: boolean;\n allowDuplicateLinks?: boolean;\n /** Host metadata update when deleting a selected editable domain port. */\n deletePort?(node: GraphNode, port: PortDefinition): void;\n canConnect?(\n source: PortEndpoint,\n target: LinkTarget,\n graph: GraphDocument,\n ): string | undefined;\n}\nexport interface ChangeEvent {\n label: string;\n kinds: readonly ChangeKind[];\n document: GraphDocument;\n path: readonly string[];\n origin: \"edit\" | \"undo\" | \"redo\" | \"replace\";\n}\nexport type ChangeKind = \"structure\" | \"values\" | \"layout\" | \"metadata\";\nexport function emptyGraph(): GraphDocument {\n return { format: \"spagbol\", version: 1, nodes: [], links: [], areas: [] };\n}\nexport function emptySelection(): Selection {\n return { nodeIds: [], linkIds: [], areaIds: [] };\n}\nexport function clone<T>(value: T): T {\n return JSON.parse(JSON.stringify(value)) as T;\n}\nexport function createId(prefix = \"item\"): string {\n return `${prefix}-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;\n}\nexport function graphAt(\n document: GraphDocument,\n path: readonly string[],\n): GraphDocument {\n let graph = document;\n for (const id of path) {\n const nested = graph.nodes.find((node) => node.id === id)?.graph;\n if (!nested) throw new Error(`Nested graph ${id} does not exist.`);\n graph = nested;\n }\n return graph;\n}\nexport function validPath(\n document: GraphDocument,\n path: readonly string[],\n): string[] {\n const result: string[] = [];\n let graph = document;\n for (const id of path) {\n const nested = graph.nodes.find((node) => node.id === id)?.graph;\n if (!nested) break;\n result.push(id);\n graph = nested;\n }\n return result;\n}\nconst immutablePortCache = new WeakMap<GraphNode, WeakMap<NodeRegistry, readonly PortDefinition[]>>();\nexport function portsFor(\n node: GraphNode,\n definitions: NodeRegistry,\n): readonly PortDefinition[] {\n if (!Object.isFrozen(node)) return definitions.get(node.kind)?.ports(node) ?? node.ports ?? [];\n let registries = immutablePortCache.get(node);\n if (!registries) { registries = new WeakMap(); immutablePortCache.set(node, registries); }\n let ports = registries.get(definitions);\n if (!ports) { ports = definitions.get(node.kind)?.ports(node) ?? node.ports ?? []; registries.set(definitions, ports); }\n return ports;\n}\nexport const spagbolGroupKinds = { group: \"spagbol.group\", inputs: \"spagbol.group.inputs\", outputs: \"spagbol.group.outputs\" } as const;\nconst groupDefinitions: readonly NodeDefinition[] = [\n { kind: spagbolGroupKinds.group, label: 'Group', category: 'graph', createData: () => ({}), ports: node => node.ports ?? [], createGraph: () => ({ ...emptyGraph(), nodes: [\n { id: createId('node'), kind: spagbolGroupKinds.inputs, position: { x: 0, y: 0 }, data: {}, values: {}, ports: [] },\n { id: createId('node'), kind: spagbolGroupKinds.outputs, position: { x: 500, y: 0 }, data: {}, values: {}, ports: [] },\n ] }) },\n { kind: spagbolGroupKinds.inputs, label: 'Ins', category: 'graph', createData: () => ({}), ports: node => node.ports ?? [] },\n { kind: spagbolGroupKinds.outputs, label: 'Outs', category: 'graph', createData: () => ({}), ports: node => node.ports ?? [] },\n];\n\nexport class NodeRegistry {\n readonly #definitions = new Map<string, NodeDefinition>();\n constructor(definitions: readonly NodeDefinition[] = []) {\n for (const definition of [...groupDefinitions, ...definitions]) {\n if (this.#definitions.has(definition.kind))\n throw new Error(`Duplicate node kind ${definition.kind}.`);\n this.#definitions.set(definition.kind, definition);\n }\n }\n get(kind: string): NodeDefinition | undefined {\n return this.#definitions.get(kind);\n }\n list(): readonly NodeDefinition[] {\n return [...this.#definitions.values()];\n }\n create(kind: string, position: Point, id = createId(\"node\")): GraphNode {\n const definition = this.get(kind);\n if (!definition) throw new Error(`Unknown node kind ${kind}.`);\n const node: GraphNode = {\n id,\n kind,\n position: { ...position },\n data: definition.createData(),\n values: {},\n };\n if (definition.createGraph) {\n node.graph = definition.createGraph();\n node.sharedGraphId = createId('shared');\n node.ports = [];\n }\n if (definition.defaultSize) node.size = { ...definition.defaultSize };\n node.values = Object.fromEntries(\n definition\n .ports(node)\n .filter((port) => port.direction === \"input\")\n .map((port) => [port.id, port.defaultValue ?? 0]),\n );\n return node;\n }\n}\nexport function defineNode<D extends NodeData>(\n definition: NodeDefinition<D>,\n): NodeDefinition<D> {\n return definition;\n}\nexport const standardLinkModes: readonly LinkModeDefinition[] = Object.freeze([\n {\n id: \"set\",\n label: \"set\",\n color: \"#fff\",\n shortcut: \"s\",\n description:\n \"Average weighted set sources, replacing the local base value.\",\n },\n {\n id: \"add\",\n label: \"add\",\n color: \"#ffe45c\",\n shortcut: \"a\",\n description: \"Add weighted sources after set values or the local base.\",\n },\n {\n id: \"multiply\",\n label: \"multiply\",\n color: \"#8fdcff\",\n shortcut: \"m\",\n description: \"Multiply by each weighted source after addition.\",\n },\n {\n id: \"bend\",\n label: \"bend\",\n color: \"#c084fc\",\n shortcut: \"b\",\n description: \"Scale by 2^(source × weight) after multiplication.\",\n },\n]);\nexport class LinkModeRegistry {\n readonly #definitions = new Map<string, LinkModeDefinition>();\n constructor(definitions: readonly LinkModeDefinition[] = standardLinkModes) {\n for (const definition of definitions) {\n if (this.#definitions.has(definition.id))\n throw new Error(`Duplicate link mode ${definition.id}.`);\n this.#definitions.set(definition.id, Object.freeze({ ...definition }));\n }\n }\n get(id: string): LinkModeDefinition | undefined {\n return this.#definitions.get(id);\n }\n list(): readonly LinkModeDefinition[] {\n return [...this.#definitions.values()];\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"model.js","sourceRoot":"","sources":["../../src/core/model.ts"],"names":[],"mappings":"AAyJA,MAAM,UAAU,UAAU;IACxB,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;AAC5E,CAAC;AACD,MAAM,UAAU,cAAc;IAC5B,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;AACnD,CAAC;AACD,MAAM,UAAU,KAAK,CAAI,KAAQ;IAC/B,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAM,CAAC;AAChD,CAAC;AACD,MAAM,UAAU,QAAQ,CAAC,MAAM,GAAG,MAAM;IACtC,OAAO,GAAG,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;AAC3F,CAAC;AACD,MAAM,UAAU,OAAO,CACrB,QAAuB,EACvB,IAAuB;IAEvB,IAAI,KAAK,GAAG,QAAQ,CAAC;IACrB,KAAK,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC;QACtB,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC;QACjE,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,EAAE,kBAAkB,CAAC,CAAC;QACnE,KAAK,GAAG,MAAM,CAAC;IACjB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AACD,MAAM,UAAU,SAAS,CACvB,QAAuB,EACvB,IAAuB;IAEvB,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,KAAK,GAAG,QAAQ,CAAC;IACrB,KAAK,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC;QACtB,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC;QACjE,IAAI,CAAC,MAAM;YAAE,MAAM;QACnB,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChB,KAAK,GAAG,MAAM,CAAC;IACjB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AACD,MAAM,kBAAkB,GAAG,IAAI,OAAO,EAA+D,CAAC;AACtG,MAAM,UAAU,QAAQ,CACtB,IAAe,EACf,WAAyB;IAEzB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;IAC/F,IAAI,UAAU,GAAG,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9C,IAAI,CAAC,UAAU,EAAE,CAAC;QAAC,UAAU,GAAG,IAAI,OAAO,EAAE,CAAC;QAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAAC,CAAC;IAC1F,IAAI,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACxC,IAAI,CAAC,KAAK,EAAE,CAAC;QAAC,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;QAAC,UAAU,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IAAC,CAAC;IACxH,OAAO,KAAK,CAAC;AACf,CAAC;AACD,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,sBAAsB,EAAE,OAAO,EAAE,uBAAuB,EAAW,CAAC;AACvI,MAAM,gBAAgB,GAA8B;IAClD,EAAE,IAAI,EAAE,iBAAiB,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,UAAU,EAAE,EAAE,KAAK,EAAE;gBACzK,EAAE,EAAE,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,iBAAiB,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;gBACnH,EAAE,EAAE,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,iBAAiB,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;aACvH,EAAE,CAAC,EAAE;IACN,EAAE,IAAI,EAAE,iBAAiB,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,EAAE;IAC5H,EAAE,IAAI,EAAE,iBAAiB,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,EAAE;CAC/H,CAAC;AAEF,MAAM,OAAO,YAAY;IACd,YAAY,GAAG,IAAI,GAAG,EAA0B,CAAC;IAC1D,YAAY,cAAyC,EAAE;QACrD,KAAK,MAAM,UAAU,IAAI,CAAC,GAAG,gBAAgB,EAAE,GAAG,WAAW,CAAC,EAAE,CAAC;YAC/D,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;gBACxC,MAAM,IAAI,KAAK,CAAC,uBAAuB,UAAU,CAAC,IAAI,GAAG,CAAC,CAAC;YAC7D,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IACD,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC;IACD,IAAI;QACF,OAAO,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC;IACzC,CAAC;IACD,MAAM,CAAC,IAAY,EAAE,QAAe,EAAE,EAAE,GAAG,QAAQ,CAAC,MAAM,CAAC;QACzD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,UAAU;YAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,IAAI,GAAG,CAAC,CAAC;QAC/D,MAAM,IAAI,GAAc;YACtB,EAAE;YACF,IAAI;YACJ,QAAQ,EAAE,EAAE,GAAG,QAAQ,EAAE;YACzB,IAAI,EAAE,UAAU,CAAC,UAAU,EAAE;YAC7B,MAAM,EAAE,EAAE;SACX,CAAC;QACF,IAAI,UAAU,CAAC,WAAW,EAAE,CAAC;YAC3B,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC;YACtC,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACxC,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;QAClB,CAAC;QACD,IAAI,UAAU,CAAC,WAAW;YAAE,IAAI,CAAC,IAAI,GAAG,EAAE,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC;QACtE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,WAAW,CAC9B,UAAU;aACP,KAAK,CAAC,IAAI,CAAC;aACX,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,KAAK,OAAO,CAAC;aAC5C,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,YAAY,IAAI,CAAC,CAAC,CAAC,CACpD,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AACD,MAAM,UAAU,UAAU,CACxB,UAA6B;IAE7B,OAAO,UAAU,CAAC;AACpB,CAAC;AACD,MAAM,CAAC,MAAM,iBAAiB,GAAkC,MAAM,CAAC,MAAM,CAAC;IAC5E;QACE,EAAE,EAAE,KAAK;QACT,KAAK,EAAE,KAAK;QACZ,KAAK,EAAE,MAAM;QACb,QAAQ,EAAE,GAAG;QACb,WAAW,EACT,+DAA+D;KAClE;IACD;QACE,EAAE,EAAE,KAAK;QACT,KAAK,EAAE,KAAK;QACZ,KAAK,EAAE,SAAS;QAChB,QAAQ,EAAE,GAAG;QACb,WAAW,EAAE,0DAA0D;KACxE;IACD;QACE,EAAE,EAAE,UAAU;QACd,KAAK,EAAE,UAAU;QACjB,KAAK,EAAE,SAAS;QAChB,QAAQ,EAAE,GAAG;QACb,WAAW,EAAE,kDAAkD;KAChE;IACD;QACE,EAAE,EAAE,MAAM;QACV,KAAK,EAAE,MAAM;QACb,KAAK,EAAE,SAAS;QAChB,QAAQ,EAAE,GAAG;QACb,WAAW,EAAE,oDAAoD;KAClE;CACF,CAAC,CAAC;AACH,MAAM,OAAO,gBAAgB;IAClB,YAAY,GAAG,IAAI,GAAG,EAA8B,CAAC;IAC9D,YAAY,cAA6C,iBAAiB;QACxE,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;YACrC,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;gBACtC,MAAM,IAAI,KAAK,CAAC,uBAAuB,UAAU,CAAC,EAAE,GAAG,CAAC,CAAC;YAC3D,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,UAAU,EAAE,CAAC,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;IACD,GAAG,CAAC,EAAU;QACZ,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACnC,CAAC;IACD,IAAI;QACF,OAAO,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC;IACzC,CAAC;CACF","sourcesContent":["/** Saved data is JSON only. Functions, observers and UI state never enter documents. */\nexport type JsonValue =\n | null\n | boolean\n | number\n | string\n | JsonValue[]\n | { [key: string]: JsonValue };\nexport type NodeData = { [key: string]: JsonValue };\nexport interface Point {\n x: number;\n y: number;\n}\nexport interface Size {\n width: number;\n height: number;\n}\nexport interface PortDefinition {\n id: string;\n label: string;\n direction: \"input\" | \"output\";\n dataType?: string;\n connectable?: boolean;\n valueEditor?: boolean;\n defaultValue?: number;\n min?: number;\n max?: number;\n step?: number;\n integer?: boolean;\n}\nexport interface GraphNode<D extends NodeData = NodeData> {\n id: string;\n kind: string;\n label?: string;\n position: Point;\n size?: Size;\n compact?: boolean;\n compactLabel?: string;\n scale?: number;\n enabled?: boolean;\n data: D;\n values: Record<string, number>;\n /** Explicit/dynamic instance ports; a definition may derive ports instead. */\n ports?: PortDefinition[];\n graph?: GraphDocument;\n /** Equal IDs opt into shared nested structure; instance values stay local. */\n sharedGraphId?: string;\n /** Explicit nested nodes to show on this parent. No title conventions in core. */\n panelNodeIds?: string[];\n overrides?: Record<string, Record<string, number>>;\n dataOverrides?: Record<string, NodeData>;\n}\nexport interface PortEndpoint {\n nodeId: string;\n portId: string;\n}\nexport type LinkTarget =\n | ({ type: \"port\" } & PortEndpoint)\n | { type: \"link\"; linkId: string; property: string };\nexport interface GraphLink {\n id: string;\n source: PortEndpoint;\n target: LinkTarget;\n mode: string;\n weight: number;\n enabled?: boolean;\n data?: NodeData;\n}\n/** Shared area structure: plain visual Containers or application-owned execution areas. */\nexport interface GraphArea {\n id: string;\n /** Optional owner supplies execution-area behaviour; no owner means a visual Container. */\n ownerNodeId?: string;\n title: string;\n position: Point;\n size: Size;\n collapsed?: boolean;\n locked?: boolean;\n nodeIds?: string[];\n areaIds?: string[];\n /** The top portion remains operable while the rest is collapsed. */\n controlHeight?: number;\n data?: NodeData;\n}\nexport interface GraphDocument {\n format: \"spagbol\";\n version: 1;\n nodes: GraphNode[];\n links: GraphLink[];\n areas: GraphArea[];\n data?: NodeData;\n}\nexport interface Selection {\n port?: { nodeId: string; portId: string; direction: \"input\" | \"output\" };\n nodeIds: string[];\n linkIds: string[];\n areaIds: string[];\n}\nexport interface Diagnostic {\n severity: \"info\" | \"warning\" | \"error\";\n code: string;\n message: string;\n path: readonly string[];\n nodeId?: string;\n linkId?: string;\n portId?: string;\n}\nexport interface LinkModeDefinition {\n id: string;\n label: string;\n color: string;\n shortcut?: string;\n description: string;\n}\nexport interface NodeDefinition<D extends NodeData = NodeData> {\n kind: string;\n label: string;\n category?: string;\n description?: string;\n keywords?: string[];\n createData(): D;\n createGraph?(): GraphDocument;\n editablePorts?: \"input\" | \"output\";\n newPortLabel?: string;\n createPort?(node: GraphNode<D>, label: string): PortDefinition;\n ports(node: GraphNode<D>): readonly PortDefinition[];\n defaultSize?: Size;\n validate?(node: GraphNode<D>): readonly string[];\n /** App code can remap asset or domain references when duplicating. */\n cloneData?(data: D, ids: ReadonlyMap<string, string>): D;\n}\nexport interface GraphPolicy {\n /** All registered modes are allowed unless the consumer supplies a subset. */\n modes?: readonly string[];\n linkProperties?: readonly string[];\n allowSelfLinks?: boolean;\n allowDuplicateLinks?: boolean;\n /** Host metadata update when deleting a selected editable domain port. */\n deletePort?(node: GraphNode, port: PortDefinition): void;\n canConnect?(\n source: PortEndpoint,\n target: LinkTarget,\n graph: GraphDocument,\n ): string | undefined;\n}\nexport interface ChangeEvent {\n label: string;\n kinds: readonly ChangeKind[];\n document: GraphDocument;\n path: readonly string[];\n origin: \"edit\" | \"undo\" | \"redo\" | \"replace\";\n}\nexport type ChangeKind = \"structure\" | \"values\" | \"layout\" | \"metadata\";\nexport function emptyGraph(): GraphDocument {\n return { format: \"spagbol\", version: 1, nodes: [], links: [], areas: [] };\n}\nexport function emptySelection(): Selection {\n return { nodeIds: [], linkIds: [], areaIds: [] };\n}\nexport function clone<T>(value: T): T {\n return JSON.parse(JSON.stringify(value)) as T;\n}\nexport function createId(prefix = \"item\"): string {\n return `${prefix}-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;\n}\nexport function graphAt(\n document: GraphDocument,\n path: readonly string[],\n): GraphDocument {\n let graph = document;\n for (const id of path) {\n const nested = graph.nodes.find((node) => node.id === id)?.graph;\n if (!nested) throw new Error(`Nested graph ${id} does not exist.`);\n graph = nested;\n }\n return graph;\n}\nexport function validPath(\n document: GraphDocument,\n path: readonly string[],\n): string[] {\n const result: string[] = [];\n let graph = document;\n for (const id of path) {\n const nested = graph.nodes.find((node) => node.id === id)?.graph;\n if (!nested) break;\n result.push(id);\n graph = nested;\n }\n return result;\n}\nconst immutablePortCache = new WeakMap<GraphNode, WeakMap<NodeRegistry, readonly PortDefinition[]>>();\nexport function portsFor(\n node: GraphNode,\n definitions: NodeRegistry,\n): readonly PortDefinition[] {\n if (!Object.isFrozen(node)) return definitions.get(node.kind)?.ports(node) ?? node.ports ?? [];\n let registries = immutablePortCache.get(node);\n if (!registries) { registries = new WeakMap(); immutablePortCache.set(node, registries); }\n let ports = registries.get(definitions);\n if (!ports) { ports = definitions.get(node.kind)?.ports(node) ?? node.ports ?? []; registries.set(definitions, ports); }\n return ports;\n}\nexport const spagbolGroupKinds = { group: \"spagbol.group\", inputs: \"spagbol.group.inputs\", outputs: \"spagbol.group.outputs\" } as const;\nconst groupDefinitions: readonly NodeDefinition[] = [\n { kind: spagbolGroupKinds.group, label: 'Group', category: 'graph', createData: () => ({}), ports: node => node.ports ?? [], createGraph: () => ({ ...emptyGraph(), nodes: [\n { id: createId('node'), kind: spagbolGroupKinds.inputs, position: { x: 0, y: 0 }, data: {}, values: {}, ports: [] },\n { id: createId('node'), kind: spagbolGroupKinds.outputs, position: { x: 500, y: 0 }, data: {}, values: {}, ports: [] },\n ] }) },\n { kind: spagbolGroupKinds.inputs, label: 'Ins', category: 'graph', createData: () => ({}), ports: node => node.ports ?? [] },\n { kind: spagbolGroupKinds.outputs, label: 'Outs', category: 'graph', createData: () => ({}), ports: node => node.ports ?? [] },\n];\n\nexport class NodeRegistry {\n readonly #definitions = new Map<string, NodeDefinition>();\n constructor(definitions: readonly NodeDefinition[] = []) {\n for (const definition of [...groupDefinitions, ...definitions]) {\n if (this.#definitions.has(definition.kind))\n throw new Error(`Duplicate node kind ${definition.kind}.`);\n this.#definitions.set(definition.kind, definition);\n }\n }\n get(kind: string): NodeDefinition | undefined {\n return this.#definitions.get(kind);\n }\n list(): readonly NodeDefinition[] {\n return [...this.#definitions.values()];\n }\n create(kind: string, position: Point, id = createId(\"node\")): GraphNode {\n const definition = this.get(kind);\n if (!definition) throw new Error(`Unknown node kind ${kind}.`);\n const node: GraphNode = {\n id,\n kind,\n position: { ...position },\n data: definition.createData(),\n values: {},\n };\n if (definition.createGraph) {\n node.graph = definition.createGraph();\n node.sharedGraphId = createId('shared');\n node.ports = [];\n }\n if (definition.defaultSize) node.size = { ...definition.defaultSize };\n node.values = Object.fromEntries(\n definition\n .ports(node)\n .filter((port) => port.direction === \"input\")\n .map((port) => [port.id, port.defaultValue ?? 0]),\n );\n return node;\n }\n}\nexport function defineNode<D extends NodeData>(\n definition: NodeDefinition<D>,\n): NodeDefinition<D> {\n return definition;\n}\nexport const standardLinkModes: readonly LinkModeDefinition[] = Object.freeze([\n {\n id: \"set\",\n label: \"set\",\n color: \"#fff\",\n shortcut: \"s\",\n description:\n \"Average weighted set sources, replacing the local base value.\",\n },\n {\n id: \"add\",\n label: \"add\",\n color: \"#ffe45c\",\n shortcut: \"a\",\n description: \"Add weighted sources after set values or the local base.\",\n },\n {\n id: \"multiply\",\n label: \"multiply\",\n color: \"#8fdcff\",\n shortcut: \"m\",\n description: \"Multiply by each weighted source after addition.\",\n },\n {\n id: \"bend\",\n label: \"bend\",\n color: \"#c084fc\",\n shortcut: \"b\",\n description: \"Scale by 2^(source × weight) after multiplication.\",\n },\n]);\nexport class LinkModeRegistry {\n readonly #definitions = new Map<string, LinkModeDefinition>();\n constructor(definitions: readonly LinkModeDefinition[] = standardLinkModes) {\n for (const definition of definitions) {\n if (this.#definitions.has(definition.id))\n throw new Error(`Duplicate link mode ${definition.id}.`);\n this.#definitions.set(definition.id, Object.freeze({ ...definition }));\n }\n }\n get(id: string): LinkModeDefinition | undefined {\n return this.#definitions.get(id);\n }\n list(): readonly LinkModeDefinition[] {\n return [...this.#definitions.values()];\n }\n}\n"]}
|