excalidraw-gen 0.1.1 → 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 +18 -6
- package/dist/layout/arrow-router.d.ts +4 -1
- package/dist/layout/arrow-router.js +83 -10
- package/dist/layout/arrow-router.js.map +1 -1
- package/dist/layout/dag.js +27 -9
- package/dist/layout/dag.js.map +1 -1
- package/dist/renderer/elements.js +3 -2
- package/dist/renderer/elements.js.map +1 -1
- package/dist/renderer/index.js +41 -6
- package/dist/renderer/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -24,17 +24,29 @@ Define your diagram with nodes, edges, types, colors, sizes, and arrow styles
|
|
|
24
24
|
|
|
25
25
|
## Installation
|
|
26
26
|
|
|
27
|
+
### npx (no install required)
|
|
28
|
+
|
|
29
|
+
Run directly without installing anything:
|
|
30
|
+
|
|
27
31
|
```bash
|
|
28
|
-
|
|
29
|
-
cd excalidraw-gen
|
|
30
|
-
npm install
|
|
31
|
-
npm run build
|
|
32
|
+
npx excalidraw-gen generate diagram.json --out out.excalidraw
|
|
32
33
|
```
|
|
33
34
|
|
|
34
|
-
|
|
35
|
+
### Global install
|
|
35
36
|
|
|
36
37
|
```bash
|
|
37
|
-
npm
|
|
38
|
+
npm install -g excalidraw-gen
|
|
39
|
+
excalidraw-gen generate diagram.json --out out.excalidraw
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### From source
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
git clone https://github.com/fizznix/excalidraw-gen.git
|
|
46
|
+
cd excalidraw-gen
|
|
47
|
+
npm install
|
|
48
|
+
npm run build
|
|
49
|
+
npm link # makes excalidraw-gen available globally
|
|
38
50
|
```
|
|
39
51
|
|
|
40
52
|
---
|
|
@@ -10,5 +10,8 @@ export declare const VERTICAL_THRESHOLD = 60;
|
|
|
10
10
|
*
|
|
11
11
|
* @param sourceEdgeIndex 0-based index of this arrow among all arrows sharing the same source edge
|
|
12
12
|
* @param totalFromSource total count of arrows leaving from the same edge of source
|
|
13
|
+
* @param targetEdgeIndex 0-based index of this arrow among all arrows arriving at the same target edge
|
|
14
|
+
* @param totalToTarget total count of arrows arriving at the same edge of target
|
|
15
|
+
* @param allNodes all layout nodes — used for obstacle avoidance
|
|
13
16
|
*/
|
|
14
|
-
export declare function routeArrow(source: LayoutNode, target: LayoutNode, sourceEdgeIndex?: number, totalFromSource?: number): ArrowRoute;
|
|
17
|
+
export declare function routeArrow(source: LayoutNode, target: LayoutNode, sourceEdgeIndex?: number, totalFromSource?: number, targetEdgeIndex?: number, totalToTarget?: number, allNodes?: LayoutNode[]): ArrowRoute;
|
|
@@ -31,17 +31,19 @@ function getEdgeAnchor(node, side) {
|
|
|
31
31
|
}
|
|
32
32
|
return { x, y, side, fixedPoint: FIXED_POINTS[side] };
|
|
33
33
|
}
|
|
34
|
-
/** Stagger
|
|
35
|
-
* Only applied to left/right exits — for top/bottom, the step routing
|
|
36
|
-
* pattern naturally keeps arrows distinguishable without staggering the start.
|
|
37
|
-
*/
|
|
34
|
+
/** Stagger anchor for N arrows sharing the same edge of a node. */
|
|
38
35
|
function staggerAnchor(node, side, index, total) {
|
|
39
|
-
|
|
40
|
-
if (side === "top" || side === "bottom" || total <= 1) {
|
|
36
|
+
if (total <= 1) {
|
|
41
37
|
return getEdgeAnchor(node, side);
|
|
42
38
|
}
|
|
43
|
-
// Left/right exits: stagger vertically along the edge
|
|
44
39
|
const pct = 0.2 + (0.6 * index) / (total - 1);
|
|
40
|
+
if (side === "top" || side === "bottom") {
|
|
41
|
+
// Stagger horizontally along the top/bottom edge
|
|
42
|
+
const x = node.x + node.width * pct;
|
|
43
|
+
const y = side === "bottom" ? node.y + node.height : node.y;
|
|
44
|
+
return { x, y, side, fixedPoint: [pct, FIXED_POINTS[side][1]] };
|
|
45
|
+
}
|
|
46
|
+
// Left/right exits: stagger vertically along the edge
|
|
45
47
|
const x = side === "right" ? node.x + node.width : node.x;
|
|
46
48
|
const y = node.y + node.height * pct;
|
|
47
49
|
return {
|
|
@@ -153,18 +155,89 @@ function buildElbowPoints(sourceAnchor, targetAnchor) {
|
|
|
153
155
|
// Fallback — straight line
|
|
154
156
|
return [[0, 0], [dx, dy]];
|
|
155
157
|
}
|
|
158
|
+
// ── Obstacle avoidance ───────────────────────────────────────────────────────
|
|
159
|
+
const OBSTACLE_PAD = 20;
|
|
160
|
+
/**
|
|
161
|
+
* Post-process elbow points so vertical segments don't cross through
|
|
162
|
+
* intermediate nodes. When a vertical segment intersects a node, a
|
|
163
|
+
* horizontal detour is inserted around the obstacle.
|
|
164
|
+
*/
|
|
165
|
+
function avoidObstacles(relPoints, sourceAnchor, allNodes, sourceId, targetId) {
|
|
166
|
+
const excludeIds = new Set([sourceId, targetId]);
|
|
167
|
+
const obstacles = allNodes.filter((n) => !excludeIds.has(n.id));
|
|
168
|
+
if (obstacles.length === 0)
|
|
169
|
+
return relPoints;
|
|
170
|
+
const toAbs = (p) => [
|
|
171
|
+
sourceAnchor.x + p[0],
|
|
172
|
+
sourceAnchor.y + p[1],
|
|
173
|
+
];
|
|
174
|
+
const toRel = (p) => [
|
|
175
|
+
p[0] - sourceAnchor.x,
|
|
176
|
+
p[1] - sourceAnchor.y,
|
|
177
|
+
];
|
|
178
|
+
const abs = relPoints.map(toAbs);
|
|
179
|
+
const result = [abs[0]];
|
|
180
|
+
for (let i = 0; i < abs.length - 1; i++) {
|
|
181
|
+
const [x1, y1] = abs[i];
|
|
182
|
+
const [x2, y2] = abs[i + 1];
|
|
183
|
+
const isVertical = Math.abs(x2 - x1) < 2;
|
|
184
|
+
if (isVertical) {
|
|
185
|
+
const segX = x1;
|
|
186
|
+
const minY = Math.min(y1, y2);
|
|
187
|
+
const maxY = Math.max(y1, y2);
|
|
188
|
+
const goingDown = y2 > y1;
|
|
189
|
+
// Find nodes whose padded bounding box is crossed by this vertical segment
|
|
190
|
+
const blockers = obstacles.filter((n) => segX > n.x - OBSTACLE_PAD &&
|
|
191
|
+
segX < n.x + n.width + OBSTACLE_PAD &&
|
|
192
|
+
maxY > n.y &&
|
|
193
|
+
minY < n.y + n.height);
|
|
194
|
+
if (blockers.length > 0) {
|
|
195
|
+
// Combined bounding box of all blockers on this segment
|
|
196
|
+
const bLeft = Math.min(...blockers.map((n) => n.x));
|
|
197
|
+
const bRight = Math.max(...blockers.map((n) => n.x + n.width));
|
|
198
|
+
const bTop = Math.min(...blockers.map((n) => n.y));
|
|
199
|
+
const bBottom = Math.max(...blockers.map((n) => n.y + n.height));
|
|
200
|
+
// Detour left or right — pick the closer clear side
|
|
201
|
+
const leftX = bLeft - OBSTACLE_PAD;
|
|
202
|
+
const rightX = bRight + OBSTACLE_PAD;
|
|
203
|
+
const detourX = Math.abs(segX - leftX) <= Math.abs(segX - rightX) ? leftX : rightX;
|
|
204
|
+
// Enter detour before the blocker, exit after it
|
|
205
|
+
const enterY = goingDown
|
|
206
|
+
? Math.max(y1, bTop - OBSTACLE_PAD)
|
|
207
|
+
: Math.min(y1, bBottom + OBSTACLE_PAD);
|
|
208
|
+
const exitY = goingDown
|
|
209
|
+
? Math.min(y2, bBottom + OBSTACLE_PAD)
|
|
210
|
+
: Math.max(y2, bTop - OBSTACLE_PAD);
|
|
211
|
+
result.push([segX, enterY]);
|
|
212
|
+
result.push([detourX, enterY]);
|
|
213
|
+
result.push([detourX, exitY]);
|
|
214
|
+
result.push([segX, exitY]);
|
|
215
|
+
result.push(abs[i + 1]);
|
|
216
|
+
continue;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
result.push(abs[i + 1]);
|
|
220
|
+
}
|
|
221
|
+
return result.map(toRel);
|
|
222
|
+
}
|
|
156
223
|
// ── Public API ───────────────────────────────────────────────────────────────
|
|
157
224
|
/**
|
|
158
225
|
* Route an elbow arrow from source → target nodes.
|
|
159
226
|
*
|
|
160
227
|
* @param sourceEdgeIndex 0-based index of this arrow among all arrows sharing the same source edge
|
|
161
228
|
* @param totalFromSource total count of arrows leaving from the same edge of source
|
|
229
|
+
* @param targetEdgeIndex 0-based index of this arrow among all arrows arriving at the same target edge
|
|
230
|
+
* @param totalToTarget total count of arrows arriving at the same edge of target
|
|
231
|
+
* @param allNodes all layout nodes — used for obstacle avoidance
|
|
162
232
|
*/
|
|
163
|
-
function routeArrow(source, target, sourceEdgeIndex = 0, totalFromSource = 1) {
|
|
233
|
+
function routeArrow(source, target, sourceEdgeIndex = 0, totalFromSource = 1, targetEdgeIndex = 0, totalToTarget = 1, allNodes = []) {
|
|
164
234
|
const { sourceSide, targetSide } = chooseSides(source, target);
|
|
165
235
|
const sourceAnchor = staggerAnchor(source, sourceSide, sourceEdgeIndex, totalFromSource);
|
|
166
|
-
const targetAnchor =
|
|
167
|
-
|
|
236
|
+
const targetAnchor = staggerAnchor(target, targetSide, targetEdgeIndex, totalToTarget);
|
|
237
|
+
let points = buildElbowPoints(sourceAnchor, targetAnchor);
|
|
238
|
+
if (allNodes.length > 0) {
|
|
239
|
+
points = avoidObstacles(points, sourceAnchor, allNodes, source.id, target.id);
|
|
240
|
+
}
|
|
168
241
|
const { width, height } = boundingBox(points);
|
|
169
242
|
return { sourceAnchor, targetAnchor, points, width, height };
|
|
170
243
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arrow-router.js","sourceRoot":"","sources":["../../src/layout/arrow-router.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"arrow-router.js","sourceRoot":"","sources":["../../src/layout/arrow-router.ts"],"names":[],"mappings":"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"}
|
package/dist/layout/dag.js
CHANGED
|
@@ -2,10 +2,11 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.layoutDAG = layoutDAG;
|
|
4
4
|
const DEFAULT_NODE_WIDTH = 180;
|
|
5
|
+
const MAX_NODE_WIDTH = 260;
|
|
5
6
|
const DEFAULT_NODE_HEIGHT = 80;
|
|
6
7
|
const MIN_NODE_HEIGHT = 60;
|
|
7
|
-
const
|
|
8
|
-
const SPACING_GAP_Y =
|
|
8
|
+
const MIN_GAP_X = 60; // minimum horizontal gap between adjacent nodes
|
|
9
|
+
const SPACING_GAP_Y = 90; // vertical gap between bottom of one row and top of next
|
|
9
10
|
const MARGIN_X = 80;
|
|
10
11
|
const MARGIN_Y = 80;
|
|
11
12
|
// Font constants mirrored from renderer — used to estimate node height from label
|
|
@@ -31,6 +32,14 @@ function effectiveHeight(label, nodeWidth, styleHeight) {
|
|
|
31
32
|
const textH = Math.ceil(lines * FONT_SIZE * LINE_HEIGHT);
|
|
32
33
|
return Math.max(MIN_NODE_HEIGHT, textH + TEXT_PADDING_Y);
|
|
33
34
|
}
|
|
35
|
+
/** Compute a node width that fits the longest line comfortably. */
|
|
36
|
+
function effectiveWidth(label, styleWidth) {
|
|
37
|
+
if (styleWidth !== undefined)
|
|
38
|
+
return styleWidth;
|
|
39
|
+
const longestLine = Math.max(...label.split("\n").map((l) => l.length));
|
|
40
|
+
const needed = longestLine * CHAR_WIDTH_EST + TEXT_PADDING_X + 24; // 24px extra breathing room
|
|
41
|
+
return Math.min(MAX_NODE_WIDTH, Math.max(DEFAULT_NODE_WIDTH, needed));
|
|
42
|
+
}
|
|
34
43
|
/**
|
|
35
44
|
* BFS-based layered DAG layout using Kahn's algorithm.
|
|
36
45
|
* Each node is enqueued exactly once (when all its predecessors are processed),
|
|
@@ -103,18 +112,25 @@ function layoutDAG(diagram) {
|
|
|
103
112
|
levelGroups.get(lvl).push(id);
|
|
104
113
|
}
|
|
105
114
|
const sortedLevels = [...levelGroups.keys()].sort((a, b) => a - b);
|
|
106
|
-
// Widest level (node count) drives the total canvas width
|
|
107
|
-
const maxLevelCount = Math.max(...sortedLevels.map((l) => levelGroups.get(l).length));
|
|
108
|
-
const totalCanvasWidth = maxLevelCount * SPACING_X;
|
|
109
115
|
// ── Compute effective dimensions per node ─────────────────────────────────
|
|
110
116
|
const nodeMap = new Map(nodes.map((n) => [n.id, n]));
|
|
111
117
|
const nodeDims = new Map();
|
|
112
118
|
for (const id of nodeIds) {
|
|
113
119
|
const n = nodeMap.get(id);
|
|
114
|
-
const w = n.style?.width
|
|
120
|
+
const w = effectiveWidth(n.label, n.style?.width);
|
|
115
121
|
const h = effectiveHeight(n.label, w, n.style?.height);
|
|
116
122
|
nodeDims.set(id, { width: w, height: h });
|
|
117
123
|
}
|
|
124
|
+
// ── Compute per-level row width (sum of node widths + gaps) ───────────────
|
|
125
|
+
// This replaces the old fixed SPACING_X approach.
|
|
126
|
+
function levelRowWidth(group) {
|
|
127
|
+
let total = 0;
|
|
128
|
+
for (const id of group)
|
|
129
|
+
total += nodeDims.get(id).width;
|
|
130
|
+
total += Math.max(0, group.length - 1) * MIN_GAP_X;
|
|
131
|
+
return total;
|
|
132
|
+
}
|
|
133
|
+
const maxRowWidth = Math.max(...sortedLevels.map((l) => levelRowWidth(levelGroups.get(l))));
|
|
118
134
|
// ── Compute cumulative Y per level (dynamic row heights) ──────────────────
|
|
119
135
|
let cumulativeY = MARGIN_Y;
|
|
120
136
|
const levelY = new Map();
|
|
@@ -128,8 +144,9 @@ function layoutDAG(diagram) {
|
|
|
128
144
|
for (const lvl of sortedLevels) {
|
|
129
145
|
const group = levelGroups.get(lvl);
|
|
130
146
|
group.sort((a, b) => nodeIds.indexOf(a) - nodeIds.indexOf(b));
|
|
131
|
-
const
|
|
132
|
-
const offsetX = MARGIN_X + Math.floor((
|
|
147
|
+
const rowW = levelRowWidth(group);
|
|
148
|
+
const offsetX = MARGIN_X + Math.floor((maxRowWidth - rowW) / 2);
|
|
149
|
+
let cursorX = offsetX;
|
|
133
150
|
group.forEach((id, colIndex) => {
|
|
134
151
|
const inputNode = nodeMap.get(id);
|
|
135
152
|
const { width, height } = nodeDims.get(id);
|
|
@@ -139,13 +156,14 @@ function layoutDAG(diagram) {
|
|
|
139
156
|
type: inputNode.type ?? "process",
|
|
140
157
|
metadata: inputNode.metadata,
|
|
141
158
|
style: inputNode.style,
|
|
142
|
-
x:
|
|
159
|
+
x: cursorX,
|
|
143
160
|
y: levelY.get(lvl),
|
|
144
161
|
width,
|
|
145
162
|
height,
|
|
146
163
|
level: lvl,
|
|
147
164
|
colIndex,
|
|
148
165
|
});
|
|
166
|
+
cursorX += width + MIN_GAP_X;
|
|
149
167
|
});
|
|
150
168
|
}
|
|
151
169
|
return layoutNodes;
|
package/dist/layout/dag.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dag.js","sourceRoot":"","sources":["../../src/layout/dag.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"dag.js","sourceRoot":"","sources":["../../src/layout/dag.ts"],"names":[],"mappings":"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"}
|
|
@@ -111,6 +111,7 @@ function createArrowElement(edge, route, defaultStrokeColor) {
|
|
|
111
111
|
const strokeStyle = edge.style?.strokeStyle ?? "solid";
|
|
112
112
|
const strokeWidth = edge.style?.strokeWidth ?? 2;
|
|
113
113
|
const opacity = edge.style?.opacity ?? 100;
|
|
114
|
+
const labelId = edge.label ? `arrow-${edge.from}-${edge.to}-label` : null;
|
|
114
115
|
const arrow = {
|
|
115
116
|
...baseFields(arrowId, sourceAnchor.x, sourceAnchor.y, width, height),
|
|
116
117
|
type: "arrow",
|
|
@@ -121,7 +122,7 @@ function createArrowElement(edge, route, defaultStrokeColor) {
|
|
|
121
122
|
opacity,
|
|
122
123
|
roughness: 0,
|
|
123
124
|
roundness: null,
|
|
124
|
-
boundElements: null,
|
|
125
|
+
boundElements: labelId ? [{ type: "text", id: labelId }] : null,
|
|
125
126
|
points,
|
|
126
127
|
lastCommittedPoint: null,
|
|
127
128
|
startArrowhead: edge.bidirectional ? "arrow" : null,
|
|
@@ -203,7 +204,7 @@ function createArrowLabel(edge, route) {
|
|
|
203
204
|
textAlign: "center",
|
|
204
205
|
verticalAlign: "middle",
|
|
205
206
|
baseline: Math.ceil(13 * 0.8),
|
|
206
|
-
containerId:
|
|
207
|
+
containerId: `arrow-${edge.from}-${edge.to}`,
|
|
207
208
|
lineHeight: LINE_HEIGHT,
|
|
208
209
|
};
|
|
209
210
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"elements.js","sourceRoot":"","sources":["../../src/renderer/elements.ts"],"names":[],"mappings":";;AAoEA,kDAgEC;AAID,
|
|
1
|
+
{"version":3,"file":"elements.js","sourceRoot":"","sources":["../../src/renderer/elements.ts"],"names":[],"mappings":"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"}
|
package/dist/renderer/index.js
CHANGED
|
@@ -29,8 +29,10 @@ function render(diagram, layoutNodes, template) {
|
|
|
29
29
|
edgeGroups.set(key, []);
|
|
30
30
|
edgeGroups.get(key).push(edge);
|
|
31
31
|
}
|
|
32
|
-
// Count per-side groupings
|
|
32
|
+
// Count per-side groupings (source side)
|
|
33
33
|
const sideGroups = new Map();
|
|
34
|
+
// Also group by target side for staggering incoming arrows
|
|
35
|
+
const targetSideGroups = new Map();
|
|
34
36
|
for (const [fromId, edges] of edgeGroups) {
|
|
35
37
|
const source = nodeMap.get(fromId);
|
|
36
38
|
if (!source)
|
|
@@ -42,16 +44,24 @@ function render(diagram, layoutNodes, template) {
|
|
|
42
44
|
// Determine side using the same threshold as the arrow router
|
|
43
45
|
const dx = (target.x + target.width / 2) - (source.x + source.width / 2);
|
|
44
46
|
const dy = (target.y + target.height / 2) - (source.y + source.height / 2);
|
|
45
|
-
const
|
|
47
|
+
const sourceSide = Math.abs(dy) > arrow_router_js_1.VERTICAL_THRESHOLD
|
|
46
48
|
? dy > 0 ? "bottom" : "top"
|
|
47
49
|
: dx >= 0 ? "right" : "left";
|
|
48
|
-
const
|
|
50
|
+
const targetSide = Math.abs(dy) > arrow_router_js_1.VERTICAL_THRESHOLD
|
|
51
|
+
? dy > 0 ? "top" : "bottom"
|
|
52
|
+
: dx >= 0 ? "left" : "right";
|
|
53
|
+
const sideKey = `${fromId}:${sourceSide}`;
|
|
49
54
|
if (!sideGroups.has(sideKey))
|
|
50
55
|
sideGroups.set(sideKey, []);
|
|
51
56
|
sideGroups.get(sideKey).push(edge);
|
|
57
|
+
const tKey = `${edge.to}:${targetSide}`;
|
|
58
|
+
if (!targetSideGroups.has(tKey))
|
|
59
|
+
targetSideGroups.set(tKey, []);
|
|
60
|
+
targetSideGroups.get(tKey).push(edge);
|
|
52
61
|
}
|
|
53
62
|
}
|
|
54
|
-
// Render arrows
|
|
63
|
+
// Render arrows + collect arrow bindings per shape
|
|
64
|
+
const arrowBindings = new Map();
|
|
55
65
|
for (const [sideKey, sideEdges] of sideGroups) {
|
|
56
66
|
const fromId = sideKey.split(":")[0];
|
|
57
67
|
const source = nodeMap.get(fromId);
|
|
@@ -61,16 +71,41 @@ function render(diagram, layoutNodes, template) {
|
|
|
61
71
|
const target = nodeMap.get(edge.to);
|
|
62
72
|
if (!target)
|
|
63
73
|
return;
|
|
64
|
-
|
|
74
|
+
// Look up target-side stagger info
|
|
75
|
+
const dx = (target.x + target.width / 2) - (source.x + source.width / 2);
|
|
76
|
+
const dy = (target.y + target.height / 2) - (source.y + source.height / 2);
|
|
77
|
+
const targetSide = Math.abs(dy) > arrow_router_js_1.VERTICAL_THRESHOLD
|
|
78
|
+
? dy > 0 ? "top" : "bottom"
|
|
79
|
+
: dx >= 0 ? "left" : "right";
|
|
80
|
+
const tKey = `${edge.to}:${targetSide}`;
|
|
81
|
+
const tGroup = targetSideGroups.get(tKey) ?? [edge];
|
|
82
|
+
const tIndex = tGroup.indexOf(edge);
|
|
83
|
+
const route = (0, arrow_router_js_1.routeArrow)(source, target, i, sideEdges.length, Math.max(0, tIndex), tGroup.length, layoutNodes);
|
|
65
84
|
// Arrow stroke = target node's stroke color
|
|
66
85
|
const targetTemplate = (0, index_js_1.getNodeDef)(template, target.type);
|
|
67
86
|
const strokeColor = targetTemplate.style.strokeColor;
|
|
68
|
-
|
|
87
|
+
const arrowEl = (0, elements_js_1.createArrowElement)(edge, route, strokeColor);
|
|
88
|
+
elements.push(arrowEl);
|
|
69
89
|
if (edge.label) {
|
|
70
90
|
elements.push((0, elements_js_1.createArrowLabel)(edge, route));
|
|
71
91
|
}
|
|
92
|
+
// Track which arrows bind to each shape
|
|
93
|
+
const arrowRef = { type: "arrow", id: arrowEl.id };
|
|
94
|
+
if (!arrowBindings.has(edge.from))
|
|
95
|
+
arrowBindings.set(edge.from, []);
|
|
96
|
+
arrowBindings.get(edge.from).push(arrowRef);
|
|
97
|
+
if (!arrowBindings.has(edge.to))
|
|
98
|
+
arrowBindings.set(edge.to, []);
|
|
99
|
+
arrowBindings.get(edge.to).push(arrowRef);
|
|
72
100
|
});
|
|
73
101
|
}
|
|
102
|
+
// Patch shape boundElements to include their connected arrows
|
|
103
|
+
for (const el of elements) {
|
|
104
|
+
if ((el.type === "rectangle" || el.type === "ellipse") && arrowBindings.has(el.id)) {
|
|
105
|
+
const existing = el.boundElements ?? [];
|
|
106
|
+
el.boundElements = [...existing, ...arrowBindings.get(el.id)];
|
|
107
|
+
}
|
|
108
|
+
}
|
|
74
109
|
return elements;
|
|
75
110
|
}
|
|
76
111
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/renderer/index.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/renderer/index.ts"],"names":[],"mappings":"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"}
|