@zukhruf/diagram 0.3.32 → 0.3.34

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.
Files changed (122) hide show
  1. package/README.md +98 -52
  2. package/dist/index.d.ts +5 -3
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +1 -0
  5. package/dist/index.js.map +1 -1
  6. package/dist/lib/compiler/diagram-compile.d.ts +3 -4
  7. package/dist/lib/compiler/diagram-compile.d.ts.map +1 -1
  8. package/dist/lib/compiler/diagram-compile.js +85 -370
  9. package/dist/lib/compiler/diagram-compile.js.map +1 -1
  10. package/dist/lib/layouts/graph/attach.d.ts +25 -0
  11. package/dist/lib/layouts/graph/attach.d.ts.map +1 -0
  12. package/dist/lib/layouts/graph/attach.js +272 -0
  13. package/dist/lib/layouts/graph/attach.js.map +1 -0
  14. package/dist/lib/layouts/graph/connections.d.ts +45 -0
  15. package/dist/lib/layouts/graph/connections.d.ts.map +1 -0
  16. package/dist/lib/layouts/graph/connections.js +138 -0
  17. package/dist/lib/layouts/graph/connections.js.map +1 -0
  18. package/dist/lib/layouts/graph/graph-layout-result.d.ts +5 -3
  19. package/dist/lib/layouts/graph/graph-layout-result.d.ts.map +1 -1
  20. package/dist/lib/layouts/graph/graph-layout-result.js.map +1 -1
  21. package/dist/lib/layouts/graph/gutters.js +41 -22
  22. package/dist/lib/layouts/graph/gutters.js.map +1 -1
  23. package/dist/lib/layouts/graph/labels.d.ts +23 -0
  24. package/dist/lib/layouts/graph/labels.d.ts.map +1 -0
  25. package/dist/lib/layouts/graph/labels.js +120 -0
  26. package/dist/lib/layouts/graph/labels.js.map +1 -0
  27. package/dist/lib/layouts/graph/layout.d.ts +1 -1
  28. package/dist/lib/layouts/graph/layout.d.ts.map +1 -1
  29. package/dist/lib/layouts/graph/layout.js +37 -12
  30. package/dist/lib/layouts/graph/layout.js.map +1 -1
  31. package/dist/lib/layouts/graph/measure.d.ts +15 -11
  32. package/dist/lib/layouts/graph/measure.d.ts.map +1 -1
  33. package/dist/lib/layouts/graph/measure.js +82 -38
  34. package/dist/lib/layouts/graph/measure.js.map +1 -1
  35. package/dist/lib/layouts/graph/min-heap.d.ts +8 -0
  36. package/dist/lib/layouts/graph/min-heap.d.ts.map +1 -0
  37. package/dist/lib/layouts/graph/min-heap.js +56 -0
  38. package/dist/lib/layouts/graph/min-heap.js.map +1 -0
  39. package/dist/lib/layouts/graph/node-content.d.ts +2 -3
  40. package/dist/lib/layouts/graph/node-content.d.ts.map +1 -1
  41. package/dist/lib/layouts/graph/node-content.js +67 -47
  42. package/dist/lib/layouts/graph/node-content.js.map +1 -1
  43. package/dist/lib/layouts/graph/path.d.ts +6 -0
  44. package/dist/lib/layouts/graph/path.d.ts.map +1 -0
  45. package/dist/lib/layouts/graph/path.js +53 -0
  46. package/dist/lib/layouts/graph/path.js.map +1 -0
  47. package/dist/lib/layouts/graph/round.d.ts +11 -0
  48. package/dist/lib/layouts/graph/round.d.ts.map +1 -0
  49. package/dist/lib/layouts/graph/round.js +181 -0
  50. package/dist/lib/layouts/graph/round.js.map +1 -0
  51. package/dist/lib/layouts/graph/route-search.d.ts +34 -0
  52. package/dist/lib/layouts/graph/route-search.d.ts.map +1 -0
  53. package/dist/lib/layouts/graph/route-search.js +208 -0
  54. package/dist/lib/layouts/graph/route-search.js.map +1 -0
  55. package/dist/lib/layouts/graph/route.d.ts +20 -0
  56. package/dist/lib/layouts/graph/route.d.ts.map +1 -0
  57. package/dist/lib/layouts/graph/route.js +276 -0
  58. package/dist/lib/layouts/graph/route.js.map +1 -0
  59. package/dist/lib/layouts/graph/sides.d.ts +28 -0
  60. package/dist/lib/layouts/graph/sides.d.ts.map +1 -0
  61. package/dist/lib/layouts/graph/sides.js +98 -0
  62. package/dist/lib/layouts/graph/sides.js.map +1 -0
  63. package/dist/lib/layouts/timeline/timeline-layout.d.ts +2 -1
  64. package/dist/lib/layouts/timeline/timeline-layout.d.ts.map +1 -1
  65. package/dist/lib/layouts/timeline/timeline-layout.js +9 -4
  66. package/dist/lib/layouts/timeline/timeline-layout.js.map +1 -1
  67. package/dist/lib/model/diagram-ir.d.ts +19 -156
  68. package/dist/lib/model/diagram-ir.d.ts.map +1 -1
  69. package/dist/lib/model/diagram-ir.js.map +1 -1
  70. package/dist/lib/model/validate-graph.d.ts +7 -0
  71. package/dist/lib/model/validate-graph.d.ts.map +1 -0
  72. package/dist/lib/model/validate-graph.js +54 -0
  73. package/dist/lib/model/validate-graph.js.map +1 -0
  74. package/dist/lib/react/Diagram.d.ts +3 -9
  75. package/dist/lib/react/Diagram.d.ts.map +1 -1
  76. package/dist/lib/react/Diagram.js +1 -13
  77. package/dist/lib/react/Diagram.js.map +1 -1
  78. package/dist/lib/react/diagram-types.d.ts +17 -46
  79. package/dist/lib/react/diagram-types.d.ts.map +1 -1
  80. package/dist/lib/react/diagram-types.js.map +1 -1
  81. package/dist/lib/renderers/canvas/graph-canvas.d.ts +2 -5
  82. package/dist/lib/renderers/canvas/graph-canvas.d.ts.map +1 -1
  83. package/dist/lib/renderers/canvas/graph-canvas.js +68 -43
  84. package/dist/lib/renderers/canvas/graph-canvas.js.map +1 -1
  85. package/dist/lib/renderers/html/graph-html.d.ts +2 -3
  86. package/dist/lib/renderers/html/graph-html.d.ts.map +1 -1
  87. package/dist/lib/renderers/html/graph-html.js +298 -289
  88. package/dist/lib/renderers/html/graph-html.js.map +1 -1
  89. package/dist/lib/renderers/shared/graph-parts.d.ts +3 -1
  90. package/dist/lib/renderers/shared/graph-parts.d.ts.map +1 -1
  91. package/dist/lib/renderers/shared/graph-parts.js +350 -418
  92. package/dist/lib/renderers/shared/graph-parts.js.map +1 -1
  93. package/dist/lib/renderers/shared/node-parts.d.ts +5 -6
  94. package/dist/lib/renderers/shared/node-parts.d.ts.map +1 -1
  95. package/dist/lib/renderers/shared/node-parts.js +112 -190
  96. package/dist/lib/renderers/shared/node-parts.js.map +1 -1
  97. package/dist/lib/renderers/shared/run-spans.js +2 -2
  98. package/dist/lib/renderers/shared/run-spans.js.map +1 -1
  99. package/dist/lib/renderers/shared/text-runs.d.ts +0 -6
  100. package/dist/lib/renderers/shared/text-runs.d.ts.map +1 -1
  101. package/dist/lib/renderers/shared/text-runs.js +0 -12
  102. package/dist/lib/renderers/shared/text-runs.js.map +1 -1
  103. package/dist/lib/renderers/svg/graph-svg.d.ts +1 -3
  104. package/dist/lib/renderers/svg/graph-svg.d.ts.map +1 -1
  105. package/dist/lib/renderers/svg/graph-svg.js +66 -80
  106. package/dist/lib/renderers/svg/graph-svg.js.map +1 -1
  107. package/dist/lib/renderers/svg/timeline-svg.d.ts.map +1 -1
  108. package/dist/lib/renderers/svg/timeline-svg.js +7 -5
  109. package/dist/lib/renderers/svg/timeline-svg.js.map +1 -1
  110. package/package.json +1 -1
  111. package/dist/lib/layouts/graph/graph-layout.d.ts +0 -154
  112. package/dist/lib/layouts/graph/graph-layout.d.ts.map +0 -1
  113. package/dist/lib/layouts/graph/graph-layout.js +0 -2340
  114. package/dist/lib/layouts/graph/graph-layout.js.map +0 -1
  115. package/dist/lib/layouts/graph/legacy-graph-layout.d.ts +0 -6
  116. package/dist/lib/layouts/graph/legacy-graph-layout.d.ts.map +0 -1
  117. package/dist/lib/layouts/graph/legacy-graph-layout.js +0 -542
  118. package/dist/lib/layouts/graph/legacy-graph-layout.js.map +0 -1
  119. package/dist/lib/layouts/text-metrics.d.ts +0 -7
  120. package/dist/lib/layouts/text-metrics.d.ts.map +0 -1
  121. package/dist/lib/layouts/text-metrics.js +0 -40
  122. package/dist/lib/layouts/text-metrics.js.map +0 -1
