@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,6 @@
1
+ /**
2
+ * Shumoku Layout Engines
3
+ */
4
+
5
+ export { HierarchicalLayout, hierarchicalLayout } from './hierarchical.js'
6
+ export type { HierarchicalLayoutOptions } from './hierarchical.js'
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Shumoku Models
3
+ */
4
+
5
+ export * from './types.js'
@@ -0,0 +1,528 @@
1
+ /**
2
+ * Shumoku Data Models
3
+ * Network diagram support with Mermaid-like syntax
4
+ */
5
+
6
+ // ============================================
7
+ // Node Types
8
+ // ============================================
9
+
10
+ export type NodeShape =
11
+ | 'rect' // Rectangle [text]
12
+ | 'rounded' // Rounded rectangle (text)
13
+ | 'circle' // Circle ((text))
14
+ | 'diamond' // Diamond {text}
15
+ | 'hexagon' // Hexagon {{text}}
16
+ | 'cylinder' // Database cylinder [(text)]
17
+ | 'stadium' // Stadium/pill shape ([text])
18
+ | 'trapezoid' // Trapezoid [/text/]
19
+
20
+ export interface NodeStyle {
21
+ fill?: string
22
+ stroke?: string
23
+ strokeWidth?: number
24
+ strokeDasharray?: string
25
+ textColor?: string
26
+ fontSize?: number
27
+ fontWeight?: 'normal' | 'bold'
28
+ opacity?: number
29
+ }
30
+
31
+ export interface Node {
32
+ id: string
33
+
34
+ /**
35
+ * Display label - can be single line or multiple lines
36
+ * Supports basic HTML: <b>, <i>, <br/>
37
+ */
38
+ label: string | string[]
39
+
40
+ /**
41
+ * Node shape
42
+ */
43
+ shape: NodeShape
44
+
45
+ /**
46
+ * Device type (for default styling/icons)
47
+ */
48
+ type?: DeviceType
49
+
50
+ /**
51
+ * Parent subgraph ID
52
+ */
53
+ parent?: string
54
+
55
+ /**
56
+ * Rank/layer for horizontal alignment
57
+ * Nodes with the same rank value will be placed on the same horizontal level
58
+ */
59
+ rank?: number | string
60
+
61
+ /**
62
+ * Custom style
63
+ */
64
+ style?: NodeStyle
65
+
66
+ /**
67
+ * Additional metadata
68
+ */
69
+ metadata?: Record<string, unknown>
70
+
71
+ /**
72
+ * Vendor name for vendor-specific icons (e.g., 'aws', 'azure', 'gcp', 'yamaha')
73
+ */
74
+ vendor?: string
75
+
76
+ /**
77
+ * Service name within the vendor (e.g., 'ec2', 'vpc', 'lambda')
78
+ * Used for cloud providers like AWS
79
+ */
80
+ service?: string
81
+
82
+ /**
83
+ * Model name for hardware vendors (e.g., 'rtx3510', 'ex4400')
84
+ * Alternative to service for equipment vendors
85
+ */
86
+ model?: string
87
+
88
+ /**
89
+ * Resource type within the service (e.g., 'instance', 'nat-gateway')
90
+ */
91
+ resource?: string
92
+ }
93
+
94
+ // ============================================
95
+ // Link Types
96
+ // ============================================
97
+
98
+ export type LinkType =
99
+ | 'solid' // Normal line -->
100
+ | 'dashed' // Dashed line -.->
101
+ | 'thick' // Thick line ==>
102
+ | 'double' // Double line o==o
103
+ | 'invisible' // No line (for layout only)
104
+
105
+ export type ArrowType =
106
+ | 'none' // No arrow ---
107
+ | 'forward' // Arrow at target -->
108
+ | 'back' // Arrow at source <--
109
+ | 'both' // Arrows at both <-->
110
+
111
+ export interface LinkStyle {
112
+ stroke?: string
113
+ strokeWidth?: number
114
+ strokeDasharray?: string
115
+ opacity?: number
116
+ /** Minimum length for this link (controls node spacing for HA pairs) */
117
+ minLength?: number
118
+ }
119
+
120
+ /**
121
+ * Link endpoint with optional port/IP details
122
+ */
123
+ export interface LinkEndpoint {
124
+ node: string
125
+ port?: string
126
+ ip?: string // e.g., "10.57.0.1/30"
127
+ }
128
+
129
+ /**
130
+ * Link bandwidth/speed type
131
+ * Controls line thickness for visual distinction
132
+ */
133
+ export type LinkBandwidth = '1G' | '10G' | '25G' | '40G' | '100G'
134
+
135
+ export interface Link {
136
+ id?: string
137
+
138
+ /**
139
+ * Source endpoint - can be simple node ID or detailed endpoint
140
+ */
141
+ from: string | LinkEndpoint
142
+
143
+ /**
144
+ * Target endpoint - can be simple node ID or detailed endpoint
145
+ */
146
+ to: string | LinkEndpoint
147
+
148
+ /**
149
+ * Link label - can be multiple lines (displayed at center)
150
+ */
151
+ label?: string | string[]
152
+
153
+ /**
154
+ * Link type
155
+ */
156
+ type?: LinkType
157
+
158
+ /**
159
+ * Arrow direction
160
+ */
161
+ arrow?: ArrowType
162
+
163
+ /**
164
+ * Bandwidth/speed - affects line thickness
165
+ * 1G: thin, 10G: normal, 25G: medium, 40G: thick, 100G: extra thick
166
+ */
167
+ bandwidth?: LinkBandwidth
168
+
169
+ /**
170
+ * Redundancy/clustering type - nodes connected with this will be placed on the same layer
171
+ * ha: High Availability (VRRP, HSRP, GLBP, keepalive)
172
+ * vc: Virtual Chassis (Juniper)
173
+ * vss: Virtual Switching System (Cisco)
174
+ * vpc: Virtual Port Channel (Cisco Nexus)
175
+ * mlag: Multi-Chassis Link Aggregation
176
+ * stack: Stacking
177
+ */
178
+ redundancy?: 'ha' | 'vc' | 'vss' | 'vpc' | 'mlag' | 'stack'
179
+
180
+ /**
181
+ * VLANs carried on this link
182
+ * Single VLAN for access ports, multiple for trunk ports
183
+ */
184
+ vlan?: number[]
185
+
186
+ /**
187
+ * Custom style
188
+ */
189
+ style?: LinkStyle
190
+ }
191
+
192
+ /**
193
+ * Helper to get node ID from endpoint
194
+ */
195
+ export function getNodeId(endpoint: string | LinkEndpoint): string {
196
+ return typeof endpoint === 'string' ? endpoint : endpoint.node
197
+ }
198
+
199
+ // ============================================
200
+ // Subgraph Types
201
+ // ============================================
202
+
203
+ export type LayoutDirection = 'TB' | 'BT' | 'LR' | 'RL'
204
+
205
+ export interface SubgraphStyle {
206
+ fill?: string
207
+ stroke?: string
208
+ strokeWidth?: number
209
+ strokeDasharray?: string
210
+ labelPosition?: 'top' | 'bottom' | 'left' | 'right'
211
+ labelFontSize?: number
212
+ /** Padding inside this subgraph (like CSS padding) */
213
+ padding?: number
214
+ /** Horizontal spacing between nodes in this subgraph */
215
+ nodeSpacing?: number
216
+ /** Vertical spacing between layers in this subgraph */
217
+ rankSpacing?: number
218
+ }
219
+
220
+ export interface Subgraph {
221
+ id: string
222
+
223
+ /**
224
+ * Display label
225
+ */
226
+ label: string
227
+
228
+ /**
229
+ * Child subgraph IDs
230
+ */
231
+ children?: string[]
232
+
233
+ /**
234
+ * Parent subgraph ID (for nested subgraphs)
235
+ */
236
+ parent?: string
237
+
238
+ /**
239
+ * Layout direction within this subgraph
240
+ */
241
+ direction?: LayoutDirection
242
+
243
+ /**
244
+ * Custom style
245
+ */
246
+ style?: SubgraphStyle
247
+
248
+ /**
249
+ * Vendor name for vendor-specific icons (e.g., 'aws', 'azure', 'gcp', 'yamaha')
250
+ */
251
+ vendor?: string
252
+
253
+ /**
254
+ * Service name within the vendor (e.g., 'ec2', 'vpc', 'lambda')
255
+ * Used for cloud providers like AWS
256
+ */
257
+ service?: string
258
+
259
+ /**
260
+ * Model name for hardware vendors (e.g., 'rtx3510', 'ex4400')
261
+ * Alternative to service for equipment vendors
262
+ */
263
+ model?: string
264
+
265
+ /**
266
+ * Resource type within the service (e.g., 'instance', 'nat-gateway')
267
+ */
268
+ resource?: string
269
+ }
270
+
271
+ // ============================================
272
+ // Canvas/Sheet Size Types
273
+ // ============================================
274
+
275
+ /**
276
+ * Standard paper size presets
277
+ */
278
+ export type PaperSize =
279
+ | 'A0' | 'A1' | 'A2' | 'A3' | 'A4'
280
+ | 'B0' | 'B1' | 'B2' | 'B3' | 'B4'
281
+ | 'letter' | 'legal' | 'tabloid'
282
+
283
+ /**
284
+ * Paper orientation
285
+ */
286
+ export type PaperOrientation = 'portrait' | 'landscape'
287
+
288
+ /**
289
+ * Paper size dimensions in mm
290
+ */
291
+ export const PAPER_SIZES: Record<PaperSize, { width: number; height: number }> = {
292
+ 'A0': { width: 841, height: 1189 },
293
+ 'A1': { width: 594, height: 841 },
294
+ 'A2': { width: 420, height: 594 },
295
+ 'A3': { width: 297, height: 420 },
296
+ 'A4': { width: 210, height: 297 },
297
+ 'B0': { width: 1000, height: 1414 },
298
+ 'B1': { width: 707, height: 1000 },
299
+ 'B2': { width: 500, height: 707 },
300
+ 'B3': { width: 353, height: 500 },
301
+ 'B4': { width: 250, height: 353 },
302
+ 'letter': { width: 216, height: 279 },
303
+ 'legal': { width: 216, height: 356 },
304
+ 'tabloid': { width: 279, height: 432 },
305
+ }
306
+
307
+ /**
308
+ * Canvas/sheet size settings
309
+ */
310
+ export interface CanvasSettings {
311
+ /**
312
+ * Paper size preset (A0, A1, A2, A3, A4, etc.)
313
+ */
314
+ preset?: PaperSize
315
+
316
+ /**
317
+ * Paper orientation (portrait or landscape)
318
+ * Only used with preset
319
+ */
320
+ orientation?: PaperOrientation
321
+
322
+ /**
323
+ * Custom width in pixels
324
+ * Takes precedence over preset
325
+ */
326
+ width?: number
327
+
328
+ /**
329
+ * Custom height in pixels
330
+ * Takes precedence over preset
331
+ */
332
+ height?: number
333
+
334
+ /**
335
+ * DPI for print output (default: 96 for screen, 300 for print)
336
+ */
337
+ dpi?: number
338
+
339
+ /**
340
+ * Fit content to canvas with padding
341
+ * If true, scales content to fit within canvas
342
+ */
343
+ fit?: boolean
344
+
345
+ /**
346
+ * Padding around content when fit is true (in pixels)
347
+ */
348
+ padding?: number
349
+ }
350
+
351
+ /**
352
+ * Convert paper size to pixels at given DPI
353
+ */
354
+ export function paperSizeToPixels(
355
+ size: PaperSize,
356
+ orientation: PaperOrientation = 'portrait',
357
+ dpi: number = 96
358
+ ): { width: number; height: number } {
359
+ const dimensions = PAPER_SIZES[size]
360
+ const mmToInch = 1 / 25.4
361
+
362
+ let width = Math.round(dimensions.width * mmToInch * dpi)
363
+ let height = Math.round(dimensions.height * mmToInch * dpi)
364
+
365
+ if (orientation === 'landscape') {
366
+ ;[width, height] = [height, width]
367
+ }
368
+
369
+ return { width, height }
370
+ }
371
+
372
+ // ============================================
373
+ // Graph Types
374
+ // ============================================
375
+
376
+ /**
377
+ * Theme type for diagram appearance
378
+ */
379
+ export type ThemeType = 'light' | 'dark'
380
+
381
+ export interface GraphSettings {
382
+ /**
383
+ * Default layout direction
384
+ */
385
+ direction?: LayoutDirection
386
+
387
+ /**
388
+ * Theme for diagram appearance (light or dark)
389
+ */
390
+ theme?: ThemeType
391
+
392
+ /**
393
+ * Node spacing
394
+ */
395
+ nodeSpacing?: number
396
+
397
+ /**
398
+ * Rank spacing (between layers)
399
+ */
400
+ rankSpacing?: number
401
+
402
+ /**
403
+ * Subgraph padding
404
+ */
405
+ subgraphPadding?: number
406
+
407
+ /**
408
+ * Canvas/sheet size settings
409
+ */
410
+ canvas?: CanvasSettings
411
+ }
412
+
413
+ export interface NetworkGraph {
414
+ version: string
415
+ name?: string
416
+ description?: string
417
+
418
+ /**
419
+ * All nodes (flat list)
420
+ */
421
+ nodes: Node[]
422
+
423
+ /**
424
+ * All links
425
+ */
426
+ links: Link[]
427
+
428
+ /**
429
+ * Subgraph definitions
430
+ */
431
+ subgraphs?: Subgraph[]
432
+
433
+ /**
434
+ * Global settings
435
+ */
436
+ settings?: GraphSettings
437
+ }
438
+
439
+ // ============================================
440
+ // Device Types (for default styling)
441
+ // ============================================
442
+
443
+ export enum DeviceType {
444
+ Router = 'router',
445
+ L3Switch = 'l3-switch',
446
+ L2Switch = 'l2-switch',
447
+ Firewall = 'firewall',
448
+ LoadBalancer = 'load-balancer',
449
+ Server = 'server',
450
+ AccessPoint = 'access-point',
451
+ Cloud = 'cloud',
452
+ Internet = 'internet',
453
+ VPN = 'vpn',
454
+ Database = 'database',
455
+ Generic = 'generic',
456
+ }
457
+
458
+ // ============================================
459
+ // Layout Result Types
460
+ // ============================================
461
+
462
+ export interface Position {
463
+ x: number
464
+ y: number
465
+ }
466
+
467
+ export interface Size {
468
+ width: number
469
+ height: number
470
+ }
471
+
472
+ export interface Bounds {
473
+ x: number
474
+ y: number
475
+ width: number
476
+ height: number
477
+ }
478
+
479
+ /**
480
+ * Port position on a node edge
481
+ */
482
+ export interface LayoutPort {
483
+ id: string
484
+ /** Port name (e.g., "eth0", "Gi0/1") */
485
+ label: string
486
+ /** Position relative to node center */
487
+ position: Position
488
+ /** Port box size */
489
+ size: Size
490
+ /** Which side of the node (for rendering) */
491
+ side: 'top' | 'bottom' | 'left' | 'right'
492
+ }
493
+
494
+ export interface LayoutNode {
495
+ id: string
496
+ position: Position
497
+ size: Size
498
+ node: Node
499
+ /** Ports on this node */
500
+ ports?: Map<string, LayoutPort>
501
+ }
502
+
503
+ export interface LayoutLink {
504
+ id: string
505
+ from: string // Node ID
506
+ to: string // Node ID
507
+ fromEndpoint: LinkEndpoint // Full endpoint info
508
+ toEndpoint: LinkEndpoint // Full endpoint info
509
+ points: Position[]
510
+ link: Link
511
+ }
512
+
513
+ export interface LayoutSubgraph {
514
+ id: string
515
+ bounds: Bounds
516
+ subgraph: Subgraph
517
+ }
518
+
519
+ export interface LayoutResult {
520
+ nodes: Map<string, LayoutNode>
521
+ links: Map<string, LayoutLink>
522
+ subgraphs: Map<string, LayoutSubgraph>
523
+ bounds: Bounds
524
+ metadata?: {
525
+ algorithm: string
526
+ duration: number
527
+ }
528
+ }
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Shumoku Renderers
3
+ */
4
+
5
+ export { SVGRenderer, svgRenderer } from './svg.js'
6
+ export type { SVGRendererOptions } from './svg.js'