@xpressai/xircuits-viewer 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 (69) hide show
  1. package/dist/index.d.ts +10 -0
  2. package/dist/index.d.ts.map +1 -0
  3. package/dist/index.js +36 -0
  4. package/dist/index.js.map +1 -0
  5. package/dist/interaction/panZoom.d.ts +16 -0
  6. package/dist/interaction/panZoom.d.ts.map +1 -0
  7. package/dist/interaction/panZoom.js +84 -0
  8. package/dist/interaction/panZoom.js.map +1 -0
  9. package/dist/layout/metrics.d.ts +18 -0
  10. package/dist/layout/metrics.d.ts.map +1 -0
  11. package/dist/layout/metrics.js +78 -0
  12. package/dist/layout/metrics.js.map +1 -0
  13. package/dist/layout/viewBox.d.ts +9 -0
  14. package/dist/layout/viewBox.d.ts.map +1 -0
  15. package/dist/layout/viewBox.js +25 -0
  16. package/dist/layout/viewBox.js.map +1 -0
  17. package/dist/parser/classify.d.ts +10 -0
  18. package/dist/parser/classify.d.ts.map +1 -0
  19. package/dist/parser/classify.js +52 -0
  20. package/dist/parser/classify.js.map +1 -0
  21. package/dist/parser/parse.d.ts +3 -0
  22. package/dist/parser/parse.d.ts.map +1 -0
  23. package/dist/parser/parse.js +92 -0
  24. package/dist/parser/parse.js.map +1 -0
  25. package/dist/parser/validate.d.ts +5 -0
  26. package/dist/parser/validate.d.ts.map +1 -0
  27. package/dist/parser/validate.js +31 -0
  28. package/dist/parser/validate.js.map +1 -0
  29. package/dist/render/colors.d.ts +14 -0
  30. package/dist/render/colors.d.ts.map +1 -0
  31. package/dist/render/colors.js +78 -0
  32. package/dist/render/colors.js.map +1 -0
  33. package/dist/render/renderDefs.d.ts +4 -0
  34. package/dist/render/renderDefs.d.ts.map +1 -0
  35. package/dist/render/renderDefs.js +128 -0
  36. package/dist/render/renderDefs.js.map +1 -0
  37. package/dist/render/renderEdge.d.ts +3 -0
  38. package/dist/render/renderEdge.d.ts.map +1 -0
  39. package/dist/render/renderEdge.js +13 -0
  40. package/dist/render/renderEdge.js.map +1 -0
  41. package/dist/render/renderGraph.d.ts +5 -0
  42. package/dist/render/renderGraph.d.ts.map +1 -0
  43. package/dist/render/renderGraph.js +40 -0
  44. package/dist/render/renderGraph.js.map +1 -0
  45. package/dist/render/renderNode.d.ts +3 -0
  46. package/dist/render/renderNode.d.ts.map +1 -0
  47. package/dist/render/renderNode.js +81 -0
  48. package/dist/render/renderNode.js.map +1 -0
  49. package/dist/render/renderPort.d.ts +3 -0
  50. package/dist/render/renderPort.d.ts.map +1 -0
  51. package/dist/render/renderPort.js +57 -0
  52. package/dist/render/renderPort.js.map +1 -0
  53. package/dist/render/symbols.d.ts +6 -0
  54. package/dist/render/symbols.d.ts.map +1 -0
  55. package/dist/render/symbols.js +45 -0
  56. package/dist/render/symbols.js.map +1 -0
  57. package/dist/svg/bezier.d.ts +7 -0
  58. package/dist/svg/bezier.d.ts.map +1 -0
  59. package/dist/svg/bezier.js +9 -0
  60. package/dist/svg/bezier.js.map +1 -0
  61. package/dist/svg/builder.d.ts +11 -0
  62. package/dist/svg/builder.d.ts.map +1 -0
  63. package/dist/svg/builder.js +48 -0
  64. package/dist/svg/builder.js.map +1 -0
  65. package/dist/types.d.ts +69 -0
  66. package/dist/types.d.ts.map +1 -0
  67. package/dist/types.js +2 -0
  68. package/dist/types.js.map +1 -0
  69. package/package.json +25 -0
