@shumoku/core 0.1.0
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/dist/icons/build-icons.d.ts +6 -0
- package/dist/icons/build-icons.d.ts.map +1 -0
- package/dist/icons/build-icons.js +163 -0
- package/dist/icons/build-icons.js.map +1 -0
- package/dist/icons/generated-icons.d.ts +32 -0
- package/dist/icons/generated-icons.d.ts.map +1 -0
- package/dist/icons/generated-icons.js +88 -0
- package/dist/icons/generated-icons.js.map +1 -0
- package/dist/icons/index.d.ts +2 -0
- package/dist/icons/index.d.ts.map +1 -0
- package/dist/icons/index.js +2 -0
- package/dist/icons/index.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/layout/hierarchical.d.ts +73 -0
- package/dist/layout/hierarchical.d.ts.map +1 -0
- package/dist/layout/hierarchical.js +1320 -0
- package/dist/layout/hierarchical.js.map +1 -0
- package/dist/layout/index.d.ts +6 -0
- package/dist/layout/index.d.ts.map +1 -0
- package/dist/layout/index.js +5 -0
- package/dist/layout/index.js.map +1 -0
- package/dist/models/index.d.ts +5 -0
- package/dist/models/index.d.ts.map +1 -0
- package/dist/models/index.js +5 -0
- package/dist/models/index.js.map +1 -0
- package/dist/models/types.d.ts +381 -0
- package/dist/models/types.d.ts.map +1 -0
- package/dist/models/types.js +61 -0
- package/dist/models/types.js.map +1 -0
- package/dist/renderer/components/index.d.ts +8 -0
- package/dist/renderer/components/index.d.ts.map +1 -0
- package/dist/renderer/components/index.js +8 -0
- package/dist/renderer/components/index.js.map +1 -0
- package/dist/renderer/components/link-renderer.d.ts +11 -0
- package/dist/renderer/components/link-renderer.d.ts.map +1 -0
- package/dist/renderer/components/link-renderer.js +340 -0
- package/dist/renderer/components/link-renderer.js.map +1 -0
- package/dist/renderer/components/node-renderer.d.ts +14 -0
- package/dist/renderer/components/node-renderer.d.ts.map +1 -0
- package/dist/renderer/components/node-renderer.js +242 -0
- package/dist/renderer/components/node-renderer.js.map +1 -0
- package/dist/renderer/components/port-renderer.d.ts +8 -0
- package/dist/renderer/components/port-renderer.d.ts.map +1 -0
- package/dist/renderer/components/port-renderer.js +85 -0
- package/dist/renderer/components/port-renderer.js.map +1 -0
- package/dist/renderer/components/subgraph-renderer.d.ts +13 -0
- package/dist/renderer/components/subgraph-renderer.d.ts.map +1 -0
- package/dist/renderer/components/subgraph-renderer.js +85 -0
- package/dist/renderer/components/subgraph-renderer.js.map +1 -0
- package/dist/renderer/icon-registry/index.d.ts +6 -0
- package/dist/renderer/icon-registry/index.d.ts.map +1 -0
- package/dist/renderer/icon-registry/index.js +5 -0
- package/dist/renderer/icon-registry/index.js.map +1 -0
- package/dist/renderer/icon-registry/registry.d.ts +25 -0
- package/dist/renderer/icon-registry/registry.d.ts.map +1 -0
- package/dist/renderer/icon-registry/registry.js +85 -0
- package/dist/renderer/icon-registry/registry.js.map +1 -0
- package/dist/renderer/icon-registry/types.d.ts +44 -0
- package/dist/renderer/icon-registry/types.d.ts.map +1 -0
- package/dist/renderer/icon-registry/types.js +5 -0
- package/dist/renderer/icon-registry/types.js.map +1 -0
- package/dist/renderer/index.d.ts +6 -0
- package/dist/renderer/index.d.ts.map +1 -0
- package/dist/renderer/index.js +5 -0
- package/dist/renderer/index.js.map +1 -0
- package/dist/renderer/render-model/builder.d.ts +43 -0
- package/dist/renderer/render-model/builder.d.ts.map +1 -0
- package/dist/renderer/render-model/builder.js +646 -0
- package/dist/renderer/render-model/builder.js.map +1 -0
- package/dist/renderer/render-model/index.d.ts +6 -0
- package/dist/renderer/render-model/index.d.ts.map +1 -0
- package/dist/renderer/render-model/index.js +5 -0
- package/dist/renderer/render-model/index.js.map +1 -0
- package/dist/renderer/render-model/types.d.ts +216 -0
- package/dist/renderer/render-model/types.d.ts.map +1 -0
- package/dist/renderer/render-model/types.js +6 -0
- package/dist/renderer/render-model/types.js.map +1 -0
- package/dist/renderer/renderer-types.d.ts +55 -0
- package/dist/renderer/renderer-types.d.ts.map +1 -0
- package/dist/renderer/renderer-types.js +5 -0
- package/dist/renderer/renderer-types.js.map +1 -0
- package/dist/renderer/svg-builder.d.ts +152 -0
- package/dist/renderer/svg-builder.d.ts.map +1 -0
- package/dist/renderer/svg-builder.js +176 -0
- package/dist/renderer/svg-builder.js.map +1 -0
- package/dist/renderer/svg-dom/builders/defs.d.ts +10 -0
- package/dist/renderer/svg-dom/builders/defs.d.ts.map +1 -0
- package/dist/renderer/svg-dom/builders/defs.js +82 -0
- package/dist/renderer/svg-dom/builders/defs.js.map +1 -0
- package/dist/renderer/svg-dom/builders/index.d.ts +9 -0
- package/dist/renderer/svg-dom/builders/index.d.ts.map +1 -0
- package/dist/renderer/svg-dom/builders/index.js +9 -0
- package/dist/renderer/svg-dom/builders/index.js.map +1 -0
- package/dist/renderer/svg-dom/builders/link.d.ts +18 -0
- package/dist/renderer/svg-dom/builders/link.d.ts.map +1 -0
- package/dist/renderer/svg-dom/builders/link.js +188 -0
- package/dist/renderer/svg-dom/builders/link.js.map +1 -0
- package/dist/renderer/svg-dom/builders/node.d.ts +15 -0
- package/dist/renderer/svg-dom/builders/node.d.ts.map +1 -0
- package/dist/renderer/svg-dom/builders/node.js +262 -0
- package/dist/renderer/svg-dom/builders/node.js.map +1 -0
- package/dist/renderer/svg-dom/builders/subgraph.d.ts +14 -0
- package/dist/renderer/svg-dom/builders/subgraph.d.ts.map +1 -0
- package/dist/renderer/svg-dom/builders/subgraph.js +63 -0
- package/dist/renderer/svg-dom/builders/subgraph.js.map +1 -0
- package/dist/renderer/svg-dom/builders/utils.d.ts +40 -0
- package/dist/renderer/svg-dom/builders/utils.d.ts.map +1 -0
- package/dist/renderer/svg-dom/builders/utils.js +79 -0
- package/dist/renderer/svg-dom/builders/utils.js.map +1 -0
- package/dist/renderer/svg-dom/index.d.ts +9 -0
- package/dist/renderer/svg-dom/index.d.ts.map +1 -0
- package/dist/renderer/svg-dom/index.js +7 -0
- package/dist/renderer/svg-dom/index.js.map +1 -0
- package/dist/renderer/svg-dom/interaction.d.ts +69 -0
- package/dist/renderer/svg-dom/interaction.d.ts.map +1 -0
- package/dist/renderer/svg-dom/interaction.js +296 -0
- package/dist/renderer/svg-dom/interaction.js.map +1 -0
- package/dist/renderer/svg-dom/renderer.d.ts +47 -0
- package/dist/renderer/svg-dom/renderer.d.ts.map +1 -0
- package/dist/renderer/svg-dom/renderer.js +188 -0
- package/dist/renderer/svg-dom/renderer.js.map +1 -0
- package/dist/renderer/svg-string/builders/defs.d.ts +10 -0
- package/dist/renderer/svg-string/builders/defs.d.ts.map +1 -0
- package/dist/renderer/svg-string/builders/defs.js +43 -0
- package/dist/renderer/svg-string/builders/defs.js.map +1 -0
- package/dist/renderer/svg-string/builders/link.d.ts +10 -0
- package/dist/renderer/svg-string/builders/link.d.ts.map +1 -0
- package/dist/renderer/svg-string/builders/link.js +149 -0
- package/dist/renderer/svg-string/builders/link.js.map +1 -0
- package/dist/renderer/svg-string/builders/node.d.ts +10 -0
- package/dist/renderer/svg-string/builders/node.d.ts.map +1 -0
- package/dist/renderer/svg-string/builders/node.js +134 -0
- package/dist/renderer/svg-string/builders/node.js.map +1 -0
- package/dist/renderer/svg-string/builders/subgraph.d.ts +10 -0
- package/dist/renderer/svg-string/builders/subgraph.d.ts.map +1 -0
- package/dist/renderer/svg-string/builders/subgraph.js +59 -0
- package/dist/renderer/svg-string/builders/subgraph.js.map +1 -0
- package/dist/renderer/svg-string/index.d.ts +5 -0
- package/dist/renderer/svg-string/index.d.ts.map +1 -0
- package/dist/renderer/svg-string/index.js +5 -0
- package/dist/renderer/svg-string/index.js.map +1 -0
- package/dist/renderer/svg-string/renderer.d.ts +17 -0
- package/dist/renderer/svg-string/renderer.d.ts.map +1 -0
- package/dist/renderer/svg-string/renderer.js +53 -0
- package/dist/renderer/svg-string/renderer.js.map +1 -0
- package/dist/renderer/svg.d.ts +105 -0
- package/dist/renderer/svg.d.ts.map +1 -0
- package/dist/renderer/svg.js +804 -0
- package/dist/renderer/svg.js.map +1 -0
- package/dist/renderer/text-measurer/browser-measurer.d.ts +25 -0
- package/dist/renderer/text-measurer/browser-measurer.d.ts.map +1 -0
- package/dist/renderer/text-measurer/browser-measurer.js +85 -0
- package/dist/renderer/text-measurer/browser-measurer.js.map +1 -0
- package/dist/renderer/text-measurer/fallback-measurer.d.ts +22 -0
- package/dist/renderer/text-measurer/fallback-measurer.d.ts.map +1 -0
- package/dist/renderer/text-measurer/fallback-measurer.js +113 -0
- package/dist/renderer/text-measurer/fallback-measurer.js.map +1 -0
- package/dist/renderer/text-measurer/index.d.ts +13 -0
- package/dist/renderer/text-measurer/index.d.ts.map +1 -0
- package/dist/renderer/text-measurer/index.js +35 -0
- package/dist/renderer/text-measurer/index.js.map +1 -0
- package/dist/renderer/text-measurer/types.d.ts +30 -0
- package/dist/renderer/text-measurer/types.d.ts.map +1 -0
- package/dist/renderer/text-measurer/types.js +5 -0
- package/dist/renderer/text-measurer/types.js.map +1 -0
- package/dist/renderer/theme.d.ts +29 -0
- package/dist/renderer/theme.d.ts.map +1 -0
- package/dist/renderer/theme.js +80 -0
- package/dist/renderer/theme.js.map +1 -0
- package/dist/themes/dark.d.ts +6 -0
- package/dist/themes/dark.d.ts.map +1 -0
- package/dist/themes/dark.js +96 -0
- package/dist/themes/dark.js.map +1 -0
- package/dist/themes/index.d.ts +13 -0
- package/dist/themes/index.d.ts.map +1 -0
- package/dist/themes/index.js +15 -0
- package/dist/themes/index.js.map +1 -0
- package/dist/themes/modern.d.ts +6 -0
- package/dist/themes/modern.d.ts.map +1 -0
- package/dist/themes/modern.js +164 -0
- package/dist/themes/modern.js.map +1 -0
- package/dist/themes/types.d.ts +234 -0
- package/dist/themes/types.d.ts.map +1 -0
- package/dist/themes/types.js +5 -0
- package/dist/themes/types.js.map +1 -0
- package/dist/themes/utils.d.ts +21 -0
- package/dist/themes/utils.d.ts.map +1 -0
- package/dist/themes/utils.js +124 -0
- package/dist/themes/utils.js.map +1 -0
- package/package.json +92 -0
- package/src/icons/build-icons.ts +189 -0
- package/src/icons/default/access-point.svg +3 -0
- package/src/icons/default/cloud.svg +3 -0
- package/src/icons/default/database.svg +3 -0
- package/src/icons/default/firewall.svg +4 -0
- package/src/icons/default/generic.svg +3 -0
- package/src/icons/default/internet.svg +3 -0
- package/src/icons/default/l2-switch.svg +3 -0
- package/src/icons/default/l3-switch.svg +3 -0
- package/src/icons/default/load-balancer.svg +3 -0
- package/src/icons/default/router.svg +3 -0
- package/src/icons/default/server.svg +3 -0
- package/src/icons/default/vpn.svg +3 -0
- package/src/icons/generated-icons.ts +111 -0
- package/src/icons/index.ts +1 -0
- package/src/index.ts +21 -0
- package/src/layout/hierarchical.ts +1543 -0
- package/src/layout/index.ts +6 -0
- package/src/models/index.ts +5 -0
- package/src/models/types.ts +528 -0
- package/src/renderer/index.ts +6 -0
- package/src/renderer/svg.ts +997 -0
- package/src/themes/dark.ts +110 -0
- package/src/themes/index.ts +24 -0
- package/src/themes/modern.ts +186 -0
- package/src/themes/types.ts +262 -0
- package/src/themes/utils.ts +143 -0
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SVG Link Builder
|
|
3
|
+
* Renders RenderLink to SVG string
|
|
4
|
+
*/
|
|
5
|
+
import { escapeXml } from '../../svg-builder.js';
|
|
6
|
+
/**
|
|
7
|
+
* Render link as SVG group
|
|
8
|
+
*/
|
|
9
|
+
export function renderLink(link) {
|
|
10
|
+
const parts = [];
|
|
11
|
+
// Open group
|
|
12
|
+
const classNames = link.classes.join(' ');
|
|
13
|
+
const dataAttrs = Object.entries(link.dataAttributes)
|
|
14
|
+
.map(([k, v]) => `${k}="${v}"`)
|
|
15
|
+
.join(' ');
|
|
16
|
+
parts.push(`<g class="${classNames}" ${dataAttrs}>`);
|
|
17
|
+
// Render link lines (with bandwidth support)
|
|
18
|
+
parts.push(renderLinkLines(link));
|
|
19
|
+
// Center labels
|
|
20
|
+
for (const label of link.labels) {
|
|
21
|
+
parts.push(renderLabel(label));
|
|
22
|
+
}
|
|
23
|
+
// From endpoint labels
|
|
24
|
+
for (const label of link.fromLabels) {
|
|
25
|
+
parts.push(renderEndpointLabel(label));
|
|
26
|
+
}
|
|
27
|
+
// To endpoint labels
|
|
28
|
+
for (const label of link.toLabels) {
|
|
29
|
+
parts.push(renderEndpointLabel(label));
|
|
30
|
+
}
|
|
31
|
+
// Close group
|
|
32
|
+
parts.push('</g>');
|
|
33
|
+
return parts.join('\n');
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Render link lines with bandwidth support
|
|
37
|
+
*/
|
|
38
|
+
function renderLinkLines(link) {
|
|
39
|
+
const { pathData, style, markerStart, markerEnd, lineCount, points } = link;
|
|
40
|
+
const parts = [];
|
|
41
|
+
if (lineCount === 1) {
|
|
42
|
+
// Single line
|
|
43
|
+
parts.push(renderPath(pathData, style, markerStart, markerEnd));
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
// Multiple parallel lines for bandwidth visualization
|
|
47
|
+
const lineSpacing = 3;
|
|
48
|
+
const offsets = calculateLineOffsets(lineCount, lineSpacing);
|
|
49
|
+
for (const offset of offsets) {
|
|
50
|
+
const offsetPoints = offsetPointsPerp(points, offset);
|
|
51
|
+
const offsetPathData = generatePathData(offsetPoints);
|
|
52
|
+
parts.push(renderPath(offsetPathData, style, undefined, undefined));
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return parts.join('\n');
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Render a single path
|
|
59
|
+
*/
|
|
60
|
+
function renderPath(d, style, markerStart, markerEnd) {
|
|
61
|
+
const attrs = [
|
|
62
|
+
'class="link"',
|
|
63
|
+
`d="${d}"`,
|
|
64
|
+
'fill="none"',
|
|
65
|
+
];
|
|
66
|
+
if (style.stroke)
|
|
67
|
+
attrs.push(`stroke="${style.stroke}"`);
|
|
68
|
+
if (style.strokeWidth)
|
|
69
|
+
attrs.push(`stroke-width="${style.strokeWidth}"`);
|
|
70
|
+
if (style.strokeDasharray)
|
|
71
|
+
attrs.push(`stroke-dasharray="${style.strokeDasharray}"`);
|
|
72
|
+
if (markerStart)
|
|
73
|
+
attrs.push(`marker-start="${markerStart}"`);
|
|
74
|
+
if (markerEnd)
|
|
75
|
+
attrs.push(`marker-end="${markerEnd}"`);
|
|
76
|
+
return `<path ${attrs.join(' ')} />`;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Render center label
|
|
80
|
+
*/
|
|
81
|
+
function renderLabel(label) {
|
|
82
|
+
const { position, text, textStyle } = label;
|
|
83
|
+
return `<text class="link-label" x="${position.x}" y="${position.y}" text-anchor="${textStyle.textAnchor}" font-family="${textStyle.fontFamily}" font-size="${textStyle.fontSize}" fill="${textStyle.fill}">${escapeXml(text)}</text>`;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Render endpoint label with background
|
|
87
|
+
*/
|
|
88
|
+
function renderEndpointLabel(label) {
|
|
89
|
+
const parts = [];
|
|
90
|
+
// Background
|
|
91
|
+
if (label.background) {
|
|
92
|
+
const bg = label.background;
|
|
93
|
+
const bgStyle = bg.style;
|
|
94
|
+
const strokeAttr = bgStyle.stroke ? ` stroke="${bgStyle.stroke}" stroke-width="${bgStyle.strokeWidth || 0.5}"` : '';
|
|
95
|
+
parts.push(`<rect x="${bg.bounds.x}" y="${bg.bounds.y}" width="${bg.bounds.width}" height="${bg.bounds.height}" rx="${bg.cornerRadius}" fill="${bgStyle.fill}"${strokeAttr} />`);
|
|
96
|
+
}
|
|
97
|
+
// Text
|
|
98
|
+
const { position, text, textStyle } = label;
|
|
99
|
+
parts.push(`<text class="endpoint-label" x="${position.x}" y="${position.y}" text-anchor="${textStyle.textAnchor}" font-family="${textStyle.fontFamily}" font-size="${textStyle.fontSize}" fill="${textStyle.fill}">${escapeXml(text)}</text>`);
|
|
100
|
+
return parts.join('\n');
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Calculate line offsets for parallel lines
|
|
104
|
+
*/
|
|
105
|
+
function calculateLineOffsets(lineCount, spacing) {
|
|
106
|
+
const offsets = [];
|
|
107
|
+
const totalWidth = (lineCount - 1) * spacing;
|
|
108
|
+
const startOffset = -totalWidth / 2;
|
|
109
|
+
for (let i = 0; i < lineCount; i++) {
|
|
110
|
+
offsets.push(startOffset + i * spacing);
|
|
111
|
+
}
|
|
112
|
+
return offsets;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Offset points perpendicular to the line direction
|
|
116
|
+
*/
|
|
117
|
+
function offsetPointsPerp(points, offset) {
|
|
118
|
+
if (points.length < 2)
|
|
119
|
+
return points;
|
|
120
|
+
const dx = points[points.length - 1].x - points[0].x;
|
|
121
|
+
const dy = points[points.length - 1].y - points[0].y;
|
|
122
|
+
const len = Math.sqrt(dx * dx + dy * dy);
|
|
123
|
+
if (len === 0)
|
|
124
|
+
return points;
|
|
125
|
+
const perpX = -dy / len;
|
|
126
|
+
const perpY = dx / len;
|
|
127
|
+
return points.map(p => ({
|
|
128
|
+
x: p.x + perpX * offset,
|
|
129
|
+
y: p.y + perpY * offset,
|
|
130
|
+
}));
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Generate path data from points
|
|
134
|
+
*/
|
|
135
|
+
function generatePathData(points) {
|
|
136
|
+
if (points.length === 4) {
|
|
137
|
+
// Bezier curve
|
|
138
|
+
return `M ${points[0].x} ${points[0].y} C ${points[1].x} ${points[1].y}, ${points[2].x} ${points[2].y}, ${points[3].x} ${points[3].y}`;
|
|
139
|
+
}
|
|
140
|
+
else if (points.length === 2) {
|
|
141
|
+
// Straight line
|
|
142
|
+
return `M ${points[0].x} ${points[0].y} L ${points[1].x} ${points[1].y}`;
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
// Polyline
|
|
146
|
+
return points.map((p, i) => `${i === 0 ? 'M' : 'L'} ${p.x} ${p.y}`).join(' ');
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=link.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"link.js","sourceRoot":"","sources":["../../../../src/renderer/svg-string/builders/link.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SVG Node Builder
|
|
3
|
+
* Renders RenderNode to SVG string
|
|
4
|
+
*/
|
|
5
|
+
import type { RenderNode } from '../../render-model/types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Render node as SVG group
|
|
8
|
+
*/
|
|
9
|
+
export declare function renderNode(node: RenderNode): string;
|
|
10
|
+
//# sourceMappingURL=node.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../../../src/renderer/svg-string/builders/node.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAwC,MAAM,6BAA6B,CAAA;AAGnG;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAgCnD"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SVG Node Builder
|
|
3
|
+
* Renders RenderNode to SVG string
|
|
4
|
+
*/
|
|
5
|
+
import { escapeXml } from '../../svg-builder.js';
|
|
6
|
+
/**
|
|
7
|
+
* Render node as SVG group
|
|
8
|
+
*/
|
|
9
|
+
export function renderNode(node) {
|
|
10
|
+
const parts = [];
|
|
11
|
+
// Open group
|
|
12
|
+
const classNames = node.classes.join(' ');
|
|
13
|
+
const dataAttrs = Object.entries(node.dataAttributes)
|
|
14
|
+
.map(([k, v]) => `${k}="${v}"`)
|
|
15
|
+
.join(' ');
|
|
16
|
+
parts.push(`<g class="${classNames}" ${dataAttrs}>`);
|
|
17
|
+
// Shape
|
|
18
|
+
parts.push(renderShape(node));
|
|
19
|
+
// Icon
|
|
20
|
+
if (node.iconRef && node.iconPosition && node.iconSize) {
|
|
21
|
+
parts.push(renderIcon(node.iconRef, node.iconPosition, node.iconSize));
|
|
22
|
+
}
|
|
23
|
+
// Labels
|
|
24
|
+
for (const label of node.labels) {
|
|
25
|
+
parts.push(renderLabel(label));
|
|
26
|
+
}
|
|
27
|
+
// Ports
|
|
28
|
+
for (const port of node.ports) {
|
|
29
|
+
parts.push(renderPort(port));
|
|
30
|
+
}
|
|
31
|
+
// Close group
|
|
32
|
+
parts.push('</g>');
|
|
33
|
+
return parts.join('\n');
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Render node shape
|
|
37
|
+
*/
|
|
38
|
+
function renderShape(node) {
|
|
39
|
+
const { position, size, shape, style } = node;
|
|
40
|
+
const x = position.x;
|
|
41
|
+
const y = position.y;
|
|
42
|
+
const w = size.width;
|
|
43
|
+
const h = size.height;
|
|
44
|
+
const halfW = w / 2;
|
|
45
|
+
const halfH = h / 2;
|
|
46
|
+
const styleAttrs = buildStyleAttrs(style);
|
|
47
|
+
switch (shape) {
|
|
48
|
+
case 'rect':
|
|
49
|
+
return `<rect x="${x - halfW}" y="${y - halfH}" width="${w}" height="${h}" ${styleAttrs} />`;
|
|
50
|
+
case 'rounded':
|
|
51
|
+
return `<rect x="${x - halfW}" y="${y - halfH}" width="${w}" height="${h}" rx="8" ry="8" ${styleAttrs} />`;
|
|
52
|
+
case 'circle': {
|
|
53
|
+
const r = Math.min(halfW, halfH);
|
|
54
|
+
return `<circle cx="${x}" cy="${y}" r="${r}" ${styleAttrs} />`;
|
|
55
|
+
}
|
|
56
|
+
case 'diamond':
|
|
57
|
+
return `<polygon points="${x},${y - halfH} ${x + halfW},${y} ${x},${y + halfH} ${x - halfW},${y}" ${styleAttrs} />`;
|
|
58
|
+
case 'hexagon': {
|
|
59
|
+
const hx = halfW * 0.866;
|
|
60
|
+
return `<polygon points="${x - halfW},${y} ${x - hx},${y - halfH} ${x + hx},${y - halfH} ${x + halfW},${y} ${x + hx},${y + halfH} ${x - hx},${y + halfH}" ${styleAttrs} />`;
|
|
61
|
+
}
|
|
62
|
+
case 'cylinder': {
|
|
63
|
+
const ellipseH = h * 0.15;
|
|
64
|
+
return [
|
|
65
|
+
`<ellipse cx="${x}" cy="${y + halfH - ellipseH}" rx="${halfW}" ry="${ellipseH}" ${styleAttrs} />`,
|
|
66
|
+
`<rect x="${x - halfW}" y="${y - halfH + ellipseH}" width="${w}" height="${h - ellipseH * 2}" fill="${style.fill}" />`,
|
|
67
|
+
`<line x1="${x - halfW}" y1="${y - halfH + ellipseH}" x2="${x - halfW}" y2="${y + halfH - ellipseH}" stroke="${style.stroke}" stroke-width="${style.strokeWidth}" />`,
|
|
68
|
+
`<line x1="${x + halfW}" y1="${y - halfH + ellipseH}" x2="${x + halfW}" y2="${y + halfH - ellipseH}" stroke="${style.stroke}" stroke-width="${style.strokeWidth}" />`,
|
|
69
|
+
`<ellipse cx="${x}" cy="${y - halfH + ellipseH}" rx="${halfW}" ry="${ellipseH}" ${styleAttrs} />`,
|
|
70
|
+
].join('\n');
|
|
71
|
+
}
|
|
72
|
+
case 'stadium':
|
|
73
|
+
return `<rect x="${x - halfW}" y="${y - halfH}" width="${w}" height="${h}" rx="${halfH}" ry="${halfH}" ${styleAttrs} />`;
|
|
74
|
+
case 'trapezoid': {
|
|
75
|
+
const indent = w * 0.15;
|
|
76
|
+
return `<polygon points="${x - halfW + indent},${y - halfH} ${x + halfW - indent},${y - halfH} ${x + halfW},${y + halfH} ${x - halfW},${y + halfH}" ${styleAttrs} />`;
|
|
77
|
+
}
|
|
78
|
+
default:
|
|
79
|
+
return `<rect x="${x - halfW}" y="${y - halfH}" width="${w}" height="${h}" rx="4" ry="4" ${styleAttrs} />`;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Render icon using symbol reference
|
|
84
|
+
*/
|
|
85
|
+
function renderIcon(iconRef, position, size) {
|
|
86
|
+
return `<use href="#${iconRef}" x="${position.x}" y="${position.y}" width="${size.width}" height="${size.height}" class="node-icon" />`;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Render label
|
|
90
|
+
*/
|
|
91
|
+
function renderLabel(label) {
|
|
92
|
+
const { position, text, textStyle } = label;
|
|
93
|
+
const fontWeight = textStyle.fontWeight === 'bold' ? ' font-weight="bold"' : '';
|
|
94
|
+
return `<text x="${position.x}" y="${position.y}" text-anchor="${textStyle.textAnchor}" font-family="${textStyle.fontFamily}" font-size="${textStyle.fontSize}" fill="${textStyle.fill}"${fontWeight}>${escapeXml(text)}</text>`;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Render port
|
|
98
|
+
*/
|
|
99
|
+
function renderPort(port) {
|
|
100
|
+
const { absolutePosition, size, style, label } = port;
|
|
101
|
+
const x = absolutePosition.x - size.width / 2;
|
|
102
|
+
const y = absolutePosition.y - size.height / 2;
|
|
103
|
+
const parts = [];
|
|
104
|
+
// Port box
|
|
105
|
+
parts.push(`<rect class="port" data-port="${port.id}" x="${x}" y="${y}" width="${size.width}" height="${size.height}" rx="2" fill="${style.fill}" stroke="${style.stroke}" stroke-width="${style.strokeWidth}" />`);
|
|
106
|
+
// Label background
|
|
107
|
+
if (label.background) {
|
|
108
|
+
const bg = label.background;
|
|
109
|
+
parts.push(`<rect x="${bg.bounds.x}" y="${bg.bounds.y}" width="${bg.bounds.width}" height="${bg.bounds.height}" rx="${bg.cornerRadius}" fill="${bg.style.fill}" />`);
|
|
110
|
+
}
|
|
111
|
+
// Label text
|
|
112
|
+
parts.push(`<text class="port-label" x="${label.position.x}" y="${label.position.y}" text-anchor="${label.textStyle.textAnchor}" font-size="${label.textStyle.fontSize}" fill="${label.textStyle.fill}">${escapeXml(label.text)}</text>`);
|
|
113
|
+
return parts.join('\n');
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Build style attributes string
|
|
117
|
+
*/
|
|
118
|
+
function buildStyleAttrs(style) {
|
|
119
|
+
const attrs = [];
|
|
120
|
+
if (style.fill)
|
|
121
|
+
attrs.push(`fill="${style.fill}"`);
|
|
122
|
+
if (style.stroke)
|
|
123
|
+
attrs.push(`stroke="${style.stroke}"`);
|
|
124
|
+
if (style.strokeWidth)
|
|
125
|
+
attrs.push(`stroke-width="${style.strokeWidth}"`);
|
|
126
|
+
if (style.strokeDasharray)
|
|
127
|
+
attrs.push(`stroke-dasharray="${style.strokeDasharray}"`);
|
|
128
|
+
if (style.opacity !== undefined)
|
|
129
|
+
attrs.push(`opacity="${style.opacity}"`);
|
|
130
|
+
if (style.filter)
|
|
131
|
+
attrs.push(`filter="${style.filter}"`);
|
|
132
|
+
return attrs.join(' ');
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=node.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node.js","sourceRoot":"","sources":["../../../../src/renderer/svg-string/builders/node.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SVG Subgraph Builder
|
|
3
|
+
* Renders RenderSubgraph to SVG string
|
|
4
|
+
*/
|
|
5
|
+
import type { RenderSubgraph } from '../../render-model/types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Render subgraph as SVG group
|
|
8
|
+
*/
|
|
9
|
+
export declare function renderSubgraph(subgraph: RenderSubgraph): string;
|
|
10
|
+
//# sourceMappingURL=subgraph.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subgraph.d.ts","sourceRoot":"","sources":["../../../../src/renderer/svg-string/builders/subgraph.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAe,MAAM,6BAA6B,CAAA;AAG9E;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,CA2B/D"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SVG Subgraph Builder
|
|
3
|
+
* Renders RenderSubgraph to SVG string
|
|
4
|
+
*/
|
|
5
|
+
import { escapeXml } from '../../svg-builder.js';
|
|
6
|
+
/**
|
|
7
|
+
* Render subgraph as SVG group
|
|
8
|
+
*/
|
|
9
|
+
export function renderSubgraph(subgraph) {
|
|
10
|
+
const parts = [];
|
|
11
|
+
// Open group
|
|
12
|
+
const classNames = subgraph.classes.join(' ');
|
|
13
|
+
const dataAttrs = Object.entries(subgraph.dataAttributes)
|
|
14
|
+
.map(([k, v]) => `${k}="${v}"`)
|
|
15
|
+
.join(' ');
|
|
16
|
+
parts.push(`<g class="${classNames}" ${dataAttrs}>`);
|
|
17
|
+
// Background rect
|
|
18
|
+
const { bounds, style, cornerRadius } = subgraph;
|
|
19
|
+
parts.push(renderRect(bounds, style, cornerRadius));
|
|
20
|
+
// Icon
|
|
21
|
+
if (subgraph.iconRef && subgraph.iconPosition && subgraph.iconSize) {
|
|
22
|
+
parts.push(renderIcon(subgraph.iconRef, subgraph.iconPosition, subgraph.iconSize));
|
|
23
|
+
}
|
|
24
|
+
// Label
|
|
25
|
+
const { label } = subgraph;
|
|
26
|
+
parts.push(`<text class="subgraph-label" x="${label.position.x}" y="${label.position.y}" text-anchor="${label.textStyle.textAnchor}" font-family="${label.textStyle.fontFamily}" font-size="${label.textStyle.fontSize}" font-weight="${label.textStyle.fontWeight}" fill="${label.textStyle.fill}">${escapeXml(label.text)}</text>`);
|
|
27
|
+
// Close group
|
|
28
|
+
parts.push('</g>');
|
|
29
|
+
return parts.join('\n');
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Render background rectangle
|
|
33
|
+
*/
|
|
34
|
+
function renderRect(bounds, style, cornerRadius) {
|
|
35
|
+
const attrs = [
|
|
36
|
+
`x="${bounds.x}"`,
|
|
37
|
+
`y="${bounds.y}"`,
|
|
38
|
+
`width="${bounds.width}"`,
|
|
39
|
+
`height="${bounds.height}"`,
|
|
40
|
+
`rx="${cornerRadius}"`,
|
|
41
|
+
`ry="${cornerRadius}"`,
|
|
42
|
+
];
|
|
43
|
+
if (style.fill)
|
|
44
|
+
attrs.push(`fill="${style.fill}"`);
|
|
45
|
+
if (style.stroke)
|
|
46
|
+
attrs.push(`stroke="${style.stroke}"`);
|
|
47
|
+
if (style.strokeWidth)
|
|
48
|
+
attrs.push(`stroke-width="${style.strokeWidth}"`);
|
|
49
|
+
if (style.strokeDasharray)
|
|
50
|
+
attrs.push(`stroke-dasharray="${style.strokeDasharray}"`);
|
|
51
|
+
return `<rect ${attrs.join(' ')} />`;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Render icon using symbol reference
|
|
55
|
+
*/
|
|
56
|
+
function renderIcon(iconRef, position, size) {
|
|
57
|
+
return `<use href="#${iconRef}" x="${position.x}" y="${position.y}" width="${size.width}" height="${size.height}" class="subgraph-icon" />`;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=subgraph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subgraph.js","sourceRoot":"","sources":["../../../../src/renderer/svg-string/builders/subgraph.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/renderer/svg-string/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/renderer/svg-string/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAA"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SVG String Renderer
|
|
3
|
+
* Renders RenderModel to SVG string output
|
|
4
|
+
*/
|
|
5
|
+
import type { RenderModel } from '../render-model/types.js';
|
|
6
|
+
import type { Renderer, RendererOptions } from '../renderer-types.js';
|
|
7
|
+
export declare class SVGStringRenderer implements Renderer<'string'> {
|
|
8
|
+
constructor(_options?: RendererOptions);
|
|
9
|
+
render(model: RenderModel): string;
|
|
10
|
+
private renderOpen;
|
|
11
|
+
private renderStyles;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Create a new SVG string renderer
|
|
15
|
+
*/
|
|
16
|
+
export declare function createSVGStringRenderer(options?: RendererOptions): SVGStringRenderer;
|
|
17
|
+
//# sourceMappingURL=renderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../../src/renderer/svg-string/renderer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAC3D,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAUrE,qBAAa,iBAAkB,YAAW,QAAQ,CAAC,QAAQ,CAAC;gBAC9C,QAAQ,GAAE,eAAoB;IAI1C,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM;IAiClC,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,YAAY;CAGrB;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,CAAC,EAAE,eAAe,GAAG,iBAAiB,CAEpF"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SVG String Renderer
|
|
3
|
+
* Renders RenderModel to SVG string output
|
|
4
|
+
*/
|
|
5
|
+
import { renderDefs } from './builders/defs.js';
|
|
6
|
+
import { renderNode } from './builders/node.js';
|
|
7
|
+
import { renderLink } from './builders/link.js';
|
|
8
|
+
import { renderSubgraph } from './builders/subgraph.js';
|
|
9
|
+
// ============================================
|
|
10
|
+
// SVG String Renderer
|
|
11
|
+
// ============================================
|
|
12
|
+
export class SVGStringRenderer {
|
|
13
|
+
constructor(_options = {}) {
|
|
14
|
+
// Options reserved for future use (e.g., customizing output)
|
|
15
|
+
}
|
|
16
|
+
render(model) {
|
|
17
|
+
const parts = [];
|
|
18
|
+
// Open SVG
|
|
19
|
+
parts.push(this.renderOpen(model));
|
|
20
|
+
// Defs (icons, markers, filters)
|
|
21
|
+
parts.push(renderDefs(model.defs));
|
|
22
|
+
// Styles
|
|
23
|
+
parts.push(this.renderStyles(model.styles));
|
|
24
|
+
// Subgraphs (background layer)
|
|
25
|
+
for (const [, subgraph] of model.subgraphs) {
|
|
26
|
+
parts.push(renderSubgraph(subgraph));
|
|
27
|
+
}
|
|
28
|
+
// Links
|
|
29
|
+
for (const [, link] of model.links) {
|
|
30
|
+
parts.push(renderLink(link));
|
|
31
|
+
}
|
|
32
|
+
// Nodes (foreground layer)
|
|
33
|
+
for (const [, node] of model.nodes) {
|
|
34
|
+
parts.push(renderNode(node));
|
|
35
|
+
}
|
|
36
|
+
// Close SVG
|
|
37
|
+
parts.push('</svg>');
|
|
38
|
+
return parts.join('\n');
|
|
39
|
+
}
|
|
40
|
+
renderOpen(model) {
|
|
41
|
+
return `<svg xmlns="http://www.w3.org/2000/svg" viewBox="${model.viewBox}" width="${model.bounds.width}" height="${model.bounds.height}" style="background: ${model.backgroundColor}">`;
|
|
42
|
+
}
|
|
43
|
+
renderStyles(styles) {
|
|
44
|
+
return `<style>${styles}</style>`;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Create a new SVG string renderer
|
|
49
|
+
*/
|
|
50
|
+
export function createSVGStringRenderer(options) {
|
|
51
|
+
return new SVGStringRenderer(options);
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=renderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderer.js","sourceRoot":"","sources":["../../../src/renderer/svg-string/renderer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAEvD,+CAA+C;AAC/C,sBAAsB;AACtB,+CAA+C;AAE/C,MAAM,OAAO,iBAAiB;IAC5B,YAAY,WAA4B,EAAE;QACxC,6DAA6D;IAC/D,CAAC;IAED,MAAM,CAAC,KAAkB;QACvB,MAAM,KAAK,GAAa,EAAE,CAAA;QAE1B,WAAW;QACX,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAA;QAElC,iCAAiC;QACjC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAA;QAElC,SAAS;QACT,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAA;QAE3C,+BAA+B;QAC/B,KAAK,MAAM,CAAC,EAAE,QAAQ,CAAC,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;YAC3C,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAA;QACtC,CAAC;QAED,QAAQ;QACR,KAAK,MAAM,CAAC,EAAE,IAAI,CAAC,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YACnC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAA;QAC9B,CAAC;QAED,2BAA2B;QAC3B,KAAK,MAAM,CAAC,EAAE,IAAI,CAAC,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YACnC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAA;QAC9B,CAAC;QAED,YAAY;QACZ,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAEpB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACzB,CAAC;IAEO,UAAU,CAAC,KAAkB;QACnC,OAAO,oDAAoD,KAAK,CAAC,OAAO,YAAY,KAAK,CAAC,MAAM,CAAC,KAAK,aAAa,KAAK,CAAC,MAAM,CAAC,MAAM,wBAAwB,KAAK,CAAC,eAAe,IAAI,CAAA;IACzL,CAAC;IAEO,YAAY,CAAC,MAAc;QACjC,OAAO,UAAU,MAAM,UAAU,CAAA;IACnC,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAC,OAAyB;IAC/D,OAAO,IAAI,iBAAiB,CAAC,OAAO,CAAC,CAAA;AACvC,CAAC"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SVG Renderer
|
|
3
|
+
* Renders NetworkGraph to SVG
|
|
4
|
+
*/
|
|
5
|
+
import type { NetworkGraph, LayoutResult } from '../models/index.js';
|
|
6
|
+
export interface SVGRendererOptions {
|
|
7
|
+
/** Font family */
|
|
8
|
+
fontFamily?: string;
|
|
9
|
+
/** Include interactive elements */
|
|
10
|
+
interactive?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export declare class SVGRenderer {
|
|
13
|
+
private options;
|
|
14
|
+
private themeColors;
|
|
15
|
+
private iconTheme;
|
|
16
|
+
constructor(options?: SVGRendererOptions);
|
|
17
|
+
/**
|
|
18
|
+
* Get theme colors based on theme type
|
|
19
|
+
*/
|
|
20
|
+
private getThemeColors;
|
|
21
|
+
/**
|
|
22
|
+
* Get icon theme variant based on theme type
|
|
23
|
+
*/
|
|
24
|
+
private getIconTheme;
|
|
25
|
+
render(graph: NetworkGraph, layout: LayoutResult): string;
|
|
26
|
+
private renderHeader;
|
|
27
|
+
private renderDefs;
|
|
28
|
+
private renderStyles;
|
|
29
|
+
private renderSubgraph;
|
|
30
|
+
private renderNode;
|
|
31
|
+
/**
|
|
32
|
+
* Render ports on a node
|
|
33
|
+
*/
|
|
34
|
+
private renderPorts;
|
|
35
|
+
private renderNodeShape;
|
|
36
|
+
/**
|
|
37
|
+
* Calculate icon dimensions for a node
|
|
38
|
+
*/
|
|
39
|
+
private calculateIconInfo;
|
|
40
|
+
private renderNodeIcon;
|
|
41
|
+
private renderNodeLabel;
|
|
42
|
+
private renderLink;
|
|
43
|
+
private formatEndpointLabels;
|
|
44
|
+
/**
|
|
45
|
+
* Calculate position for endpoint label near the port (not along the line)
|
|
46
|
+
* This avoids label clustering at the center of links
|
|
47
|
+
* Labels are placed based on port position relative to node center
|
|
48
|
+
*/
|
|
49
|
+
private getEndpointLabelPosition;
|
|
50
|
+
/**
|
|
51
|
+
* Render endpoint labels (IP) with white background
|
|
52
|
+
*/
|
|
53
|
+
private renderEndpointLabels;
|
|
54
|
+
private getLinkStrokeWidth;
|
|
55
|
+
/**
|
|
56
|
+
* Bandwidth rendering configuration - line count represents speed
|
|
57
|
+
* 1G → 1 line
|
|
58
|
+
* 10G → 2 lines
|
|
59
|
+
* 25G → 3 lines
|
|
60
|
+
* 40G → 4 lines
|
|
61
|
+
* 100G → 5 lines
|
|
62
|
+
*/
|
|
63
|
+
private getBandwidthConfig;
|
|
64
|
+
/**
|
|
65
|
+
* Render bandwidth lines (single or multiple parallel lines)
|
|
66
|
+
*/
|
|
67
|
+
private renderBandwidthLines;
|
|
68
|
+
/**
|
|
69
|
+
* Generate SVG path string from points
|
|
70
|
+
*/
|
|
71
|
+
private generatePath;
|
|
72
|
+
/**
|
|
73
|
+
* Calculate offsets for parallel lines (centered around 0)
|
|
74
|
+
*/
|
|
75
|
+
private calculateLineOffsets;
|
|
76
|
+
/**
|
|
77
|
+
* Offset points perpendicular to the line direction
|
|
78
|
+
*/
|
|
79
|
+
private offsetPoints;
|
|
80
|
+
/**
|
|
81
|
+
* Get default link type based on redundancy
|
|
82
|
+
*/
|
|
83
|
+
private getDefaultLinkType;
|
|
84
|
+
/**
|
|
85
|
+
* Get default arrow type based on redundancy
|
|
86
|
+
*/
|
|
87
|
+
private getDefaultArrowType;
|
|
88
|
+
/**
|
|
89
|
+
* VLAN color palette - distinct colors for different VLANs
|
|
90
|
+
*/
|
|
91
|
+
private static readonly VLAN_COLORS;
|
|
92
|
+
/**
|
|
93
|
+
* Get stroke color based on VLANs
|
|
94
|
+
*/
|
|
95
|
+
private getVlanStroke;
|
|
96
|
+
private getLinkDasharray;
|
|
97
|
+
private getMidPoint;
|
|
98
|
+
private escapeXml;
|
|
99
|
+
/**
|
|
100
|
+
* Simple string hash for consistent but varied label placement
|
|
101
|
+
*/
|
|
102
|
+
private hashString;
|
|
103
|
+
}
|
|
104
|
+
export declare const svgRenderer: SVGRenderer;
|
|
105
|
+
//# sourceMappingURL=svg.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"svg.d.ts","sourceRoot":"","sources":["../../src/renderer/svg.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,YAAY,EACZ,YAAY,EASb,MAAM,oBAAoB,CAAA;AAiE3B,MAAM,WAAW,kBAAkB;IACjC,kBAAkB;IAClB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,mCAAmC;IACnC,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB;AAWD,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAA8B;IAC7C,OAAO,CAAC,WAAW,CAA2B;IAC9C,OAAO,CAAC,SAAS,CAA8B;gBAEnC,OAAO,CAAC,EAAE,kBAAkB;IAIxC;;OAEG;IACH,OAAO,CAAC,cAAc;IAItB;;OAEG;IACH,OAAO,CAAC,YAAY;IAIpB,MAAM,CAAC,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,GAAG,MAAM;IAyCzD,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,UAAU;IAiBlB,OAAO,CAAC,YAAY;IAcpB,OAAO,CAAC,cAAc;IA2EtB,OAAO,CAAC,UAAU;IA0BlB;;OAEG;IACH,OAAO,CAAC,WAAW;IAiEnB,OAAO,CAAC,eAAe;IA2DvB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA0EzB,OAAO,CAAC,cAAc;IAWtB,OAAO,CAAC,eAAe;IAqBvB,OAAO,CAAC,UAAU;IAgElB,OAAO,CAAC,oBAAoB;IAO5B;;;;OAIG;IACH,OAAO,CAAC,wBAAwB;IA+EhC;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAiC5B,OAAO,CAAC,kBAAkB;IAQ1B;;;;;;;OAOG;IACH,OAAO,CAAC,kBAAkB;IAkB1B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IA6C5B;;OAEG;IACH,OAAO,CAAC,YAAY;IAapB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAW5B;;OAEG;IACH,OAAO,CAAC,YAAY;IAqBpB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAe1B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAK3B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAalC;IAED;;OAEG;IACH,OAAO,CAAC,aAAa;IAiBrB,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,WAAW;IAoCnB,OAAO,CAAC,SAAS;IASjB;;OAEG;IACH,OAAO,CAAC,UAAU;CASnB;AAGD,eAAO,MAAM,WAAW,aAAoB,CAAA"}
|