@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,296 @@
1
+ /**
2
+ * SVG DOM Interaction Controller
3
+ * Handles pan, zoom, and drag interactions
4
+ */
5
+ const DEFAULT_OPTIONS = {
6
+ enablePan: true,
7
+ enableZoom: true,
8
+ enableNodeDrag: true,
9
+ minScale: 0.1,
10
+ maxScale: 5,
11
+ zoomSensitivity: 0.002,
12
+ };
13
+ // ============================================
14
+ // Interaction Controller
15
+ // ============================================
16
+ export class InteractionController {
17
+ svg;
18
+ contentGroup;
19
+ options;
20
+ events = {};
21
+ viewport = { scale: 1, translateX: 0, translateY: 0 };
22
+ // Interaction state
23
+ isPanning = false;
24
+ isDragging = false;
25
+ draggedNodeId = null;
26
+ lastPointer = { x: 0, y: 0 };
27
+ // Event handler references for cleanup
28
+ boundHandlers;
29
+ // Node/Link maps for event handling
30
+ nodeElements = new Map();
31
+ linkElements = new Map();
32
+ nodeDataMap = new Map();
33
+ linkDataMap = new Map();
34
+ constructor(svg, contentGroup, options = {}) {
35
+ this.svg = svg;
36
+ this.contentGroup = contentGroup;
37
+ this.options = { ...DEFAULT_OPTIONS, ...options };
38
+ // Bind handlers
39
+ this.boundHandlers = {
40
+ wheel: this.handleWheel.bind(this),
41
+ mousedown: this.handleMouseDown.bind(this),
42
+ mousemove: this.handleMouseMove.bind(this),
43
+ mouseup: this.handleMouseUp.bind(this),
44
+ mouseleave: this.handleMouseLeave.bind(this),
45
+ };
46
+ }
47
+ // ============================================
48
+ // Public API
49
+ // ============================================
50
+ attach() {
51
+ this.svg.addEventListener('wheel', this.boundHandlers.wheel, { passive: false });
52
+ this.svg.addEventListener('mousedown', this.boundHandlers.mousedown);
53
+ this.svg.addEventListener('mousemove', this.boundHandlers.mousemove);
54
+ this.svg.addEventListener('mouseup', this.boundHandlers.mouseup);
55
+ this.svg.addEventListener('mouseleave', this.boundHandlers.mouseleave);
56
+ }
57
+ detach() {
58
+ this.svg.removeEventListener('wheel', this.boundHandlers.wheel);
59
+ this.svg.removeEventListener('mousedown', this.boundHandlers.mousedown);
60
+ this.svg.removeEventListener('mousemove', this.boundHandlers.mousemove);
61
+ this.svg.removeEventListener('mouseup', this.boundHandlers.mouseup);
62
+ this.svg.removeEventListener('mouseleave', this.boundHandlers.mouseleave);
63
+ }
64
+ setEvents(events) {
65
+ this.events = events;
66
+ }
67
+ setViewport(viewport) {
68
+ this.viewport = { ...viewport };
69
+ this.applyViewport();
70
+ }
71
+ getViewport() {
72
+ return { ...this.viewport };
73
+ }
74
+ resetViewport() {
75
+ this.viewport = { scale: 1, translateX: 0, translateY: 0 };
76
+ this.applyViewport();
77
+ }
78
+ registerNode(id, element, data) {
79
+ this.nodeElements.set(id, element);
80
+ this.nodeDataMap.set(id, data);
81
+ this.attachNodeHandlers(element, id);
82
+ }
83
+ registerLink(id, element, data) {
84
+ this.linkElements.set(id, element);
85
+ this.linkDataMap.set(id, data);
86
+ this.attachLinkHandlers(element, id);
87
+ }
88
+ unregisterNode(id) {
89
+ const element = this.nodeElements.get(id);
90
+ if (element) {
91
+ this.detachNodeHandlers(element);
92
+ this.nodeElements.delete(id);
93
+ this.nodeDataMap.delete(id);
94
+ }
95
+ }
96
+ unregisterLink(id) {
97
+ const element = this.linkElements.get(id);
98
+ if (element) {
99
+ this.detachLinkHandlers(element);
100
+ this.linkElements.delete(id);
101
+ this.linkDataMap.delete(id);
102
+ }
103
+ }
104
+ getNodeElement(nodeId) {
105
+ return this.nodeElements.get(nodeId) || null;
106
+ }
107
+ getLinkElement(linkId) {
108
+ return this.linkElements.get(linkId) || null;
109
+ }
110
+ clear() {
111
+ this.nodeElements.clear();
112
+ this.linkElements.clear();
113
+ this.nodeDataMap.clear();
114
+ this.linkDataMap.clear();
115
+ }
116
+ // ============================================
117
+ // Viewport Control
118
+ // ============================================
119
+ applyViewport() {
120
+ const { scale, translateX, translateY } = this.viewport;
121
+ this.contentGroup.setAttribute('transform', `translate(${translateX}, ${translateY}) scale(${scale})`);
122
+ this.events.onViewportChange?.(this.viewport);
123
+ }
124
+ fitToContent(bounds, padding = 40) {
125
+ const svgRect = this.svg.getBoundingClientRect();
126
+ const containerWidth = svgRect.width;
127
+ const containerHeight = svgRect.height;
128
+ const contentWidth = bounds.width + padding * 2;
129
+ const contentHeight = bounds.height + padding * 2;
130
+ const scaleX = containerWidth / contentWidth;
131
+ const scaleY = containerHeight / contentHeight;
132
+ const scale = Math.min(scaleX, scaleY, 1); // Don't scale up beyond 1
133
+ const translateX = (containerWidth - bounds.width * scale) / 2 - bounds.x * scale;
134
+ const translateY = (containerHeight - bounds.height * scale) / 2 - bounds.y * scale;
135
+ this.viewport = { scale, translateX, translateY };
136
+ this.applyViewport();
137
+ }
138
+ // ============================================
139
+ // Event Handlers
140
+ // ============================================
141
+ handleWheel(e) {
142
+ if (!this.options.enableZoom)
143
+ return;
144
+ e.preventDefault();
145
+ const rect = this.svg.getBoundingClientRect();
146
+ const mouseX = e.clientX - rect.left;
147
+ const mouseY = e.clientY - rect.top;
148
+ // Calculate new scale
149
+ const delta = -e.deltaY * this.options.zoomSensitivity;
150
+ const newScale = Math.min(this.options.maxScale, Math.max(this.options.minScale, this.viewport.scale * (1 + delta)));
151
+ // Zoom toward mouse position
152
+ const scaleFactor = newScale / this.viewport.scale;
153
+ const newTranslateX = mouseX - scaleFactor * (mouseX - this.viewport.translateX);
154
+ const newTranslateY = mouseY - scaleFactor * (mouseY - this.viewport.translateY);
155
+ this.viewport = {
156
+ scale: newScale,
157
+ translateX: newTranslateX,
158
+ translateY: newTranslateY,
159
+ };
160
+ this.applyViewport();
161
+ }
162
+ handleMouseDown(e) {
163
+ const target = e.target;
164
+ // Check if clicking on a node for dragging
165
+ if (this.options.enableNodeDrag) {
166
+ const nodeGroup = this.findParentNodeGroup(target);
167
+ if (nodeGroup) {
168
+ const nodeId = nodeGroup.getAttribute('data-node-id');
169
+ if (nodeId) {
170
+ this.isDragging = true;
171
+ this.draggedNodeId = nodeId;
172
+ this.lastPointer = this.getPointerPosition(e);
173
+ const data = this.nodeDataMap.get(nodeId);
174
+ if (data) {
175
+ this.events.onNodeDragStart?.(nodeId, { ...data.position }, e);
176
+ }
177
+ e.preventDefault();
178
+ return;
179
+ }
180
+ }
181
+ }
182
+ // Start panning on background
183
+ if (this.options.enablePan && this.isBackground(target)) {
184
+ this.isPanning = true;
185
+ this.lastPointer = { x: e.clientX, y: e.clientY };
186
+ e.preventDefault();
187
+ }
188
+ }
189
+ handleMouseMove(e) {
190
+ if (this.isDragging && this.draggedNodeId) {
191
+ const currentPointer = this.getPointerPosition(e);
192
+ const data = this.nodeDataMap.get(this.draggedNodeId);
193
+ if (data) {
194
+ const dx = (currentPointer.x - this.lastPointer.x) / this.viewport.scale;
195
+ const dy = (currentPointer.y - this.lastPointer.y) / this.viewport.scale;
196
+ data.position.x += dx;
197
+ data.position.y += dy;
198
+ // Note: Full node dragging requires re-rendering or updating all child elements
199
+ // For now, just emit the drag event
200
+ this.events.onNodeDrag?.(this.draggedNodeId, { ...data.position }, e);
201
+ this.lastPointer = currentPointer;
202
+ }
203
+ }
204
+ else if (this.isPanning) {
205
+ const dx = e.clientX - this.lastPointer.x;
206
+ const dy = e.clientY - this.lastPointer.y;
207
+ this.viewport.translateX += dx;
208
+ this.viewport.translateY += dy;
209
+ this.lastPointer = { x: e.clientX, y: e.clientY };
210
+ this.applyViewport();
211
+ }
212
+ }
213
+ handleMouseUp(e) {
214
+ if (this.isDragging && this.draggedNodeId) {
215
+ const data = this.nodeDataMap.get(this.draggedNodeId);
216
+ if (data) {
217
+ this.events.onNodeDragEnd?.(this.draggedNodeId, { ...data.position }, e);
218
+ }
219
+ }
220
+ this.isDragging = false;
221
+ this.draggedNodeId = null;
222
+ this.isPanning = false;
223
+ }
224
+ handleMouseLeave(_e) {
225
+ this.isPanning = false;
226
+ // Don't cancel drag on mouse leave to allow dragging outside SVG
227
+ }
228
+ // ============================================
229
+ // Node Event Handlers
230
+ // ============================================
231
+ attachNodeHandlers(element, nodeId) {
232
+ const data = this.nodeDataMap.get(nodeId);
233
+ if (!data)
234
+ return;
235
+ element.addEventListener('click', (e) => {
236
+ if (!this.isDragging) {
237
+ this.events.onNodeClick?.(nodeId, data, e);
238
+ }
239
+ });
240
+ element.addEventListener('dblclick', (e) => {
241
+ this.events.onNodeDoubleClick?.(nodeId, data, e);
242
+ });
243
+ element.addEventListener('mouseenter', (e) => {
244
+ this.events.onNodeMouseEnter?.(nodeId, data, e);
245
+ });
246
+ element.addEventListener('mouseleave', (e) => {
247
+ this.events.onNodeMouseLeave?.(nodeId, data, e);
248
+ });
249
+ // Set cursor for draggable nodes
250
+ if (this.options.enableNodeDrag) {
251
+ element.style.cursor = 'grab';
252
+ }
253
+ }
254
+ detachNodeHandlers(_element) {
255
+ // Event listeners are automatically removed when element is removed from DOM
256
+ // For explicit cleanup, we'd need to store references to the handlers
257
+ }
258
+ // ============================================
259
+ // Link Event Handlers
260
+ // ============================================
261
+ attachLinkHandlers(element, linkId) {
262
+ const data = this.linkDataMap.get(linkId);
263
+ if (!data)
264
+ return;
265
+ element.addEventListener('click', (e) => {
266
+ this.events.onLinkClick?.(linkId, data, e);
267
+ });
268
+ }
269
+ detachLinkHandlers(_element) {
270
+ // Event listeners are automatically removed when element is removed from DOM
271
+ }
272
+ // ============================================
273
+ // Helpers
274
+ // ============================================
275
+ getPointerPosition(e) {
276
+ const rect = this.svg.getBoundingClientRect();
277
+ return {
278
+ x: e.clientX - rect.left,
279
+ y: e.clientY - rect.top,
280
+ };
281
+ }
282
+ findParentNodeGroup(element) {
283
+ let current = element;
284
+ while (current && current !== this.svg) {
285
+ if (current instanceof SVGGElement && current.hasAttribute('data-node-id')) {
286
+ return current;
287
+ }
288
+ current = current.parentElement;
289
+ }
290
+ return null;
291
+ }
292
+ isBackground(element) {
293
+ return element === this.svg || element.classList.contains('background');
294
+ }
295
+ }
296
+ //# sourceMappingURL=interaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interaction.js","sourceRoot":"","sources":["../../../src/renderer/svg-dom/interaction.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * SVG DOM Renderer
3
+ * Renders RenderModel to SVG DOM elements with interactive features
4
+ */
5
+ import type { RenderModel, RenderEvents, ViewportState } from '../render-model/types.js';
6
+ import type { InteractiveRenderer, RendererOptions } from '../renderer-types.js';
7
+ import { type InteractionOptions } from './interaction.js';
8
+ export interface SVGDOMRendererOptions extends RendererOptions {
9
+ /** Interaction options */
10
+ interaction?: InteractionOptions;
11
+ /** Container element to attach to */
12
+ container?: HTMLElement;
13
+ }
14
+ export declare class SVGDOMRenderer implements InteractiveRenderer {
15
+ private options;
16
+ private svg;
17
+ private contentGroup;
18
+ private controller;
19
+ private currentModel;
20
+ private defsElement;
21
+ private styleElement;
22
+ private subgraphLayer;
23
+ private linkLayer;
24
+ private nodeLayer;
25
+ constructor(options?: SVGDOMRendererOptions);
26
+ render(model: RenderModel): SVGSVGElement;
27
+ update(model: RenderModel, changedIds: string[]): void;
28
+ dispose(): void;
29
+ attachEvents(events: RenderEvents): void;
30
+ detachEvents(): void;
31
+ setViewport(viewport: ViewportState): void;
32
+ getViewport(): ViewportState;
33
+ fitToContainer(_container: HTMLElement, padding?: number): void;
34
+ resetViewport(): void;
35
+ getNodeElement(nodeId: string): SVGGElement | null;
36
+ getLinkElement(linkId: string): SVGGElement | null;
37
+ getSVGElement(): SVGSVGElement | null;
38
+ getContentGroup(): SVGGElement | null;
39
+ private renderSubgraphs;
40
+ private renderLinks;
41
+ private renderNodes;
42
+ }
43
+ /**
44
+ * Create a new SVG DOM renderer
45
+ */
46
+ export declare function createSVGDOMRenderer(options?: SVGDOMRendererOptions): SVGDOMRenderer;
47
+ //# sourceMappingURL=renderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../../src/renderer/svg-dom/renderer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AACxF,OAAO,KAAK,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAChF,OAAO,EAAyB,KAAK,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAOjF,MAAM,WAAW,qBAAsB,SAAQ,eAAe;IAC5D,0BAA0B;IAC1B,WAAW,CAAC,EAAE,kBAAkB,CAAA;IAChC,qCAAqC;IACrC,SAAS,CAAC,EAAE,WAAW,CAAA;CACxB;AAMD,qBAAa,cAAe,YAAW,mBAAmB;IACxD,OAAO,CAAC,OAAO,CAAuB;IACtC,OAAO,CAAC,GAAG,CAA6B;IACxC,OAAO,CAAC,YAAY,CAA2B;IAC/C,OAAO,CAAC,UAAU,CAAqC;IACvD,OAAO,CAAC,YAAY,CAA2B;IAG/C,OAAO,CAAC,WAAW,CAA8B;IACjD,OAAO,CAAC,YAAY,CAA+B;IACnD,OAAO,CAAC,aAAa,CAA2B;IAChD,OAAO,CAAC,SAAS,CAA2B;IAC5C,OAAO,CAAC,SAAS,CAA2B;gBAEhC,OAAO,GAAE,qBAA0B;IAQ/C,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,aAAa;IAmEzC,MAAM,CAAC,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,IAAI;IA0BtD,OAAO,IAAI,IAAI;IAcf,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI;IAIxC,YAAY,IAAI,IAAI;IAIpB,WAAW,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI;IAI1C,WAAW,IAAI,aAAa;IAI5B,cAAc,CAAC,UAAU,EAAE,WAAW,EAAE,OAAO,SAAK,GAAG,IAAI;IAK3D,aAAa,IAAI,IAAI;IAIrB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAIlD,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAQlD,aAAa,IAAI,aAAa,GAAG,IAAI;IAIrC,eAAe,IAAI,WAAW,GAAG,IAAI;IAQrC,OAAO,CAAC,eAAe;IASvB,OAAO,CAAC,WAAW;IAUnB,OAAO,CAAC,WAAW;CASpB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,cAAc,CAEpF"}
@@ -0,0 +1,188 @@
1
+ /**
2
+ * SVG DOM Renderer
3
+ * Renders RenderModel to SVG DOM elements with interactive features
4
+ */
5
+ import { InteractionController } from './interaction.js';
6
+ import { buildDefs, buildNode, buildLink, buildSubgraph, updateNode, updateLink, SVG_NS } from './builders/index.js';
7
+ // ============================================
8
+ // SVG DOM Renderer
9
+ // ============================================
10
+ export class SVGDOMRenderer {
11
+ options;
12
+ svg = null;
13
+ contentGroup = null;
14
+ controller = null;
15
+ currentModel = null;
16
+ // Layer groups
17
+ defsElement = null;
18
+ styleElement = null;
19
+ subgraphLayer = null;
20
+ linkLayer = null;
21
+ nodeLayer = null;
22
+ constructor(options = {}) {
23
+ this.options = options;
24
+ }
25
+ // ============================================
26
+ // Renderer Implementation
27
+ // ============================================
28
+ render(model) {
29
+ this.currentModel = model;
30
+ // Create SVG element
31
+ this.svg = document.createElementNS(SVG_NS, 'svg');
32
+ this.svg.setAttribute('xmlns', SVG_NS);
33
+ this.svg.setAttribute('viewBox', model.viewBox);
34
+ // Use 100% to fill container, viewBox handles scaling
35
+ this.svg.setAttribute('width', '100%');
36
+ this.svg.setAttribute('height', '100%');
37
+ this.svg.style.background = model.backgroundColor;
38
+ this.svg.style.display = 'block';
39
+ // Defs
40
+ this.defsElement = buildDefs(model.defs);
41
+ this.svg.appendChild(this.defsElement);
42
+ // Styles
43
+ this.styleElement = document.createElementNS(SVG_NS, 'style');
44
+ this.styleElement.textContent = model.styles;
45
+ this.svg.appendChild(this.styleElement);
46
+ // Background for click detection
47
+ const background = document.createElementNS(SVG_NS, 'rect');
48
+ background.setAttribute('class', 'background');
49
+ background.setAttribute('x', String(model.bounds.x));
50
+ background.setAttribute('y', String(model.bounds.y));
51
+ background.setAttribute('width', String(model.bounds.width));
52
+ background.setAttribute('height', String(model.bounds.height));
53
+ background.setAttribute('fill', 'transparent');
54
+ this.svg.appendChild(background);
55
+ // Content group (for viewport transforms)
56
+ this.contentGroup = document.createElementNS(SVG_NS, 'g');
57
+ this.contentGroup.setAttribute('class', 'content');
58
+ this.svg.appendChild(this.contentGroup);
59
+ // Layer groups
60
+ this.subgraphLayer = document.createElementNS(SVG_NS, 'g');
61
+ this.subgraphLayer.setAttribute('class', 'subgraph-layer');
62
+ this.contentGroup.appendChild(this.subgraphLayer);
63
+ this.linkLayer = document.createElementNS(SVG_NS, 'g');
64
+ this.linkLayer.setAttribute('class', 'link-layer');
65
+ this.contentGroup.appendChild(this.linkLayer);
66
+ this.nodeLayer = document.createElementNS(SVG_NS, 'g');
67
+ this.nodeLayer.setAttribute('class', 'node-layer');
68
+ this.contentGroup.appendChild(this.nodeLayer);
69
+ // Render elements
70
+ this.renderSubgraphs(model);
71
+ this.renderLinks(model);
72
+ this.renderNodes(model);
73
+ // Setup interaction controller
74
+ this.controller = new InteractionController(this.svg, this.contentGroup, this.options.interaction);
75
+ this.controller.attach();
76
+ // Attach to container if provided
77
+ if (this.options.container) {
78
+ this.options.container.appendChild(this.svg);
79
+ }
80
+ return this.svg;
81
+ }
82
+ update(model, changedIds) {
83
+ if (!this.svg || !this.controller)
84
+ return;
85
+ this.currentModel = model;
86
+ for (const id of changedIds) {
87
+ // Check nodes
88
+ const node = model.nodes.get(id);
89
+ if (node && node.dirty) {
90
+ const element = this.controller.getNodeElement(id);
91
+ if (element) {
92
+ updateNode(element, node);
93
+ }
94
+ }
95
+ // Check links
96
+ const link = model.links.get(id);
97
+ if (link && link.dirty) {
98
+ const element = this.controller.getLinkElement(id);
99
+ if (element) {
100
+ updateLink(element, link);
101
+ }
102
+ }
103
+ }
104
+ }
105
+ dispose() {
106
+ this.controller?.detach();
107
+ this.controller?.clear();
108
+ this.svg?.remove();
109
+ this.svg = null;
110
+ this.contentGroup = null;
111
+ this.controller = null;
112
+ this.currentModel = null;
113
+ }
114
+ // ============================================
115
+ // Interactive Renderer Implementation
116
+ // ============================================
117
+ attachEvents(events) {
118
+ this.controller?.setEvents(events);
119
+ }
120
+ detachEvents() {
121
+ this.controller?.setEvents({});
122
+ }
123
+ setViewport(viewport) {
124
+ this.controller?.setViewport(viewport);
125
+ }
126
+ getViewport() {
127
+ return this.controller?.getViewport() ?? { scale: 1, translateX: 0, translateY: 0 };
128
+ }
129
+ fitToContainer(_container, padding = 40) {
130
+ if (!this.currentModel || !this.controller)
131
+ return;
132
+ this.controller.fitToContent(this.currentModel.bounds, padding);
133
+ }
134
+ resetViewport() {
135
+ this.controller?.resetViewport();
136
+ }
137
+ getNodeElement(nodeId) {
138
+ return this.controller?.getNodeElement(nodeId) ?? null;
139
+ }
140
+ getLinkElement(linkId) {
141
+ return this.controller?.getLinkElement(linkId) ?? null;
142
+ }
143
+ // ============================================
144
+ // Public Utilities
145
+ // ============================================
146
+ getSVGElement() {
147
+ return this.svg;
148
+ }
149
+ getContentGroup() {
150
+ return this.contentGroup;
151
+ }
152
+ // ============================================
153
+ // Private Render Methods
154
+ // ============================================
155
+ renderSubgraphs(model) {
156
+ if (!this.subgraphLayer)
157
+ return;
158
+ for (const [, subgraph] of model.subgraphs) {
159
+ const element = buildSubgraph(subgraph);
160
+ this.subgraphLayer.appendChild(element);
161
+ }
162
+ }
163
+ renderLinks(model) {
164
+ if (!this.linkLayer || !this.controller)
165
+ return;
166
+ for (const [id, link] of model.links) {
167
+ const element = buildLink(link);
168
+ this.linkLayer.appendChild(element);
169
+ this.controller.registerLink(id, element, link);
170
+ }
171
+ }
172
+ renderNodes(model) {
173
+ if (!this.nodeLayer || !this.controller)
174
+ return;
175
+ for (const [id, node] of model.nodes) {
176
+ const element = buildNode(node);
177
+ this.nodeLayer.appendChild(element);
178
+ this.controller.registerNode(id, element, node);
179
+ }
180
+ }
181
+ }
182
+ /**
183
+ * Create a new SVG DOM renderer
184
+ */
185
+ export function createSVGDOMRenderer(options) {
186
+ return new SVGDOMRenderer(options);
187
+ }
188
+ //# sourceMappingURL=renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderer.js","sourceRoot":"","sources":["../../../src/renderer/svg-dom/renderer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,qBAAqB,EAA2B,MAAM,kBAAkB,CAAA;AACjF,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAapH,+CAA+C;AAC/C,mBAAmB;AACnB,+CAA+C;AAE/C,MAAM,OAAO,cAAc;IACjB,OAAO,CAAuB;IAC9B,GAAG,GAAyB,IAAI,CAAA;IAChC,YAAY,GAAuB,IAAI,CAAA;IACvC,UAAU,GAAiC,IAAI,CAAA;IAC/C,YAAY,GAAuB,IAAI,CAAA;IAE/C,eAAe;IACP,WAAW,GAA0B,IAAI,CAAA;IACzC,YAAY,GAA2B,IAAI,CAAA;IAC3C,aAAa,GAAuB,IAAI,CAAA;IACxC,SAAS,GAAuB,IAAI,CAAA;IACpC,SAAS,GAAuB,IAAI,CAAA;IAE5C,YAAY,UAAiC,EAAE;QAC7C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IACxB,CAAC;IAED,+CAA+C;IAC/C,0BAA0B;IAC1B,+CAA+C;IAE/C,MAAM,CAAC,KAAkB;QACvB,IAAI,CAAC,YAAY,GAAG,KAAK,CAAA;QAEzB,qBAAqB;QACrB,IAAI,CAAC,GAAG,GAAG,QAAQ,CAAC,eAAe,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;QAClD,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;QACtC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;QAC/C,sDAAsD;QACtD,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;QACtC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;QACvC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,eAAe,CAAA;QACjD,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAA;QAEhC,OAAO;QACP,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QACxC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QAEtC,SAAS;QACT,IAAI,CAAC,YAAY,GAAG,QAAQ,CAAC,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QAC7D,IAAI,CAAC,YAAY,CAAC,WAAW,GAAG,KAAK,CAAC,MAAM,CAAA;QAC5C,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;QAEvC,iCAAiC;QACjC,MAAM,UAAU,GAAG,QAAQ,CAAC,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;QAC3D,UAAU,CAAC,YAAY,CAAC,OAAO,EAAE,YAAY,CAAC,CAAA;QAC9C,UAAU,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;QACpD,UAAU,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;QACpD,UAAU,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;QAC5D,UAAU,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAA;QAC9D,UAAU,CAAC,YAAY,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;QAC9C,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,UAAU,CAAC,CAAA;QAEhC,0CAA0C;QAC1C,IAAI,CAAC,YAAY,GAAG,QAAQ,CAAC,eAAe,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;QACzD,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,OAAO,EAAE,SAAS,CAAC,CAAA;QAClD,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;QAEvC,eAAe;QACf,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAC,eAAe,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;QAC1D,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAA;QAC1D,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;QAEjD,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,eAAe,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;QACtD,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,OAAO,EAAE,YAAY,CAAC,CAAA;QAClD,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QAE7C,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,eAAe,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;QACtD,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,OAAO,EAAE,YAAY,CAAC,CAAA;QAClD,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QAE7C,kBAAkB;QAClB,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAA;QAC3B,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;QACvB,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;QAEvB,+BAA+B;QAC/B,IAAI,CAAC,UAAU,GAAG,IAAI,qBAAqB,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;QAClG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAA;QAExB,kCAAkC;QAClC,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;YAC3B,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAC9C,CAAC;QAED,OAAO,IAAI,CAAC,GAAG,CAAA;IACjB,CAAC;IAED,MAAM,CAAC,KAAkB,EAAE,UAAoB;QAC7C,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE,OAAM;QAEzC,IAAI,CAAC,YAAY,GAAG,KAAK,CAAA;QAEzB,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;YAC5B,cAAc;YACd,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;YAChC,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBACvB,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC,CAAA;gBAClD,IAAI,OAAO,EAAE,CAAC;oBACZ,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;gBAC3B,CAAC;YACH,CAAC;YAED,cAAc;YACd,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;YAChC,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBACvB,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC,CAAA;gBAClD,IAAI,OAAO,EAAE,CAAC;oBACZ,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;gBAC3B,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,CAAA;QACzB,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,CAAA;QACxB,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,CAAA;QAClB,IAAI,CAAC,GAAG,GAAG,IAAI,CAAA;QACf,IAAI,CAAC,YAAY,GAAG,IAAI,CAAA;QACxB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAA;QACtB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAA;IAC1B,CAAC;IAED,+CAA+C;IAC/C,sCAAsC;IACtC,+CAA+C;IAE/C,YAAY,CAAC,MAAoB;QAC/B,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,MAAM,CAAC,CAAA;IACpC,CAAC;IAED,YAAY;QACV,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,EAAE,CAAC,CAAA;IAChC,CAAC;IAED,WAAW,CAAC,QAAuB;QACjC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAA;IACxC,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,UAAU,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAA;IACrF,CAAC;IAED,cAAc,CAAC,UAAuB,EAAE,OAAO,GAAG,EAAE;QAClD,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE,OAAM;QAClD,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACjE,CAAC;IAED,aAAa;QACX,IAAI,CAAC,UAAU,EAAE,aAAa,EAAE,CAAA;IAClC,CAAC;IAED,cAAc,CAAC,MAAc;QAC3B,OAAO,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,MAAM,CAAC,IAAI,IAAI,CAAA;IACxD,CAAC;IAED,cAAc,CAAC,MAAc;QAC3B,OAAO,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,MAAM,CAAC,IAAI,IAAI,CAAA;IACxD,CAAC;IAED,+CAA+C;IAC/C,mBAAmB;IACnB,+CAA+C;IAE/C,aAAa;QACX,OAAO,IAAI,CAAC,GAAG,CAAA;IACjB,CAAC;IAED,eAAe;QACb,OAAO,IAAI,CAAC,YAAY,CAAA;IAC1B,CAAC;IAED,+CAA+C;IAC/C,yBAAyB;IACzB,+CAA+C;IAEvC,eAAe,CAAC,KAAkB;QACxC,IAAI,CAAC,IAAI,CAAC,aAAa;YAAE,OAAM;QAE/B,KAAK,MAAM,CAAC,EAAE,QAAQ,CAAC,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;YAC3C,MAAM,OAAO,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAA;YACvC,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;QACzC,CAAC;IACH,CAAC;IAEO,WAAW,CAAC,KAAkB;QACpC,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE,OAAM;QAE/C,KAAK,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YACrC,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,CAAA;YAC/B,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;YACnC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,CAAA;QACjD,CAAC;IACH,CAAC;IAEO,WAAW,CAAC,KAAkB;QACpC,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE,OAAM;QAE/C,KAAK,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YACrC,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,CAAA;YAC/B,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;YACnC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,CAAA;QACjD,CAAC;IACH,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAA+B;IAClE,OAAO,IAAI,cAAc,CAAC,OAAO,CAAC,CAAA;AACpC,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * SVG Defs Builder
3
+ * Renders shared definitions (icons, markers, filters)
4
+ */
5
+ import type { RenderDefs } from '../../render-model/types.js';
6
+ /**
7
+ * Render all defs as SVG string
8
+ */
9
+ export declare function renderDefs(defs: RenderDefs): string;
10
+ //# sourceMappingURL=defs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defs.d.ts","sourceRoot":"","sources":["../../../../src/renderer/svg-string/builders/defs.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,UAAU,EAA0C,MAAM,6BAA6B,CAAA;AAErG;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAoBnD"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * SVG Defs Builder
3
+ * Renders shared definitions (icons, markers, filters)
4
+ */
5
+ /**
6
+ * Render all defs as SVG string
7
+ */
8
+ export function renderDefs(defs) {
9
+ const parts = ['<defs>'];
10
+ // Icons as symbols
11
+ for (const [, icon] of defs.icons) {
12
+ parts.push(renderIconSymbol(icon));
13
+ }
14
+ // Markers (arrows)
15
+ for (const [, marker] of defs.markers) {
16
+ parts.push(renderMarker(marker));
17
+ }
18
+ // Filters (shadows, etc.)
19
+ for (const [, filter] of defs.filters) {
20
+ parts.push(renderFilter(filter));
21
+ }
22
+ parts.push('</defs>');
23
+ return parts.join('\n');
24
+ }
25
+ /**
26
+ * Render icon as SVG symbol
27
+ */
28
+ function renderIconSymbol(icon) {
29
+ return `<symbol id="${icon.id}" viewBox="${icon.viewBox}">${icon.content}</symbol>`;
30
+ }
31
+ /**
32
+ * Render marker (arrow)
33
+ */
34
+ function renderMarker(marker) {
35
+ return `<marker id="${marker.id}" markerWidth="${marker.width}" markerHeight="${marker.height}" refX="${marker.refX}" refY="${marker.refY}" orient="${marker.orient}"><polygon points="0 0, ${marker.width} ${marker.refY}, 0 ${marker.height}" fill="${marker.fill}" /></marker>`;
36
+ }
37
+ /**
38
+ * Render filter
39
+ */
40
+ function renderFilter(filter) {
41
+ return `<filter id="${filter.id}" x="${filter.x}" y="${filter.y}" width="${filter.width}" height="${filter.height}">${filter.content}</filter>`;
42
+ }
43
+ //# sourceMappingURL=defs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defs.js","sourceRoot":"","sources":["../../../../src/renderer/svg-string/builders/defs.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,IAAgB;IACzC,MAAM,KAAK,GAAa,CAAC,QAAQ,CAAC,CAAA;IAElC,mBAAmB;IACnB,KAAK,MAAM,CAAC,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QAClC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAA;IACpC,CAAC;IAED,mBAAmB;IACnB,KAAK,MAAM,CAAC,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACtC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAA;IAClC,CAAC;IAED,0BAA0B;IAC1B,KAAK,MAAM,CAAC,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACtC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAA;IAClC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IACrB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,IAAgB;IACxC,OAAO,eAAe,IAAI,CAAC,EAAE,cAAc,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,OAAO,WAAW,CAAA;AACrF,CAAC;AAED;;GAEG;AACH,SAAS,YAAY,CAAC,MAAoB;IACxC,OAAO,eAAe,MAAM,CAAC,EAAE,kBAAkB,MAAM,CAAC,KAAK,mBAAmB,MAAM,CAAC,MAAM,WAAW,MAAM,CAAC,IAAI,WAAW,MAAM,CAAC,IAAI,aAAa,MAAM,CAAC,MAAM,2BAA2B,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,OAAO,MAAM,CAAC,MAAM,WAAW,MAAM,CAAC,IAAI,eAAe,CAAA;AACpR,CAAC;AAED;;GAEG;AACH,SAAS,YAAY,CAAC,MAAoB;IACxC,OAAO,eAAe,MAAM,CAAC,EAAE,QAAQ,MAAM,CAAC,CAAC,QAAQ,MAAM,CAAC,CAAC,YAAY,MAAM,CAAC,KAAK,aAAa,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,OAAO,WAAW,CAAA;AACjJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * SVG Link Builder
3
+ * Renders RenderLink to SVG string
4
+ */
5
+ import type { RenderLink } from '../../render-model/types.js';
6
+ /**
7
+ * Render link as SVG group
8
+ */
9
+ export declare function renderLink(link: RenderLink): string;
10
+ //# sourceMappingURL=link.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../../../../src/renderer/svg-string/builders/link.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAmC,MAAM,6BAA6B,CAAA;AAG9F;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAgCnD"}