@@ -0,0 +1,78 @@
1
+ // Color utilities for title bar gradients.
2
+ // Replicates the Xircuits oklch gradient logic from CustomNodeWidget.tsx.
3
+ // Outputs oklch() CSS — requires a modern browser or renderer for full fidelity.
4
+ function parseColor(color) {
5
+ const named = {
6
+ red: '#ff0000', blue: '#0000ff', green: '#008000', yellow: '#ffff00',
7
+ orange: '#ffa500', purple: '#800080', pink: '#ffc0cb', lightpink: '#ffb6c1',
8
+ cyan: '#00ffff', white: '#ffffff', black: '#000000', gray: '#808080',
9
+ grey: '#808080', salmon: '#fa8072', coral: '#ff7f50', teal: '#008080',
10
+ navy: '#000080', maroon: '#800000', lime: '#00ff00', magenta: '#ff00ff',
11
+ darkred: '#8b0000', darkblue: '#00008b', darkgreen: '#006400',
12
+ goldenrod: '#daa520', tomato: '#ff6347', orchid: '#da70d6',
13
+ };
14
+ const lower = color.toLowerCase().trim();
15
+ if (named[lower])
16
+ color = named[lower];
17
+ const hexMatch = color.match(/^#([0-9a-f]{3,8})$/i);
18
+ if (hexMatch) {
19
+ let hex = hexMatch[1];
20
+ if (hex.length === 3)
21
+ hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2];
22
+ return {
23
+ r: parseInt(hex.slice(0, 2), 16) / 255,
24
+ g: parseInt(hex.slice(2, 4), 16) / 255,
25
+ b: parseInt(hex.slice(4, 6), 16) / 255,
26
+ };
27
+ }
28
+ const rgbMatch = color.match(/rgb\(\s*(\d+)[,\s]+(\d+)[,\s]+(\d+)/);
29
+ if (rgbMatch) {
30
+ return {
31
+ r: parseInt(rgbMatch[1]) / 255,
32
+ g: parseInt(rgbMatch[2]) / 255,
33
+ b: parseInt(rgbMatch[3]) / 255,
34
+ };
35
+ }
36
+ return { r: 0.5, g: 0.5, b: 0.5 };
37
+ }
38
+ function srgbToLinear(c) {
39
+ return c <= 0.04045 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
40
+ }
41
+ function toOklab(r, g, b) {
42
+ const l_ = 0.4122214708 * r + 0.5363325363 * g + 0.0514459929 * b;
43
+ const m_ = 0.2119034982 * r + 0.6806995451 * g + 0.1073969566 * b;
44
+ const s_ = 0.0883024619 * r + 0.2817188376 * g + 0.6299787005 * b;
45
+ const l = Math.cbrt(l_), m = Math.cbrt(m_), s = Math.cbrt(s_);
46
+ return {
47
+ L: 0.2104542553 * l + 0.7936177850 * m - 0.0040720468 * s,
48
+ a: 1.9779984951 * l - 2.4285922050 * m + 0.4505937099 * s,
49
+ b: 0.0259040371 * l + 0.7827717662 * m - 0.8086757660 * s,
50
+ };
51
+ }
52
+ function rgbToOklch(color) {
53
+ const { r, g, b } = parseColor(color);
54
+ const lab = toOklab(srgbToLinear(r), srgbToLinear(g), srgbToLinear(b));
55
+ const c = Math.sqrt(lab.a * lab.a + lab.b * lab.b);
56
+ let h = Math.atan2(lab.b, lab.a) * (180 / Math.PI);
57
+ if (h < 0)
58
+ h += 360;
59
+ return { l: lab.L, c, h };
60
+ }
61
+ /**
62
+ * Replicate the Xircuits title gradient from CustomNodeWidget.tsx:
63
+ * const color = new Color(p.background);
64
+ * color.alpha = 0.75; color.oklch.c *= 1.2;
65
+ * const color1 = color.to('oklch').toString()
66
+ * color.oklch.c *= 1.2; color.oklch.l /= 2;
67
+ * const color2 = color.to('oklch').toString()
68
+ */
69
+ export function titleGradient(baseColor) {
70
+ const oklch = rgbToOklch(baseColor);
71
+ const c1_c = oklch.c * 1.2;
72
+ const c1 = `oklch(${(oklch.l * 100).toFixed(1)}% ${c1_c.toFixed(4)} ${oklch.h.toFixed(1)} / 0.75)`;
73
+ const c2_c = c1_c * 1.2;
74
+ const c2_l = oklch.l / 2;
75
+ const c2 = `oklch(${(c2_l * 100).toFixed(1)}% ${c2_c.toFixed(4)} ${oklch.h.toFixed(1)} / 0.75)`;
76
+ return { color1: c1, color2: c2 };
77
+ }
78
+ //# sourceMappingURL=colors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"colors.js","sourceRoot":"","sources":["../../src/render/colors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { XNode } from '../types.js';
2
+ export declare function renderDefs(nodes: XNode[], theme: 'dark' | 'light'): string;
3
+ export declare function colorToGradientId(color: string): string;
4
+ //# sourceMappingURL=renderDefs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderDefs.d.ts","sourceRoot":"","sources":["../../src/render/renderDefs.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAGzC,wBAAgB,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CA8C1E;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEvD"}
@@ -0,0 +1,128 @@
1
+ import { el } from '../svg/builder.js';
2
+ import { titleGradient } from './colors.js';
3
+ export function renderDefs(nodes, theme) {
4
+ const gradients = [];
5
+ const seenColors = new Set();
6
+ for (const node of nodes) {
7
+ if (node.kind === 'comment')
8
+ continue;
9
+ const color = node.color;
10
+ if (seenColors.has(color))
11
+ continue;
12
+ seenColors.add(color);
13
+ const { color1, color2 } = titleGradient(color);
14
+ const gradId = colorToGradientId(color);
15
+ gradients.push(el('linearGradient', { id: gradId, x1: '0', y1: '0', x2: '0', y2: '1' }, el('stop', { offset: '0%', 'stop-color': color1 }), el('stop', { offset: '100%', 'stop-color': color2 })));
16
+ }
17
+ const style = renderStyleBlock(theme);
18
+ const flowInSymbol = el('symbol', { id: 'xg-flow-in', viewBox: '0 0 24 24' }, el('path', { stroke: 'none', d: 'M0 0h24v24H0z', fill: 'none' }), el('path', { d: 'M3 12h12' }), el('path', { d: 'M11 8l4 4l-4 4' }), el('path', { d: 'M12 21a9 9 0 0 0 0 -18' }));
19
+ const flowOutSymbol = el('symbol', { id: 'xg-flow-out', viewBox: '0 0 24 24' }, el('path', { stroke: 'none', d: 'M0 0h24v24H0z', fill: 'none' }), el('path', { d: 'M9 12h12' }), el('path', { d: 'M17 16l4 -4l-4 -4' }), el('path', { d: 'M12 3a9 9 0 1 0 0 18' }));
20
+ // Node icon symbols (from style/icons/*.svg in the Xircuits repo)
21
+ const nodeIcons = renderNodeIconSymbols();
22
+ return el('defs', {}, style, ...gradients, flowInSymbol, flowOutSymbol, nodeIcons);
23
+ }
24
+ export function colorToGradientId(color) {
25
+ return 'xg-grad-' + color.replace(/[^a-zA-Z0-9]/g, '_');
26
+ }
27
+ function renderNodeIconSymbols() {
28
+ const s = el;
29
+ // Each symbol extracted from style/icons/*.svg in the Xircuits repo
30
+ // All use viewBox="0 0 24 24", stroke="currentColor" (inherited)
31
+ const icons = [];
32
+ // start-finish-component.svg (filled direction sign diamond)
33
+ icons.push(s('symbol', { id: 'xg-icon-start-finish', viewBox: '0 0 24 24', fill: 'currentColor' }, s('path', { stroke: 'none', d: 'M0 0h24v24H0z', fill: 'none' }), s('path', { d: 'M10.52 2.614a2.095 2.095 0 0 1 2.835 -.117l.126 .117l7.905 7.905c.777 .777 .816 2.013 .117 2.836l-.117 .126l-7.905 7.905a2.094 2.094 0 0 1 -2.836 .117l-.126 -.117l-7.907 -7.906a2.096 2.096 0 0 1 -.115 -2.835l.117 -.126l7.905 -7.905zm5.969 9.535l.01 -.116l-.003 -.12l-.016 -.114l-.03 -.11l-.044 -.112l-.052 -.098l-.076 -.105l-.07 -.081l-3.5 -3.5l-.095 -.083a1 1 0 0 0 -1.226 0l-.094 .083l-.083 .094a1 1 0 0 0 0 1.226l.083 .094l1.792 1.793h-5.085l-.117 .007a1 1 0 0 0 0 1.986l.117 .007h5.085l-1.792 1.793l-.083 .094a1 1 0 0 0 1.403 1.403l.094 -.083l3.5 -3.5l.097 -.112l.05 -.074l.037 -.067l.05 -.112l.023 -.076l.025 -.117z' })));
34
+ // component-library.svg (3D cube outline)
35
+ icons.push(s('symbol', { id: 'xg-icon-component', viewBox: '0 0 24 24', fill: 'none', stroke: 'currentColor', 'stroke-width': 2, 'stroke-linecap': 'round', 'stroke-linejoin': 'round' }, s('path', { stroke: 'none', d: 'M0 0h24v24H0z', fill: 'none' }), s('path', { d: 'M21 16.008v-8.018a1.98 1.98 0 0 0 -1 -1.717l-7 -4.008a2.016 2.016 0 0 0 -2 0l-7 4.008c-.619 .355 -1 1.01 -1 1.718v8.018c0 .709 .381 1.363 1 1.717l7 4.008a2.016 2.016 0 0 0 2 0l7 -4.008c.619 -.355 1 -1.01 1 -1.718z' }), s('path', { d: 'M12 22v-10' }), s('path', { d: 'M12 12l8.73 -5.04' }), s('path', { d: 'M3.27 6.96l8.73 5.04' })));
36
+ // workflow-component.svg (chart dots)
37
+ icons.push(s('symbol', { id: 'xg-icon-workflow', viewBox: '0 0 24 24', fill: 'none', stroke: 'currentColor', 'stroke-width': 2, 'stroke-linecap': 'round', 'stroke-linejoin': 'round' }, s('path', { stroke: 'none', d: 'M0 0h24v24H0z', fill: 'none' }), s('path', { d: 'M5 7m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0' }), s('path', { d: 'M16 15m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0' }), s('path', { d: 'M18 6m-3 0a3 3 0 1 0 6 0a3 3 0 1 0 -6 0' }), s('path', { d: 'M6 18m-3 0a3 3 0 1 0 6 0a3 3 0 1 0 -6 0' }), s('path', { d: 'M9 17l5 -1.5' }), s('path', { d: 'M6.5 8.5l7.81 5.37' }), s('path', { d: 'M7 7l8 -1' })));
38
+ // branch-component.svg (arrows split)
39
+ icons.push(s('symbol', { id: 'xg-icon-branch', viewBox: '0 0 24 24', fill: 'none', stroke: 'currentColor', 'stroke-width': 2, 'stroke-linecap': 'round', 'stroke-linejoin': 'round' }, s('path', { stroke: 'none', d: 'M0 0h24v24H0z', fill: 'none' }), s('path', { d: 'M21 17h-8l-3.5 -5h-6.5' }), s('path', { d: 'M21 7h-8l-3.495 5' }), s('path', { d: 'M18 10l3 -3l-3 -3' }), s('path', { d: 'M18 20l3 -3l-3 -3' })));
40
+ // function-component.svg (math function)
41
+ icons.push(s('symbol', { id: 'xg-icon-function', viewBox: '0 0 24 24', fill: 'none', stroke: 'currentColor', 'stroke-width': 2.5, 'stroke-linecap': 'round', 'stroke-linejoin': 'round' }, s('path', { stroke: 'none', d: 'M0 0h24v24H0z', fill: 'none' }), s('path', { d: 'M3 19a2 2 0 0 0 2 2c2 0 2 -4 3 -9s1 -9 3 -9a2 2 0 0 1 2 2' }), s('path', { d: 'M5 12h6' }), s('path', { d: 'M15 12l6 6' }), s('path', { d: 'M15 18l6 -6' })));
42
+ // set-variable-component.svg (world upload)
43
+ icons.push(s('symbol', { id: 'xg-icon-context_set', viewBox: '0 0 24 24', fill: 'none', stroke: 'currentColor', 'stroke-width': 2, 'stroke-linecap': 'round', 'stroke-linejoin': 'round' }, s('path', { stroke: 'none', d: 'M0 0h24v24H0z', fill: 'none' }), s('path', { d: 'M21 12a9 9 0 1 0 -9 9' }), s('path', { d: 'M3.6 9h16.8' }), s('path', { d: 'M3.6 15h8.4' }), s('path', { d: 'M11.578 3a17 17 0 0 0 0 18' }), s('path', { d: 'M12.5 3c1.719 2.755 2.5 5.876 2.5 9' }), s('path', { d: 'M18 21v-7m3 3l-3 -3l-3 3' })));
44
+ // get-variable-component.svg (world download)
45
+ icons.push(s('symbol', { id: 'xg-icon-context_get', viewBox: '0 0 24 24', fill: 'none', stroke: 'currentColor', 'stroke-width': 2, 'stroke-linecap': 'round', 'stroke-linejoin': 'round' }, s('path', { stroke: 'none', d: 'M0 0h24v24H0z', fill: 'none' }), s('path', { d: 'M21 12a9 9 0 1 0 -9 9' }), s('path', { d: 'M3.6 9h16.8' }), s('path', { d: 'M3.6 15h8.4' }), s('path', { d: 'M11.578 3a17 17 0 0 0 0 18' }), s('path', { d: 'M12.5 3c1.719 2.755 2.5 5.876 2.5 9' }), s('path', { d: 'M18 14v7m-3 -3l3 3l3 -3' })));
46
+ // variable-component.svg (variable x)
47
+ icons.push(s('symbol', { id: 'xg-icon-variable', viewBox: '0 0 24 24', fill: 'none', stroke: 'currentColor', 'stroke-width': 2, 'stroke-linecap': 'round', 'stroke-linejoin': 'round' }, s('path', { stroke: 'none', d: 'M0 0h24v24H0z', fill: 'none' }), s('path', { d: 'M5 4c-2.5 5 -2.5 10 0 16m14 -16c2.5 5 2.5 10 0 16m-10 -11h1c1 0 1 1 2.016 3.527c.984 2.473 .984 3.473 1.984 3.473h1' }), s('path', { d: 'M8 16c1.5 0 3 -2 4 -3.5s2.5 -3.5 4 -3.5' })));
48
+ return icons.join('');
49
+ }
50
+ function renderStyleBlock(theme) {
51
+ const isDark = theme === 'dark';
52
+ const css = `
53
+ .xg-root {
54
+ font-family: sans-serif;
55
+ font-size: 11px;
56
+ }
57
+ .xg-node__border {
58
+ fill: none;
59
+ stroke: ${isDark ? 'black' : 'oklch(0.8 0 0)'};
60
+ stroke-width: 1;
61
+ }
62
+ .xg-node__title-text {
63
+ fill: white;
64
+ font-weight: 500;
65
+ letter-spacing: 0.025rem;
66
+ }
67
+ .xg-node__body {
68
+ fill: ${isDark
69
+ ? 'oklch(10% 0 0 / 0.85)'
70
+ : 'oklch(99% 0 0 / 0.85)'};
71
+ stroke: none;
72
+ }
73
+ .xg-port__dot {
74
+ fill: oklch(50% 0 0 / 0.2);
75
+ stroke: oklch(0 0 0 / 0.2);
76
+ stroke-width: 1;
77
+ }
78
+ .xg-port__dot--connected {
79
+ fill: oklch(100% 0 0 / 0.5);
80
+ }
81
+ .xg-port__label {
82
+ fill: ${isDark ? 'white' : 'black'};
83
+ }
84
+ .xg-port__symbol {
85
+ font-weight: bold;
86
+ font-family: Helvetica, Arial, sans-serif;
87
+ }
88
+ .xg-port__symbol--connected { fill: black; }
89
+ .xg-port__symbol--disconnected { fill: grey; }
90
+ .xg-port--flow use {
91
+ stroke-width: 3;
92
+ stroke-linecap: round;
93
+ stroke-linejoin: round;
94
+ fill: none;
95
+ }
96
+ .xg-port--flow--connected use { stroke: oklch(0% 0 0 / 0.8); }
97
+ .xg-port--flow--disconnected use { stroke: oklch(100% 0 0 / 0.8); }
98
+ .xg-edge--flow {
99
+ stroke: rgb(0, 192, 255);
100
+ stroke-width: 3;
101
+ fill: none;
102
+ stroke-dasharray: 10 2;
103
+ animation: xg-flow 1s steps(24) infinite;
104
+ filter: drop-shadow(2px 2px 4px rgb(0 0 0 / 40%)) opacity(60%);
105
+ }
106
+ .xg-edge--data {
107
+ stroke: gray;
108
+ stroke-width: 3;
109
+ fill: none;
110
+ filter: drop-shadow(2px 2px 4px rgb(0 0 0 / 40%)) opacity(60%);
111
+ }
112
+ .xg-comment__bg {
113
+ fill: ${isDark ? 'rgba(0, 0, 0, 0.3)' : 'oklch(0.98 0.13 108.65)'};
114
+ stroke: ${isDark ? 'black' : '#ccc'};
115
+ stroke-width: 2;
116
+ rx: 5;
117
+ }
118
+ .xg-comment__text {
119
+ fill: ${isDark ? 'white' : 'black'};
120
+ }
121
+ @keyframes xg-flow {
122
+ from { stroke-dashoffset: 24; }
123
+ to { stroke-dashoffset: 0; }
124
+ }
125
+ `;
126
+ return el('style', {}, css);
127
+ }
128
+ //# sourceMappingURL=renderDefs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderDefs.js","sourceRoot":"","sources":["../../src/render/renderDefs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,mBAAmB,CAAC;AAEvC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,UAAU,UAAU,CAAC,KAAc,EAAE,KAAuB;IAChE,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IAErC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;YAAE,SAAS;QACtC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,IAAI,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE,SAAS;QACpC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAEtB,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;QACxC,SAAS,CAAC,IAAI,CACZ,EAAE,CAAC,gBAAgB,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EACrE,EAAE,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,EAClD,EAAE,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,CACrD,CACF,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAEtC,MAAM,YAAY,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,YAAY,EAAE,OAAO,EAAE,WAAW,EAAE,EAC1E,EAAE,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAChE,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAC7B,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,gBAAgB,EAAE,CAAC,EACnC,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,wBAAwB,EAAE,CAAC,CAC5C,CAAC;IAEF,MAAM,aAAa,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,aAAa,EAAE,OAAO,EAAE,WAAW,EAAE,EAC5E,EAAE,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAChE,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAC7B,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,mBAAmB,EAAE,CAAC,EACtC,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,sBAAsB,EAAE,CAAC,CAC1C,CAAC;IAEF,kEAAkE;IAClE,MAAM,SAAS,GAAG,qBAAqB,EAAE,CAAC;IAE1C,OAAO,EAAE,CAAC,MAAM,EAAE,EAAE,EAClB,KAAK,EACL,GAAG,SAAS,EACZ,YAAY,EACZ,aAAa,EACb,SAAS,CACV,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAa;IAC7C,OAAO,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,qBAAqB;IAC5B,MAAM,CAAC,GAAG,EAAE,CAAC;IACb,oEAAoE;IACpE,iEAAiE;IAEjE,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,6DAA6D;IAC7D,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,sBAAsB,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,cAAc,EAAE,EAC/F,CAAC,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAC/D,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,8mBAA8mB,EAAE,CAAC,CACjoB,CAAC,CAAC;IAEH,0CAA0C;IAC1C,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,mBAAmB,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,cAAc,EAAE,CAAC,EAAE,gBAAgB,EAAE,OAAO,EAAE,iBAAiB,EAAE,OAAO,EAAE,EACtL,CAAC,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAC/D,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,uNAAuN,EAAE,CAAC,EACzO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAC9B,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,mBAAmB,EAAE,CAAC,EACrC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,sBAAsB,EAAE,CAAC,CACzC,CAAC,CAAC;IAEH,sCAAsC;IACtC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,kBAAkB,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,cAAc,EAAE,CAAC,EAAE,gBAAgB,EAAE,OAAO,EAAE,iBAAiB,EAAE,OAAO,EAAE,EACrL,CAAC,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAC/D,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,wCAAwC,EAAE,CAAC,EAC1D,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,0CAA0C,EAAE,CAAC,EAC5D,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,yCAAyC,EAAE,CAAC,EAC3D,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,yCAAyC,EAAE,CAAC,EAC3D,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,EAChC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,oBAAoB,EAAE,CAAC,EACtC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,CAC9B,CAAC,CAAC;IAEH,sCAAsC;IACtC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,gBAAgB,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,cAAc,EAAE,CAAC,EAAE,gBAAgB,EAAE,OAAO,EAAE,iBAAiB,EAAE,OAAO,EAAE,EACnL,CAAC,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAC/D,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,wBAAwB,EAAE,CAAC,EAC1C,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,mBAAmB,EAAE,CAAC,EACrC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,mBAAmB,EAAE,CAAC,EACrC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,mBAAmB,EAAE,CAAC,CACtC,CAAC,CAAC;IAEH,yCAAyC;IACzC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,kBAAkB,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,cAAc,EAAE,GAAG,EAAE,gBAAgB,EAAE,OAAO,EAAE,iBAAiB,EAAE,OAAO,EAAE,EACvL,CAAC,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAC/D,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,2DAA2D,EAAE,CAAC,EAC7E,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAC3B,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAC9B,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,CAChC,CAAC,CAAC;IAEH,4CAA4C;IAC5C,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,qBAAqB,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,cAAc,EAAE,CAAC,EAAE,gBAAgB,EAAE,OAAO,EAAE,iBAAiB,EAAE,OAAO,EAAE,EACxL,CAAC,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAC/D,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,uBAAuB,EAAE,CAAC,EACzC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAC/B,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAC/B,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,4BAA4B,EAAE,CAAC,EAC9C,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,qCAAqC,EAAE,CAAC,EACvD,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,0BAA0B,EAAE,CAAC,CAC7C,CAAC,CAAC;IAEH,8CAA8C;IAC9C,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,qBAAqB,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,cAAc,EAAE,CAAC,EAAE,gBAAgB,EAAE,OAAO,EAAE,iBAAiB,EAAE,OAAO,EAAE,EACxL,CAAC,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAC/D,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,uBAAuB,EAAE,CAAC,EACzC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAC/B,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAC/B,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,4BAA4B,EAAE,CAAC,EAC9C,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,qCAAqC,EAAE,CAAC,EACvD,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,yBAAyB,EAAE,CAAC,CAC5C,CAAC,CAAC;IAEH,sCAAsC;IACtC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,kBAAkB,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,cAAc,EAAE,CAAC,EAAE,gBAAgB,EAAE,OAAO,EAAE,iBAAiB,EAAE,OAAO,EAAE,EACrL,CAAC,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAC/D,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,qHAAqH,EAAE,CAAC,EACvI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,yCAAyC,EAAE,CAAC,CAC5D,CAAC,CAAC;IAEH,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACxB,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAuB;IAC/C,MAAM,MAAM,GAAG,KAAK,KAAK,MAAM,CAAC;IAChC,MAAM,GAAG,GAAG;;;;;;;YAOF,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB;;;;;;;;;UASrC,MAAM;QACZ,CAAC,CAAC,uBAAuB;QACzB,CAAC,CAAC,uBAAuB;;;;;;;;;;;;UAYnB,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UA+B1B,MAAM,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,yBAAyB;YACvD,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM;;;;;UAK3B,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO;;;;;;CAMnC,CAAC;IACA,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { XEdge, XNode, NodeMetrics, RenderOptions } from '../types.js';
2
+ export declare function renderEdge(edge: XEdge, nodesById: Map<string, XNode>, metricsMap: Map<string, NodeMetrics>, options?: RenderOptions): string;
3
+ //# sourceMappingURL=renderEdge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderEdge.d.ts","sourceRoot":"","sources":["../../src/render/renderEdge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAI5E,wBAAgB,UAAU,CACxB,IAAI,EAAE,KAAK,EACX,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,EAC7B,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,EACpC,OAAO,CAAC,EAAE,aAAa,GACtB,MAAM,CAaR"}
@@ -0,0 +1,13 @@
1
+ import { g, el } from '../svg/builder.js';
2
+ import { bezierPath } from '../svg/bezier.js';
3
+ export function renderEdge(edge, nodesById, metricsMap, options) {
4
+ if (!edge.points || edge.points.length < 2)
5
+ return '';
6
+ const p0 = edge.points[0];
7
+ const p1 = edge.points[edge.points.length - 1];
8
+ const d = bezierPath(p0.x, p0.y, p1.x, p1.y, 50);
9
+ const extraClass = options?.edgeClassFn?.(edge) || '';
10
+ const cls = edge.kind === 'flow' ? 'xg-edge xg-edge--flow' : 'xg-edge xg-edge--data';
11
+ return g({ class: `xg-edge-group ${extraClass}`.trim(), 'data-edge-id': edge.id }, el('path', { class: cls, d }));
12
+ }
13
+ //# sourceMappingURL=renderEdge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderEdge.js","sourceRoot":"","sources":["../../src/render/renderEdge.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,MAAM,UAAU,UAAU,CACxB,IAAW,EACX,SAA6B,EAC7B,UAAoC,EACpC,OAAuB;IAEvB,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IAEtD,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC1B,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC/C,MAAM,CAAC,GAAG,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACjD,MAAM,UAAU,GAAG,OAAO,EAAE,WAAW,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IACtD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,uBAAuB,CAAC;IAErF,OAAO,CAAC,CACN,EAAE,KAAK,EAAE,iBAAiB,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE,cAAc,EAAE,IAAI,CAAC,EAAE,EAAE,EACxE,EAAE,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAC9B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { XGraph, RenderOptions } from '../types.js';
2
+ export declare function renderToString(graph: XGraph, options?: RenderOptions): string;
3
+ export declare function renderToElement(graph: XGraph, options?: RenderOptions): SVGSVGElement;
4
+ export declare function renderXircuits(json: unknown, options?: RenderOptions): string;
5
+ //# sourceMappingURL=renderGraph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderGraph.d.ts","sourceRoot":"","sources":["../../src/render/renderGraph.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAe,MAAM,aAAa,CAAC;AAStE,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,MAAM,CAuCjF;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,aAAa,CAKzF;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,GAAE,aAAkB,GAAG,MAAM,CAGjF"}
@@ -0,0 +1,40 @@
1
+ import { svgRoot, g } from '../svg/builder.js';
2
+ import { computeNodeMetrics } from '../layout/metrics.js';
3
+ import { computeViewBox } from '../layout/viewBox.js';
4
+ import { renderDefs } from './renderDefs.js';
5
+ import { renderNode } from './renderNode.js';
6
+ import { renderEdge } from './renderEdge.js';
7
+ import { parse } from '../parser/parse.js';
8
+ export function renderToString(graph, options = {}) {
9
+ const { theme = 'dark', padding = 40, fitView = true, className, width, height, } = options;
10
+ const metricsMap = new Map();
11
+ for (const node of graph.nodes) {
12
+ metricsMap.set(node.id, computeNodeMetrics(node));
13
+ }
14
+ const viewBox = fitView
15
+ ? computeViewBox(graph.nodes, metricsMap, padding)
16
+ : { x: -graph.viewport.x, y: -graph.viewport.y, width: width || 800, height: height || 600 };
17
+ const nodesById = new Map(graph.nodes.map(n => [n.id, n]));
18
+ const defs = renderDefs(graph.nodes, theme);
19
+ const edgeElements = graph.edges.map(edge => renderEdge(edge, nodesById, metricsMap, options));
20
+ const nodeElements = graph.nodes.map(node => renderNode(node, metricsMap.get(node.id), options));
21
+ const rootClass = ['xg-root', className].filter(Boolean).join(' ');
22
+ return svgRoot({
23
+ viewBox: `${viewBox.x} ${viewBox.y} ${viewBox.width} ${viewBox.height}`,
24
+ class: rootClass,
25
+ 'data-theme': theme,
26
+ ...(width ? { width } : {}),
27
+ ...(height ? { height } : {}),
28
+ }, defs, g({ class: 'xg-edges' }, ...edgeElements), g({ class: 'xg-nodes' }, ...nodeElements));
29
+ }
30
+ export function renderToElement(graph, options = {}) {
31
+ const svgString = renderToString(graph, options);
32
+ const parser = new DOMParser();
33
+ const doc = parser.parseFromString(svgString, 'image/svg+xml');
34
+ return doc.documentElement;
35
+ }
36
+ export function renderXircuits(json, options = {}) {
37
+ const graph = parse(json);
38
+ return renderToString(graph, options);
39
+ }
40
+ //# sourceMappingURL=renderGraph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderGraph.js","sourceRoot":"","sources":["../../src/render/renderGraph.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { XNode, NodeMetrics, RenderOptions } from '../types.js';
2
+ export declare function renderNode(node: XNode, metrics: NodeMetrics, options?: RenderOptions): string;
3
+ //# sourceMappingURL=renderNode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderNode.d.ts","sourceRoot":"","sources":["../../src/render/renderNode.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAMrE,wBAAgB,UAAU,CACxB,IAAI,EAAE,KAAK,EACX,OAAO,EAAE,WAAW,EACpB,OAAO,CAAC,EAAE,aAAa,GACtB,MAAM,CAQR"}
@@ -0,0 +1,81 @@
1
+ import { g, rect, text, el, escapeXml } from '../svg/builder.js';
2
+ import { colorToGradientId } from './renderDefs.js';
3
+ import { renderPort } from './renderPort.js';
4
+ import { FONT_SIZE, TITLE_HEIGHT, TITLE_PADDING_X, TITLE_ICON_SIZE, COMMENT_PADDING } from '../layout/metrics.js';
5
+ export function renderNode(node, metrics, options) {
6
+ const extraClass = options?.nodeClassFn?.(node) || '';
7
+ if (node.kind === 'comment') {
8
+ return renderCommentNode(node, metrics, extraClass);
9
+ }
10
+ return renderStandardNode(node, metrics, extraClass);
11
+ }
12
+ function renderStandardNode(node, metrics, extraClass) {
13
+ const gradientId = colorToGradientId(node.color);
14
+ const { width, height } = metrics;
15
+ const bodyHeight = height - TITLE_HEIGHT;
16
+ const elements = [];
17
+ // Border
18
+ elements.push(rect({ x: 0, y: 0, width, height, rx: 5, ry: 5, class: 'xg-node__border' }));
19
+ // Title gradient
20
+ elements.push(rect({ x: 0, y: 0, width, height: TITLE_HEIGHT, rx: 5, ry: 5, fill: `url(#${gradientId})` }));
21
+ if (bodyHeight > 0) {
22
+ elements.push(rect({ x: 0, y: TITLE_HEIGHT - 5, width, height: 5, fill: `url(#${gradientId})` }));
23
+ }
24
+ // Icon
25
+ elements.push(renderNodeIcon(node.kind, TITLE_PADDING_X, (TITLE_HEIGHT - TITLE_ICON_SIZE) / 2));
26
+ // Name
27
+ elements.push(text({ x: TITLE_PADDING_X + TITLE_ICON_SIZE + TITLE_PADDING_X, y: TITLE_HEIGHT - 8, 'font-size': FONT_SIZE, class: 'xg-node__title-text' }, node.name.length > 40 ? node.name.slice(0, 39) + '…' : node.name));
28
+ // Body
29
+ if (bodyHeight > 0) {
30
+ elements.push(rect({ x: 0, y: TITLE_HEIGHT, width, height: bodyHeight, rx: 5, ry: 5, class: 'xg-node__body' }));
31
+ elements.push(rect({ x: 0, y: TITLE_HEIGHT, width, height: Math.min(5, bodyHeight), class: 'xg-node__body' }));
32
+ }
33
+ // Ports
34
+ node.portsIn.forEach((port, i) => elements.push(renderPort(port, width, i, TITLE_HEIGHT)));
35
+ node.portsOut.forEach((port, i) => elements.push(renderPort(port, width, i, TITLE_HEIGHT)));
36
+ return g({ class: `xg-node xg-node--${node.kind} ${extraClass}`.trim(), transform: `translate(${node.x}, ${node.y})`, 'data-node-id': node.id }, ...elements);
37
+ }
38
+ function renderCommentNode(node, metrics, extraClass) {
39
+ const { width, height } = metrics;
40
+ const commentText = node.extras.commentInput || '';
41
+ const elements = [];
42
+ elements.push(rect({ x: 0, y: 0, width, height, rx: 5, ry: 5, class: 'xg-comment__bg' }));
43
+ elements.push(text({ x: COMMENT_PADDING, y: COMMENT_PADDING + 12, 'font-size': 12, 'font-weight': 'bold', class: 'xg-comment__text' }, 'Comment:'));
44
+ const lines = commentText.split('\n');
45
+ const tspans = lines.map((line, i) => el('tspan', { x: COMMENT_PADDING, dy: i === 0 ? 18 : 18 }, escapeXml(line))).join('');
46
+ elements.push(el('text', { x: COMMENT_PADDING, y: COMMENT_PADDING + 14, 'font-size': 12, class: 'xg-comment__text' }, tspans));
47
+ return g({ class: `xg-node xg-node--comment ${extraClass}`.trim(), transform: `translate(${node.x}, ${node.y})`, 'data-node-id': node.id }, ...elements);
48
+ }
49
+ // Map node kind → symbol ID (matching getNodeIcon in CustomNodeWidget.tsx)
50
+ function getIconSymbolId(kind, extrasType) {
51
+ switch (kind) {
52
+ case 'start':
53
+ case 'finish':
54
+ return 'xg-icon-start-finish';
55
+ case 'workflow':
56
+ return 'xg-icon-workflow';
57
+ case 'branch':
58
+ return 'xg-icon-branch';
59
+ case 'function':
60
+ return 'xg-icon-function';
61
+ case 'context_set':
62
+ return 'xg-icon-context_set';
63
+ case 'context_get':
64
+ return 'xg-icon-context_get';
65
+ case 'variable':
66
+ return 'xg-icon-variable';
67
+ default:
68
+ return 'xg-icon-component';
69
+ }
70
+ }
71
+ function renderNodeIcon(kind, x, y) {
72
+ const symbolId = getIconSymbolId(kind);
73
+ return el('use', {
74
+ href: `#${symbolId}`,
75
+ x, y,
76
+ width: TITLE_ICON_SIZE,
77
+ height: TITLE_ICON_SIZE,
78
+ color: 'white',
79
+ });
80
+ }
81
+ //# sourceMappingURL=renderNode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderNode.js","sourceRoot":"","sources":["../../src/render/renderNode.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { XPort } from '../types.js';
2
+ export declare function renderPort(port: XPort, nodeWidth: number, rowIndex: number, titleHeight: number): string;
3
+ //# sourceMappingURL=renderPort.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderPort.d.ts","sourceRoot":"","sources":["../../src/render/renderPort.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAOzC,wBAAgB,UAAU,CACxB,IAAI,EAAE,KAAK,EACX,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,GAClB,MAAM,CAkBR"}
@@ -0,0 +1,57 @@
1
+ import { g, text, el } from '../svg/builder.js';
2
+ import { getPortSymbol } from './symbols.js';
3
+ import { PORT_ROW_HEIGHT, PORT_DOT_SIZE, FONT_SIZE, PORT_LABEL_PADDING } from '../layout/metrics.js';
4
+ const SYMBOL_FONT_SIZE = 9;
5
+ export function renderPort(port, nodeWidth, rowIndex, titleHeight) {
6
+ const isOut = port.direction === 'out';
7
+ const y = titleHeight + rowIndex * PORT_ROW_HEIGHT;
8
+ const isConnected = port.linkIds.length > 0;
9
+ const isFlow = port.kind === 'flow';
10
+ const dotY = y + (PORT_ROW_HEIGHT - PORT_DOT_SIZE) / 2;
11
+ if (isOut) {
12
+ const dotX = nodeWidth - PORT_DOT_SIZE;
13
+ const dot = renderDot(port, dotX, dotY, isOut, isConnected, isFlow);
14
+ const label = isFlow ? '' : renderLabel(port.label, dotX - PORT_LABEL_PADDING, y, 'end');
15
+ return g({ class: `xg-port xg-port--out xg-port--${isFlow ? 'flow' : 'param'}`, 'data-port-id': port.id }, dot, label);
16
+ }
17
+ else {
18
+ const dotX = 0;
19
+ const dot = renderDot(port, dotX, dotY, isOut, isConnected, isFlow);
20
+ const label = isFlow ? '' : renderLabel(port.label, PORT_DOT_SIZE + PORT_LABEL_PADDING, y, 'start');
21
+ return g({ class: `xg-port xg-port--in xg-port--${isFlow ? 'flow' : 'param'}`, 'data-port-id': port.id }, dot, label);
22
+ }
23
+ }
24
+ function renderDot(port, x, y, isOut, isConnected, isFlow) {
25
+ const elements = [];
26
+ const w = PORT_DOT_SIZE;
27
+ const h = PORT_DOT_SIZE;
28
+ const r = 8;
29
+ // Half-rounded rect: out-ports rounded on left, in-ports rounded on right
30
+ let d;
31
+ if (isOut) {
32
+ d = `M${x + r},${y} L${x + w},${y} L${x + w},${y + h} L${x + r},${y + h} A${r},${r} 0 0,1 ${x},${y + h - r} L${x},${y + r} A${r},${r} 0 0,1 ${x + r},${y}Z`;
33
+ }
34
+ else {
35
+ d = `M${x},${y} L${x + w - r},${y} A${r},${r} 0 0,1 ${x + w},${y + r} L${x + w},${y + h - r} A${r},${r} 0 0,1 ${x + w - r},${y + h} L${x},${y + h}Z`;
36
+ }
37
+ const connClass = isConnected ? ' xg-port__dot--connected' : '';
38
+ elements.push(el('path', { d, class: `xg-port__dot${connClass}` }));
39
+ if (isFlow) {
40
+ const iconRef = isOut ? '#xg-flow-out' : '#xg-flow-in';
41
+ const flowClass = isConnected ? 'xg-port--flow--connected' : 'xg-port--flow--disconnected';
42
+ elements.push(el('g', { class: flowClass }, el('use', { href: iconRef, x: x + 1.5, y: y + 1.5, width: 12, height: 12 })));
43
+ }
44
+ else {
45
+ const symbol = getPortSymbol(port.dataType);
46
+ if (symbol) {
47
+ const symClass = isConnected ? 'xg-port__symbol xg-port__symbol--connected' : 'xg-port__symbol xg-port__symbol--disconnected';
48
+ elements.push(text({ x: x + w / 2, y: y + h - 3, 'text-anchor': 'middle', 'font-size': SYMBOL_FONT_SIZE, class: symClass }, symbol));
49
+ }
50
+ }
51
+ return elements.join('');
52
+ }
53
+ function renderLabel(label, x, y, anchor) {
54
+ const displayLabel = label.length > 40 ? label.slice(0, 37) + '...' : label;
55
+ return text({ x, y: y + PORT_ROW_HEIGHT / 2 + FONT_SIZE / 2 - 1, 'text-anchor': anchor, 'font-size': FONT_SIZE, class: 'xg-port__label' }, displayLabel);
56
+ }
57
+ //# sourceMappingURL=renderPort.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderPort.js","sourceRoot":"","sources":["../../src/render/renderPort.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAErG,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAE3B,MAAM,UAAU,UAAU,CACxB,IAAW,EACX,SAAiB,EACjB,QAAgB,EAChB,WAAmB;IAEnB,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC;IACvC,MAAM,CAAC,GAAG,WAAW,GAAG,QAAQ,GAAG,eAAe,CAAC;IACnD,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC;IACpC,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,eAAe,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IAEvD,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,IAAI,GAAG,SAAS,GAAG,aAAa,CAAC;QACvC,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;QACpE,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,GAAG,kBAAkB,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;QACzF,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,iCAAiC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,cAAc,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;IACzH,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,GAAG,CAAC,CAAC;QACf,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;QACpE,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,aAAa,GAAG,kBAAkB,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;QACpG,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,gCAAgC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,cAAc,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;IACxH,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAChB,IAAW,EACX,CAAS,EACT,CAAS,EACT,KAAc,EACd,WAAoB,EACpB,MAAe;IAEf,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,CAAC,GAAG,aAAa,CAAC;IACxB,MAAM,CAAC,GAAG,aAAa,CAAC;IACxB,MAAM,CAAC,GAAG,CAAC,CAAC;IAEZ,0EAA0E;IAC1E,IAAI,CAAS,CAAC;IACd,IAAI,KAAK,EAAE,CAAC;QACV,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC;IAC9J,CAAC;SAAM,CAAC;QACN,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IACvJ,CAAC;IAED,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC,CAAC,EAAE,CAAC;IAChE,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,eAAe,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC;IAEpE,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,aAAa,CAAC;QACvD,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC,CAAC,6BAA6B,CAAC;QAC3F,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,EACxC,EAAE,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAC5E,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC5C,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,CAAC,4CAA4C,CAAC,CAAC,CAAC,+CAA+C,CAAC;YAC9H,QAAQ,CAAC,IAAI,CAAC,IAAI,CAChB,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,aAAa,EAAE,QAAQ,EAAE,WAAW,EAAE,gBAAgB,EAAE,KAAK,EAAE,QAAQ,EAAE,EACvG,MAAM,CACP,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC3B,CAAC;AAED,SAAS,WAAW,CAAC,KAAa,EAAE,CAAS,EAAE,CAAS,EAAE,MAAuB;IAC/E,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;IAC5E,OAAO,IAAI,CACT,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,eAAe,GAAG,CAAC,GAAG,SAAS,GAAG,CAAC,GAAG,CAAC,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,KAAK,EAAE,gBAAgB,EAAE,EAC7H,YAAY,CACb,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ export declare const SYMBOL_MAP: Record<string, string | null>;
2
+ export declare const UNKNOWN_SYMBOL = "\u25CE";
3
+ export declare function getPortSymbol(dataType: string | null): string | null;
4
+ export declare const FLOW_IN_ICON: string;
5
+ export declare const FLOW_OUT_ICON: string;
6
+ //# sourceMappingURL=symbols.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"symbols.d.ts","sourceRoot":"","sources":["../../src/render/symbols.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAiBpD,CAAC;AAEF,eAAO,MAAM,cAAc,WAAM,CAAC;AAElC,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAKpE;AAGD,eAAO,MAAM,YAAY,QAOf,CAAC;AAEX,eAAO,MAAM,aAAa,QAOhB,CAAC"}
@@ -0,0 +1,45 @@
1
+ export const SYMBOL_MAP = {
2
+ 'string': '" "',
3
+ 'int': ' 1',
4
+ 'float': '1.0',
5
+ 'boolean': '⊤⊥',
6
+ 'time.time': '𝘵',
7
+ 'list': '[ ]',
8
+ 'tuple': '( )',
9
+ 'dict': '{ }',
10
+ 'dynalist': '«[]»',
11
+ 'dynatuple': '«()»',
12
+ 'union': ' U',
13
+ 'secret': '🗝️',
14
+ 'chat': '🗨',
15
+ 'any': '[_]',
16
+ '0': null,
17
+ 'flow': null,
18
+ };
19
+ export const UNKNOWN_SYMBOL = '◎';
20
+ export function getPortSymbol(dataType) {
21
+ if (!dataType)
22
+ return null;
23
+ const lower = dataType.toLowerCase();
24
+ if (lower in SYMBOL_MAP)
25
+ return SYMBOL_MAP[lower];
26
+ return UNKNOWN_SYMBOL;
27
+ }
28
+ // Flow port SVG icons (from CustomPortLabel.tsx)
29
+ export const FLOW_IN_ICON = [
30
+ '<svg viewBox="0 0 24 24" width="12" height="12">',
31
+ '<path stroke="none" d="M0 0h24v24H0z" fill="none"/>',
32
+ '<path d="M3 12h12"/>',
33
+ '<path d="M11 8l4 4l-4 4"/>',
34
+ '<path d="M12 21a9 9 0 0 0 0 -18"/>',
35
+ '</svg>',
36
+ ].join('');
37
+ export const FLOW_OUT_ICON = [
38
+ '<svg viewBox="0 0 24 24" width="12" height="12">',
39
+ '<path stroke="none" d="M0 0h24v24H0z" fill="none"/>',
40
+ '<path d="M9 12h12"/>',
41
+ '<path d="M17 16l4 -4l-4 -4"/>',
42
+ '<path d="M12 3a9 9 0 1 0 0 18"/>',
43
+ '</svg>',
44
+ ].join('');
45
+ //# sourceMappingURL=symbols.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"symbols.js","sourceRoot":"","sources":["../../src/render/symbols.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,UAAU,GAAkC;IACvD,QAAQ,EAAE,KAAK;IACf,KAAK,EAAE,IAAI;IACX,OAAO,EAAE,KAAK;IACd,SAAS,EAAE,IAAI;IACf,WAAW,EAAE,IAAI;IACjB,MAAM,EAAE,KAAK;IACb,OAAO,EAAE,KAAK;IACd,MAAM,EAAE,KAAK;IACb,UAAU,EAAE,MAAM;IAClB,WAAW,EAAE,MAAM;IACnB,OAAO,EAAE,IAAI;IACb,QAAQ,EAAE,KAAK;IACf,MAAM,EAAE,IAAI;IACZ,KAAK,EAAE,KAAK;IACZ,GAAG,EAAE,IAAI;IACT,MAAM,EAAE,IAAI;CACb,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,CAAC;AAElC,MAAM,UAAU,aAAa,CAAC,QAAuB;IACnD,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3B,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IACrC,IAAI,KAAK,IAAI,UAAU;QAAE,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC;IAClD,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,iDAAiD;AACjD,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,kDAAkD;IAClD,qDAAqD;IACrD,sBAAsB;IACtB,4BAA4B;IAC5B,oCAAoC;IACpC,QAAQ;CACT,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAEX,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,kDAAkD;IAClD,qDAAqD;IACrD,sBAAsB;IACtB,+BAA+B;IAC/B,kCAAkC;IAClC,QAAQ;CACT,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Generate a cubic bezier path between two points.
3
+ * Matches react-diagrams' DefaultLinkModel.getSVGPath() behavior:
4
+ * control points offset horizontally by `curvyness` (default 50).
5
+ */
6
+ export declare function bezierPath(x1: number, y1: number, x2: number, y2: number, curvyness?: number): string;
7
+ //# sourceMappingURL=bezier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bezier.d.ts","sourceRoot":"","sources":["../../src/svg/bezier.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,wBAAgB,UAAU,CACxB,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,SAAS,GAAE,MAAW,GACrB,MAAM,CAER"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Generate a cubic bezier path between two points.
3
+ * Matches react-diagrams' DefaultLinkModel.getSVGPath() behavior:
4
+ * control points offset horizontally by `curvyness` (default 50).
5
+ */
6
+ export function bezierPath(x1, y1, x2, y2, curvyness = 50) {
7
+ return `M${x1},${y1} C${x1 + curvyness},${y1} ${x2 - curvyness},${y2} ${x2},${y2}`;
8
+ }
9
+ //# sourceMappingURL=bezier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bezier.js","sourceRoot":"","sources":["../../src/svg/bezier.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,UAAU,UAAU,CACxB,EAAU,EACV,EAAU,EACV,EAAU,EACV,EAAU,EACV,YAAoB,EAAE;IAEtB,OAAO,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,SAAS,IAAI,EAAE,IAAI,EAAE,GAAG,SAAS,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;AACrF,CAAC"}
@@ -0,0 +1,11 @@
1
+ type Attrs = Record<string, string | number | boolean | undefined>;
2
+ export declare function escapeXml(s: string): string;
3
+ export declare function el(tag: string, attrs: Attrs, ...children: string[]): string;
4
+ export declare function g(attrs: Attrs, ...children: string[]): string;
5
+ export declare function rect(attrs: Attrs): string;
6
+ export declare function text(attrs: Attrs, content: string): string;
7
+ export declare function path(attrs: Attrs): string;
8
+ export declare function line(attrs: Attrs): string;
9
+ export declare function svgRoot(attrs: Attrs, ...children: string[]): string;
10
+ export {};
11
+ //# sourceMappingURL=builder.d.ts.map