@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.
Files changed (220) hide show
  1. package/dist/icons/build-icons.d.ts +6 -0
  2. package/dist/icons/build-icons.d.ts.map +1 -0
  3. package/dist/icons/build-icons.js +163 -0
  4. package/dist/icons/build-icons.js.map +1 -0
  5. package/dist/icons/generated-icons.d.ts +32 -0
  6. package/dist/icons/generated-icons.d.ts.map +1 -0
  7. package/dist/icons/generated-icons.js +88 -0
  8. package/dist/icons/generated-icons.js.map +1 -0
  9. package/dist/icons/index.d.ts +2 -0
  10. package/dist/icons/index.d.ts.map +1 -0
  11. package/dist/icons/index.js +2 -0
  12. package/dist/icons/index.js.map +1 -0
  13. package/dist/index.d.ts +10 -0
  14. package/dist/index.d.ts.map +1 -0
  15. package/dist/index.js +16 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/layout/hierarchical.d.ts +73 -0
  18. package/dist/layout/hierarchical.d.ts.map +1 -0
  19. package/dist/layout/hierarchical.js +1320 -0
  20. package/dist/layout/hierarchical.js.map +1 -0
  21. package/dist/layout/index.d.ts +6 -0
  22. package/dist/layout/index.d.ts.map +1 -0
  23. package/dist/layout/index.js +5 -0
  24. package/dist/layout/index.js.map +1 -0
  25. package/dist/models/index.d.ts +5 -0
  26. package/dist/models/index.d.ts.map +1 -0
  27. package/dist/models/index.js +5 -0
  28. package/dist/models/index.js.map +1 -0
  29. package/dist/models/types.d.ts +381 -0
  30. package/dist/models/types.d.ts.map +1 -0
  31. package/dist/models/types.js +61 -0
  32. package/dist/models/types.js.map +1 -0
  33. package/dist/renderer/components/index.d.ts +8 -0
  34. package/dist/renderer/components/index.d.ts.map +1 -0
  35. package/dist/renderer/components/index.js +8 -0
  36. package/dist/renderer/components/index.js.map +1 -0
  37. package/dist/renderer/components/link-renderer.d.ts +11 -0
  38. package/dist/renderer/components/link-renderer.d.ts.map +1 -0
  39. package/dist/renderer/components/link-renderer.js +340 -0
  40. package/dist/renderer/components/link-renderer.js.map +1 -0
  41. package/dist/renderer/components/node-renderer.d.ts +14 -0
  42. package/dist/renderer/components/node-renderer.d.ts.map +1 -0
  43. package/dist/renderer/components/node-renderer.js +242 -0
  44. package/dist/renderer/components/node-renderer.js.map +1 -0
  45. package/dist/renderer/components/port-renderer.d.ts +8 -0
  46. package/dist/renderer/components/port-renderer.d.ts.map +1 -0
  47. package/dist/renderer/components/port-renderer.js +85 -0
  48. package/dist/renderer/components/port-renderer.js.map +1 -0
  49. package/dist/renderer/components/subgraph-renderer.d.ts +13 -0
  50. package/dist/renderer/components/subgraph-renderer.d.ts.map +1 -0
  51. package/dist/renderer/components/subgraph-renderer.js +85 -0
  52. package/dist/renderer/components/subgraph-renderer.js.map +1 -0
  53. package/dist/renderer/icon-registry/index.d.ts +6 -0
  54. package/dist/renderer/icon-registry/index.d.ts.map +1 -0
  55. package/dist/renderer/icon-registry/index.js +5 -0
  56. package/dist/renderer/icon-registry/index.js.map +1 -0
  57. package/dist/renderer/icon-registry/registry.d.ts +25 -0
  58. package/dist/renderer/icon-registry/registry.d.ts.map +1 -0
  59. package/dist/renderer/icon-registry/registry.js +85 -0
  60. package/dist/renderer/icon-registry/registry.js.map +1 -0
  61. package/dist/renderer/icon-registry/types.d.ts +44 -0
  62. package/dist/renderer/icon-registry/types.d.ts.map +1 -0
  63. package/dist/renderer/icon-registry/types.js +5 -0
  64. package/dist/renderer/icon-registry/types.js.map +1 -0
  65. package/dist/renderer/index.d.ts +6 -0
  66. package/dist/renderer/index.d.ts.map +1 -0
  67. package/dist/renderer/index.js +5 -0
  68. package/dist/renderer/index.js.map +1 -0
  69. package/dist/renderer/render-model/builder.d.ts +43 -0
  70. package/dist/renderer/render-model/builder.d.ts.map +1 -0
  71. package/dist/renderer/render-model/builder.js +646 -0
  72. package/dist/renderer/render-model/builder.js.map +1 -0
  73. package/dist/renderer/render-model/index.d.ts +6 -0
  74. package/dist/renderer/render-model/index.d.ts.map +1 -0
  75. package/dist/renderer/render-model/index.js +5 -0
  76. package/dist/renderer/render-model/index.js.map +1 -0
  77. package/dist/renderer/render-model/types.d.ts +216 -0
  78. package/dist/renderer/render-model/types.d.ts.map +1 -0
  79. package/dist/renderer/render-model/types.js +6 -0
  80. package/dist/renderer/render-model/types.js.map +1 -0
  81. package/dist/renderer/renderer-types.d.ts +55 -0
  82. package/dist/renderer/renderer-types.d.ts.map +1 -0
  83. package/dist/renderer/renderer-types.js +5 -0
  84. package/dist/renderer/renderer-types.js.map +1 -0
  85. package/dist/renderer/svg-builder.d.ts +152 -0
  86. package/dist/renderer/svg-builder.d.ts.map +1 -0
  87. package/dist/renderer/svg-builder.js +176 -0
  88. package/dist/renderer/svg-builder.js.map +1 -0
  89. package/dist/renderer/svg-dom/builders/defs.d.ts +10 -0
  90. package/dist/renderer/svg-dom/builders/defs.d.ts.map +1 -0
  91. package/dist/renderer/svg-dom/builders/defs.js +82 -0
  92. package/dist/renderer/svg-dom/builders/defs.js.map +1 -0
  93. package/dist/renderer/svg-dom/builders/index.d.ts +9 -0
  94. package/dist/renderer/svg-dom/builders/index.d.ts.map +1 -0
  95. package/dist/renderer/svg-dom/builders/index.js +9 -0
  96. package/dist/renderer/svg-dom/builders/index.js.map +1 -0
  97. package/dist/renderer/svg-dom/builders/link.d.ts +18 -0
  98. package/dist/renderer/svg-dom/builders/link.d.ts.map +1 -0
  99. package/dist/renderer/svg-dom/builders/link.js +188 -0
  100. package/dist/renderer/svg-dom/builders/link.js.map +1 -0
  101. package/dist/renderer/svg-dom/builders/node.d.ts +15 -0
  102. package/dist/renderer/svg-dom/builders/node.d.ts.map +1 -0
  103. package/dist/renderer/svg-dom/builders/node.js +262 -0
  104. package/dist/renderer/svg-dom/builders/node.js.map +1 -0
  105. package/dist/renderer/svg-dom/builders/subgraph.d.ts +14 -0
  106. package/dist/renderer/svg-dom/builders/subgraph.d.ts.map +1 -0
  107. package/dist/renderer/svg-dom/builders/subgraph.js +63 -0
  108. package/dist/renderer/svg-dom/builders/subgraph.js.map +1 -0
  109. package/dist/renderer/svg-dom/builders/utils.d.ts +40 -0
  110. package/dist/renderer/svg-dom/builders/utils.d.ts.map +1 -0
  111. package/dist/renderer/svg-dom/builders/utils.js +79 -0
  112. package/dist/renderer/svg-dom/builders/utils.js.map +1 -0
  113. package/dist/renderer/svg-dom/index.d.ts +9 -0
  114. package/dist/renderer/svg-dom/index.d.ts.map +1 -0
  115. package/dist/renderer/svg-dom/index.js +7 -0
  116. package/dist/renderer/svg-dom/index.js.map +1 -0
  117. package/dist/renderer/svg-dom/interaction.d.ts +69 -0
  118. package/dist/renderer/svg-dom/interaction.d.ts.map +1 -0
  119. package/dist/renderer/svg-dom/interaction.js +296 -0
  120. package/dist/renderer/svg-dom/interaction.js.map +1 -0
  121. package/dist/renderer/svg-dom/renderer.d.ts +47 -0
  122. package/dist/renderer/svg-dom/renderer.d.ts.map +1 -0
  123. package/dist/renderer/svg-dom/renderer.js +188 -0
  124. package/dist/renderer/svg-dom/renderer.js.map +1 -0
  125. package/dist/renderer/svg-string/builders/defs.d.ts +10 -0
  126. package/dist/renderer/svg-string/builders/defs.d.ts.map +1 -0
  127. package/dist/renderer/svg-string/builders/defs.js +43 -0
  128. package/dist/renderer/svg-string/builders/defs.js.map +1 -0
  129. package/dist/renderer/svg-string/builders/link.d.ts +10 -0
  130. package/dist/renderer/svg-string/builders/link.d.ts.map +1 -0
  131. package/dist/renderer/svg-string/builders/link.js +149 -0
  132. package/dist/renderer/svg-string/builders/link.js.map +1 -0
  133. package/dist/renderer/svg-string/builders/node.d.ts +10 -0
  134. package/dist/renderer/svg-string/builders/node.d.ts.map +1 -0
  135. package/dist/renderer/svg-string/builders/node.js +134 -0
  136. package/dist/renderer/svg-string/builders/node.js.map +1 -0
  137. package/dist/renderer/svg-string/builders/subgraph.d.ts +10 -0
  138. package/dist/renderer/svg-string/builders/subgraph.d.ts.map +1 -0
  139. package/dist/renderer/svg-string/builders/subgraph.js +59 -0
  140. package/dist/renderer/svg-string/builders/subgraph.js.map +1 -0
  141. package/dist/renderer/svg-string/index.d.ts +5 -0
  142. package/dist/renderer/svg-string/index.d.ts.map +1 -0
  143. package/dist/renderer/svg-string/index.js +5 -0
  144. package/dist/renderer/svg-string/index.js.map +1 -0
  145. package/dist/renderer/svg-string/renderer.d.ts +17 -0
  146. package/dist/renderer/svg-string/renderer.d.ts.map +1 -0
  147. package/dist/renderer/svg-string/renderer.js +53 -0
  148. package/dist/renderer/svg-string/renderer.js.map +1 -0
  149. package/dist/renderer/svg.d.ts +105 -0
  150. package/dist/renderer/svg.d.ts.map +1 -0
  151. package/dist/renderer/svg.js +804 -0
  152. package/dist/renderer/svg.js.map +1 -0
  153. package/dist/renderer/text-measurer/browser-measurer.d.ts +25 -0
  154. package/dist/renderer/text-measurer/browser-measurer.d.ts.map +1 -0
  155. package/dist/renderer/text-measurer/browser-measurer.js +85 -0
  156. package/dist/renderer/text-measurer/browser-measurer.js.map +1 -0
  157. package/dist/renderer/text-measurer/fallback-measurer.d.ts +22 -0
  158. package/dist/renderer/text-measurer/fallback-measurer.d.ts.map +1 -0
  159. package/dist/renderer/text-measurer/fallback-measurer.js +113 -0
  160. package/dist/renderer/text-measurer/fallback-measurer.js.map +1 -0
  161. package/dist/renderer/text-measurer/index.d.ts +13 -0
  162. package/dist/renderer/text-measurer/index.d.ts.map +1 -0
  163. package/dist/renderer/text-measurer/index.js +35 -0
  164. package/dist/renderer/text-measurer/index.js.map +1 -0
  165. package/dist/renderer/text-measurer/types.d.ts +30 -0
  166. package/dist/renderer/text-measurer/types.d.ts.map +1 -0
  167. package/dist/renderer/text-measurer/types.js +5 -0
  168. package/dist/renderer/text-measurer/types.js.map +1 -0
  169. package/dist/renderer/theme.d.ts +29 -0
  170. package/dist/renderer/theme.d.ts.map +1 -0
  171. package/dist/renderer/theme.js +80 -0
  172. package/dist/renderer/theme.js.map +1 -0
  173. package/dist/themes/dark.d.ts +6 -0
  174. package/dist/themes/dark.d.ts.map +1 -0
  175. package/dist/themes/dark.js +96 -0
  176. package/dist/themes/dark.js.map +1 -0
  177. package/dist/themes/index.d.ts +13 -0
  178. package/dist/themes/index.d.ts.map +1 -0
  179. package/dist/themes/index.js +15 -0
  180. package/dist/themes/index.js.map +1 -0
  181. package/dist/themes/modern.d.ts +6 -0
  182. package/dist/themes/modern.d.ts.map +1 -0
  183. package/dist/themes/modern.js +164 -0
  184. package/dist/themes/modern.js.map +1 -0
  185. package/dist/themes/types.d.ts +234 -0
  186. package/dist/themes/types.d.ts.map +1 -0
  187. package/dist/themes/types.js +5 -0
  188. package/dist/themes/types.js.map +1 -0
  189. package/dist/themes/utils.d.ts +21 -0
  190. package/dist/themes/utils.d.ts.map +1 -0
  191. package/dist/themes/utils.js +124 -0
  192. package/dist/themes/utils.js.map +1 -0
  193. package/package.json +92 -0
  194. package/src/icons/build-icons.ts +189 -0
  195. package/src/icons/default/access-point.svg +3 -0
  196. package/src/icons/default/cloud.svg +3 -0
  197. package/src/icons/default/database.svg +3 -0
  198. package/src/icons/default/firewall.svg +4 -0
  199. package/src/icons/default/generic.svg +3 -0
  200. package/src/icons/default/internet.svg +3 -0
  201. package/src/icons/default/l2-switch.svg +3 -0
  202. package/src/icons/default/l3-switch.svg +3 -0
  203. package/src/icons/default/load-balancer.svg +3 -0
  204. package/src/icons/default/router.svg +3 -0
  205. package/src/icons/default/server.svg +3 -0
  206. package/src/icons/default/vpn.svg +3 -0
  207. package/src/icons/generated-icons.ts +111 -0
  208. package/src/icons/index.ts +1 -0
  209. package/src/index.ts +21 -0
  210. package/src/layout/hierarchical.ts +1543 -0
  211. package/src/layout/index.ts +6 -0
  212. package/src/models/index.ts +5 -0
  213. package/src/models/types.ts +528 -0
  214. package/src/renderer/index.ts +6 -0
  215. package/src/renderer/svg.ts +997 -0
  216. package/src/themes/dark.ts +110 -0
  217. package/src/themes/index.ts +24 -0
  218. package/src/themes/modern.ts +186 -0
  219. package/src/themes/types.ts +262 -0
  220. 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,5 @@
1
+ /**
2
+ * SVG String Renderer Module
3
+ */
4
+ export { SVGStringRenderer, createSVGStringRenderer } from './renderer.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -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,5 @@
1
+ /**
2
+ * SVG String Renderer Module
3
+ */
4
+ export { SVGStringRenderer, createSVGStringRenderer } from './renderer.js';
5
+ //# sourceMappingURL=index.js.map
@@ -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"}