@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,85 @@
1
+ /**
2
+ * Port Renderer Component
3
+ */
4
+ import { rect, text, escapeXml } from '../svg-builder.js';
5
+ // ============================================
6
+ // Port Renderer
7
+ // ============================================
8
+ export function renderPorts(nodeX, nodeY, ports, theme) {
9
+ if (!ports || ports.size === 0)
10
+ return [];
11
+ const elements = [];
12
+ ports.forEach((port) => {
13
+ const px = nodeX + port.position.x;
14
+ const py = nodeY + port.position.y;
15
+ const pw = port.size.width;
16
+ const ph = port.size.height;
17
+ // Port box
18
+ elements.push(rect({
19
+ class: 'port',
20
+ 'data-port': port.id,
21
+ x: px - pw / 2,
22
+ y: py - ph / 2,
23
+ width: pw,
24
+ height: ph,
25
+ fill: theme.portFill,
26
+ stroke: theme.portStroke,
27
+ 'stroke-width': 1,
28
+ rx: 2,
29
+ }));
30
+ // Port label positioning
31
+ const { labelX, labelY, textAnchor } = calculateLabelPosition(port, px, py);
32
+ // Label background
33
+ const labelText = escapeXml(port.label);
34
+ const charWidth = 5.5;
35
+ const labelWidth = labelText.length * charWidth + 4;
36
+ const labelHeight = 12;
37
+ const bgX = calculateBackgroundX(labelX, labelWidth, textAnchor);
38
+ const bgY = labelY - labelHeight + 3;
39
+ elements.push(rect({
40
+ class: 'port-label-bg',
41
+ x: bgX,
42
+ y: bgY,
43
+ width: labelWidth,
44
+ height: labelHeight,
45
+ rx: 2,
46
+ fill: theme.portLabelBg,
47
+ }));
48
+ // Port label text
49
+ elements.push(text({
50
+ class: 'port-label',
51
+ x: labelX,
52
+ y: labelY,
53
+ 'text-anchor': textAnchor,
54
+ 'font-size': 9,
55
+ fill: theme.portLabelColor,
56
+ }, labelText));
57
+ });
58
+ return elements;
59
+ }
60
+ function calculateLabelPosition(port, px, py) {
61
+ const labelOffset = 12;
62
+ switch (port.side) {
63
+ case 'top':
64
+ return { labelX: px, labelY: py - labelOffset, textAnchor: 'middle' };
65
+ case 'bottom':
66
+ return { labelX: px, labelY: py + labelOffset + 4, textAnchor: 'middle' };
67
+ case 'left':
68
+ return { labelX: px - labelOffset, labelY: py, textAnchor: 'end' };
69
+ case 'right':
70
+ return { labelX: px + labelOffset, labelY: py, textAnchor: 'start' };
71
+ default:
72
+ return { labelX: px, labelY: py + labelOffset + 4, textAnchor: 'middle' };
73
+ }
74
+ }
75
+ function calculateBackgroundX(labelX, labelWidth, textAnchor) {
76
+ switch (textAnchor) {
77
+ case 'middle':
78
+ return labelX - labelWidth / 2;
79
+ case 'end':
80
+ return labelX - labelWidth + 2;
81
+ default:
82
+ return labelX - 2;
83
+ }
84
+ }
85
+ //# sourceMappingURL=port-renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"port-renderer.js","sourceRoot":"","sources":["../../../src/renderer/components/port-renderer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Subgraph Renderer Component
3
+ */
4
+ import type { LayoutSubgraph } from '../../models/index.js';
5
+ import type { ThemeColors } from '../theme.js';
6
+ import type { IconThemeVariant } from '../../icons/index.js';
7
+ import { type SVGElement } from '../svg-builder.js';
8
+ export interface SubgraphRendererContext {
9
+ theme: ThemeColors;
10
+ iconTheme: IconThemeVariant;
11
+ }
12
+ export declare function renderSubgraph(sg: LayoutSubgraph, ctx: SubgraphRendererContext): SVGElement;
13
+ //# sourceMappingURL=subgraph-renderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subgraph-renderer.d.ts","sourceRoot":"","sources":["../../../src/renderer/components/subgraph-renderer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAC3D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAC9C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAE5D,OAAO,EAA4B,KAAK,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAM7E,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,WAAW,CAAA;IAClB,SAAS,EAAE,gBAAgB,CAAA;CAC5B;AAED,wBAAgB,cAAc,CAC5B,EAAE,EAAE,cAAc,EAClB,GAAG,EAAE,uBAAuB,GAC3B,UAAU,CA8DZ"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Subgraph Renderer Component
3
+ */
4
+ import { getVendorIconEntry } from '../../icons/index.js';
5
+ import { g, rect, text, escapeXml } from '../svg-builder.js';
6
+ export function renderSubgraph(sg, ctx) {
7
+ const { bounds, subgraph } = sg;
8
+ const style = subgraph.style || {};
9
+ const fill = style.fill || ctx.theme.subgraphFill;
10
+ const stroke = style.stroke || ctx.theme.subgraphStroke;
11
+ const strokeWidth = style.strokeWidth || 1;
12
+ const strokeDasharray = style.strokeDasharray || '';
13
+ const labelPos = style.labelPosition || 'top';
14
+ const rx = 8;
15
+ // Icon configuration
16
+ const iconKey = subgraph.service || subgraph.model;
17
+ const hasIcon = subgraph.vendor && iconKey;
18
+ const iconSize = 24;
19
+ const iconPadding = 8;
20
+ const group = g({ class: 'subgraph', 'data-id': sg.id });
21
+ // Background rect
22
+ group.child(rect({
23
+ x: bounds.x,
24
+ y: bounds.y,
25
+ width: bounds.width,
26
+ height: bounds.height,
27
+ rx,
28
+ ry: rx,
29
+ fill,
30
+ stroke,
31
+ 'stroke-width': strokeWidth,
32
+ 'stroke-dasharray': strokeDasharray || undefined,
33
+ }));
34
+ // Icon
35
+ if (hasIcon) {
36
+ const iconX = bounds.x + iconPadding;
37
+ const iconY = bounds.y + iconPadding;
38
+ const iconElement = renderSubgraphIcon(subgraph.vendor, iconKey, subgraph.resource, iconX, iconY, iconSize, ctx.iconTheme);
39
+ if (iconElement) {
40
+ group.child(iconElement);
41
+ }
42
+ }
43
+ // Label
44
+ let labelX = hasIcon ? bounds.x + iconSize + iconPadding * 2 : bounds.x + 10;
45
+ let labelY = bounds.y + 20;
46
+ if (labelPos === 'top') {
47
+ labelX = hasIcon ? bounds.x + iconSize + iconPadding * 2 : bounds.x + 10;
48
+ labelY = bounds.y + 20;
49
+ }
50
+ group.child(text({
51
+ x: labelX,
52
+ y: labelY,
53
+ class: 'subgraph-label',
54
+ 'text-anchor': 'start',
55
+ fill: ctx.theme.subgraphLabelColor,
56
+ }, escapeXml(subgraph.label)));
57
+ return group;
58
+ }
59
+ // ============================================
60
+ // Icon Rendering
61
+ // ============================================
62
+ function renderSubgraphIcon(vendor, iconKey, resource, iconX, iconY, iconSize, iconTheme) {
63
+ const iconEntry = getVendorIconEntry(vendor, iconKey, resource);
64
+ if (!iconEntry)
65
+ return null;
66
+ const iconContent = iconEntry[iconTheme] || iconEntry.default;
67
+ const viewBox = iconEntry.viewBox || '0 0 48 48';
68
+ // Check if icon is a nested SVG (PNG-based)
69
+ if (iconContent.startsWith('<svg')) {
70
+ const viewBoxMatch = iconContent.match(/viewBox="0 0 (\d+) (\d+)"/);
71
+ if (viewBoxMatch) {
72
+ const vbWidth = parseInt(viewBoxMatch[1]);
73
+ const vbHeight = parseInt(viewBoxMatch[2]);
74
+ const aspectRatio = vbWidth / vbHeight;
75
+ const iconWidth = Math.round(iconSize * aspectRatio);
76
+ const innerSvg = iconContent.replace(/<svg[^>]*>/, '').replace(/<\/svg>$/, '');
77
+ return g({ class: 'subgraph-icon', transform: `translate(${iconX}, ${iconY})` })
78
+ .child(`<svg width="${iconWidth}" height="${iconSize}" viewBox="0 0 ${vbWidth} ${vbHeight}">${innerSvg}</svg>`);
79
+ }
80
+ }
81
+ // Use viewBox from entry
82
+ return g({ class: 'subgraph-icon', transform: `translate(${iconX}, ${iconY})` })
83
+ .child(`<svg width="${iconSize}" height="${iconSize}" viewBox="${viewBox}">${iconContent}</svg>`);
84
+ }
85
+ //# sourceMappingURL=subgraph-renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subgraph-renderer.js","sourceRoot":"","sources":["../../../src/renderer/components/subgraph-renderer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Icon Registry Module
3
+ */
4
+ export type { IconRegistry, IconRegistryEntry } from './types.js';
5
+ export { DefaultIconRegistry, createIconRegistry } from './registry.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/renderer/icon-registry/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,YAAY,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AACjE,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Icon Registry Module
3
+ */
4
+ export { DefaultIconRegistry, createIconRegistry } from './registry.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/renderer/icon-registry/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Icon Registry Implementation
3
+ * Handles icon deduplication and symbol ID generation
4
+ */
5
+ import type { RenderIcon } from '../render-model/types.js';
6
+ import type { IconRegistry, IconRegistryEntry } from './types.js';
7
+ /**
8
+ * Default icon registry implementation
9
+ */
10
+ export declare class DefaultIconRegistry implements IconRegistry {
11
+ private icons;
12
+ private keyToId;
13
+ private counter;
14
+ register(key: string, entry: IconRegistryEntry): string;
15
+ has(key: string): boolean;
16
+ getId(key: string): string | undefined;
17
+ getIcons(): Map<string, RenderIcon>;
18
+ clear(): void;
19
+ get size(): number;
20
+ }
21
+ /**
22
+ * Create a new icon registry
23
+ */
24
+ export declare function createIconRegistry(): IconRegistry;
25
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/renderer/icon-registry/registry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AA8BjE;;GAEG;AACH,qBAAa,mBAAoB,YAAW,YAAY;IACtD,OAAO,CAAC,KAAK,CAAqC;IAClD,OAAO,CAAC,OAAO,CAAiC;IAChD,OAAO,CAAC,OAAO,CAAI;IAEnB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,iBAAiB,GAAG,MAAM;IA8BvD,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIzB,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAItC,QAAQ,IAAI,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC;IAInC,KAAK,IAAI,IAAI;IAMb,IAAI,IAAI,IAAI,MAAM,CAEjB;CACF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,YAAY,CAEjD"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Icon Registry Implementation
3
+ * Handles icon deduplication and symbol ID generation
4
+ */
5
+ /**
6
+ * Parse viewBox string to get dimensions
7
+ */
8
+ function parseViewBox(viewBox) {
9
+ const parts = viewBox.split(/\s+/);
10
+ if (parts.length >= 4) {
11
+ return {
12
+ width: parseFloat(parts[2]) || 48,
13
+ height: parseFloat(parts[3]) || 48,
14
+ };
15
+ }
16
+ return { width: 48, height: 48 };
17
+ }
18
+ /**
19
+ * Generate a unique symbol ID from a key
20
+ */
21
+ function generateSymbolId(key, index) {
22
+ // Sanitize key for use in SVG ID
23
+ const sanitized = key
24
+ .toLowerCase()
25
+ .replace(/[^a-z0-9-]/g, '-')
26
+ .replace(/-+/g, '-')
27
+ .replace(/^-|-$/g, '');
28
+ return `icon-${sanitized || index}`;
29
+ }
30
+ /**
31
+ * Default icon registry implementation
32
+ */
33
+ export class DefaultIconRegistry {
34
+ icons = new Map();
35
+ keyToId = new Map();
36
+ counter = 0;
37
+ register(key, entry) {
38
+ // Check if already registered
39
+ const existingId = this.keyToId.get(key);
40
+ if (existingId) {
41
+ return existingId;
42
+ }
43
+ // Generate new symbol ID
44
+ const symbolId = generateSymbolId(key, this.counter++);
45
+ // Parse dimensions
46
+ const dimensions = entry.width && entry.height
47
+ ? { width: entry.width, height: entry.height }
48
+ : parseViewBox(entry.viewBox);
49
+ // Create render icon
50
+ const renderIcon = {
51
+ id: symbolId,
52
+ content: entry.content,
53
+ viewBox: entry.viewBox,
54
+ size: dimensions,
55
+ };
56
+ // Store
57
+ this.icons.set(symbolId, renderIcon);
58
+ this.keyToId.set(key, symbolId);
59
+ return symbolId;
60
+ }
61
+ has(key) {
62
+ return this.keyToId.has(key);
63
+ }
64
+ getId(key) {
65
+ return this.keyToId.get(key);
66
+ }
67
+ getIcons() {
68
+ return new Map(this.icons);
69
+ }
70
+ clear() {
71
+ this.icons.clear();
72
+ this.keyToId.clear();
73
+ this.counter = 0;
74
+ }
75
+ get size() {
76
+ return this.icons.size;
77
+ }
78
+ }
79
+ /**
80
+ * Create a new icon registry
81
+ */
82
+ export function createIconRegistry() {
83
+ return new DefaultIconRegistry();
84
+ }
85
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/renderer/icon-registry/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Icon Registry Types
3
+ */
4
+ import type { RenderIcon } from '../render-model/types.js';
5
+ /**
6
+ * Icon entry for registration (different from icons/types.ts IconEntry)
7
+ */
8
+ export interface IconRegistryEntry {
9
+ content: string;
10
+ viewBox: string;
11
+ width?: number;
12
+ height?: number;
13
+ }
14
+ /**
15
+ * Icon registry for deduplication and symbol management
16
+ */
17
+ export interface IconRegistry {
18
+ /**
19
+ * Register an icon and get its symbol ID
20
+ * If the icon is already registered, returns existing ID
21
+ */
22
+ register(key: string, entry: IconRegistryEntry): string;
23
+ /**
24
+ * Check if an icon is registered
25
+ */
26
+ has(key: string): boolean;
27
+ /**
28
+ * Get symbol ID for a registered icon
29
+ */
30
+ getId(key: string): string | undefined;
31
+ /**
32
+ * Get all registered icons as RenderIcon map
33
+ */
34
+ getIcons(): Map<string, RenderIcon>;
35
+ /**
36
+ * Clear all registered icons
37
+ */
38
+ clear(): void;
39
+ /**
40
+ * Get the number of registered icons
41
+ */
42
+ get size(): number;
43
+ }
44
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/renderer/icon-registry/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AAE1D;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B;;;OAGG;IACH,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,iBAAiB,GAAG,MAAM,CAAA;IAEvD;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;IAEzB;;OAEG;IACH,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;IAEtC;;OAEG;IACH,QAAQ,IAAI,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;IAEnC;;OAEG;IACH,KAAK,IAAI,IAAI,CAAA;IAEb;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAAA;CACnB"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Icon Registry Types
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/renderer/icon-registry/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Shumoku Renderers
3
+ */
4
+ export { SVGRenderer, svgRenderer } from './svg.js';
5
+ export type { SVGRendererOptions } from './svg.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/renderer/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AACnD,YAAY,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAA"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Shumoku Renderers
3
+ */
4
+ export { SVGRenderer, svgRenderer } from './svg.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/renderer/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * RenderModel Builder
3
+ * Converts LayoutResult to RenderModel
4
+ */
5
+ import type { NetworkGraph, LayoutResult } from '../../models/index.js';
6
+ import type { TextMeasurer } from '../text-measurer/index.js';
7
+ import type { IconRegistry } from '../icon-registry/index.js';
8
+ import type { RenderModel } from './types.js';
9
+ import type { RenderModelBuilderOptions } from '../renderer-types.js';
10
+ export declare class RenderModelBuilder {
11
+ private textMeasurer;
12
+ private iconRegistry;
13
+ private options;
14
+ private theme;
15
+ private version;
16
+ constructor(textMeasurer: TextMeasurer, iconRegistry: IconRegistry, options?: RenderModelBuilderOptions);
17
+ /**
18
+ * Build RenderModel from NetworkGraph and LayoutResult
19
+ */
20
+ build(_graph: NetworkGraph, layout: LayoutResult): RenderModel;
21
+ private buildNode;
22
+ private resolveNodeStyle;
23
+ private buildNodeLabels;
24
+ private registerNodeIcon;
25
+ private buildPorts;
26
+ private calculatePortLabelPosition;
27
+ private calculateLabelBackground;
28
+ private buildLink;
29
+ private resolveLinkStyle;
30
+ private getLinkStrokeWidth;
31
+ private getLinkDasharray;
32
+ private getBandwidthLineCount;
33
+ private generatePathData;
34
+ private getMidPoint;
35
+ private buildLinkLabels;
36
+ private buildEndpointLabels;
37
+ private buildSubgraph;
38
+ private resolveSubgraphStyle;
39
+ private buildDefs;
40
+ private buildStyles;
41
+ }
42
+ export declare function createRenderModelBuilder(textMeasurer: TextMeasurer, iconRegistry: IconRegistry, options?: RenderModelBuilderOptions): RenderModelBuilder;
43
+ //# sourceMappingURL=builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../../src/renderer/render-model/builder.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,YAAY,EACZ,YAAY,EAQb,MAAM,uBAAuB,CAAA;AAC9B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAC7D,OAAO,KAAK,EACV,WAAW,EAeZ,MAAM,YAAY,CAAA;AAGnB,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAA;AAiBrE,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,YAAY,CAAc;IAClC,OAAO,CAAC,YAAY,CAAc;IAClC,OAAO,CAAC,OAAO,CAAqC;IACpD,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,OAAO,CAAI;gBAGjB,YAAY,EAAE,YAAY,EAC1B,YAAY,EAAE,YAAY,EAC1B,OAAO,GAAE,yBAA8B;IAazC;;OAEG;IACH,KAAK,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,GAAG,WAAW;IAwD9D,OAAO,CAAC,SAAS;IAkCjB,OAAO,CAAC,gBAAgB;IAYxB,OAAO,CAAC,eAAe;IAwCvB,OAAO,CAAC,gBAAgB;IAoDxB,OAAO,CAAC,UAAU;IAyDlB,OAAO,CAAC,0BAA0B;IAclC,OAAO,CAAC,wBAAwB;IA4BhC,OAAO,CAAC,SAAS;IA2CjB,OAAO,CAAC,gBAAgB;IAcxB,OAAO,CAAC,kBAAkB;IAQ1B,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,qBAAqB;IAW7B,OAAO,CAAC,gBAAgB;IAaxB,OAAO,CAAC,WAAW;IAqBnB,OAAO,CAAC,eAAe;IA4DvB,OAAO,CAAC,mBAAmB;IA8E3B,OAAO,CAAC,aAAa;IAsErB,OAAO,CAAC,oBAAoB;IAc5B,OAAO,CAAC,SAAS;IA6CjB,OAAO,CAAC,WAAW;CAapB;AAMD,wBAAgB,wBAAwB,CACtC,YAAY,EAAE,YAAY,EAC1B,YAAY,EAAE,YAAY,EAC1B,OAAO,CAAC,EAAE,yBAAyB,GAClC,kBAAkB,CAEpB"}