@coral-viz/viz 0.2.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/LICENSE +4 -0
- package/README.md +11 -0
- package/dist/compatibility/CompatibilityEdge.d.ts +106 -0
- package/dist/compatibility/CompatibilityEdge.d.ts.map +1 -0
- package/dist/compatibility/CompatibilityEdge.js +233 -0
- package/dist/compatibility/CompatibilityEdge.js.map +1 -0
- package/dist/compatibility/IncompatibilityTooltip.d.ts +44 -0
- package/dist/compatibility/IncompatibilityTooltip.d.ts.map +1 -0
- package/dist/compatibility/IncompatibilityTooltip.js +145 -0
- package/dist/compatibility/IncompatibilityTooltip.js.map +1 -0
- package/dist/compatibility/index.d.ts +10 -0
- package/dist/compatibility/index.d.ts.map +1 -0
- package/dist/compatibility/index.js +10 -0
- package/dist/compatibility/index.js.map +1 -0
- package/dist/compatibility/useEdgeCompatibility.d.ts +82 -0
- package/dist/compatibility/useEdgeCompatibility.d.ts.map +1 -0
- package/dist/compatibility/useEdgeCompatibility.js +170 -0
- package/dist/compatibility/useEdgeCompatibility.js.map +1 -0
- package/dist/compatibility/validateConnection.d.ts +56 -0
- package/dist/compatibility/validateConnection.d.ts.map +1 -0
- package/dist/compatibility/validateConnection.js +382 -0
- package/dist/compatibility/validateConnection.js.map +1 -0
- package/dist/components/EditContext.d.ts +45 -0
- package/dist/components/EditContext.d.ts.map +1 -0
- package/dist/components/EditContext.js +41 -0
- package/dist/components/EditContext.js.map +1 -0
- package/dist/components/ShapeRenderer.d.ts +35 -0
- package/dist/components/ShapeRenderer.d.ts.map +1 -0
- package/dist/components/ShapeRenderer.js +77 -0
- package/dist/components/ShapeRenderer.js.map +1 -0
- package/dist/components/SymbolNode.d.ts +53 -0
- package/dist/components/SymbolNode.d.ts.map +1 -0
- package/dist/components/SymbolNode.js +333 -0
- package/dist/components/SymbolNode.js.map +1 -0
- package/dist/components/index.d.ts +8 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +10 -0
- package/dist/components/index.js.map +1 -0
- package/dist/components/nodes.d.ts +43 -0
- package/dist/components/nodes.d.ts.map +1 -0
- package/dist/components/nodes.js +111 -0
- package/dist/components/nodes.js.map +1 -0
- package/dist/editor/CoralEditor.d.ts +29 -0
- package/dist/editor/CoralEditor.d.ts.map +1 -0
- package/dist/editor/CoralEditor.js +112 -0
- package/dist/editor/CoralEditor.js.map +1 -0
- package/dist/editor/FileControls.d.ts +34 -0
- package/dist/editor/FileControls.d.ts.map +1 -0
- package/dist/editor/FileControls.js +139 -0
- package/dist/editor/FileControls.js.map +1 -0
- package/dist/editor/LayoutControls.d.ts +41 -0
- package/dist/editor/LayoutControls.d.ts.map +1 -0
- package/dist/editor/LayoutControls.js +124 -0
- package/dist/editor/LayoutControls.js.map +1 -0
- package/dist/editor/converter.d.ts +37 -0
- package/dist/editor/converter.d.ts.map +1 -0
- package/dist/editor/converter.js +256 -0
- package/dist/editor/converter.js.map +1 -0
- package/dist/editor/index.d.ts +8 -0
- package/dist/editor/index.d.ts.map +1 -0
- package/dist/editor/index.js +8 -0
- package/dist/editor/index.js.map +1 -0
- package/dist/file/deserialize.d.ts +15 -0
- package/dist/file/deserialize.d.ts.map +1 -0
- package/dist/file/deserialize.js +145 -0
- package/dist/file/deserialize.js.map +1 -0
- package/dist/file/index.d.ts +15 -0
- package/dist/file/index.d.ts.map +1 -0
- package/dist/file/index.js +20 -0
- package/dist/file/index.js.map +1 -0
- package/dist/file/migrate.d.ts +29 -0
- package/dist/file/migrate.d.ts.map +1 -0
- package/dist/file/migrate.js +103 -0
- package/dist/file/migrate.js.map +1 -0
- package/dist/file/schema.d.ts +385 -0
- package/dist/file/schema.d.ts.map +1 -0
- package/dist/file/schema.js +180 -0
- package/dist/file/schema.js.map +1 -0
- package/dist/file/serialize.d.ts +30 -0
- package/dist/file/serialize.d.ts.map +1 -0
- package/dist/file/serialize.js +218 -0
- package/dist/file/serialize.js.map +1 -0
- package/dist/file/validate.d.ts +21 -0
- package/dist/file/validate.d.ts.map +1 -0
- package/dist/file/validate.js +165 -0
- package/dist/file/validate.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +42 -0
- package/dist/index.js.map +1 -0
- package/dist/layout/elk.d.ts +77 -0
- package/dist/layout/elk.d.ts.map +1 -0
- package/dist/layout/elk.js +379 -0
- package/dist/layout/elk.js.map +1 -0
- package/dist/layout/index.d.ts +12 -0
- package/dist/layout/index.d.ts.map +1 -0
- package/dist/layout/index.js +12 -0
- package/dist/layout/index.js.map +1 -0
- package/dist/layout/nodeSizing.d.ts +65 -0
- package/dist/layout/nodeSizing.d.ts.map +1 -0
- package/dist/layout/nodeSizing.js +319 -0
- package/dist/layout/nodeSizing.js.map +1 -0
- package/dist/layout/positionStability.d.ts +73 -0
- package/dist/layout/positionStability.d.ts.map +1 -0
- package/dist/layout/positionStability.js +199 -0
- package/dist/layout/positionStability.js.map +1 -0
- package/dist/layout/useAxisConstrain.d.ts +20 -0
- package/dist/layout/useAxisConstrain.d.ts.map +1 -0
- package/dist/layout/useAxisConstrain.js +106 -0
- package/dist/layout/useAxisConstrain.js.map +1 -0
- package/dist/layout/useDiagramState.d.ts +92 -0
- package/dist/layout/useDiagramState.d.ts.map +1 -0
- package/dist/layout/useDiagramState.js +256 -0
- package/dist/layout/useDiagramState.js.map +1 -0
- package/dist/layout/useLayoutHistory.d.ts +53 -0
- package/dist/layout/useLayoutHistory.d.ts.map +1 -0
- package/dist/layout/useLayoutHistory.js +124 -0
- package/dist/layout/useLayoutHistory.js.map +1 -0
- package/dist/properties/NodePropertiesPanel.d.ts +47 -0
- package/dist/properties/NodePropertiesPanel.d.ts.map +1 -0
- package/dist/properties/NodePropertiesPanel.js +199 -0
- package/dist/properties/NodePropertiesPanel.js.map +1 -0
- package/dist/properties/index.d.ts +10 -0
- package/dist/properties/index.d.ts.map +1 -0
- package/dist/properties/index.js +10 -0
- package/dist/properties/index.js.map +1 -0
- package/dist/properties/propertyUtils.d.ts +60 -0
- package/dist/properties/propertyUtils.d.ts.map +1 -0
- package/dist/properties/propertyUtils.js +89 -0
- package/dist/properties/propertyUtils.js.map +1 -0
- package/dist/settings/FontSettingsForm.d.ts +28 -0
- package/dist/settings/FontSettingsForm.d.ts.map +1 -0
- package/dist/settings/FontSettingsForm.js +129 -0
- package/dist/settings/FontSettingsForm.js.map +1 -0
- package/dist/settings/LayoutSettingsForm.d.ts +37 -0
- package/dist/settings/LayoutSettingsForm.d.ts.map +1 -0
- package/dist/settings/LayoutSettingsForm.js +165 -0
- package/dist/settings/LayoutSettingsForm.js.map +1 -0
- package/dist/settings/SettingsPanel.d.ts +55 -0
- package/dist/settings/SettingsPanel.d.ts.map +1 -0
- package/dist/settings/SettingsPanel.js +84 -0
- package/dist/settings/SettingsPanel.js.map +1 -0
- package/dist/settings/index.d.ts +13 -0
- package/dist/settings/index.d.ts.map +1 -0
- package/dist/settings/index.js +13 -0
- package/dist/settings/index.js.map +1 -0
- package/dist/settings/useSettings.d.ts +51 -0
- package/dist/settings/useSettings.d.ts.map +1 -0
- package/dist/settings/useSettings.js +154 -0
- package/dist/settings/useSettings.js.map +1 -0
- package/dist/text-editor/SplitEditor.d.ts +72 -0
- package/dist/text-editor/SplitEditor.d.ts.map +1 -0
- package/dist/text-editor/SplitEditor.js +172 -0
- package/dist/text-editor/SplitEditor.js.map +1 -0
- package/dist/text-editor/TextEditor.d.ts +53 -0
- package/dist/text-editor/TextEditor.d.ts.map +1 -0
- package/dist/text-editor/TextEditor.js +181 -0
- package/dist/text-editor/TextEditor.js.map +1 -0
- package/dist/text-editor/hooks/useBidirectionalSync.d.ts +106 -0
- package/dist/text-editor/hooks/useBidirectionalSync.d.ts.map +1 -0
- package/dist/text-editor/hooks/useBidirectionalSync.js +151 -0
- package/dist/text-editor/hooks/useBidirectionalSync.js.map +1 -0
- package/dist/text-editor/index.d.ts +9 -0
- package/dist/text-editor/index.d.ts.map +1 -0
- package/dist/text-editor/index.js +11 -0
- package/dist/text-editor/index.js.map +1 -0
- package/dist/types.d.ts +242 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/waypoints/index.d.ts +8 -0
- package/dist/waypoints/index.d.ts.map +1 -0
- package/dist/waypoints/index.js +7 -0
- package/dist/waypoints/index.js.map +1 -0
- package/dist/waypoints/operations.d.ts +29 -0
- package/dist/waypoints/operations.d.ts.map +1 -0
- package/dist/waypoints/operations.js +85 -0
- package/dist/waypoints/operations.js.map +1 -0
- package/dist/waypoints/router.d.ts +23 -0
- package/dist/waypoints/router.d.ts.map +1 -0
- package/dist/waypoints/router.js +109 -0
- package/dist/waypoints/router.js.map +1 -0
- package/dist/waypoints/types.d.ts +15 -0
- package/dist/waypoints/types.d.ts.map +1 -0
- package/dist/waypoints/types.js +5 -0
- package/dist/waypoints/types.js.map +1 -0
- package/dist/waypoints/useWaypointManager.d.ts +38 -0
- package/dist/waypoints/useWaypointManager.d.ts.map +1 -0
- package/dist/waypoints/useWaypointManager.js +106 -0
- package/dist/waypoints/useWaypointManager.js.map +1 -0
- package/package.json +76 -0
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SymbolNode - React Flow node component that renders symbols
|
|
3
|
+
*
|
|
4
|
+
* This component looks up the symbol and shape from registries
|
|
5
|
+
* and renders them with proper styling and handles.
|
|
6
|
+
*
|
|
7
|
+
* Supports inline label editing via double-click.
|
|
8
|
+
*/
|
|
9
|
+
import type { HandleDragState, CoralNodeData } from '../types.js';
|
|
10
|
+
export interface SymbolNodeData extends CoralNodeData {
|
|
11
|
+
/** Symbol ID (e.g., 'flowchart-process', 'arch-service') */
|
|
12
|
+
symbolId?: string;
|
|
13
|
+
/** Variant ID (e.g., 'start', 'end') */
|
|
14
|
+
variant?: string;
|
|
15
|
+
/** Override fill color */
|
|
16
|
+
fill?: string;
|
|
17
|
+
/** Override stroke color */
|
|
18
|
+
stroke?: string;
|
|
19
|
+
/** Override stroke width */
|
|
20
|
+
strokeWidth?: number;
|
|
21
|
+
/** Node width */
|
|
22
|
+
width?: number;
|
|
23
|
+
/** Node height */
|
|
24
|
+
height?: number;
|
|
25
|
+
/** Enable hand-drawn sketch rendering */
|
|
26
|
+
sketch?: boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Live state of a connection gesture relative to this node, so its handles
|
|
29
|
+
* can show whether dropping here would be accepted (R-016).
|
|
30
|
+
*/
|
|
31
|
+
dragState?: HandleDragState;
|
|
32
|
+
/** Live compatibility keyed by the concrete React Flow handle id. */
|
|
33
|
+
dragStates?: Record<string, HandleDragState>;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Props passed to SymbolNode by React Flow
|
|
37
|
+
*/
|
|
38
|
+
interface SymbolNodeProps {
|
|
39
|
+
id: string;
|
|
40
|
+
data: SymbolNodeData;
|
|
41
|
+
selected?: boolean;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* SymbolNode component - renders any symbol from the registry
|
|
45
|
+
*
|
|
46
|
+
* Supports inline label editing via double-click:
|
|
47
|
+
* - Double-click to edit the label
|
|
48
|
+
* - Press Enter or blur to save
|
|
49
|
+
* - Press Escape to cancel
|
|
50
|
+
*/
|
|
51
|
+
export declare const SymbolNode: import("react").MemoExoticComponent<({ id, data, selected }: SymbolNodeProps) => import("react").JSX.Element>;
|
|
52
|
+
export default SymbolNode;
|
|
53
|
+
//# sourceMappingURL=SymbolNode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SymbolNode.d.ts","sourceRoot":"","sources":["../../src/components/SymbolNode.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAQH,OAAO,KAAK,EACV,eAAe,EAAgC,aAAa,EAAE,MAAM,aAAa,CAAC;AAkBpF,MAAM,WAAW,cAAe,SAAQ,aAAa;IACnD,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wCAAwC;IACxC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0BAA0B;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,4BAA4B;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4BAA4B;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kBAAkB;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yCAAyC;IACzC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;OAGG;IACH,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,qEAAqE;IACrE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;CAC9C;AAED;;GAEG;AACH,UAAU,eAAe;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,cAAc,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAuHD;;;;;;;GAOG;AACH,eAAO,MAAM,UAAU,+DAAoD,eAAe,iCAqTxF,CAAC;AAEH,eAAe,UAAU,CAAC"}
|
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* SymbolNode - React Flow node component that renders symbols
|
|
4
|
+
*
|
|
5
|
+
* This component looks up the symbol and shape from registries
|
|
6
|
+
* and renders them with proper styling and handles.
|
|
7
|
+
*
|
|
8
|
+
* Supports inline label editing via double-click.
|
|
9
|
+
*/
|
|
10
|
+
import { memo, useMemo, useState, useCallback, useRef, useEffect } from 'react';
|
|
11
|
+
import { Handle, Position } from '@xyflow/react';
|
|
12
|
+
import { ShapeRenderer } from './ShapeRenderer.js';
|
|
13
|
+
import { symbolRegistry } from '@coral-viz/render';
|
|
14
|
+
import { shapeRegistry } from '@coral-viz/render';
|
|
15
|
+
import { useEditContext } from './EditContext.js';
|
|
16
|
+
/**
|
|
17
|
+
* Extended node data for symbol-aware rendering
|
|
18
|
+
*/
|
|
19
|
+
/** Visually hidden, but announced. */
|
|
20
|
+
const SR_ONLY = {
|
|
21
|
+
position: 'absolute',
|
|
22
|
+
width: 1,
|
|
23
|
+
height: 1,
|
|
24
|
+
padding: 0,
|
|
25
|
+
margin: -1,
|
|
26
|
+
overflow: 'hidden',
|
|
27
|
+
clip: 'rect(0 0 0 0)',
|
|
28
|
+
whiteSpace: 'nowrap',
|
|
29
|
+
border: 0,
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Map anchor direction to React Flow Position
|
|
33
|
+
*/
|
|
34
|
+
function anchorToPosition(anchor) {
|
|
35
|
+
switch (anchor) {
|
|
36
|
+
case 'NORTH':
|
|
37
|
+
return Position.Top;
|
|
38
|
+
case 'SOUTH':
|
|
39
|
+
return Position.Bottom;
|
|
40
|
+
case 'EAST':
|
|
41
|
+
return Position.Right;
|
|
42
|
+
case 'WEST':
|
|
43
|
+
return Position.Left;
|
|
44
|
+
default:
|
|
45
|
+
return Position.Top;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Get port position offset based on port count and index
|
|
50
|
+
*/
|
|
51
|
+
function getPortOffset(port, portIndex, totalPortsOnSide) {
|
|
52
|
+
if (port.position !== undefined) {
|
|
53
|
+
return `${port.position * 100}%`;
|
|
54
|
+
}
|
|
55
|
+
// Distribute ports evenly
|
|
56
|
+
const offset = ((portIndex + 1) / (totalPortsOnSide + 1)) * 100;
|
|
57
|
+
return `${offset}%`;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Get styling from symbol/variant defaults
|
|
61
|
+
*/
|
|
62
|
+
function getSymbolStyle(symbol, variant) {
|
|
63
|
+
const defaultStyle = {
|
|
64
|
+
fill: '#ffffff',
|
|
65
|
+
stroke: '#666666',
|
|
66
|
+
strokeWidth: 2,
|
|
67
|
+
};
|
|
68
|
+
if (!symbol) {
|
|
69
|
+
return defaultStyle;
|
|
70
|
+
}
|
|
71
|
+
// Start with symbol defaults
|
|
72
|
+
const symbolDefaults = symbol.defaults || {};
|
|
73
|
+
let style = {
|
|
74
|
+
fill: symbolDefaults.fill || defaultStyle.fill,
|
|
75
|
+
stroke: symbolDefaults.stroke || defaultStyle.stroke,
|
|
76
|
+
strokeWidth: symbolDefaults.strokeWidth || defaultStyle.strokeWidth,
|
|
77
|
+
strokeDasharray: symbolDefaults.strokeDasharray,
|
|
78
|
+
};
|
|
79
|
+
// Apply variant overrides
|
|
80
|
+
if (variant && symbol.variants?.[variant]) {
|
|
81
|
+
const variantDefaults = symbol.variants[variant].defaults || {};
|
|
82
|
+
style = {
|
|
83
|
+
...style,
|
|
84
|
+
fill: variantDefaults.fill || style.fill,
|
|
85
|
+
stroke: variantDefaults.stroke || style.stroke,
|
|
86
|
+
strokeWidth: variantDefaults.strokeWidth || style.strokeWidth,
|
|
87
|
+
strokeDasharray: variantDefaults.strokeDasharray || style.strokeDasharray,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
return style;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Get ports to render from symbol definition
|
|
94
|
+
*/
|
|
95
|
+
function getSymbolPorts(symbol, variant) {
|
|
96
|
+
if (!symbol) {
|
|
97
|
+
// Default ports
|
|
98
|
+
return [
|
|
99
|
+
{ id: 'in', anchor: 'NORTH', direction: 'in' },
|
|
100
|
+
{ id: 'out', anchor: 'SOUTH', direction: 'out' },
|
|
101
|
+
];
|
|
102
|
+
}
|
|
103
|
+
// Check for variant-specific ports first
|
|
104
|
+
if (variant && symbol.variants?.[variant]?.ports) {
|
|
105
|
+
return symbol.variants[variant].ports;
|
|
106
|
+
}
|
|
107
|
+
// Fall back to symbol ports
|
|
108
|
+
if (symbol.ports && symbol.ports.length > 0) {
|
|
109
|
+
return symbol.ports;
|
|
110
|
+
}
|
|
111
|
+
// Default ports
|
|
112
|
+
return [
|
|
113
|
+
{ id: 'in', anchor: 'NORTH', direction: 'in' },
|
|
114
|
+
{ id: 'out', anchor: 'SOUTH', direction: 'out' },
|
|
115
|
+
];
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Fallback mapping from old node types to symbols
|
|
119
|
+
*/
|
|
120
|
+
const legacyTypeMapping = {
|
|
121
|
+
service: 'arch-service',
|
|
122
|
+
database: 'arch-database',
|
|
123
|
+
module: 'flowchart-process',
|
|
124
|
+
external_api: 'arch-external-api',
|
|
125
|
+
actor: 'arch-actor',
|
|
126
|
+
group: 'arch-container',
|
|
127
|
+
process: 'flowchart-process',
|
|
128
|
+
decision: 'flowchart-decision',
|
|
129
|
+
terminal: 'flowchart-terminal',
|
|
130
|
+
io: 'flowchart-io',
|
|
131
|
+
document: 'flowchart-document',
|
|
132
|
+
};
|
|
133
|
+
/**
|
|
134
|
+
* SymbolNode component - renders any symbol from the registry
|
|
135
|
+
*
|
|
136
|
+
* Supports inline label editing via double-click:
|
|
137
|
+
* - Double-click to edit the label
|
|
138
|
+
* - Press Enter or blur to save
|
|
139
|
+
* - Press Escape to cancel
|
|
140
|
+
*/
|
|
141
|
+
export const SymbolNode = memo(function SymbolNode({ id, data, selected }) {
|
|
142
|
+
// Edit context for label editing
|
|
143
|
+
const { onLabelEdit, editingNodeId, startEditing, stopEditing } = useEditContext();
|
|
144
|
+
const isEditing = editingNodeId === id;
|
|
145
|
+
// Local state for edit value
|
|
146
|
+
const [editValue, setEditValue] = useState(data.label);
|
|
147
|
+
const inputRef = useRef(null);
|
|
148
|
+
// Resolve symbol ID (support legacy types)
|
|
149
|
+
const symbolId = data.symbolId || legacyTypeMapping[data.nodeType] || 'flowchart-process';
|
|
150
|
+
// Look up symbol and shape
|
|
151
|
+
const symbol = symbolRegistry.get(symbolId);
|
|
152
|
+
const shape = symbol ? shapeRegistry.get(symbol.shape) : shapeRegistry.get('rectangle');
|
|
153
|
+
// Get styling
|
|
154
|
+
const baseStyle = getSymbolStyle(symbol, data.variant);
|
|
155
|
+
const style = {
|
|
156
|
+
fill: data.fill || baseStyle.fill,
|
|
157
|
+
stroke: data.stroke || baseStyle.stroke,
|
|
158
|
+
strokeWidth: data.strokeWidth || baseStyle.strokeWidth,
|
|
159
|
+
strokeDasharray: baseStyle.strokeDasharray,
|
|
160
|
+
};
|
|
161
|
+
// Get dimensions
|
|
162
|
+
const width = data.width || shape?.defaultSize?.width || 120;
|
|
163
|
+
const height = data.height || shape?.defaultSize?.height || 60;
|
|
164
|
+
// Get ports
|
|
165
|
+
const ports = getSymbolPorts(symbol, data.variant);
|
|
166
|
+
// Group ports by side for positioning
|
|
167
|
+
const portsBySide = useMemo(() => {
|
|
168
|
+
const grouped = {};
|
|
169
|
+
ports.forEach((port) => {
|
|
170
|
+
const side = port.anchor;
|
|
171
|
+
if (!grouped[side])
|
|
172
|
+
grouped[side] = [];
|
|
173
|
+
grouped[side].push(port);
|
|
174
|
+
});
|
|
175
|
+
return grouped;
|
|
176
|
+
}, [ports]);
|
|
177
|
+
// Focus input when editing starts
|
|
178
|
+
useEffect(() => {
|
|
179
|
+
if (isEditing && inputRef.current) {
|
|
180
|
+
inputRef.current.focus();
|
|
181
|
+
inputRef.current.select();
|
|
182
|
+
}
|
|
183
|
+
}, [isEditing]);
|
|
184
|
+
// Sync edit value when data.label changes (external updates)
|
|
185
|
+
useEffect(() => {
|
|
186
|
+
if (!isEditing) {
|
|
187
|
+
setEditValue(data.label);
|
|
188
|
+
}
|
|
189
|
+
}, [data.label, isEditing]);
|
|
190
|
+
// Handle double-click to start editing
|
|
191
|
+
const handleDoubleClick = useCallback((e) => {
|
|
192
|
+
e.stopPropagation(); // Prevent React Flow from handling
|
|
193
|
+
setEditValue(data.label);
|
|
194
|
+
startEditing(id);
|
|
195
|
+
}, [id, data.label, startEditing]);
|
|
196
|
+
// Handle save (Enter or blur)
|
|
197
|
+
const handleSave = useCallback(() => {
|
|
198
|
+
if (editValue.trim() !== data.label && onLabelEdit) {
|
|
199
|
+
onLabelEdit(id, editValue.trim());
|
|
200
|
+
}
|
|
201
|
+
stopEditing();
|
|
202
|
+
}, [id, editValue, data.label, onLabelEdit, stopEditing]);
|
|
203
|
+
// Handle cancel (Escape)
|
|
204
|
+
const handleCancel = useCallback(() => {
|
|
205
|
+
setEditValue(data.label);
|
|
206
|
+
stopEditing();
|
|
207
|
+
}, [data.label, stopEditing]);
|
|
208
|
+
// Handle key down events
|
|
209
|
+
const handleKeyDown = useCallback((e) => {
|
|
210
|
+
if (e.key === 'Enter') {
|
|
211
|
+
e.preventDefault();
|
|
212
|
+
handleSave();
|
|
213
|
+
}
|
|
214
|
+
else if (e.key === 'Escape') {
|
|
215
|
+
e.preventDefault();
|
|
216
|
+
handleCancel();
|
|
217
|
+
}
|
|
218
|
+
}, [handleSave, handleCancel]);
|
|
219
|
+
// Accessible name and state (R-014). Nodes carried no ARIA at all, so a
|
|
220
|
+
// screen reader announced an unlabelled group of divs.
|
|
221
|
+
const kindName = symbol?.name ?? data.symbolId ?? data.nodeType ?? 'node';
|
|
222
|
+
const accessibleName = `${data.label ?? id}, ${kindName}`;
|
|
223
|
+
const dragDescription = data.dragState === 'compatible'
|
|
224
|
+
? 'can connect here'
|
|
225
|
+
: data.dragState === 'warning'
|
|
226
|
+
? 'can connect here with a warning'
|
|
227
|
+
: data.dragState === 'incompatible'
|
|
228
|
+
? 'cannot connect here'
|
|
229
|
+
: undefined;
|
|
230
|
+
return (_jsxs("div", { role: "group", "aria-label": accessibleName, "aria-selected": selected, "aria-describedby": dragDescription ? `${id}-drag-state` : undefined, tabIndex: 0, style: {
|
|
231
|
+
position: 'relative',
|
|
232
|
+
width,
|
|
233
|
+
height,
|
|
234
|
+
cursor: isEditing ? 'text' : 'grab',
|
|
235
|
+
}, onDoubleClick: handleDoubleClick, children: [dragDescription && (_jsx("span", { id: `${id}-drag-state`, style: SR_ONLY, children: dragDescription })), shape && (_jsx("div", { style: {
|
|
236
|
+
position: 'absolute',
|
|
237
|
+
top: 0,
|
|
238
|
+
left: 0,
|
|
239
|
+
width: '100%',
|
|
240
|
+
height: '100%',
|
|
241
|
+
}, children: _jsx(ShapeRenderer, { shape: shape, width: width, height: height, fill: style.fill, stroke: selected ? '#0066ff' : style.stroke, strokeWidth: selected ? style.strokeWidth + 1 : style.strokeWidth, strokeDasharray: style.strokeDasharray, parameters: symbol?.defaults, sketch: data.sketch }) })), _jsx("div", { style: {
|
|
242
|
+
position: 'absolute',
|
|
243
|
+
top: 0,
|
|
244
|
+
left: 0,
|
|
245
|
+
width: '100%',
|
|
246
|
+
height: '100%',
|
|
247
|
+
display: 'flex',
|
|
248
|
+
alignItems: 'center',
|
|
249
|
+
justifyContent: 'center',
|
|
250
|
+
padding: '8px',
|
|
251
|
+
boxSizing: 'border-box',
|
|
252
|
+
}, children: isEditing ? (_jsx("input", { ref: inputRef, type: "text", value: editValue, onChange: (e) => setEditValue(e.target.value), onBlur: handleSave, onKeyDown: handleKeyDown, style: {
|
|
253
|
+
fontSize: '12px',
|
|
254
|
+
fontWeight: 500,
|
|
255
|
+
textAlign: 'center',
|
|
256
|
+
width: '100%',
|
|
257
|
+
maxWidth: '100%',
|
|
258
|
+
padding: '2px 4px',
|
|
259
|
+
border: '1px solid #0066ff',
|
|
260
|
+
borderRadius: '2px',
|
|
261
|
+
outline: 'none',
|
|
262
|
+
background: 'white',
|
|
263
|
+
} })) : (_jsx("div", { style: {
|
|
264
|
+
fontSize: data.sketch ? '14px' : '12px',
|
|
265
|
+
fontWeight: 500,
|
|
266
|
+
fontFamily: data.sketch ? "'Caveat', 'Comic Sans MS', cursive" : undefined,
|
|
267
|
+
textAlign: 'center',
|
|
268
|
+
wordWrap: 'break-word',
|
|
269
|
+
maxWidth: '100%',
|
|
270
|
+
overflow: 'hidden',
|
|
271
|
+
textOverflow: 'ellipsis',
|
|
272
|
+
}, children: data.label })) }), ports.map((port, idx) => {
|
|
273
|
+
const portsOnSide = portsBySide[port.anchor] || [];
|
|
274
|
+
const indexOnSide = portsOnSide.indexOf(port);
|
|
275
|
+
const offset = getPortOffset(port, indexOnSide, portsOnSide.length);
|
|
276
|
+
const position = anchorToPosition(port.anchor);
|
|
277
|
+
const isVertical = position === Position.Top || position === Position.Bottom;
|
|
278
|
+
const handleStyle = {
|
|
279
|
+
position: 'absolute',
|
|
280
|
+
...(isVertical
|
|
281
|
+
? { left: offset, transform: 'translateX(-50%)' }
|
|
282
|
+
: { top: offset, transform: 'translateY(-50%)' }),
|
|
283
|
+
};
|
|
284
|
+
// While a connection is being dragged, handles say whether dropping
|
|
285
|
+
// here would be accepted. Idle handles keep the neutral colour.
|
|
286
|
+
const targetHandleId = port.direction === 'inout' ? `${port.id}-in` : port.id;
|
|
287
|
+
const sourceHandleId = port.direction === 'inout' ? `${port.id}-out` : port.id;
|
|
288
|
+
const stateFor = (handleId) => data.dragStates?.[handleId] ?? data.dragState ?? 'idle';
|
|
289
|
+
const dragState = stateFor(port.direction === 'out' ? sourceHandleId : targetHandleId);
|
|
290
|
+
const handleFill = dragState === 'compatible'
|
|
291
|
+
? '#22c55e'
|
|
292
|
+
: dragState === 'warning'
|
|
293
|
+
? '#f59e0b'
|
|
294
|
+
: dragState === 'incompatible'
|
|
295
|
+
? '#ef4444'
|
|
296
|
+
: '#555';
|
|
297
|
+
const handleSize = dragState === 'idle' ? 8 : 12;
|
|
298
|
+
const handleVisual = {
|
|
299
|
+
background: handleFill,
|
|
300
|
+
width: handleSize,
|
|
301
|
+
height: handleSize,
|
|
302
|
+
...(dragState === 'incompatible' ? { cursor: 'not-allowed' } : {}),
|
|
303
|
+
};
|
|
304
|
+
// Handle type based on direction
|
|
305
|
+
const handleType = port.direction === 'in'
|
|
306
|
+
? 'target'
|
|
307
|
+
: port.direction === 'out'
|
|
308
|
+
? 'source'
|
|
309
|
+
: undefined; // inout gets both
|
|
310
|
+
if (port.direction === 'inout') {
|
|
311
|
+
// Render both source and target for bidirectional ports
|
|
312
|
+
return (_jsxs("div", { children: [_jsx(Handle, { type: "target", position: position, id: `${port.id}-in`, "aria-label": `${port.label ?? port.id}: ${stateFor(targetHandleId)}`, style: {
|
|
313
|
+
...handleStyle,
|
|
314
|
+
...handleVisual,
|
|
315
|
+
background: stateFor(targetHandleId) === 'compatible' ? '#22c55e'
|
|
316
|
+
: stateFor(targetHandleId) === 'warning' ? '#f59e0b'
|
|
317
|
+
: stateFor(targetHandleId) === 'incompatible' ? '#ef4444' : '#555',
|
|
318
|
+
} }), _jsx(Handle, { type: "source", position: position, id: `${port.id}-out`, "aria-label": `${port.label ?? port.id}: ${stateFor(sourceHandleId)}`, style: {
|
|
319
|
+
...handleStyle,
|
|
320
|
+
...handleVisual,
|
|
321
|
+
background: stateFor(sourceHandleId) === 'compatible' ? '#22c55e'
|
|
322
|
+
: stateFor(sourceHandleId) === 'warning' ? '#f59e0b'
|
|
323
|
+
: stateFor(sourceHandleId) === 'incompatible' ? '#ef4444' : '#555',
|
|
324
|
+
} })] }, port.id));
|
|
325
|
+
}
|
|
326
|
+
return (_jsx(Handle, { type: handleType, position: position, id: port.id, "aria-label": `${port.label ?? port.id}: ${dragState}`, style: {
|
|
327
|
+
...handleStyle,
|
|
328
|
+
...handleVisual,
|
|
329
|
+
} }, port.id));
|
|
330
|
+
})] }));
|
|
331
|
+
});
|
|
332
|
+
export default SymbolNode;
|
|
333
|
+
//# sourceMappingURL=SymbolNode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SymbolNode.js","sourceRoot":"","sources":["../../src/components/SymbolNode.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Coral Node Components
|
|
3
|
+
*/
|
|
4
|
+
export { ServiceNode, DatabaseNode, ExternalApiNode, ActorNode, ModuleNode, GroupNode, nodeTypes, } from './nodes.js';
|
|
5
|
+
export { ShapeRenderer, type ShapeRendererProps } from './ShapeRenderer.js';
|
|
6
|
+
export { SymbolNode, type SymbolNodeData } from './SymbolNode.js';
|
|
7
|
+
export { EditProvider, useEditContext, useIsEditing, type EditProviderProps, type OnLabelEditCallback, } from './EditContext.js';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,WAAW,EACX,YAAY,EACZ,eAAe,EACf,SAAS,EACT,UAAU,EACV,SAAS,EACT,SAAS,GACV,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EAAE,UAAU,EAAE,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGlE,OAAO,EACL,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,GACzB,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Coral Node Components
|
|
3
|
+
*/
|
|
4
|
+
export { ServiceNode, DatabaseNode, ExternalApiNode, ActorNode, ModuleNode, GroupNode, nodeTypes, } from './nodes.js';
|
|
5
|
+
// New symbol-aware components
|
|
6
|
+
export { ShapeRenderer } from './ShapeRenderer.js';
|
|
7
|
+
export { SymbolNode } from './SymbolNode.js';
|
|
8
|
+
// Edit context for inline label editing
|
|
9
|
+
export { EditProvider, useEditContext, useIsEditing, } from './EditContext.js';
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,WAAW,EACX,YAAY,EACZ,eAAe,EACf,SAAS,EACT,UAAU,EACV,SAAS,EACT,SAAS,GACV,MAAM,YAAY,CAAC;AAEpB,8BAA8B;AAC9B,OAAO,EAAE,aAAa,EAA2B,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EAAE,UAAU,EAAuB,MAAM,iBAAiB,CAAC;AAElE,wCAAwC;AACxC,OAAO,EACL,YAAY,EACZ,cAAc,EACd,YAAY,GAGb,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Custom Node Components for Coral Editor
|
|
3
|
+
*
|
|
4
|
+
* Each node type gets a distinct visual style.
|
|
5
|
+
*/
|
|
6
|
+
import React from 'react';
|
|
7
|
+
import type { CoralNodeProps } from '../types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Service Node - rectangular with rounded corners
|
|
10
|
+
*/
|
|
11
|
+
export declare const ServiceNode: React.MemoExoticComponent<({ data, selected }: CoralNodeProps) => React.JSX.Element>;
|
|
12
|
+
/**
|
|
13
|
+
* Database Node - cylinder-like appearance
|
|
14
|
+
*/
|
|
15
|
+
export declare const DatabaseNode: React.MemoExoticComponent<({ data, selected }: CoralNodeProps) => React.JSX.Element>;
|
|
16
|
+
/**
|
|
17
|
+
* External API Node - cloud-like appearance
|
|
18
|
+
*/
|
|
19
|
+
export declare const ExternalApiNode: React.MemoExoticComponent<({ data, selected }: CoralNodeProps) => React.JSX.Element>;
|
|
20
|
+
/**
|
|
21
|
+
* Actor Node - stick figure / person shape
|
|
22
|
+
*/
|
|
23
|
+
export declare const ActorNode: React.MemoExoticComponent<({ data, selected }: CoralNodeProps) => React.JSX.Element>;
|
|
24
|
+
/**
|
|
25
|
+
* Module Node - smaller, component-like
|
|
26
|
+
*/
|
|
27
|
+
export declare const ModuleNode: React.MemoExoticComponent<({ data, selected }: CoralNodeProps) => React.JSX.Element>;
|
|
28
|
+
/**
|
|
29
|
+
* Group Node - container for other nodes
|
|
30
|
+
*/
|
|
31
|
+
export declare const GroupNode: React.MemoExoticComponent<({ data, selected }: CoralNodeProps) => React.JSX.Element>;
|
|
32
|
+
/**
|
|
33
|
+
* Node type registry for React Flow
|
|
34
|
+
*/
|
|
35
|
+
export declare const nodeTypes: {
|
|
36
|
+
coralService: React.MemoExoticComponent<({ data, selected }: CoralNodeProps) => React.JSX.Element>;
|
|
37
|
+
coralDatabase: React.MemoExoticComponent<({ data, selected }: CoralNodeProps) => React.JSX.Element>;
|
|
38
|
+
coralExternalApi: React.MemoExoticComponent<({ data, selected }: CoralNodeProps) => React.JSX.Element>;
|
|
39
|
+
coralActor: React.MemoExoticComponent<({ data, selected }: CoralNodeProps) => React.JSX.Element>;
|
|
40
|
+
coralModule: React.MemoExoticComponent<({ data, selected }: CoralNodeProps) => React.JSX.Element>;
|
|
41
|
+
coralGroup: React.MemoExoticComponent<({ data, selected }: CoralNodeProps) => React.JSX.Element>;
|
|
42
|
+
};
|
|
43
|
+
//# sourceMappingURL=nodes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nodes.d.ts","sourceRoot":"","sources":["../../src/components/nodes.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAe,MAAM,OAAO,CAAC;AAEpC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAmClD;;GAEG;AACH,eAAO,MAAM,WAAW,iDAA6B,cAAc,uBAkBjE,CAAC;AAGH;;GAEG;AACH,eAAO,MAAM,YAAY,iDAA6B,cAAc,uBA4BlE,CAAC;AAGH;;GAEG;AACH,eAAO,MAAM,eAAe,iDAA6B,cAAc,uBAerE,CAAC;AAGH;;GAEG;AACH,eAAO,MAAM,SAAS,iDAA6B,cAAc,uBAqB/D,CAAC;AAGH;;GAEG;AACH,eAAO,MAAM,UAAU,iDAA6B,cAAc,uBAehE,CAAC;AAGH;;GAEG;AACH,eAAO,MAAM,SAAS,iDAA6B,cAAc,uBA8B/D,CAAC;AAGH;;GAEG;AACH,eAAO,MAAM,SAAS;iEAnK+B,cAAc;kEAwBb,cAAc;qEAkCX,cAAc;+DAqBpB,cAAc;gEA2Bb,cAAc;+DAqBf,cAAc;CA2ChE,CAAC"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* Custom Node Components for Coral Editor
|
|
4
|
+
*
|
|
5
|
+
* Each node type gets a distinct visual style.
|
|
6
|
+
*/
|
|
7
|
+
import { memo } from 'react';
|
|
8
|
+
import { Handle, Position } from '@xyflow/react';
|
|
9
|
+
const NodeWrapper = ({ children, selected, className = '', style = {}, }) => (_jsx("div", { className: `coral-node ${className} ${selected ? 'selected' : ''}`, style: {
|
|
10
|
+
padding: '10px 15px',
|
|
11
|
+
borderRadius: '4px',
|
|
12
|
+
border: selected ? '2px solid #1a73e8' : '1px solid #ccc',
|
|
13
|
+
backgroundColor: '#fff',
|
|
14
|
+
boxShadow: selected ? '0 0 0 2px rgba(26, 115, 232, 0.2)' : '0 1px 3px rgba(0,0,0,0.1)',
|
|
15
|
+
minWidth: '100px',
|
|
16
|
+
textAlign: 'center',
|
|
17
|
+
...style,
|
|
18
|
+
}, children: children }));
|
|
19
|
+
/**
|
|
20
|
+
* Service Node - rectangular with rounded corners
|
|
21
|
+
*/
|
|
22
|
+
export const ServiceNode = memo(({ data, selected }) => (_jsxs(NodeWrapper, { selected: selected, className: "coral-node-service", style: {
|
|
23
|
+
backgroundColor: '#e3f2fd',
|
|
24
|
+
borderColor: selected ? '#1a73e8' : '#90caf9',
|
|
25
|
+
}, children: [_jsx(Handle, { type: "target", position: Position.Top }), _jsx("div", { style: { fontWeight: 500 }, children: data.label }), data.description && (_jsx("div", { style: { fontSize: '11px', color: '#666', marginTop: '4px' }, children: data.description })), _jsx(Handle, { type: "source", position: Position.Bottom })] })));
|
|
26
|
+
ServiceNode.displayName = 'ServiceNode';
|
|
27
|
+
/**
|
|
28
|
+
* Database Node - cylinder-like appearance
|
|
29
|
+
*/
|
|
30
|
+
export const DatabaseNode = memo(({ data, selected }) => (_jsxs(NodeWrapper, { selected: selected, className: "coral-node-database", style: {
|
|
31
|
+
backgroundColor: '#fff3e0',
|
|
32
|
+
borderColor: selected ? '#1a73e8' : '#ffb74d',
|
|
33
|
+
borderRadius: '8px',
|
|
34
|
+
position: 'relative',
|
|
35
|
+
}, children: [_jsx(Handle, { type: "target", position: Position.Top }), _jsx("div", { style: {
|
|
36
|
+
position: 'absolute',
|
|
37
|
+
top: '-8px',
|
|
38
|
+
left: '10%',
|
|
39
|
+
right: '10%',
|
|
40
|
+
height: '16px',
|
|
41
|
+
backgroundColor: '#fff3e0',
|
|
42
|
+
borderRadius: '50%',
|
|
43
|
+
border: selected ? '2px solid #1a73e8' : '1px solid #ffb74d',
|
|
44
|
+
borderBottom: 'none',
|
|
45
|
+
} }), _jsx("div", { style: { fontWeight: 500, marginTop: '8px' }, children: data.label }), _jsx(Handle, { type: "source", position: Position.Bottom })] })));
|
|
46
|
+
DatabaseNode.displayName = 'DatabaseNode';
|
|
47
|
+
/**
|
|
48
|
+
* External API Node - cloud-like appearance
|
|
49
|
+
*/
|
|
50
|
+
export const ExternalApiNode = memo(({ data, selected }) => (_jsxs(NodeWrapper, { selected: selected, className: "coral-node-external-api", style: {
|
|
51
|
+
backgroundColor: '#fce4ec',
|
|
52
|
+
borderColor: selected ? '#1a73e8' : '#f48fb1',
|
|
53
|
+
borderStyle: 'dashed',
|
|
54
|
+
}, children: [_jsx(Handle, { type: "target", position: Position.Top }), _jsx("div", { style: { fontWeight: 500 }, children: data.label }), _jsx("div", { style: { fontSize: '10px', color: '#888' }, children: "External" }), _jsx(Handle, { type: "source", position: Position.Bottom })] })));
|
|
55
|
+
ExternalApiNode.displayName = 'ExternalApiNode';
|
|
56
|
+
/**
|
|
57
|
+
* Actor Node - stick figure / person shape
|
|
58
|
+
*/
|
|
59
|
+
export const ActorNode = memo(({ data, selected }) => (_jsxs(NodeWrapper, { selected: selected, className: "coral-node-actor", style: {
|
|
60
|
+
backgroundColor: '#e8f5e9',
|
|
61
|
+
borderColor: selected ? '#1a73e8' : '#81c784',
|
|
62
|
+
borderRadius: '50%',
|
|
63
|
+
width: '80px',
|
|
64
|
+
height: '80px',
|
|
65
|
+
display: 'flex',
|
|
66
|
+
flexDirection: 'column',
|
|
67
|
+
alignItems: 'center',
|
|
68
|
+
justifyContent: 'center',
|
|
69
|
+
}, children: [_jsx(Handle, { type: "target", position: Position.Top }), _jsx("div", { style: { fontSize: '24px' }, children: "\uD83D\uDC64" }), _jsx("div", { style: { fontWeight: 500, fontSize: '12px' }, children: data.label }), _jsx(Handle, { type: "source", position: Position.Bottom })] })));
|
|
70
|
+
ActorNode.displayName = 'ActorNode';
|
|
71
|
+
/**
|
|
72
|
+
* Module Node - smaller, component-like
|
|
73
|
+
*/
|
|
74
|
+
export const ModuleNode = memo(({ data, selected }) => (_jsxs(NodeWrapper, { selected: selected, className: "coral-node-module", style: {
|
|
75
|
+
backgroundColor: '#f3e5f5',
|
|
76
|
+
borderColor: selected ? '#1a73e8' : '#ce93d8',
|
|
77
|
+
padding: '6px 12px',
|
|
78
|
+
fontSize: '13px',
|
|
79
|
+
}, children: [_jsx(Handle, { type: "target", position: Position.Top }), _jsx("div", { style: { fontWeight: 500 }, children: data.label }), _jsx(Handle, { type: "source", position: Position.Bottom })] })));
|
|
80
|
+
ModuleNode.displayName = 'ModuleNode';
|
|
81
|
+
/**
|
|
82
|
+
* Group Node - container for other nodes
|
|
83
|
+
*/
|
|
84
|
+
export const GroupNode = memo(({ data, selected }) => (_jsxs("div", { className: `coral-node-group ${selected ? 'selected' : ''}`, style: {
|
|
85
|
+
padding: '10px',
|
|
86
|
+
borderRadius: '8px',
|
|
87
|
+
border: selected ? '2px dashed #1a73e8' : '2px dashed #bdbdbd',
|
|
88
|
+
backgroundColor: 'rgba(245, 245, 245, 0.5)',
|
|
89
|
+
minWidth: '200px',
|
|
90
|
+
minHeight: '150px',
|
|
91
|
+
}, children: [_jsx("div", { style: {
|
|
92
|
+
fontWeight: 600,
|
|
93
|
+
fontSize: '14px',
|
|
94
|
+
color: '#616161',
|
|
95
|
+
marginBottom: '10px',
|
|
96
|
+
paddingBottom: '5px',
|
|
97
|
+
borderBottom: '1px solid #e0e0e0',
|
|
98
|
+
}, children: data.label }), data.childCount !== undefined && data.childCount > 0 && (_jsxs("div", { style: { fontSize: '11px', color: '#9e9e9e' }, children: [data.childCount, " items"] }))] })));
|
|
99
|
+
GroupNode.displayName = 'GroupNode';
|
|
100
|
+
/**
|
|
101
|
+
* Node type registry for React Flow
|
|
102
|
+
*/
|
|
103
|
+
export const nodeTypes = {
|
|
104
|
+
coralService: ServiceNode,
|
|
105
|
+
coralDatabase: DatabaseNode,
|
|
106
|
+
coralExternalApi: ExternalApiNode,
|
|
107
|
+
coralActor: ActorNode,
|
|
108
|
+
coralModule: ModuleNode,
|
|
109
|
+
coralGroup: GroupNode,
|
|
110
|
+
};
|
|
111
|
+
//# sourceMappingURL=nodes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nodes.js","sourceRoot":"","sources":["../../src/components/nodes.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CoralEditor - Main visual editor component
|
|
3
|
+
*
|
|
4
|
+
* Renders Graph-IR as an interactive diagram using React Flow.
|
|
5
|
+
*/
|
|
6
|
+
import React from 'react';
|
|
7
|
+
import type { GraphIR, CoralNode, CoralEdge, EditorConfig, EditorCallbacks } from '../types.js';
|
|
8
|
+
export interface CoralEditorProps {
|
|
9
|
+
/** Graph-IR data to render */
|
|
10
|
+
graph: GraphIR;
|
|
11
|
+
/** Editor configuration */
|
|
12
|
+
config?: EditorConfig;
|
|
13
|
+
/** Callbacks for editor events */
|
|
14
|
+
callbacks?: EditorCallbacks;
|
|
15
|
+
/** CSS class name for the container */
|
|
16
|
+
className?: string;
|
|
17
|
+
/** Inline styles for the container */
|
|
18
|
+
style?: React.CSSProperties;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Main Coral Editor component
|
|
22
|
+
*/
|
|
23
|
+
export declare const CoralEditor: React.FC<CoralEditorProps>;
|
|
24
|
+
/**
|
|
25
|
+
* Hook to get Graph-IR from current editor state
|
|
26
|
+
*/
|
|
27
|
+
export declare function useGraphIR(nodes: CoralNode[], edges: CoralEdge[], originalGraph: GraphIR): GraphIR;
|
|
28
|
+
export default CoralEditor;
|
|
29
|
+
//# sourceMappingURL=CoralEditor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CoralEditor.d.ts","sourceRoot":"","sources":["../../src/editor/CoralEditor.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAyC,MAAM,OAAO,CAAC;AAiB9D,OAAO,KAAK,EACV,OAAO,EAGP,SAAS,EACT,SAAS,EACT,YAAY,EACZ,eAAe,EAChB,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,gBAAgB;IAC/B,8BAA8B;IAC9B,KAAK,EAAE,OAAO,CAAC;IACf,2BAA2B;IAC3B,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,kCAAkC;IAClC,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,uCAAuC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sCAAsC;IACtC,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B;AAaD;;GAEG;AACH,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,CA0IlD,CAAC;AAEF;;GAEG;AACH,wBAAgB,UAAU,CACxB,KAAK,EAAE,SAAS,EAAE,EAClB,KAAK,EAAE,SAAS,EAAE,EAClB,aAAa,EAAE,OAAO,GACrB,OAAO,CAWT;AAED,eAAe,WAAW,CAAC"}
|