@bian-womp/spark-workbench 0.3.88 → 0.3.89
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/lib/src/adapters/cli/index.d.ts +22 -0
- package/lib/src/adapters/cli/index.d.ts.map +1 -0
- package/lib/src/adapters/cli/index.js +50 -0
- package/lib/src/adapters/cli/index.js.map +1 -0
- package/lib/src/core/AbstractWorkbench.d.ts +40 -0
- package/lib/src/core/AbstractWorkbench.d.ts.map +1 -0
- package/lib/src/core/AbstractWorkbench.js +15 -0
- package/lib/src/core/AbstractWorkbench.js.map +1 -0
- package/lib/src/core/InMemoryWorkbench.d.ts +304 -0
- package/lib/src/core/InMemoryWorkbench.d.ts.map +1 -0
- package/lib/src/core/InMemoryWorkbench.js +1016 -0
- package/lib/src/core/InMemoryWorkbench.js.map +1 -0
- package/lib/src/core/contracts.d.ts +172 -0
- package/lib/src/core/contracts.d.ts.map +1 -0
- package/lib/src/core/contracts.js +2 -0
- package/lib/src/core/contracts.js.map +1 -0
- package/lib/src/core/ui-extensions.d.ts +85 -0
- package/lib/src/core/ui-extensions.d.ts.map +1 -0
- package/lib/src/core/ui-extensions.js +111 -0
- package/lib/src/core/ui-extensions.js.map +1 -0
- package/lib/src/examples/cli.d.ts +2 -0
- package/lib/src/examples/cli.d.ts.map +1 -0
- package/lib/src/examples/cli.js +244 -0
- package/lib/src/examples/cli.js.map +1 -0
- package/lib/src/examples/reactflow/App.d.ts +2 -0
- package/lib/src/examples/reactflow/App.d.ts.map +1 -0
- package/lib/src/examples/reactflow/App.js +20 -0
- package/lib/src/examples/reactflow/App.js.map +1 -0
- package/lib/src/index.d.ts +30 -0
- package/lib/src/index.d.ts.map +1 -0
- package/lib/src/index.js +30 -0
- package/lib/src/index.js.map +1 -0
- package/lib/src/misc/DebugEvents.d.ts +7 -0
- package/lib/src/misc/DebugEvents.d.ts.map +1 -0
- package/lib/src/misc/DebugEvents.js +51 -0
- package/lib/src/misc/DebugEvents.js.map +1 -0
- package/lib/src/misc/DefaultEdge.d.ts +5 -0
- package/lib/src/misc/DefaultEdge.d.ts.map +1 -0
- package/lib/src/misc/DefaultEdge.js +15 -0
- package/lib/src/misc/DefaultEdge.js.map +1 -0
- package/lib/src/misc/DefaultNode.d.ts +5 -0
- package/lib/src/misc/DefaultNode.d.ts.map +1 -0
- package/lib/src/misc/DefaultNode.js +25 -0
- package/lib/src/misc/DefaultNode.js.map +1 -0
- package/lib/src/misc/DefaultNodeContent.d.ts +4 -0
- package/lib/src/misc/DefaultNodeContent.d.ts.map +1 -0
- package/lib/src/misc/DefaultNodeContent.js +58 -0
- package/lib/src/misc/DefaultNodeContent.js.map +1 -0
- package/lib/src/misc/DefaultNodeHeader.d.ts +13 -0
- package/lib/src/misc/DefaultNodeHeader.d.ts.map +1 -0
- package/lib/src/misc/DefaultNodeHeader.js +78 -0
- package/lib/src/misc/DefaultNodeHeader.js.map +1 -0
- package/lib/src/misc/Inspector.d.ts +12 -0
- package/lib/src/misc/Inspector.d.ts.map +1 -0
- package/lib/src/misc/Inspector.js +253 -0
- package/lib/src/misc/Inspector.js.map +1 -0
- package/lib/src/misc/IssueBadge.d.ts +7 -0
- package/lib/src/misc/IssueBadge.d.ts.map +1 -0
- package/lib/src/misc/IssueBadge.js +7 -0
- package/lib/src/misc/IssueBadge.js.map +1 -0
- package/lib/src/misc/KeyboardShortcutToast.d.ts +16 -0
- package/lib/src/misc/KeyboardShortcutToast.d.ts.map +1 -0
- package/lib/src/misc/KeyboardShortcutToast.js +40 -0
- package/lib/src/misc/KeyboardShortcutToast.js.map +1 -0
- package/lib/src/misc/NodeHandles.d.ts +18 -0
- package/lib/src/misc/NodeHandles.d.ts.map +1 -0
- package/lib/src/misc/NodeHandles.js +67 -0
- package/lib/src/misc/NodeHandles.js.map +1 -0
- package/lib/src/misc/SelectionActiveSync.d.ts +10 -0
- package/lib/src/misc/SelectionActiveSync.d.ts.map +1 -0
- package/lib/src/misc/SelectionActiveSync.js +21 -0
- package/lib/src/misc/SelectionActiveSync.js.map +1 -0
- package/lib/src/misc/WorkbenchCanvas.d.ts +23 -0
- package/lib/src/misc/WorkbenchCanvas.d.ts.map +1 -0
- package/lib/src/misc/WorkbenchCanvas.js +669 -0
- package/lib/src/misc/WorkbenchCanvas.js.map +1 -0
- package/lib/src/misc/WorkbenchStudio.d.ts +43 -0
- package/lib/src/misc/WorkbenchStudio.d.ts.map +1 -0
- package/lib/src/misc/WorkbenchStudio.js +463 -0
- package/lib/src/misc/WorkbenchStudio.js.map +1 -0
- package/lib/src/misc/constants.d.ts +4 -0
- package/lib/src/misc/constants.d.ts.map +1 -0
- package/lib/src/misc/constants.js +5 -0
- package/lib/src/misc/constants.js.map +1 -0
- package/lib/src/misc/context/WorkbenchContext.d.ts +133 -0
- package/lib/src/misc/context/WorkbenchContext.d.ts.map +1 -0
- package/lib/src/misc/context/WorkbenchContext.js +9 -0
- package/lib/src/misc/context/WorkbenchContext.js.map +1 -0
- package/lib/src/misc/context/WorkbenchContext.provider.d.ts +12 -0
- package/lib/src/misc/context/WorkbenchContext.provider.d.ts.map +1 -0
- package/lib/src/misc/context/WorkbenchContext.provider.js +995 -0
- package/lib/src/misc/context/WorkbenchContext.provider.js.map +1 -0
- package/lib/src/misc/context-menu/ContextMenuButton.d.ts +8 -0
- package/lib/src/misc/context-menu/ContextMenuButton.d.ts.map +1 -0
- package/lib/src/misc/context-menu/ContextMenuButton.js +10 -0
- package/lib/src/misc/context-menu/ContextMenuButton.js.map +1 -0
- package/lib/src/misc/context-menu/ContextMenuHandlers.d.ts +85 -0
- package/lib/src/misc/context-menu/ContextMenuHandlers.d.ts.map +1 -0
- package/lib/src/misc/context-menu/ContextMenuHandlers.js +2 -0
- package/lib/src/misc/context-menu/ContextMenuHandlers.js.map +1 -0
- package/lib/src/misc/context-menu/ContextMenuHelpers.d.ts +45 -0
- package/lib/src/misc/context-menu/ContextMenuHelpers.d.ts.map +1 -0
- package/lib/src/misc/context-menu/ContextMenuHelpers.js +182 -0
- package/lib/src/misc/context-menu/ContextMenuHelpers.js.map +1 -0
- package/lib/src/misc/context-menu/DefaultContextMenu.d.ts +3 -0
- package/lib/src/misc/context-menu/DefaultContextMenu.d.ts.map +1 -0
- package/lib/src/misc/context-menu/DefaultContextMenu.js +111 -0
- package/lib/src/misc/context-menu/DefaultContextMenu.js.map +1 -0
- package/lib/src/misc/context-menu/NodeContextMenu.d.ts +3 -0
- package/lib/src/misc/context-menu/NodeContextMenu.d.ts.map +1 -0
- package/lib/src/misc/context-menu/NodeContextMenu.js +51 -0
- package/lib/src/misc/context-menu/NodeContextMenu.js.map +1 -0
- package/lib/src/misc/context-menu/SelectionContextMenu.d.ts +3 -0
- package/lib/src/misc/context-menu/SelectionContextMenu.d.ts.map +1 -0
- package/lib/src/misc/context-menu/SelectionContextMenu.js +47 -0
- package/lib/src/misc/context-menu/SelectionContextMenu.js.map +1 -0
- package/lib/src/misc/hooks.d.ts +18 -0
- package/lib/src/misc/hooks.d.ts.map +1 -0
- package/lib/src/misc/hooks.js +275 -0
- package/lib/src/misc/hooks.js.map +1 -0
- package/lib/src/misc/layout.d.ts +117 -0
- package/lib/src/misc/layout.d.ts.map +1 -0
- package/lib/src/misc/layout.js +205 -0
- package/lib/src/misc/layout.js.map +1 -0
- package/lib/src/misc/load.d.ts +5 -0
- package/lib/src/misc/load.d.ts.map +1 -0
- package/lib/src/misc/load.js +106 -0
- package/lib/src/misc/load.js.map +1 -0
- package/lib/src/misc/mapping.d.ts +128 -0
- package/lib/src/misc/mapping.d.ts.map +1 -0
- package/lib/src/misc/mapping.js +270 -0
- package/lib/src/misc/mapping.js.map +1 -0
- package/lib/src/misc/merge-utils.d.ts +12 -0
- package/lib/src/misc/merge-utils.d.ts.map +1 -0
- package/lib/src/misc/merge-utils.js +51 -0
- package/lib/src/misc/merge-utils.js.map +1 -0
- package/lib/src/misc/thumbnail-utils.d.ts +53 -0
- package/lib/src/misc/thumbnail-utils.d.ts.map +1 -0
- package/lib/src/misc/thumbnail-utils.js +629 -0
- package/lib/src/misc/thumbnail-utils.js.map +1 -0
- package/lib/src/misc/types.d.ts +18 -0
- package/lib/src/misc/types.d.ts.map +1 -0
- package/lib/src/misc/types.js +2 -0
- package/lib/src/misc/types.js.map +1 -0
- package/lib/src/misc/value.d.ts +16 -0
- package/lib/src/misc/value.d.ts.map +1 -0
- package/lib/src/misc/value.js +114 -0
- package/lib/src/misc/value.js.map +1 -0
- package/lib/src/misc/viewport-utils.d.ts +6 -0
- package/lib/src/misc/viewport-utils.d.ts.map +1 -0
- package/lib/src/misc/viewport-utils.js +18 -0
- package/lib/src/misc/viewport-utils.js.map +1 -0
- package/lib/src/runtime/AbstractGraphRunner.d.ts +61 -0
- package/lib/src/runtime/AbstractGraphRunner.d.ts.map +1 -0
- package/lib/src/runtime/AbstractGraphRunner.js +63 -0
- package/lib/src/runtime/AbstractGraphRunner.js.map +1 -0
- package/lib/src/runtime/IGraphRunner.d.ts +100 -0
- package/lib/src/runtime/IGraphRunner.d.ts.map +1 -0
- package/lib/src/runtime/IGraphRunner.js +2 -0
- package/lib/src/runtime/IGraphRunner.js.map +1 -0
- package/lib/src/runtime/LocalGraphRunner.d.ts +60 -0
- package/lib/src/runtime/LocalGraphRunner.d.ts.map +1 -0
- package/lib/src/runtime/LocalGraphRunner.js +294 -0
- package/lib/src/runtime/LocalGraphRunner.js.map +1 -0
- package/lib/src/runtime/RemoteGraphRunner.d.ts +109 -0
- package/lib/src/runtime/RemoteGraphRunner.d.ts.map +1 -0
- package/lib/src/runtime/RemoteGraphRunner.js +696 -0
- package/lib/src/runtime/RemoteGraphRunner.js.map +1 -0
- package/package.json +4 -4
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useRef } from "react";
|
|
3
|
+
import { ContextMenuButton } from "./ContextMenuButton";
|
|
4
|
+
export function NodeContextMenu({ open, clientPos, nodeId, handlers, bakeableOutputs, runMode, wb, keyboardShortcuts = {
|
|
5
|
+
copy: "⌘/Ctrl + C",
|
|
6
|
+
duplicate: "⌘/Ctrl + E",
|
|
7
|
+
delete: "Delete",
|
|
8
|
+
}, }) {
|
|
9
|
+
const ref = useRef(null);
|
|
10
|
+
// outside click + ESC
|
|
11
|
+
useEffect(() => {
|
|
12
|
+
if (!open)
|
|
13
|
+
return;
|
|
14
|
+
const onDown = (e) => {
|
|
15
|
+
if (!ref.current)
|
|
16
|
+
return;
|
|
17
|
+
if (!ref.current.contains(e.target))
|
|
18
|
+
handlers.onClose();
|
|
19
|
+
};
|
|
20
|
+
const onKey = (e) => {
|
|
21
|
+
if (e.key === "Escape")
|
|
22
|
+
handlers.onClose();
|
|
23
|
+
};
|
|
24
|
+
window.addEventListener("mousedown", onDown, true);
|
|
25
|
+
window.addEventListener("keydown", onKey);
|
|
26
|
+
return () => {
|
|
27
|
+
window.removeEventListener("mousedown", onDown, true);
|
|
28
|
+
window.removeEventListener("keydown", onKey);
|
|
29
|
+
};
|
|
30
|
+
}, [open, handlers]);
|
|
31
|
+
useEffect(() => {
|
|
32
|
+
if (open)
|
|
33
|
+
ref.current?.focus();
|
|
34
|
+
}, [open]);
|
|
35
|
+
if (!open || !clientPos || !nodeId)
|
|
36
|
+
return null;
|
|
37
|
+
// Determine if this is a start node (no inbound edges)
|
|
38
|
+
const isStartNode = wb ? !wb.def.edges.some((e) => e.target.nodeId === nodeId) : false;
|
|
39
|
+
// Check if node has outbound edges (required for "Run workflow" / "Run from here")
|
|
40
|
+
const hasOutboundEdges = wb ? wb.def.edges.some((e) => e.source.nodeId === nodeId) : false;
|
|
41
|
+
// clamp
|
|
42
|
+
const MENU_MIN_WIDTH = 180;
|
|
43
|
+
const PADDING = 16;
|
|
44
|
+
const x = Math.min(clientPos.x, (typeof window !== "undefined" ? window.innerWidth : 0) - (MENU_MIN_WIDTH + PADDING));
|
|
45
|
+
const y = Math.min(clientPos.y, (typeof window !== "undefined" ? window.innerHeight : 0) - 240);
|
|
46
|
+
return (_jsxs("div", { ref: ref, tabIndex: -1, className: "fixed z-[1000] bg-white border border-gray-300 rounded-lg shadow-lg p-1 min-w-[180px] text-sm text-gray-700 select-none", style: { left: x, top: y }, onClick: (e) => e.stopPropagation(), onMouseDown: (e) => e.stopPropagation(), onWheel: (e) => e.stopPropagation(), onContextMenu: (e) => {
|
|
47
|
+
e.preventDefault();
|
|
48
|
+
e.stopPropagation();
|
|
49
|
+
}, children: [_jsxs("div", { className: "px-2 py-1 font-semibold text-gray-700", children: ["Node (", nodeId, ")"] }), _jsx(ContextMenuButton, { label: "Delete", onClick: handlers.onDelete, shortcut: keyboardShortcuts.delete }), _jsx(ContextMenuButton, { label: "Duplicate", onClick: handlers.onDuplicate, shortcut: keyboardShortcuts.duplicate }), handlers.onRunNode && (_jsx("button", { className: "block w-full text-left px-2 py-1 hover:bg-gray-100", onClick: handlers.onRunNode, children: "Run node" })), runMode === "manual" && handlers.onRunFromHere && hasOutboundEdges && (_jsx("button", { className: "block w-full text-left px-2 py-1 hover:bg-gray-100", onClick: handlers.onRunFromHere, children: isStartNode ? "Run workflow" : "Run from here" })), _jsx("div", { className: "h-px bg-gray-200 my-1" }), _jsx(ContextMenuButton, { label: "Copy", onClick: handlers.onCopy, shortcut: keyboardShortcuts.copy }), _jsx("button", { className: "block w-full text-left px-2 py-1 hover:bg-gray-100", onClick: handlers.onCopyId, children: "Copy Node ID" }), bakeableOutputs.length > 0 && (_jsxs(_Fragment, { children: [_jsx("div", { className: "h-px bg-gray-200 my-1" }), _jsx("div", { className: "px-2 py-1 font-semibold text-gray-700", children: "Bake" }), bakeableOutputs.map((h) => (_jsxs("button", { className: "block w-full text-left px-2 py-1 hover:bg-gray-100", onClick: () => handlers.onBake(h), children: ["Bake: ", h] }, h)))] }))] }));
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=NodeContextMenu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NodeContextMenu.js","sourceRoot":"","sources":["../../../../src/misc/context-menu/NodeContextMenu.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { SelectionContextMenuProps } from "./ContextMenuHandlers";
|
|
2
|
+
export declare function SelectionContextMenu({ open, clientPos, handlers, keyboardShortcuts, }: SelectionContextMenuProps): import("react/jsx-runtime").JSX.Element | null;
|
|
3
|
+
//# sourceMappingURL=SelectionContextMenu.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SelectionContextMenu.d.ts","sourceRoot":"","sources":["../../../../src/misc/context-menu/SelectionContextMenu.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAGvE,wBAAgB,oBAAoB,CAAC,EACnC,IAAI,EACJ,SAAS,EACT,QAAQ,EACR,iBAIC,GACF,EAAE,yBAAyB,kDAuD3B"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useRef } from "react";
|
|
3
|
+
import { ContextMenuButton } from "./ContextMenuButton";
|
|
4
|
+
export function SelectionContextMenu({ open, clientPos, handlers, keyboardShortcuts = {
|
|
5
|
+
copy: "⌘/Ctrl + C",
|
|
6
|
+
duplicate: "⌘/Ctrl + E",
|
|
7
|
+
delete: "Delete",
|
|
8
|
+
}, }) {
|
|
9
|
+
const ref = useRef(null);
|
|
10
|
+
// Close on outside click and on ESC
|
|
11
|
+
useEffect(() => {
|
|
12
|
+
if (!open)
|
|
13
|
+
return;
|
|
14
|
+
const onDown = (e) => {
|
|
15
|
+
if (!ref.current)
|
|
16
|
+
return;
|
|
17
|
+
if (!ref.current.contains(e.target))
|
|
18
|
+
handlers.onClose();
|
|
19
|
+
};
|
|
20
|
+
const onKey = (e) => {
|
|
21
|
+
if (e.key === "Escape")
|
|
22
|
+
handlers.onClose();
|
|
23
|
+
};
|
|
24
|
+
window.addEventListener("mousedown", onDown, true);
|
|
25
|
+
window.addEventListener("keydown", onKey);
|
|
26
|
+
return () => {
|
|
27
|
+
window.removeEventListener("mousedown", onDown, true);
|
|
28
|
+
window.removeEventListener("keydown", onKey);
|
|
29
|
+
};
|
|
30
|
+
}, [open, handlers]);
|
|
31
|
+
useEffect(() => {
|
|
32
|
+
if (open)
|
|
33
|
+
ref.current?.focus();
|
|
34
|
+
}, [open]);
|
|
35
|
+
if (!open || !clientPos)
|
|
36
|
+
return null;
|
|
37
|
+
// Clamp menu position to viewport
|
|
38
|
+
const MENU_MIN_WIDTH = 180;
|
|
39
|
+
const PADDING = 16;
|
|
40
|
+
const x = Math.min(clientPos.x, (typeof window !== "undefined" ? window.innerWidth : 0) - (MENU_MIN_WIDTH + PADDING));
|
|
41
|
+
const y = Math.min(clientPos.y, (typeof window !== "undefined" ? window.innerHeight : 0) - 100);
|
|
42
|
+
return (_jsxs("div", { ref: ref, tabIndex: -1, className: "fixed z-[1000] bg-white border border-gray-300 rounded-lg shadow-lg p-1 min-w-[180px] text-sm text-gray-700 select-none", style: { left: x, top: y }, onClick: (e) => e.stopPropagation(), onMouseDown: (e) => e.stopPropagation(), onWheel: (e) => e.stopPropagation(), onContextMenu: (e) => {
|
|
43
|
+
e.preventDefault();
|
|
44
|
+
e.stopPropagation();
|
|
45
|
+
}, children: [_jsx("div", { className: "px-2 py-1 font-semibold text-gray-700", children: "Selection" }), _jsx(ContextMenuButton, { label: "Copy", onClick: handlers.onCopy, shortcut: keyboardShortcuts.copy }), handlers.onDuplicate && (_jsx(ContextMenuButton, { label: "Duplicate", onClick: handlers.onDuplicate, shortcut: keyboardShortcuts.duplicate })), _jsx(ContextMenuButton, { label: "Delete", onClick: handlers.onDelete, shortcut: keyboardShortcuts.delete })] }));
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=SelectionContextMenu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SelectionContextMenu.js","sourceRoot":"","sources":["../../../../src/misc/context-menu/SelectionContextMenu.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { OnConnect, OnEdgesChange, OnEdgesDelete, OnNodesChange, OnNodesDelete } from "@xyflow/react";
|
|
2
|
+
import type { ResolvedHandles } from "@bian-womp/spark-protocol";
|
|
3
|
+
import type { InMemoryWorkbench } from "../core/InMemoryWorkbench";
|
|
4
|
+
import { IGraphRunner } from "../runtime/IGraphRunner";
|
|
5
|
+
export declare function useWorkbenchBridge(wb: InMemoryWorkbench, handlesMap?: Record<string, ResolvedHandles>): {
|
|
6
|
+
onConnect: OnConnect;
|
|
7
|
+
onNodesChange: OnNodesChange;
|
|
8
|
+
onEdgesChange: OnEdgesChange;
|
|
9
|
+
onEdgesDelete: OnEdgesDelete;
|
|
10
|
+
onNodesDelete: OnNodesDelete;
|
|
11
|
+
};
|
|
12
|
+
export declare function useWorkbenchGraphTick(wb: InMemoryWorkbench): number;
|
|
13
|
+
export declare function useWorkbenchGraphUiTick(wb: InMemoryWorkbench): number;
|
|
14
|
+
export declare function useWorkbenchVersionTick(runner: IGraphRunner): number;
|
|
15
|
+
export declare function useThrottledValue<T>(value: T, intervalMs: number): T;
|
|
16
|
+
export declare function useQueryParamBoolean(key: string, defaultValue: boolean): [boolean, (v: boolean) => void];
|
|
17
|
+
export declare function useQueryParamString(key: string, defaultValue?: string): [string | undefined, (v: string | undefined) => void];
|
|
18
|
+
//# sourceMappingURL=hooks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../../src/misc/hooks.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,SAAS,EACT,aAAa,EACb,aAAa,EACb,aAAa,EACb,aAAa,EAEd,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAEjE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,iBAAiB,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC;;;;;;EAoKrG;AAED,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,iBAAiB,UAU1D;AAED,wBAAgB,uBAAuB,CAAC,EAAE,EAAE,iBAAiB,UAW5D;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,YAAY,UAoB3D;AAED,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,UAAU,EAAE,MAAM,GAAG,CAAC,CAqCpE;AAWD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC,CA0BxG;AAED,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,MAAM,EACX,YAAY,CAAC,EAAE,MAAM,GACpB,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC,CAyBvD"}
|
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
import { useCallback, useEffect, useState, useMemo, useRef } from "react";
|
|
2
|
+
import { getInputTypeId } from "@bian-womp/spark-graph";
|
|
3
|
+
export function useWorkbenchBridge(wb, handlesMap) {
|
|
4
|
+
const onConnect = useCallback((params) => {
|
|
5
|
+
if (!params.source || !params.target)
|
|
6
|
+
return;
|
|
7
|
+
if (!params.sourceHandle || !params.targetHandle)
|
|
8
|
+
return;
|
|
9
|
+
// Prevent duplicate edges between the same endpoints
|
|
10
|
+
const exists = wb.def.edges.some((e) => e.source.nodeId === params.source &&
|
|
11
|
+
e.source.handle === params.sourceHandle &&
|
|
12
|
+
e.target.nodeId === params.target &&
|
|
13
|
+
e.target.handle === params.targetHandle);
|
|
14
|
+
if (exists)
|
|
15
|
+
return;
|
|
16
|
+
// Check if target input handle is a non-array type (typeId doesn't end with [])
|
|
17
|
+
// If so, remove any existing connections to that handle before connecting
|
|
18
|
+
const targetHandles = handlesMap?.[params.target];
|
|
19
|
+
const targetTypeId = targetHandles ? getInputTypeId(targetHandles.inputs, params.targetHandle) : undefined;
|
|
20
|
+
const isArrayInput = targetTypeId?.endsWith("[]") ?? false;
|
|
21
|
+
if (!isArrayInput) {
|
|
22
|
+
// Find existing edges to this input handle
|
|
23
|
+
const existingEdges = wb.def.edges.filter((e) => e.target.nodeId === params.target && e.target.handle === params.targetHandle);
|
|
24
|
+
// Remove existing edges (without committing yet)
|
|
25
|
+
for (const edge of existingEdges) {
|
|
26
|
+
wb.disconnect(edge.id, { commit: false });
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
wb.connect({
|
|
30
|
+
source: { nodeId: params.source, handle: params.sourceHandle },
|
|
31
|
+
target: { nodeId: params.target, handle: params.targetHandle },
|
|
32
|
+
}, { commit: true });
|
|
33
|
+
}, [wb, handlesMap]);
|
|
34
|
+
const onNodesChange = useCallback((changes) => {
|
|
35
|
+
const positions = {};
|
|
36
|
+
let commit = false;
|
|
37
|
+
changes.forEach((c) => {
|
|
38
|
+
if (c.type === "position" && c.position) {
|
|
39
|
+
positions[c.id] = c.position;
|
|
40
|
+
if (!c.dragging)
|
|
41
|
+
commit = true;
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
const sizes = {};
|
|
45
|
+
changes.forEach((c) => {
|
|
46
|
+
if (c.type === "dimensions" && c.dimensions) {
|
|
47
|
+
sizes[c.id] = c.dimensions;
|
|
48
|
+
if (!c.resizing)
|
|
49
|
+
commit = true;
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
// Derive next node selection from change set
|
|
53
|
+
const current = wb.getSelection();
|
|
54
|
+
const nextNodeIds = new Set(current.nodes);
|
|
55
|
+
let selectionChanged = false;
|
|
56
|
+
for (const change of changes) {
|
|
57
|
+
const type = change?.type;
|
|
58
|
+
if (type === "select") {
|
|
59
|
+
const id = change.id;
|
|
60
|
+
const selected = change.selected;
|
|
61
|
+
if (typeof selected === "boolean") {
|
|
62
|
+
if (selected) {
|
|
63
|
+
if (!nextNodeIds.has(id)) {
|
|
64
|
+
nextNodeIds.add(id);
|
|
65
|
+
selectionChanged = true;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
else if (nextNodeIds.delete(id)) {
|
|
69
|
+
selectionChanged = true;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
else if (type === "remove") {
|
|
74
|
+
const id = change.id;
|
|
75
|
+
if (nextNodeIds.delete(id))
|
|
76
|
+
selectionChanged = true;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
if (selectionChanged) {
|
|
80
|
+
wb.setSelection({
|
|
81
|
+
nodes: Array.from(nextNodeIds),
|
|
82
|
+
edges: current.edges,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
if (Object.keys(positions).length > 0) {
|
|
86
|
+
wb.setPositions(positions, {
|
|
87
|
+
commit: commit && !Object.keys(sizes).length,
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
if (Object.keys(sizes).length > 0) {
|
|
91
|
+
wb.setSizes(sizes, { commit });
|
|
92
|
+
}
|
|
93
|
+
}, [wb]);
|
|
94
|
+
const onEdgesDelete = useCallback((edges) => edges.forEach((e, idx) => wb.disconnect(e.id, { commit: idx === edges.length - 1 })), [wb]);
|
|
95
|
+
const onEdgesChange = useCallback((changes) => {
|
|
96
|
+
const current = wb.getSelection();
|
|
97
|
+
const nextEdgeIds = new Set(current.edges);
|
|
98
|
+
let selectionChanged = false;
|
|
99
|
+
for (const change of changes) {
|
|
100
|
+
const type = change?.type;
|
|
101
|
+
if (type === "select") {
|
|
102
|
+
const id = change.id;
|
|
103
|
+
const selected = change.selected;
|
|
104
|
+
if (typeof selected === "boolean") {
|
|
105
|
+
if (selected) {
|
|
106
|
+
if (!nextEdgeIds.has(id)) {
|
|
107
|
+
nextEdgeIds.add(id);
|
|
108
|
+
selectionChanged = true;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
else if (nextEdgeIds.delete(id)) {
|
|
112
|
+
selectionChanged = true;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
else if (type === "remove") {
|
|
117
|
+
const id = change.id;
|
|
118
|
+
if (nextEdgeIds.delete(id))
|
|
119
|
+
selectionChanged = true;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
if (selectionChanged) {
|
|
123
|
+
wb.setSelection({
|
|
124
|
+
nodes: current.nodes,
|
|
125
|
+
edges: Array.from(nextEdgeIds),
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
}, [wb]);
|
|
129
|
+
const onNodesDelete = useCallback((nodes) => {
|
|
130
|
+
nodes.forEach((n, idx) => wb.removeNode(n.id, { commit: idx === nodes.length - 1 }));
|
|
131
|
+
}, [wb]);
|
|
132
|
+
return {
|
|
133
|
+
onConnect,
|
|
134
|
+
onNodesChange,
|
|
135
|
+
onEdgesChange,
|
|
136
|
+
onEdgesDelete,
|
|
137
|
+
onNodesDelete,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
export function useWorkbenchGraphTick(wb) {
|
|
141
|
+
const [tick, setTick] = useState(0);
|
|
142
|
+
useEffect(() => {
|
|
143
|
+
const off = wb.on("graphChanged", () => {
|
|
144
|
+
setTick((t) => t + 1);
|
|
145
|
+
});
|
|
146
|
+
return () => off();
|
|
147
|
+
}, [wb]);
|
|
148
|
+
return tick;
|
|
149
|
+
}
|
|
150
|
+
export function useWorkbenchGraphUiTick(wb) {
|
|
151
|
+
const [tick, setTick] = useState(0);
|
|
152
|
+
useEffect(() => {
|
|
153
|
+
const off = wb.on("graphUiChanged", (evt) => {
|
|
154
|
+
if (evt.change?.type === "viewport")
|
|
155
|
+
return;
|
|
156
|
+
setTick((t) => t + 1);
|
|
157
|
+
});
|
|
158
|
+
return () => off();
|
|
159
|
+
}, [wb]);
|
|
160
|
+
return tick;
|
|
161
|
+
}
|
|
162
|
+
export function useWorkbenchVersionTick(runner) {
|
|
163
|
+
const [version, setVersion] = useState(0);
|
|
164
|
+
useEffect(() => {
|
|
165
|
+
const bump = () => setVersion((v) => v + 1);
|
|
166
|
+
const u1 = runner.on("value", bump);
|
|
167
|
+
const u2 = runner.on("error", bump);
|
|
168
|
+
const u3 = runner.on("invalidate", bump);
|
|
169
|
+
const u4 = runner.on("status", bump);
|
|
170
|
+
const u5 = runner.on("stats", bump);
|
|
171
|
+
return () => {
|
|
172
|
+
u1();
|
|
173
|
+
u2();
|
|
174
|
+
u3();
|
|
175
|
+
u4();
|
|
176
|
+
u5();
|
|
177
|
+
};
|
|
178
|
+
}, [runner]);
|
|
179
|
+
return version;
|
|
180
|
+
}
|
|
181
|
+
export function useThrottledValue(value, intervalMs) {
|
|
182
|
+
const [throttled, setThrottled] = useState(value);
|
|
183
|
+
const lastSetAtRef = useRef(0);
|
|
184
|
+
const timeoutRef = useRef(null);
|
|
185
|
+
useEffect(() => {
|
|
186
|
+
const now = typeof performance !== "undefined" && performance.now ? performance.now() : Date.now();
|
|
187
|
+
const elapsed = now - lastSetAtRef.current;
|
|
188
|
+
if (elapsed >= intervalMs) {
|
|
189
|
+
lastSetAtRef.current = now;
|
|
190
|
+
setThrottled(value);
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
if (timeoutRef.current !== null) {
|
|
194
|
+
window.clearTimeout(timeoutRef.current);
|
|
195
|
+
}
|
|
196
|
+
timeoutRef.current = window.setTimeout(() => {
|
|
197
|
+
lastSetAtRef.current = typeof performance !== "undefined" && performance.now ? performance.now() : Date.now();
|
|
198
|
+
setThrottled(value);
|
|
199
|
+
timeoutRef.current = null;
|
|
200
|
+
}, Math.max(0, intervalMs - elapsed));
|
|
201
|
+
}
|
|
202
|
+
return () => { };
|
|
203
|
+
}, [value, intervalMs]);
|
|
204
|
+
useEffect(() => {
|
|
205
|
+
return () => {
|
|
206
|
+
if (timeoutRef.current !== null) {
|
|
207
|
+
window.clearTimeout(timeoutRef.current);
|
|
208
|
+
timeoutRef.current = null;
|
|
209
|
+
}
|
|
210
|
+
};
|
|
211
|
+
}, []);
|
|
212
|
+
return throttled;
|
|
213
|
+
}
|
|
214
|
+
// Query param helpers
|
|
215
|
+
function setSearchParam(key, val) {
|
|
216
|
+
if (typeof window === "undefined")
|
|
217
|
+
return;
|
|
218
|
+
const url = new URL(window.location.href);
|
|
219
|
+
if (val === undefined || val === "")
|
|
220
|
+
url.searchParams.delete(key);
|
|
221
|
+
else
|
|
222
|
+
url.searchParams.set(key, val);
|
|
223
|
+
window.history.replaceState({}, "", url.toString());
|
|
224
|
+
}
|
|
225
|
+
export function useQueryParamBoolean(key, defaultValue) {
|
|
226
|
+
const initial = useMemo(() => {
|
|
227
|
+
if (typeof window === "undefined")
|
|
228
|
+
return defaultValue;
|
|
229
|
+
const sp = new URLSearchParams(window.location.search);
|
|
230
|
+
const v = sp.get(key);
|
|
231
|
+
if (v === null)
|
|
232
|
+
return defaultValue;
|
|
233
|
+
return v === "1" || v === "true";
|
|
234
|
+
}, [key, defaultValue]);
|
|
235
|
+
const [val, setVal] = useState(initial);
|
|
236
|
+
const set = useCallback((v) => {
|
|
237
|
+
setVal(v);
|
|
238
|
+
setSearchParam(key, v ? "1" : undefined);
|
|
239
|
+
}, [key]);
|
|
240
|
+
useEffect(() => {
|
|
241
|
+
const onPop = () => {
|
|
242
|
+
const sp = new URLSearchParams(window.location.search);
|
|
243
|
+
const v = sp.get(key);
|
|
244
|
+
setVal(v === "1" || v === "true");
|
|
245
|
+
};
|
|
246
|
+
window.addEventListener("popstate", onPop);
|
|
247
|
+
return () => window.removeEventListener("popstate", onPop);
|
|
248
|
+
}, [key]);
|
|
249
|
+
return [val, set];
|
|
250
|
+
}
|
|
251
|
+
export function useQueryParamString(key, defaultValue) {
|
|
252
|
+
const initial = useMemo(() => {
|
|
253
|
+
if (typeof window === "undefined")
|
|
254
|
+
return defaultValue;
|
|
255
|
+
const sp = new URLSearchParams(window.location.search);
|
|
256
|
+
const v = sp.get(key);
|
|
257
|
+
return v ?? defaultValue;
|
|
258
|
+
}, [key, defaultValue]);
|
|
259
|
+
const [val, setVal] = useState(initial);
|
|
260
|
+
const set = useCallback((v) => {
|
|
261
|
+
setVal(v);
|
|
262
|
+
setSearchParam(key, v);
|
|
263
|
+
}, [key]);
|
|
264
|
+
useEffect(() => {
|
|
265
|
+
const onPop = () => {
|
|
266
|
+
const sp = new URLSearchParams(window.location.search);
|
|
267
|
+
const v = sp.get(key) ?? undefined;
|
|
268
|
+
setVal(v);
|
|
269
|
+
};
|
|
270
|
+
window.addEventListener("popstate", onPop);
|
|
271
|
+
return () => window.removeEventListener("popstate", onPop);
|
|
272
|
+
}, [key]);
|
|
273
|
+
return [val, set];
|
|
274
|
+
}
|
|
275
|
+
//# sourceMappingURL=hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../../src/misc/hooks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import type { ResolvedHandles, GraphNodeDefinition } from "@bian-womp/spark-protocol";
|
|
2
|
+
import type { Registry } from "@bian-womp/spark-graph";
|
|
3
|
+
import { Position } from "@xyflow/react";
|
|
4
|
+
export type EstimateNodeSizeArgs = {
|
|
5
|
+
node: GraphNodeDefinition;
|
|
6
|
+
registry: Registry;
|
|
7
|
+
showValues?: boolean;
|
|
8
|
+
overrides?: {
|
|
9
|
+
width?: number;
|
|
10
|
+
height?: number;
|
|
11
|
+
};
|
|
12
|
+
};
|
|
13
|
+
export type EstimateNodeSizeResult = {
|
|
14
|
+
width: number;
|
|
15
|
+
height: number;
|
|
16
|
+
};
|
|
17
|
+
export type EstimateNodeSizeFunction = (args: EstimateNodeSizeArgs) => EstimateNodeSizeResult;
|
|
18
|
+
export type CreateHandleBoundsArgs = {
|
|
19
|
+
id: string;
|
|
20
|
+
type: "source" | "target";
|
|
21
|
+
position: Position;
|
|
22
|
+
rowIndex: number;
|
|
23
|
+
nodeWidth: number;
|
|
24
|
+
};
|
|
25
|
+
export type CreateHandleBoundsResult = {
|
|
26
|
+
id: string;
|
|
27
|
+
type: "source" | "target";
|
|
28
|
+
position: Position;
|
|
29
|
+
x: number;
|
|
30
|
+
y: number;
|
|
31
|
+
width: number;
|
|
32
|
+
height: number;
|
|
33
|
+
};
|
|
34
|
+
export type CreateHandleBoundsFunction = (args: CreateHandleBoundsArgs) => CreateHandleBoundsResult;
|
|
35
|
+
export type CreateHandleLayoutArgs = {
|
|
36
|
+
id: string;
|
|
37
|
+
type: "source" | "target";
|
|
38
|
+
position: Position;
|
|
39
|
+
rowIndex: number;
|
|
40
|
+
};
|
|
41
|
+
export type CreateHandleLayoutResult = {
|
|
42
|
+
id: string;
|
|
43
|
+
type: "source" | "target";
|
|
44
|
+
position: Position;
|
|
45
|
+
y: number;
|
|
46
|
+
};
|
|
47
|
+
export type CreateHandleLayoutFunction = (args: CreateHandleLayoutArgs) => CreateHandleLayoutResult;
|
|
48
|
+
export type LayoutNodeArgs = {
|
|
49
|
+
node: GraphNodeDefinition;
|
|
50
|
+
registry: Registry;
|
|
51
|
+
showValues?: boolean;
|
|
52
|
+
overrides?: {
|
|
53
|
+
width?: number;
|
|
54
|
+
height?: number;
|
|
55
|
+
};
|
|
56
|
+
missingInputs?: string[];
|
|
57
|
+
missingOutputs?: string[];
|
|
58
|
+
};
|
|
59
|
+
export type HandleBounds = {
|
|
60
|
+
id: string;
|
|
61
|
+
type: "source" | "target";
|
|
62
|
+
position: Position;
|
|
63
|
+
x: number;
|
|
64
|
+
y: number;
|
|
65
|
+
width?: number;
|
|
66
|
+
height?: number;
|
|
67
|
+
};
|
|
68
|
+
export type HandleLayout = {
|
|
69
|
+
id: string;
|
|
70
|
+
type: "source" | "target";
|
|
71
|
+
position: Position;
|
|
72
|
+
y: number;
|
|
73
|
+
missing?: boolean;
|
|
74
|
+
};
|
|
75
|
+
export type LayoutNodeResult = {
|
|
76
|
+
width: number;
|
|
77
|
+
height: number;
|
|
78
|
+
inputOrder: string[];
|
|
79
|
+
outputOrder: string[];
|
|
80
|
+
handles: HandleBounds[];
|
|
81
|
+
handleLayout: HandleLayout[];
|
|
82
|
+
};
|
|
83
|
+
export type LayoutNodeFunction = (args: LayoutNodeArgs) => LayoutNodeResult;
|
|
84
|
+
export declare function computeEffectiveHandles(node: GraphNodeDefinition, registry: Registry): ResolvedHandles;
|
|
85
|
+
export declare function countVisibleHandles(handles: Omit<ResolvedHandles, "inputDefaults">): {
|
|
86
|
+
inputsCount: number;
|
|
87
|
+
outputsCount: number;
|
|
88
|
+
};
|
|
89
|
+
export declare function estimateNodeSize(args: EstimateNodeSizeArgs): EstimateNodeSizeResult;
|
|
90
|
+
/**
|
|
91
|
+
* Calculate the Y position for handle layout (center of row).
|
|
92
|
+
* Used for positioning handles in React Flow.
|
|
93
|
+
*/
|
|
94
|
+
export declare function getHandleLayoutY(rowIndex: number): number;
|
|
95
|
+
/**
|
|
96
|
+
* Calculate the Y position for handle bounds (top + centering offset).
|
|
97
|
+
* Used for hit-testing and edge routing.
|
|
98
|
+
*/
|
|
99
|
+
export declare function getHandleBoundsY(rowIndex: number): number;
|
|
100
|
+
/**
|
|
101
|
+
* Calculate the X position for handle bounds based on position and node width.
|
|
102
|
+
*/
|
|
103
|
+
export declare function getHandleBoundsX(position: Position, nodeWidth: number): number;
|
|
104
|
+
/**
|
|
105
|
+
* Create handle bounds object for hit-testing/edge routing.
|
|
106
|
+
*/
|
|
107
|
+
export declare function createHandleBounds(args: CreateHandleBoundsArgs): CreateHandleBoundsResult;
|
|
108
|
+
/**
|
|
109
|
+
* Create handle layout object for React Flow rendering.
|
|
110
|
+
*/
|
|
111
|
+
export declare function createHandleLayout(args: CreateHandleLayoutArgs): CreateHandleLayoutResult;
|
|
112
|
+
export declare function layoutNode(args: LayoutNodeArgs, overrides?: {
|
|
113
|
+
estimateNodeSize?: EstimateNodeSizeFunction;
|
|
114
|
+
createHandleBounds?: CreateHandleBoundsFunction;
|
|
115
|
+
createHandleLayout?: CreateHandleLayoutFunction;
|
|
116
|
+
}): LayoutNodeResult;
|
|
117
|
+
//# sourceMappingURL=layout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../../src/misc/layout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,mBAAmB,EAAyB,MAAM,2BAA2B,CAAC;AAC7G,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAGvD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAGzC,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,EAAE,mBAAmB,CAAC;IAC1B,QAAQ,EAAE,QAAQ,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACjD,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG,CAAC,IAAI,EAAE,oBAAoB,KAAK,sBAAsB,CAAC;AAE9F,MAAM,MAAM,sBAAsB,GAAG;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC1B,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC1B,QAAQ,EAAE,QAAQ,CAAC;IACnB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG,CAAC,IAAI,EAAE,sBAAsB,KAAK,wBAAwB,CAAC;AAEpG,MAAM,MAAM,sBAAsB,GAAG;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC1B,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC1B,QAAQ,EAAE,QAAQ,CAAC;IACnB,CAAC,EAAE,MAAM,CAAC;CACX,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG,CAAC,IAAI,EAAE,sBAAsB,KAAK,wBAAwB,CAAC;AAEpG,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,mBAAmB,CAAC;IAC1B,QAAQ,EAAE,QAAQ,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAChD,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC1B,QAAQ,EAAE,QAAQ,CAAC;IACnB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC1B,QAAQ,EAAE,QAAQ,CAAC;IACnB,CAAC,EAAE,MAAM,CAAC;IACV,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,YAAY,EAAE,YAAY,EAAE,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,CAAC,IAAI,EAAE,cAAc,KAAK,gBAAgB,CAAC;AAE5E,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,mBAAmB,EAAE,QAAQ,EAAE,QAAQ,GAAG,eAAe,CAuCtG;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,eAAe,CAAC,GAAG;IACpF,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB,CAIA;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,oBAAoB,GAAG,sBAAsB,CAanF;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAM9E;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,sBAAsB,GAAG,wBAAwB,CAUzF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,sBAAsB,GAAG,wBAAwB,CAOzF;AAED,wBAAgB,UAAU,CACxB,IAAI,EAAE,cAAc,EACpB,SAAS,CAAC,EAAE;IACV,gBAAgB,CAAC,EAAE,wBAAwB,CAAC;IAC5C,kBAAkB,CAAC,EAAE,0BAA0B,CAAC;IAChD,kBAAkB,CAAC,EAAE,0BAA0B,CAAC;CACjD,GACA,gBAAgB,CAoHlB"}
|