@@ -1,542 +0,0 @@
1
- // Temporary adapter: it builds one GraphLayout from the current engine in
2
- // graph-layout.ts, so that the renderers paint only from a GraphLayout before
3
- // the content-sized grid engine replaces it. Step 6 of the redesign deletes
4
- // this file together with graph-layout.ts.
5
- import { validateGraph } from "../../compiler/diagram-compile.js";
6
- import { centeredBaselineOffset } from "../text-metrics.js";
7
- import { fontAscent, fontDescent, measureText } from "../text/measure-text.js";
8
- import { EDGE_BADGE_ICON, GROUP_LABEL_H, computePaths, edgeBadgeSize, edgeLabelFontSize, edgeLabelFrameBox, edgeLabelLineHeight, graphContentViewBox, groupBox, groupDividerLines, groupLabelHeight, groupLabelLines, groupPortPlacements, groupTitleGutterHeight, nodeBox, nodeCaptionBounds, nodeCaptionPlacement, nodeFrameRadius, nodePortPlacements, nodeStackCount, nodeStackFrameBox, nodeVisualBox, resolveGraphAnnotations, resolveGraphLayout } from "./graph-layout.js";
9
-
10
- /** The prefix of the id of the note node that stands for a free annotation. */
11
- export const ANNOTATION_NOTE_PREFIX = 'annotation:';
12
- export function legacyGraphLayout(ir) {
13
- validateGraph(ir);
14
- const graph = resolveGraphLayout(ir);
15
- const routedEdges = computePaths(graph);
16
- const notes = resolveGraphAnnotations(graph).map(noteLayout);
17
- return {
18
- nodes: [...graph.nodes.map(node => nodeLayout(node, nodeBox(node, graph.layout))), ...notes.map(({
19
- note
20
- }) => note)],
21
- groups: (graph.groups ?? []).map(group => groupLayout(group, graph)),
22
- edges: routedEdges.map(edgeLayout),
23
- leaders: notes.flatMap(({
24
- leaders
25
- }) => leaders),
26
- viewBox: graphContentViewBox(graph, routedEdges)
27
- };
28
- }
29
- const FONT_WEIGHTS = [400, 500, 600, 700];
30
- function fontWeight(value) {
31
- const weight = FONT_WEIGHTS.find(candidate => candidate === value);
32
- if (weight === undefined) {
33
- throw new Error(`Diagram font weight ${value} has no metrics; use 400, 500, 600 or 700.`);
34
- }
35
- return weight;
36
- }
37
- function labelLines(label, defaultWeight) {
38
- return (Array.isArray(label) ? label : [label]).map(line => labelLine(line, defaultWeight));
39
- }
40
- function labelLine(line, defaultWeight) {
41
- if (typeof line === 'string') {
42
- return {
43
- text: line,
44
- weight: fontWeight(defaultWeight)
45
- };
46
- }
47
- return {
48
- text: line.text,
49
- weight: fontWeight(line.fontWeight ?? defaultWeight),
50
- ...(line.textColor ? {
51
- color: line.textColor
52
- } : {})
53
- };
54
- }
55
- function plainLines(texts, weight) {
56
- const resolved = fontWeight(weight);
57
- return texts.map(text => ({
58
- text,
59
- weight: resolved
60
- }));
61
- }
62
- function textRun(line, x, y, anchor, font, letterSpacing = 0) {
63
- const w = measureText(line.text, font) + letterSpacing * [...line.text].length;
64
- const left = anchor === 'start' ? x : anchor === 'middle' ? x - w / 2 : x - w;
65
- const ascent = fontAscent(font);
66
- return {
67
- text: line.text,
68
- x,
69
- y,
70
- anchor,
71
- font,
72
- ...(line.color ? {
73
- color: line.color
74
- } : {}),
75
- bounds: {
76
- x: left,
77
- y: y - ascent,
78
- w,
79
- h: ascent + fontDescent(font)
80
- }
81
- };
82
- }
83
- function textBlock(lines, block) {
84
- return lines.map((line, index) => textRun(line, block.x, block.y + index * block.lineHeight, block.anchor, {
85
- face: block.face,
86
- size: block.size,
87
- weight: line.weight
88
- }, block.letterSpacing));
89
- }
90
- function nonEmpty(lines) {
91
- return lines.filter(line => line.text.length > 0);
92
- }
93
- function unionBox(boxes) {
94
- const minX = Math.min(...boxes.map(box => box.x));
95
- const minY = Math.min(...boxes.map(box => box.y));
96
- const maxX = Math.max(...boxes.map(box => box.x + box.w));
97
- const maxY = Math.max(...boxes.map(box => box.y + box.h));
98
- return {
99
- x: minX,
100
- y: minY,
101
- w: maxX - minX,
102
- h: maxY - minY
103
- };
104
- }
105
- function nodeLayout(node, box) {
106
- const content = nodeContent(node, box);
107
- const captionLayout = nodeCaption(node, box);
108
- const frames = (node.frame ?? 'solid') === 'none' ? [] : Array.from({
109
- length: nodeStackCount(node) - 1
110
- }, (_, i) => nodeStackFrameBox(node, box, i + 1));
111
- const stacked = nodeVisualBox(node, box);
112
- return {
113
- node,
114
- box,
115
- visual: captionLayout ? unionBox([stacked, captionLayout.box]) : stacked,
116
- frames,
117
- radius: content.radius ?? nodeFrameRadius(node),
118
- ...(content.icon ? {
119
- icon: content.icon
120
- } : {}),
121
- text: content.text,
122
- bullets: content.bullets ?? [],
123
- ...(captionLayout ? {
124
- caption: captionLayout
125
- } : {}),
126
- ports: nodePortPlacements(node, box).map(portLayout),
127
- ...(content.appliance ? {
128
- appliance: content.appliance
129
- } : {})
130
- };
131
- }
132
- function nodeContent(node, box) {
133
- if (node.kind === 'appliance') return applianceContent(node, box);
134
- if (node.kind === 'connector') return connectorContent(node, box);
135
- if (node.kind === 'marker') return markerContent(node, box);
136
- if (node.kind === 'junction') return junctionContent(node, box);
137
- const descriptionLines = [node.description ?? []].flat();
138
- const hasBodyLayout = (node.textAlign ?? 'center') === 'start' || Boolean(node.icon) || descriptionLines.length > 0;
139
- return hasBodyLayout ? cardContent(node, box, descriptionLines) : centredLabelContent(node, box);
140
- }
141
- function centredLabelContent(node, box) {
142
- const lines = labelLines(node.label, node.fontWeight ?? 500);
143
- const fontSize = node.fontSize ?? 12;
144
- const lineHeight = Math.max(12, fontSize + 2);
145
- const centerY = box.y + box.h / 2;
146
- return {
147
- text: textBlock(lines, {
148
- x: box.x + box.w / 2,
149
- y: centerY - (lines.length - 1) * lineHeight / 2 + centeredBaselineOffset(fontSize, 'mono'),
150
- lineHeight,
151
- anchor: 'middle',
152
- face: 'mono',
153
- size: fontSize,
154
- letterSpacing: 0.6
155
- })
156
- };
157
- }
158
- function cardContent(node, box, descriptionLines) {
159
- const titleLines = labelLines(node.label, node.fontWeight ?? 700);
160
- const itemLines = node.items ?? [];
161
- const hasText = titleLines.some(line => line.text.length > 0);
162
- const iconSize = node.iconSize ?? (node.icon === 'ellipsis' ? 34 : 42);
163
- const cardPadX = 28;
164
- const headerGap = 22;
165
- const hasBody = descriptionLines.length > 0 || itemLines.length > 0;
166
- const hasHeaderIcon = Boolean(node.icon && hasText && hasBody);
167
- const iconX = hasText || hasBody ? box.x + cardPadX : box.x + box.w / 2 - iconSize / 2;
168
- const iconY = hasText || hasBody ? box.y + 28 : box.y + box.h / 2 - iconSize / 2;
169
- const titleX = node.icon ? iconX + iconSize + headerGap : box.x + cardPadX;
170
- const bodyX = hasHeaderIcon ? box.x + cardPadX : titleX;
171
- const titleSize = node.fontSize ?? 15;
172
- const titleLineHeight = titleSize + 4;
173
- const titleY = hasBody ? box.y + 44 : box.y + box.h / 2 - (titleLines.length - 1) * titleLineHeight / 2 + titleSize * 0.35;
174
- const bodySize = node.bodyFontSize ?? Math.max(11, titleSize - 2);
175
- const bodyY = titleY + titleLines.length * titleLineHeight + 8;
176
- const bodyLineHeight = bodySize + (node.bodyLineGap ?? 3);
177
- const itemY = bodyY + (descriptionLines.length > 0 ? descriptionLines.length * bodyLineHeight + 6 : 0);
178
- const body = {
179
- lineHeight: bodyLineHeight,
180
- anchor: 'start',
181
- face: 'sans',
182
- size: bodySize
183
- };
184
- const items = textBlock(plainLines(itemLines, 400), {
185
- ...body,
186
- x: bodyX + 12,
187
- y: itemY
188
- });
189
- return {
190
- ...(node.icon ? {
191
- icon: {
192
- x: iconX,
193
- y: iconY,
194
- size: iconSize
195
- }
196
- } : {}),
197
- text: [...(hasText ? textBlock(titleLines, {
198
- x: titleX,
199
- y: titleY,
200
- lineHeight: titleLineHeight,
201
- anchor: 'start',
202
- face: 'sans',
203
- size: titleSize
204
- }) : []), ...textBlock(plainLines(descriptionLines, 400), {
205
- ...body,
206
- x: bodyX,
207
- y: bodyY
208
- }), ...items],
209
- bullets: items.map(item => ({
210
- x: bodyX + 3,
211
- y: item.y - 3
212
- }))
213
- };
214
- }
215
- function applianceContent(node, box) {
216
- const fontSize = node.fontSize ?? 12;
217
- const bodyX = box.x + 4;
218
- const bodyY = box.y + Math.max(12, Math.min(22, box.h * 0.28));
219
- const bodyW = Math.max(36, box.w - 8);
220
- const bodyH = Math.max(24, box.h - (bodyY - box.y) - 12);
221
- const slant = Math.max(4, Math.min(node.slant ?? 16, bodyW * 0.28, bodyH * 0.75));
222
- const jackCount = Math.max(0, Math.floor(node.appliancePorts ?? 4));
223
- const jackY = bodyY + bodyH - 15;
224
- const jackStartX = bodyX + slant + 16;
225
- const jackSpacing = Math.min(13, Math.max(8, (bodyW - slant - 42) / Math.max(jackCount, 1)));
226
- const antenna = node.antenna ?? true ? [[{
227
- x: bodyX + slant + bodyW * 0.18,
228
- y: bodyY + 1
229
- }, {
230
- x: bodyX + slant + bodyW * 0.2 - 3,
231
- y: box.y + 3
232
- }], [{
233
- x: bodyX + slant + bodyW * 0.2 + 1,
234
- y: bodyY + 2
235
- }, {
236
- x: bodyX + slant + bodyW * 0.2 + 1,
237
- y: box.y + 8
238
- }]] : [];
239
- return {
240
- text: textBlock(nonEmpty(labelLines(node.label, node.fontWeight ?? 600)), {
241
- x: box.x + box.w / 2,
242
- y: bodyY + bodyH + Math.max(12, fontSize + 2),
243
- lineHeight: Math.max(12, fontSize + 2),
244
- anchor: 'middle',
245
- face: 'sans',
246
- size: fontSize
247
- }),
248
- appliance: {
249
- body: [{
250
- x: bodyX + slant,
251
- y: bodyY
252
- }, {
253
- x: bodyX + bodyW,
254
- y: bodyY + 6
255
- }, {
256
- x: bodyX + bodyW - slant,
257
- y: bodyY + bodyH
258
- }, {
259
- x: bodyX,
260
- y: bodyY + bodyH - 6
261
- }],
262
- face: [{
263
- x: bodyX + slant,
264
- y: bodyY + bodyH - 1
265
- }, {
266
- x: bodyX + bodyW - slant,
267
- y: bodyY + bodyH + 3
268
- }],
269
- antenna,
270
- jacks: Array.from({
271
- length: jackCount
272
- }, (_, i) => ({
273
- x: jackStartX + i * jackSpacing,
274
- y: jackY,
275
- w: 5,
276
- h: 12
277
- }))
278
- }
279
- };
280
- }
281
- function connectorContent(node, box) {
282
- const centerY = box.y + box.h / 2;
283
- const iconSize = node.iconSize ?? 18;
284
- const fontSize = node.fontSize ?? 10;
285
- const lineHeight = Math.max(12, fontSize + 2);
286
- const lines = nonEmpty(labelLines(node.label, node.fontWeight ?? 700));
287
- const iconX = box.x + 10;
288
- return {
289
- radius: node.rx ?? Math.min(12, box.h / 2),
290
- ...(node.icon ? {
291
- icon: {
292
- x: iconX,
293
- y: centerY - iconSize / 2,
294
- size: iconSize
295
- }
296
- } : {}),
297
- text: textBlock(lines, {
298
- x: node.icon ? iconX + iconSize + 8 : box.x + box.w / 2,
299
- y: centerY - (lines.length - 1) * lineHeight / 2 + fontSize * 0.35,
300
- lineHeight,
301
- anchor: node.icon ? 'start' : 'middle',
302
- face: 'sans',
303
- size: fontSize
304
- })
305
- };
306
- }
307
- function markerContent(node, box) {
308
- const iconSize = node.iconSize ?? 34;
309
- const fontSize = node.fontSize ?? 11;
310
- const lineHeight = Math.max(12, fontSize + 2);
311
- const lines = nonEmpty(labelLines(node.label, node.fontWeight ?? 700));
312
- const labelGap = lines.length > 0 ? 8 : 0;
313
- const totalHeight = iconSize + labelGap + lines.length * lineHeight;
314
- const cx = box.x + box.w / 2;
315
- const iconX = Math.round(cx - iconSize / 2);
316
- const iconY = Math.round(box.y + (box.h - totalHeight) / 2);
317
- return {
318
- radius: node.rx ?? 0,
319
- icon: {
320
- x: iconX,
321
- y: iconY,
322
- size: iconSize
323
- },
324
- text: textBlock(lines, {
325
- x: cx,
326
- y: iconY + iconSize + labelGap + fontSize,
327
- lineHeight,
328
- anchor: 'middle',
329
- face: 'sans',
330
- size: fontSize
331
- })
332
- };
333
- }
334
- function junctionContent(node, box) {
335
- const lines = Array.isArray(node.label) ? node.label : [node.label];
336
- const weight = node.fontWeight ?? 600;
337
- return {
338
- radius: Math.max(4, Math.min(box.w, box.h) / 2),
339
- text: lines.some(Boolean) ? textBlock(lines.map(line => ({
340
- text: typeof line === 'string' ? line : line.text,
341
- weight: fontWeight(weight)
342
- })), {
343
- x: box.x + box.w / 2,
344
- y: box.y + box.h / 2 - Math.max(8, box.h / 2 + 6),
345
- lineHeight: Math.max(12, (node.fontSize ?? 12) + 2),
346
- anchor: 'middle',
347
- face: 'mono',
348
- size: node.fontSize ?? 10
349
- }) : []
350
- };
351
- }
352
- function nodeCaption(node, box) {
353
- const placement = nodeCaptionPlacement(node, box);
354
- const bounds = nodeCaptionBounds(node, box);
355
- if (!placement || !bounds) return undefined;
356
- const lines = plainLines(placement.lines, node.captionFontWeight ?? 600).map(line => node.captionColor ? {
357
- ...line,
358
- color: node.captionColor
359
- } : line);
360
- return {
361
- box: bounds,
362
- framed: Boolean(node.captionFrame),
363
- text: textBlock(lines, {
364
- x: placement.x,
365
- y: placement.y,
366
- lineHeight: placement.lineHeight,
367
- anchor: placement.align,
368
- face: 'sans',
369
- size: placement.fontSize
370
- })
371
- };
372
- }
373
- function portLayout(port) {
374
- return {
375
- id: port.id,
376
- side: port.side,
377
- point: {
378
- x: port.x,
379
- y: port.y
380
- },
381
- ...(port.label ? {
382
- label: textRun({
383
- text: port.label,
384
- weight: 600
385
- }, port.labelX, port.labelY, port.labelAlign, {
386
- face: 'mono',
387
- size: 9,
388
- weight: 600
389
- })
390
- } : {})
391
- };
392
- }
393
- function groupLayout(group, graph) {
394
- const rect = groupBox(group, graph.nodes, graph.layout, graph.groups);
395
- const bandHeight = group.titleBand ? groupTitleGutterHeight(group) : 0;
396
- const labelAlign = group.labelAlign ?? 'center';
397
- const labelInset = 16;
398
- return {
399
- group,
400
- depth: groupDepth(group, graph.groups ?? []),
401
- rect,
402
- ...(bandHeight > 0 ? {
403
- band: {
404
- x: rect.x,
405
- y: rect.y,
406
- w: rect.w,
407
- h: bandHeight
408
- }
409
- } : {}),
410
- label: textBlock(plainLines(groupLabelLines(group), 600), {
411
- x: labelAlign === 'start' ? rect.x + labelInset : labelAlign === 'end' ? rect.x + rect.w - labelInset : rect.x + rect.w / 2,
412
- y: group.labelSide === 'bottom' ? rect.y + rect.h - groupLabelHeight(group) + GROUP_LABEL_H - 14 : rect.y + GROUP_LABEL_H,
413
- lineHeight: 14,
414
- anchor: labelAlign === 'center' ? 'middle' : labelAlign,
415
- face: 'sans',
416
- size: 12
417
- }),
418
- dividers: groupDividerLines(group, graph.nodes, graph.layout, graph.groups).map(line => [{
419
- x: line.x1,
420
- y: line.y1
421
- }, {
422
- x: line.x2,
423
- y: line.y2
424
- }]),
425
- ports: groupPortPlacements(group, rect).map(portLayout)
426
- };
427
- }
428
- function groupDepth(group, groups) {
429
- const parent = groups.find(candidate => candidate.id === group.parent);
430
- return parent ? groupDepth(parent, groups) + 1 : 0;
431
- }
432
- function edgeLayout(routed) {
433
- const {
434
- edge,
435
- labelPlacement,
436
- badgePlacement
437
- } = routed;
438
- const layout = {
439
- edge,
440
- exitSide: routed.exitSide,
441
- entrySide: routed.entrySide,
442
- points: routed.points,
443
- d: routed.d
444
- };
445
- if (edge.label?.length && labelPlacement) {
446
- layout.label = {
447
- box: edgeLabelFrameBox(edge, labelPlacement),
448
- text: textBlock(plainLines(edge.label, 400), {
449
- x: labelPlacement.x,
450
- y: labelPlacement.y,
451
- lineHeight: edgeLabelLineHeight(edge),
452
- anchor: labelPlacement.align,
453
- face: 'mono',
454
- size: edgeLabelFontSize(edge)
455
- }),
456
- ...(labelPlacement.segmentIndex === undefined ? {} : {
457
- segment: labelPlacement.segmentIndex
458
- })
459
- };
460
- }
461
- const badgeLines = edge.badgeLabel ?? [];
462
- if ((edge.badgeIcon || badgeLines.length > 0) && badgePlacement) {
463
- const {
464
- w,
465
- h
466
- } = edgeBadgeSize(edge);
467
- const left = badgePlacement.x - w / 2;
468
- const iconSize = edge.badgeIcon ? EDGE_BADGE_ICON : 0;
469
- const iconGap = edge.badgeIcon && badgeLines.length > 0 ? 8 : 0;
470
- layout.badge = {
471
- box: {
472
- x: left,
473
- y: badgePlacement.y - h / 2,
474
- w,
475
- h
476
- },
477
- ...(edge.badgeIcon ? {
478
- icon: {
479
- x: left + 8,
480
- y: badgePlacement.y - iconSize / 2,
481
- w: iconSize,
482
- h: iconSize
483
- }
484
- } : {}),
485
- text: textBlock(plainLines(badgeLines, 600), {
486
- x: left + 8 + iconSize + iconGap,
487
- y: badgePlacement.y - (badgeLines.length - 1) * 12 / 2 + 4,
488
- lineHeight: 12,
489
- anchor: 'start',
490
- face: 'sans',
491
- size: 10
492
- })
493
- };
494
- }
495
- return layout;
496
- }
497
- function noteLayout(annotation, index) {
498
- const id = `${ANNOTATION_NOTE_PREFIX}${index}`;
499
- const fontSize = annotation.fontSize ?? 11;
500
- const lines = plainLines(annotation.text, annotation.fontWeight ?? 500).map(line => annotation.color ? {
501
- ...line,
502
- color: annotation.color
503
- } : line);
504
- const text = textBlock(lines, {
505
- x: annotation.x,
506
- y: annotation.y,
507
- lineHeight: fontSize + (annotation.lineGap ?? 4),
508
- anchor: annotation.align ?? 'middle',
509
- face: 'sans',
510
- size: fontSize
511
- });
512
- const box = text.length > 0 ? unionBox(text.map(run => run.bounds)) : {
513
- x: annotation.x,
514
- y: annotation.y,
515
- w: 0,
516
- h: 0
517
- };
518
- return {
519
- note: {
520
- node: {
521
- id,
522
- kind: 'note',
523
- label: annotation.text,
524
- frame: 'none'
525
- },
526
- box,
527
- visual: box,
528
- frames: [],
529
- radius: 0,
530
- text,
531
- bullets: [],
532
- ports: []
533
- },
534
- leaders: (annotation.leaders ?? []).map(leader => ({
535
- note: id,
536
- target: leader.target,
537
- points: leader.points,
538
- d: leader.points.map((point, i) => `${i === 0 ? 'M' : 'L'} ${point.x} ${point.y}`).join(' ')
539
- }))
540
- };
541
- }
542
- //# sourceMappingURL=legacy-graph-layout.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"legacy-graph-layout.js","names":["validateGraph","centeredBaselineOffset","fontAscent","fontDescent","measureText","EDGE_BADGE_ICON","GROUP_LABEL_H","computePaths","edgeBadgeSize","edgeLabelFontSize","edgeLabelFrameBox","edgeLabelLineHeight","graphContentViewBox","groupBox","groupDividerLines","groupLabelHeight","groupLabelLines","groupPortPlacements","groupTitleGutterHeight","nodeBox","nodeCaptionBounds","nodeCaptionPlacement","nodeFrameRadius","nodePortPlacements","nodeStackCount","nodeStackFrameBox","nodeVisualBox","resolveGraphAnnotations","resolveGraphLayout","ANNOTATION_NOTE_PREFIX","legacyGraphLayout","ir","graph","routedEdges","notes","map","noteLayout","nodes","node","nodeLayout","layout","note","groups","group","groupLayout","edges","edgeLayout","leaders","flatMap","viewBox","FONT_WEIGHTS","fontWeight","value","weight","find","candidate","undefined","Error","labelLines","label","defaultWeight","Array","isArray","line","labelLine","text","textColor","color","plainLines","texts","resolved","textRun","x","y","anchor","font","letterSpacing","w","length","left","ascent","bounds","h","textBlock","lines","block","index","lineHeight","face","size","nonEmpty","filter","unionBox","boxes","minX","Math","min","box","minY","maxX","max","maxY","content","nodeContent","captionLayout","nodeCaption","frames","frame","from","_","i","stacked","visual","radius","icon","bullets","caption","ports","portLayout","appliance","kind","applianceContent","connectorContent","markerContent","junctionContent","descriptionLines","description","flat","hasBodyLayout","textAlign","Boolean","cardContent","centredLabelContent","fontSize","centerY","titleLines","itemLines","items","hasText","some","iconSize","cardPadX","headerGap","hasBody","hasHeaderIcon","iconX","iconY","titleX","bodyX","titleSize","titleLineHeight","titleY","bodySize","bodyFontSize","bodyY","bodyLineHeight","bodyLineGap","itemY","body","item","bodyW","bodyH","slant","jackCount","floor","appliancePorts","jackY","jackStartX","jackSpacing","antenna","jacks","rx","labelGap","totalHeight","cx","round","placement","captionFontWeight","captionColor","framed","captionFrame","align","port","id","side","point","labelX","labelY","labelAlign","rect","bandHeight","titleBand","labelInset","depth","groupDepth","band","labelSide","dividers","x1","y1","x2","y2","parent","routed","edge","labelPlacement","badgePlacement","exitSide","entrySide","points","d","segmentIndex","segment","badgeLines","badgeLabel","badgeIcon","iconGap","badge","annotation","lineGap","run","leader","target","join"],"sources":["../../../../src/lib/layouts/graph/legacy-graph-layout.ts"],"sourcesContent":["// Temporary adapter: it builds one GraphLayout from the current engine in\n// graph-layout.ts, so that the renderers paint only from a GraphLayout before\n// the content-sized grid engine replaces it. Step 6 of the redesign deletes\n// this file together with graph-layout.ts.\nimport { validateGraph } from '../../compiler/diagram-compile.ts';\nimport type {\n Box,\n DiagramGraphIR,\n DiagramGroup,\n DiagramLabelLine,\n DiagramNode,\n DiagramTextColor,\n GraphLayoutSpec,\n Point,\n} from '../../model/diagram-ir.ts';\nimport { centeredBaselineOffset } from '../text-metrics.ts';\nimport type { Font, FontFace, FontWeight } from '../text/font.ts';\nimport { fontAscent, fontDescent, measureText } from '../text/measure-text.ts';\nimport type {\n EdgeLayout,\n GraphLayout,\n GroupLayout,\n LeaderLayout,\n NodeLayout,\n PortLayout,\n TextAnchor,\n TextRun,\n} from './graph-layout-result.ts';\nimport {\n EDGE_BADGE_ICON,\n GROUP_LABEL_H,\n type PortPlacement,\n type ResolvedDiagramAnnotation,\n type RoutedEdge,\n computePaths,\n edgeBadgeSize,\n edgeLabelFontSize,\n edgeLabelFrameBox,\n edgeLabelLineHeight,\n graphContentViewBox,\n groupBox,\n groupDividerLines,\n groupLabelHeight,\n groupLabelLines,\n groupPortPlacements,\n groupTitleGutterHeight,\n nodeBox,\n nodeCaptionBounds,\n nodeCaptionPlacement,\n nodeFrameRadius,\n nodePortPlacements,\n nodeStackCount,\n nodeStackFrameBox,\n nodeVisualBox,\n resolveGraphAnnotations,\n resolveGraphLayout,\n} from './graph-layout.ts';\n\n/** The prefix of the id of the note node that stands for a free annotation. */\nexport const ANNOTATION_NOTE_PREFIX = 'annotation:';\n\nexport function legacyGraphLayout(ir: DiagramGraphIR): GraphLayout {\n validateGraph(ir);\n const graph = resolveGraphLayout(ir);\n const routedEdges = computePaths(graph);\n const notes = resolveGraphAnnotations(graph).map(noteLayout);\n return {\n nodes: [\n ...graph.nodes.map((node) =>\n nodeLayout(node, nodeBox(node, graph.layout)),\n ),\n ...notes.map(({ note }) => note),\n ],\n groups: (graph.groups ?? []).map((group) => groupLayout(group, graph)),\n edges: routedEdges.map(edgeLayout),\n leaders: notes.flatMap(({ leaders }) => leaders),\n viewBox: graphContentViewBox(graph, routedEdges),\n };\n}\n\ntype Line = { text: string; color?: DiagramTextColor; weight: FontWeight };\n\nconst FONT_WEIGHTS: FontWeight[] = [400, 500, 600, 700];\n\nfunction fontWeight(value: number): FontWeight {\n const weight = FONT_WEIGHTS.find((candidate) => candidate === value);\n if (weight === undefined) {\n throw new Error(\n `Diagram font weight ${value} has no metrics; use 400, 500, 600 or 700.`,\n );\n }\n return weight;\n}\n\nfunction labelLines(\n label: DiagramNode['label'],\n defaultWeight: number,\n): Line[] {\n return (Array.isArray(label) ? label : [label]).map((line) =>\n labelLine(line, defaultWeight),\n );\n}\n\nfunction labelLine(line: DiagramLabelLine, defaultWeight: number): Line {\n if (typeof line === 'string') {\n return { text: line, weight: fontWeight(defaultWeight) };\n }\n return {\n text: line.text,\n weight: fontWeight(line.fontWeight ?? defaultWeight),\n ...(line.textColor ? { color: line.textColor } : {}),\n };\n}\n\nfunction plainLines(texts: string[], weight: number): Line[] {\n const resolved = fontWeight(weight);\n return texts.map((text) => ({ text, weight: resolved }));\n}\n\nfunction textRun(\n line: Line,\n x: number,\n y: number,\n anchor: TextAnchor,\n font: Font,\n letterSpacing = 0,\n): TextRun {\n const w =\n measureText(line.text, font) + letterSpacing * [...line.text].length;\n const left = anchor === 'start' ? x : anchor === 'middle' ? x - w / 2 : x - w;\n const ascent = fontAscent(font);\n return {\n text: line.text,\n x,\n y,\n anchor,\n font,\n ...(line.color ? { color: line.color } : {}),\n bounds: { x: left, y: y - ascent, w, h: ascent + fontDescent(font) },\n };\n}\n\nfunction textBlock(\n lines: Line[],\n block: {\n x: number;\n y: number;\n lineHeight: number;\n anchor: TextAnchor;\n face: FontFace;\n size: number;\n letterSpacing?: number;\n },\n): TextRun[] {\n return lines.map((line, index) =>\n textRun(\n line,\n block.x,\n block.y + index * block.lineHeight,\n block.anchor,\n { face: block.face, size: block.size, weight: line.weight },\n block.letterSpacing,\n ),\n );\n}\n\nfunction nonEmpty(lines: Line[]) {\n return lines.filter((line) => line.text.length > 0);\n}\n\nfunction unionBox(boxes: Box[]): Box {\n const minX = Math.min(...boxes.map((box) => box.x));\n const minY = Math.min(...boxes.map((box) => box.y));\n const maxX = Math.max(...boxes.map((box) => box.x + box.w));\n const maxY = Math.max(...boxes.map((box) => box.y + box.h));\n return { x: minX, y: minY, w: maxX - minX, h: maxY - minY };\n}\n\ntype NodeContent = Pick<NodeLayout, 'text'> &\n Partial<Pick<NodeLayout, 'icon' | 'bullets' | 'appliance'>> & {\n radius?: number;\n };\n\nfunction nodeLayout(node: DiagramNode, box: Box): NodeLayout {\n const content = nodeContent(node, box);\n const captionLayout = nodeCaption(node, box);\n const frames =\n (node.frame ?? 'solid') === 'none'\n ? []\n : Array.from({ length: nodeStackCount(node) - 1 }, (_, i) =>\n nodeStackFrameBox(node, box, i + 1),\n );\n const stacked = nodeVisualBox(node, box);\n return {\n node,\n box,\n visual: captionLayout ? unionBox([stacked, captionLayout.box]) : stacked,\n frames,\n radius: content.radius ?? nodeFrameRadius(node),\n ...(content.icon ? { icon: content.icon } : {}),\n text: content.text,\n bullets: content.bullets ?? [],\n ...(captionLayout ? { caption: captionLayout } : {}),\n ports: nodePortPlacements(node, box).map(portLayout),\n ...(content.appliance ? { appliance: content.appliance } : {}),\n };\n}\n\nfunction nodeContent(node: DiagramNode, box: Box): NodeContent {\n if (node.kind === 'appliance') return applianceContent(node, box);\n if (node.kind === 'connector') return connectorContent(node, box);\n if (node.kind === 'marker') return markerContent(node, box);\n if (node.kind === 'junction') return junctionContent(node, box);\n const descriptionLines = [node.description ?? []].flat();\n const hasBodyLayout =\n (node.textAlign ?? 'center') === 'start' ||\n Boolean(node.icon) ||\n descriptionLines.length > 0;\n return hasBodyLayout\n ? cardContent(node, box, descriptionLines)\n : centredLabelContent(node, box);\n}\n\nfunction centredLabelContent(node: DiagramNode, box: Box): NodeContent {\n const lines = labelLines(node.label, node.fontWeight ?? 500);\n const fontSize = node.fontSize ?? 12;\n const lineHeight = Math.max(12, fontSize + 2);\n const centerY = box.y + box.h / 2;\n return {\n text: textBlock(lines, {\n x: box.x + box.w / 2,\n y:\n centerY -\n ((lines.length - 1) * lineHeight) / 2 +\n centeredBaselineOffset(fontSize, 'mono'),\n lineHeight,\n anchor: 'middle',\n face: 'mono',\n size: fontSize,\n letterSpacing: 0.6,\n }),\n };\n}\n\nfunction cardContent(\n node: DiagramNode,\n box: Box,\n descriptionLines: string[],\n): NodeContent {\n const titleLines = labelLines(node.label, node.fontWeight ?? 700);\n const itemLines = node.items ?? [];\n const hasText = titleLines.some((line) => line.text.length > 0);\n const iconSize = node.iconSize ?? (node.icon === 'ellipsis' ? 34 : 42);\n const cardPadX = 28;\n const headerGap = 22;\n const hasBody = descriptionLines.length > 0 || itemLines.length > 0;\n const hasHeaderIcon = Boolean(node.icon && hasText && hasBody);\n const iconX =\n hasText || hasBody ? box.x + cardPadX : box.x + box.w / 2 - iconSize / 2;\n const iconY =\n hasText || hasBody ? box.y + 28 : box.y + box.h / 2 - iconSize / 2;\n const titleX = node.icon ? iconX + iconSize + headerGap : box.x + cardPadX;\n const bodyX = hasHeaderIcon ? box.x + cardPadX : titleX;\n const titleSize = node.fontSize ?? 15;\n const titleLineHeight = titleSize + 4;\n const titleY = hasBody\n ? box.y + 44\n : box.y +\n box.h / 2 -\n ((titleLines.length - 1) * titleLineHeight) / 2 +\n titleSize * 0.35;\n const bodySize = node.bodyFontSize ?? Math.max(11, titleSize - 2);\n const bodyY = titleY + titleLines.length * titleLineHeight + 8;\n const bodyLineHeight = bodySize + (node.bodyLineGap ?? 3);\n const itemY =\n bodyY +\n (descriptionLines.length > 0\n ? descriptionLines.length * bodyLineHeight + 6\n : 0);\n const body = {\n lineHeight: bodyLineHeight,\n anchor: 'start',\n face: 'sans',\n size: bodySize,\n } as const;\n const items = textBlock(plainLines(itemLines, 400), {\n ...body,\n x: bodyX + 12,\n y: itemY,\n });\n return {\n ...(node.icon ? { icon: { x: iconX, y: iconY, size: iconSize } } : {}),\n text: [\n ...(hasText\n ? textBlock(titleLines, {\n x: titleX,\n y: titleY,\n lineHeight: titleLineHeight,\n anchor: 'start',\n face: 'sans',\n size: titleSize,\n })\n : []),\n ...textBlock(plainLines(descriptionLines, 400), {\n ...body,\n x: bodyX,\n y: bodyY,\n }),\n ...items,\n ],\n bullets: items.map((item) => ({ x: bodyX + 3, y: item.y - 3 })),\n };\n}\n\nfunction applianceContent(node: DiagramNode, box: Box): NodeContent {\n const fontSize = node.fontSize ?? 12;\n const bodyX = box.x + 4;\n const bodyY = box.y + Math.max(12, Math.min(22, box.h * 0.28));\n const bodyW = Math.max(36, box.w - 8);\n const bodyH = Math.max(24, box.h - (bodyY - box.y) - 12);\n const slant = Math.max(\n 4,\n Math.min(node.slant ?? 16, bodyW * 0.28, bodyH * 0.75),\n );\n const jackCount = Math.max(0, Math.floor(node.appliancePorts ?? 4));\n const jackY = bodyY + bodyH - 15;\n const jackStartX = bodyX + slant + 16;\n const jackSpacing = Math.min(\n 13,\n Math.max(8, (bodyW - slant - 42) / Math.max(jackCount, 1)),\n );\n const antenna: [Point, Point][] =\n (node.antenna ?? true)\n ? [\n [\n { x: bodyX + slant + bodyW * 0.18, y: bodyY + 1 },\n { x: bodyX + slant + bodyW * 0.2 - 3, y: box.y + 3 },\n ],\n [\n { x: bodyX + slant + bodyW * 0.2 + 1, y: bodyY + 2 },\n { x: bodyX + slant + bodyW * 0.2 + 1, y: box.y + 8 },\n ],\n ]\n : [];\n return {\n text: textBlock(nonEmpty(labelLines(node.label, node.fontWeight ?? 600)), {\n x: box.x + box.w / 2,\n y: bodyY + bodyH + Math.max(12, fontSize + 2),\n lineHeight: Math.max(12, fontSize + 2),\n anchor: 'middle',\n face: 'sans',\n size: fontSize,\n }),\n appliance: {\n body: [\n { x: bodyX + slant, y: bodyY },\n { x: bodyX + bodyW, y: bodyY + 6 },\n { x: bodyX + bodyW - slant, y: bodyY + bodyH },\n { x: bodyX, y: bodyY + bodyH - 6 },\n ],\n face: [\n { x: bodyX + slant, y: bodyY + bodyH - 1 },\n { x: bodyX + bodyW - slant, y: bodyY + bodyH + 3 },\n ],\n antenna,\n jacks: Array.from({ length: jackCount }, (_, i) => ({\n x: jackStartX + i * jackSpacing,\n y: jackY,\n w: 5,\n h: 12,\n })),\n },\n };\n}\n\nfunction connectorContent(node: DiagramNode, box: Box): NodeContent {\n const centerY = box.y + box.h / 2;\n const iconSize = node.iconSize ?? 18;\n const fontSize = node.fontSize ?? 10;\n const lineHeight = Math.max(12, fontSize + 2);\n const lines = nonEmpty(labelLines(node.label, node.fontWeight ?? 700));\n const iconX = box.x + 10;\n return {\n radius: node.rx ?? Math.min(12, box.h / 2),\n ...(node.icon\n ? { icon: { x: iconX, y: centerY - iconSize / 2, size: iconSize } }\n : {}),\n text: textBlock(lines, {\n x: node.icon ? iconX + iconSize + 8 : box.x + box.w / 2,\n y: centerY - ((lines.length - 1) * lineHeight) / 2 + fontSize * 0.35,\n lineHeight,\n anchor: node.icon ? 'start' : 'middle',\n face: 'sans',\n size: fontSize,\n }),\n };\n}\n\nfunction markerContent(node: DiagramNode, box: Box): NodeContent {\n const iconSize = node.iconSize ?? 34;\n const fontSize = node.fontSize ?? 11;\n const lineHeight = Math.max(12, fontSize + 2);\n const lines = nonEmpty(labelLines(node.label, node.fontWeight ?? 700));\n const labelGap = lines.length > 0 ? 8 : 0;\n const totalHeight = iconSize + labelGap + lines.length * lineHeight;\n const cx = box.x + box.w / 2;\n const iconX = Math.round(cx - iconSize / 2);\n const iconY = Math.round(box.y + (box.h - totalHeight) / 2);\n return {\n radius: node.rx ?? 0,\n icon: { x: iconX, y: iconY, size: iconSize },\n text: textBlock(lines, {\n x: cx,\n y: iconY + iconSize + labelGap + fontSize,\n lineHeight,\n anchor: 'middle',\n face: 'sans',\n size: fontSize,\n }),\n };\n}\n\nfunction junctionContent(node: DiagramNode, box: Box): NodeContent {\n const lines = Array.isArray(node.label) ? node.label : [node.label];\n const weight = node.fontWeight ?? 600;\n return {\n radius: Math.max(4, Math.min(box.w, box.h) / 2),\n text: lines.some(Boolean)\n ? textBlock(\n lines.map((line) => ({\n text: typeof line === 'string' ? line : line.text,\n weight: fontWeight(weight),\n })),\n {\n x: box.x + box.w / 2,\n y: box.y + box.h / 2 - Math.max(8, box.h / 2 + 6),\n lineHeight: Math.max(12, (node.fontSize ?? 12) + 2),\n anchor: 'middle',\n face: 'mono',\n size: node.fontSize ?? 10,\n },\n )\n : [],\n };\n}\n\nfunction nodeCaption(node: DiagramNode, box: Box): NodeLayout['caption'] {\n const placement = nodeCaptionPlacement(node, box);\n const bounds = nodeCaptionBounds(node, box);\n if (!placement || !bounds) return undefined;\n const lines = plainLines(placement.lines, node.captionFontWeight ?? 600).map(\n (line) =>\n node.captionColor ? { ...line, color: node.captionColor } : line,\n );\n return {\n box: bounds,\n framed: Boolean(node.captionFrame),\n text: textBlock(lines, {\n x: placement.x,\n y: placement.y,\n lineHeight: placement.lineHeight,\n anchor: placement.align,\n face: 'sans',\n size: placement.fontSize,\n }),\n };\n}\n\nfunction portLayout(port: PortPlacement): PortLayout {\n return {\n id: port.id,\n side: port.side,\n point: { x: port.x, y: port.y },\n ...(port.label\n ? {\n label: textRun(\n { text: port.label, weight: 600 },\n port.labelX,\n port.labelY,\n port.labelAlign,\n { face: 'mono', size: 9, weight: 600 },\n ),\n }\n : {}),\n };\n}\n\nfunction groupLayout(group: DiagramGroup, graph: GraphLayoutSpec): GroupLayout {\n const rect = groupBox(group, graph.nodes, graph.layout, graph.groups);\n const bandHeight = group.titleBand ? groupTitleGutterHeight(group) : 0;\n const labelAlign = group.labelAlign ?? 'center';\n const labelInset = 16;\n return {\n group,\n depth: groupDepth(group, graph.groups ?? []),\n rect,\n ...(bandHeight > 0\n ? { band: { x: rect.x, y: rect.y, w: rect.w, h: bandHeight } }\n : {}),\n label: textBlock(plainLines(groupLabelLines(group), 600), {\n x:\n labelAlign === 'start'\n ? rect.x + labelInset\n : labelAlign === 'end'\n ? rect.x + rect.w - labelInset\n : rect.x + rect.w / 2,\n y:\n group.labelSide === 'bottom'\n ? rect.y + rect.h - groupLabelHeight(group) + GROUP_LABEL_H - 14\n : rect.y + GROUP_LABEL_H,\n lineHeight: 14,\n anchor: labelAlign === 'center' ? 'middle' : labelAlign,\n face: 'sans',\n size: 12,\n }),\n dividers: groupDividerLines(\n group,\n graph.nodes,\n graph.layout,\n graph.groups,\n ).map((line) => [\n { x: line.x1, y: line.y1 },\n { x: line.x2, y: line.y2 },\n ]),\n ports: groupPortPlacements(group, rect).map(portLayout),\n };\n}\n\nfunction groupDepth(group: DiagramGroup, groups: DiagramGroup[]): number {\n const parent = groups.find((candidate) => candidate.id === group.parent);\n return parent ? groupDepth(parent, groups) + 1 : 0;\n}\n\nfunction edgeLayout(routed: RoutedEdge): EdgeLayout {\n const { edge, labelPlacement, badgePlacement } = routed;\n const layout: EdgeLayout = {\n edge,\n exitSide: routed.exitSide,\n entrySide: routed.entrySide,\n points: routed.points,\n d: routed.d,\n };\n if (edge.label?.length && labelPlacement) {\n layout.label = {\n box: edgeLabelFrameBox(edge, labelPlacement),\n text: textBlock(plainLines(edge.label, 400), {\n x: labelPlacement.x,\n y: labelPlacement.y,\n lineHeight: edgeLabelLineHeight(edge),\n anchor: labelPlacement.align,\n face: 'mono',\n size: edgeLabelFontSize(edge),\n }),\n ...(labelPlacement.segmentIndex === undefined\n ? {}\n : { segment: labelPlacement.segmentIndex }),\n };\n }\n const badgeLines = edge.badgeLabel ?? [];\n if ((edge.badgeIcon || badgeLines.length > 0) && badgePlacement) {\n const { w, h } = edgeBadgeSize(edge);\n const left = badgePlacement.x - w / 2;\n const iconSize = edge.badgeIcon ? EDGE_BADGE_ICON : 0;\n const iconGap = edge.badgeIcon && badgeLines.length > 0 ? 8 : 0;\n layout.badge = {\n box: { x: left, y: badgePlacement.y - h / 2, w, h },\n ...(edge.badgeIcon\n ? {\n icon: {\n x: left + 8,\n y: badgePlacement.y - iconSize / 2,\n w: iconSize,\n h: iconSize,\n },\n }\n : {}),\n text: textBlock(plainLines(badgeLines, 600), {\n x: left + 8 + iconSize + iconGap,\n y: badgePlacement.y - ((badgeLines.length - 1) * 12) / 2 + 4,\n lineHeight: 12,\n anchor: 'start',\n face: 'sans',\n size: 10,\n }),\n };\n }\n return layout;\n}\n\nfunction noteLayout(\n annotation: ResolvedDiagramAnnotation,\n index: number,\n): { note: NodeLayout; leaders: LeaderLayout[] } {\n const id = `${ANNOTATION_NOTE_PREFIX}${index}`;\n const fontSize = annotation.fontSize ?? 11;\n const lines = plainLines(annotation.text, annotation.fontWeight ?? 500).map(\n (line) => (annotation.color ? { ...line, color: annotation.color } : line),\n );\n const text = textBlock(lines, {\n x: annotation.x,\n y: annotation.y,\n lineHeight: fontSize + (annotation.lineGap ?? 4),\n anchor: annotation.align ?? 'middle',\n face: 'sans',\n size: fontSize,\n });\n const box =\n text.length > 0\n ? unionBox(text.map((run) => run.bounds))\n : { x: annotation.x, y: annotation.y, w: 0, h: 0 };\n return {\n note: {\n node: { id, kind: 'note', label: annotation.text, frame: 'none' },\n box,\n visual: box,\n frames: [],\n radius: 0,\n text,\n bullets: [],\n ports: [],\n },\n leaders: (annotation.leaders ?? []).map((leader) => ({\n note: id,\n target: leader.target,\n points: leader.points,\n d: leader.points\n .map((point, i) => `${i === 0 ? 'M' : 'L'} ${point.x} ${point.y}`)\n .join(' '),\n })),\n };\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1,7 +0,0 @@
1
- export type DiagramFontFace = 'mono' | 'sans';
2
- export declare function textWidth(text: string, fontSize: number, face: DiagramFontFace): number;
3
- export declare function widestLine(lines: string[], fontSize: number, face: DiagramFontFace): number;
4
- export declare function textAscent(fontSize: number, face: DiagramFontFace): number;
5
- export declare function textLineBox(fontSize: number, face: DiagramFontFace): number;
6
- export declare function centeredBaselineOffset(fontSize: number, face: DiagramFontFace): number;
7
- //# sourceMappingURL=text-metrics.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"text-metrics.d.ts","sourceRoot":"","sources":["../../../src/lib/layouts/text-metrics.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,MAAM,CAAC;AAwB9C,wBAAgB,SAAS,CACvB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,eAAe,GACpB,MAAM,CAKR;AAED,wBAAgB,UAAU,CACxB,KAAK,EAAE,MAAM,EAAE,EACf,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,eAAe,GACpB,MAAM,CAER;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,GAAG,MAAM,CAE1E;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,GAAG,MAAM,CAE3E;AAED,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,eAAe,GACpB,MAAM,CAER"}