@shumoku/renderer 0.2.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.
@@ -0,0 +1,582 @@
1
+ /**
2
+ * Interactive Runtime - Hover tooltip with touch support and pan/zoom
3
+ */
4
+ let tooltip = null;
5
+ let overlay = null;
6
+ let currentHighlight = null;
7
+ let isTouchDevice = false;
8
+ function getTooltip() {
9
+ if (!tooltip) {
10
+ tooltip = document.createElement('div');
11
+ tooltip.style.cssText = `
12
+ position: fixed;
13
+ z-index: 10000;
14
+ padding: 6px 10px;
15
+ background: #1e293b;
16
+ color: #fff;
17
+ font-size: 12px;
18
+ border-radius: 4px;
19
+ pointer-events: none;
20
+ opacity: 0;
21
+ transition: opacity 0.15s;
22
+ font-family: system-ui, sans-serif;
23
+ max-width: 300px;
24
+ white-space: pre-line;
25
+ `;
26
+ document.body.appendChild(tooltip);
27
+ }
28
+ return tooltip;
29
+ }
30
+ function showTooltip(text, x, y) {
31
+ const t = getTooltip();
32
+ t.textContent = text;
33
+ // Position tooltip, keeping it within viewport
34
+ const pad = 12;
35
+ let left = x + pad;
36
+ let top = y + pad;
37
+ // Adjust if tooltip would go off-screen
38
+ requestAnimationFrame(() => {
39
+ const rect = t.getBoundingClientRect();
40
+ if (left + rect.width > window.innerWidth - pad) {
41
+ left = x - rect.width - pad;
42
+ }
43
+ if (top + rect.height > window.innerHeight - pad) {
44
+ top = y - rect.height - pad;
45
+ }
46
+ t.style.left = `${Math.max(pad, left)}px`;
47
+ t.style.top = `${Math.max(pad, top)}px`;
48
+ });
49
+ t.style.left = `${left}px`;
50
+ t.style.top = `${top}px`;
51
+ t.style.opacity = '1';
52
+ }
53
+ function hideTooltip() {
54
+ if (tooltip) {
55
+ tooltip.style.opacity = '0';
56
+ }
57
+ }
58
+ function getOverlay() {
59
+ if (!overlay) {
60
+ overlay = document.createElement('div');
61
+ overlay.style.cssText = `
62
+ position: fixed;
63
+ top: 0;
64
+ left: 0;
65
+ right: 0;
66
+ bottom: 0;
67
+ background: rgba(0, 0, 0, 0.5);
68
+ pointer-events: none;
69
+ opacity: 0;
70
+ transition: opacity 0.15s ease;
71
+ z-index: 9998;
72
+ `;
73
+ document.body.appendChild(overlay);
74
+ }
75
+ return overlay;
76
+ }
77
+ let highlightContainer = null;
78
+ let currentMiniSvg = null;
79
+ function getHighlightContainer() {
80
+ if (!highlightContainer) {
81
+ highlightContainer = document.createElement('div');
82
+ highlightContainer.style.cssText = `
83
+ position: fixed;
84
+ top: 0;
85
+ left: 0;
86
+ pointer-events: none;
87
+ z-index: 9999;
88
+ `;
89
+ document.body.appendChild(highlightContainer);
90
+ }
91
+ return highlightContainer;
92
+ }
93
+ function updateHighlightPosition() {
94
+ if (!currentHighlight || !currentMiniSvg)
95
+ return;
96
+ // Check if element is still in DOM (React may have replaced it)
97
+ if (!document.contains(currentHighlight)) {
98
+ // Element was removed, clear highlight
99
+ highlightElement(null);
100
+ return;
101
+ }
102
+ const svg = currentHighlight.closest('svg');
103
+ if (!svg)
104
+ return;
105
+ // Use getBoundingClientRect for screen position
106
+ const rect = svg.getBoundingClientRect();
107
+ // Update viewBox to match current zoom level
108
+ const viewBox = svg.getAttribute('viewBox');
109
+ if (viewBox) {
110
+ currentMiniSvg.setAttribute('viewBox', viewBox);
111
+ }
112
+ currentMiniSvg.style.left = `${rect.left}px`;
113
+ currentMiniSvg.style.top = `${rect.top}px`;
114
+ currentMiniSvg.style.width = `${rect.width}px`;
115
+ currentMiniSvg.style.height = `${rect.height}px`;
116
+ }
117
+ function highlightElement(el) {
118
+ // Skip if already highlighting the same element
119
+ if (el === currentHighlight) {
120
+ return;
121
+ }
122
+ // Remove previous highlight
123
+ if (currentHighlight) {
124
+ currentHighlight.classList.remove('shumoku-highlight');
125
+ }
126
+ // Clear previous mini SVG
127
+ const container = getHighlightContainer();
128
+ container.innerHTML = '';
129
+ currentMiniSvg = null;
130
+ currentHighlight = el;
131
+ const ov = getOverlay();
132
+ if (el) {
133
+ el.classList.add('shumoku-highlight');
134
+ const svg = el.closest('svg');
135
+ if (svg) {
136
+ const viewBox = svg.getAttribute('viewBox');
137
+ if (viewBox) {
138
+ // Clone the highlighted element
139
+ const clone = el.cloneNode(true);
140
+ clone.classList.remove('shumoku-highlight');
141
+ // Create mini SVG with same viewBox
142
+ const miniSvg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
143
+ miniSvg.setAttribute('viewBox', viewBox);
144
+ miniSvg.style.cssText = `
145
+ position: absolute;
146
+ overflow: visible;
147
+ filter: drop-shadow(0 0 4px #fff) drop-shadow(0 0 8px #fff) drop-shadow(0 0 12px rgba(100, 150, 255, 0.8));
148
+ `;
149
+ // Copy defs (for gradients, patterns, etc.)
150
+ const defs = svg.querySelector('defs');
151
+ if (defs) {
152
+ miniSvg.appendChild(defs.cloneNode(true));
153
+ }
154
+ miniSvg.appendChild(clone);
155
+ container.appendChild(miniSvg);
156
+ currentMiniSvg = miniSvg;
157
+ // Update position
158
+ updateHighlightPosition();
159
+ }
160
+ }
161
+ ov.style.opacity = '1';
162
+ }
163
+ else {
164
+ ov.style.opacity = '0';
165
+ }
166
+ }
167
+ function injectHighlightStyles() {
168
+ // No styles needed for current approach
169
+ }
170
+ function getTooltipInfo(el) {
171
+ // Port tooltip (ports are now separate layer)
172
+ const port = el.closest('.port[data-port]');
173
+ if (port) {
174
+ const portId = port.getAttribute('data-port') || '';
175
+ const deviceId = port.getAttribute('data-port-device') || '';
176
+ return { text: `${deviceId}:${portId}`, element: port };
177
+ }
178
+ // Link tooltip
179
+ const linkGroup = el.closest('.link-group[data-link-id]');
180
+ if (linkGroup) {
181
+ const from = linkGroup.getAttribute('data-link-from') || '';
182
+ const to = linkGroup.getAttribute('data-link-to') || '';
183
+ const bw = linkGroup.getAttribute('data-link-bandwidth');
184
+ const vlan = linkGroup.getAttribute('data-link-vlan');
185
+ let text = `${from} ↔ ${to}`;
186
+ if (bw)
187
+ text += `\n${bw}`;
188
+ if (vlan)
189
+ text += `\nVLAN: ${vlan}`;
190
+ return { text, element: linkGroup };
191
+ }
192
+ // Device tooltip (single label only)
193
+ const node = el.closest('.node[data-id]');
194
+ if (node) {
195
+ const json = node.getAttribute('data-device-json');
196
+ let text;
197
+ if (json) {
198
+ try {
199
+ const data = JSON.parse(json);
200
+ text = data.label || data.id;
201
+ }
202
+ catch {
203
+ text = node.getAttribute('data-id') || '';
204
+ }
205
+ }
206
+ else {
207
+ text = node.getAttribute('data-id') || '';
208
+ }
209
+ return { text, element: node };
210
+ }
211
+ return null;
212
+ }
213
+ function parseViewBox(svg) {
214
+ const vb = svg.getAttribute('viewBox');
215
+ if (!vb)
216
+ return null;
217
+ const parts = vb.split(/\s+|,/).map(Number);
218
+ if (parts.length !== 4 || parts.some(Number.isNaN))
219
+ return null;
220
+ return { x: parts[0], y: parts[1], width: parts[2], height: parts[3] };
221
+ }
222
+ function setViewBox(svg, vb) {
223
+ svg.setAttribute('viewBox', `${vb.x} ${vb.y} ${vb.width} ${vb.height}`);
224
+ }
225
+ export function initInteractive(options) {
226
+ const target = typeof options.target === 'string' ? document.querySelector(options.target) : options.target;
227
+ if (!target)
228
+ throw new Error('Target not found');
229
+ const svg = target.closest('svg') || target.querySelector('svg') || target;
230
+ if (!(svg instanceof SVGSVGElement))
231
+ throw new Error('SVG element not found');
232
+ // Inject highlight styles
233
+ injectHighlightStyles();
234
+ // Pan/Zoom settings
235
+ const panZoomEnabled = options.panZoom?.enabled ?? true;
236
+ const minScale = options.panZoom?.minScale ?? 0.1;
237
+ const maxScale = options.panZoom?.maxScale ?? 10;
238
+ const ZOOM_FACTOR = 1.2;
239
+ // Store original viewBox for reset and scale calculation
240
+ let originalViewBox = null;
241
+ const initViewBox = () => {
242
+ originalViewBox = parseViewBox(svg);
243
+ if (!originalViewBox) {
244
+ // Fallback: use SVG bounding box
245
+ const bbox = svg.getBBox();
246
+ originalViewBox = { x: bbox.x, y: bbox.y, width: bbox.width, height: bbox.height };
247
+ setViewBox(svg, originalViewBox);
248
+ }
249
+ };
250
+ initViewBox();
251
+ // Calculate current scale
252
+ const getScale = () => {
253
+ if (!originalViewBox)
254
+ return 1;
255
+ const current = parseViewBox(svg);
256
+ if (!current)
257
+ return 1;
258
+ return originalViewBox.width / current.width;
259
+ };
260
+ // Track if we're currently showing a touch tooltip
261
+ let touchTooltipActive = false;
262
+ // Pan state
263
+ let isPanning = false;
264
+ let panStartX = 0;
265
+ let panStartY = 0;
266
+ let panStartViewBox = null;
267
+ // Pinch state
268
+ let initialPinchDistance = 0;
269
+ let pinchStartViewBox = null;
270
+ let pinchCenter = null;
271
+ // Mouse move handler (desktop hover)
272
+ const handleMouseMove = (e) => {
273
+ if (isPanning)
274
+ return;
275
+ if (isTouchDevice)
276
+ return; // Skip on touch devices
277
+ const me = e;
278
+ const info = getTooltipInfo(me.target);
279
+ if (info) {
280
+ showTooltip(info.text, me.clientX, me.clientY);
281
+ highlightElement(info.element);
282
+ }
283
+ else {
284
+ hideTooltip();
285
+ highlightElement(null);
286
+ }
287
+ };
288
+ // Mouse leave handler
289
+ const handleMouseLeave = () => {
290
+ if (isTouchDevice)
291
+ return;
292
+ if (isPanning)
293
+ return;
294
+ hideTooltip();
295
+ highlightElement(null);
296
+ };
297
+ // Mouse down - start pan
298
+ const handleMouseDown = (e) => {
299
+ if (!panZoomEnabled)
300
+ return;
301
+ const me = e;
302
+ if (me.button !== 0)
303
+ return; // Left button only
304
+ // Don't start pan if clicking on interactive element
305
+ const info = getTooltipInfo(me.target);
306
+ if (info)
307
+ return;
308
+ isPanning = true;
309
+ panStartX = me.clientX;
310
+ panStartY = me.clientY;
311
+ panStartViewBox = parseViewBox(svg);
312
+ svg.style.cursor = 'grabbing';
313
+ e.preventDefault();
314
+ };
315
+ // Mouse move - pan
316
+ const handlePan = (e) => {
317
+ if (!isPanning || !panStartViewBox)
318
+ return;
319
+ const me = e;
320
+ const rect = svg.getBoundingClientRect();
321
+ const dx = me.clientX - panStartX;
322
+ const dy = me.clientY - panStartY;
323
+ // Convert screen delta to viewBox delta
324
+ const scaleX = panStartViewBox.width / rect.width;
325
+ const scaleY = panStartViewBox.height / rect.height;
326
+ setViewBox(svg, {
327
+ x: panStartViewBox.x - dx * scaleX,
328
+ y: panStartViewBox.y - dy * scaleY,
329
+ width: panStartViewBox.width,
330
+ height: panStartViewBox.height,
331
+ });
332
+ };
333
+ // Mouse up - end pan
334
+ const handleMouseUp = () => {
335
+ if (isPanning) {
336
+ isPanning = false;
337
+ panStartViewBox = null;
338
+ svg.style.cursor = '';
339
+ }
340
+ };
341
+ // Wheel zoom
342
+ const handleWheel = (e) => {
343
+ if (!panZoomEnabled)
344
+ return;
345
+ const we = e;
346
+ we.preventDefault();
347
+ const vb = parseViewBox(svg);
348
+ if (!vb || !originalViewBox)
349
+ return;
350
+ const rect = svg.getBoundingClientRect();
351
+ const mouseXRatio = (we.clientX - rect.left) / rect.width;
352
+ const mouseYRatio = (we.clientY - rect.top) / rect.height;
353
+ const mouseX = vb.x + vb.width * mouseXRatio;
354
+ const mouseY = vb.y + vb.height * mouseYRatio;
355
+ const zoomFactor = we.deltaY > 0 ? ZOOM_FACTOR : 1 / ZOOM_FACTOR;
356
+ const newWidth = vb.width * zoomFactor;
357
+ const newHeight = vb.height * zoomFactor;
358
+ // Check scale limits
359
+ const newScale = originalViewBox.width / newWidth;
360
+ if (newScale < minScale || newScale > maxScale)
361
+ return;
362
+ setViewBox(svg, {
363
+ x: mouseX - newWidth * mouseXRatio,
364
+ y: mouseY - newHeight * mouseYRatio,
365
+ width: newWidth,
366
+ height: newHeight,
367
+ });
368
+ };
369
+ // Touch start handler
370
+ const handleTouchStart = (e) => {
371
+ isTouchDevice = true;
372
+ const te = e;
373
+ if (te.touches.length === 1 && panZoomEnabled) {
374
+ // Single touch - check if on interactive element first
375
+ const touch = te.touches[0];
376
+ const targetEl = document.elementFromPoint(touch.clientX, touch.clientY);
377
+ const info = targetEl ? getTooltipInfo(targetEl) : null;
378
+ if (!info) {
379
+ // Start pan
380
+ isPanning = true;
381
+ panStartX = touch.clientX;
382
+ panStartY = touch.clientY;
383
+ panStartViewBox = parseViewBox(svg);
384
+ }
385
+ }
386
+ else if (te.touches.length === 2 && panZoomEnabled) {
387
+ // Two touches - start pinch
388
+ isPanning = false;
389
+ const t1 = te.touches[0];
390
+ const t2 = te.touches[1];
391
+ initialPinchDistance = Math.hypot(t2.clientX - t1.clientX, t2.clientY - t1.clientY);
392
+ pinchStartViewBox = parseViewBox(svg);
393
+ // Calculate pinch center in viewBox coordinates
394
+ const rect = svg.getBoundingClientRect();
395
+ const centerX = (t1.clientX + t2.clientX) / 2;
396
+ const centerY = (t1.clientY + t2.clientY) / 2;
397
+ const vb = pinchStartViewBox;
398
+ if (vb) {
399
+ const xRatio = (centerX - rect.left) / rect.width;
400
+ const yRatio = (centerY - rect.top) / rect.height;
401
+ pinchCenter = {
402
+ x: vb.x + vb.width * xRatio,
403
+ y: vb.y + vb.height * yRatio,
404
+ };
405
+ }
406
+ }
407
+ };
408
+ // Touch move handler
409
+ const handleTouchMove = (e) => {
410
+ const te = e;
411
+ if (te.touches.length === 1 && isPanning && panStartViewBox) {
412
+ // Pan
413
+ const touch = te.touches[0];
414
+ const rect = svg.getBoundingClientRect();
415
+ const dx = touch.clientX - panStartX;
416
+ const dy = touch.clientY - panStartY;
417
+ const scaleX = panStartViewBox.width / rect.width;
418
+ const scaleY = panStartViewBox.height / rect.height;
419
+ setViewBox(svg, {
420
+ x: panStartViewBox.x - dx * scaleX,
421
+ y: panStartViewBox.y - dy * scaleY,
422
+ width: panStartViewBox.width,
423
+ height: panStartViewBox.height,
424
+ });
425
+ te.preventDefault();
426
+ }
427
+ else if (te.touches.length === 2 && pinchStartViewBox && pinchCenter && originalViewBox) {
428
+ // Pinch zoom
429
+ const t1 = te.touches[0];
430
+ const t2 = te.touches[1];
431
+ const distance = Math.hypot(t2.clientX - t1.clientX, t2.clientY - t1.clientY);
432
+ const scale = distance / initialPinchDistance;
433
+ const newWidth = pinchStartViewBox.width / scale;
434
+ const newHeight = pinchStartViewBox.height / scale;
435
+ // Check scale limits
436
+ const newScale = originalViewBox.width / newWidth;
437
+ if (newScale < minScale || newScale > maxScale)
438
+ return;
439
+ // Zoom towards pinch center
440
+ const rect = svg.getBoundingClientRect();
441
+ const centerX = (t1.clientX + t2.clientX) / 2;
442
+ const centerY = (t1.clientY + t2.clientY) / 2;
443
+ const xRatio = (centerX - rect.left) / rect.width;
444
+ const yRatio = (centerY - rect.top) / rect.height;
445
+ setViewBox(svg, {
446
+ x: pinchCenter.x - newWidth * xRatio,
447
+ y: pinchCenter.y - newHeight * yRatio,
448
+ width: newWidth,
449
+ height: newHeight,
450
+ });
451
+ te.preventDefault();
452
+ }
453
+ };
454
+ // Touch end handler
455
+ const handleTouchEnd = (e) => {
456
+ const te = e;
457
+ if (te.touches.length === 0) {
458
+ isPanning = false;
459
+ panStartViewBox = null;
460
+ pinchStartViewBox = null;
461
+ pinchCenter = null;
462
+ }
463
+ else if (te.touches.length === 1) {
464
+ // Switched from pinch to pan
465
+ pinchStartViewBox = null;
466
+ pinchCenter = null;
467
+ isPanning = true;
468
+ const touch = te.touches[0];
469
+ panStartX = touch.clientX;
470
+ panStartY = touch.clientY;
471
+ panStartViewBox = parseViewBox(svg);
472
+ }
473
+ };
474
+ // Touch/click handler for mobile tooltip
475
+ const handleTap = (e) => {
476
+ if (!isTouchDevice)
477
+ return;
478
+ if (isPanning)
479
+ return;
480
+ const me = e;
481
+ const targetEl = e.target;
482
+ const info = getTooltipInfo(targetEl);
483
+ if (info) {
484
+ // Show tooltip at tap position
485
+ showTooltip(info.text, me.clientX, me.clientY);
486
+ highlightElement(info.element);
487
+ touchTooltipActive = true;
488
+ e.preventDefault();
489
+ }
490
+ else if (touchTooltipActive) {
491
+ // Tap on empty area - hide tooltip
492
+ hideTooltip();
493
+ highlightElement(null);
494
+ touchTooltipActive = false;
495
+ }
496
+ };
497
+ // Position update handler for scroll/resize events
498
+ const handlePositionUpdate = () => {
499
+ updateHighlightPosition();
500
+ };
501
+ // Track viewBox changes for pan/zoom
502
+ let rafId = null;
503
+ let lastViewBox = '';
504
+ const trackViewBox = () => {
505
+ if (currentHighlight) {
506
+ const viewBox = svg.getAttribute('viewBox') || '';
507
+ if (viewBox !== lastViewBox) {
508
+ lastViewBox = viewBox;
509
+ updateHighlightPosition();
510
+ }
511
+ }
512
+ rafId = requestAnimationFrame(trackViewBox);
513
+ };
514
+ rafId = requestAnimationFrame(trackViewBox);
515
+ // Reset view
516
+ const resetView = () => {
517
+ if (originalViewBox) {
518
+ setViewBox(svg, originalViewBox);
519
+ }
520
+ };
521
+ // Set touch-action to prevent browser gestures
522
+ if (panZoomEnabled) {
523
+ svg.style.touchAction = 'none';
524
+ }
525
+ // Add event listeners
526
+ svg.addEventListener('mousemove', handleMouseMove);
527
+ svg.addEventListener('mouseleave', handleMouseLeave);
528
+ svg.addEventListener('mousedown', handleMouseDown);
529
+ svg.addEventListener('click', handleTap);
530
+ svg.addEventListener('wheel', handleWheel, { passive: false });
531
+ svg.addEventListener('touchstart', handleTouchStart, { passive: true });
532
+ svg.addEventListener('touchmove', handleTouchMove, { passive: false });
533
+ svg.addEventListener('touchend', handleTouchEnd);
534
+ // Global mouse events for pan
535
+ document.addEventListener('mousemove', handlePan);
536
+ document.addEventListener('mouseup', handleMouseUp);
537
+ // Listen for scroll/resize to update highlight position
538
+ window.addEventListener('scroll', handlePositionUpdate, true);
539
+ window.addEventListener('resize', handlePositionUpdate);
540
+ return {
541
+ destroy: () => {
542
+ svg.removeEventListener('mousemove', handleMouseMove);
543
+ svg.removeEventListener('mouseleave', handleMouseLeave);
544
+ svg.removeEventListener('mousedown', handleMouseDown);
545
+ svg.removeEventListener('click', handleTap);
546
+ svg.removeEventListener('wheel', handleWheel);
547
+ svg.removeEventListener('touchstart', handleTouchStart);
548
+ svg.removeEventListener('touchmove', handleTouchMove);
549
+ svg.removeEventListener('touchend', handleTouchEnd);
550
+ document.removeEventListener('mousemove', handlePan);
551
+ document.removeEventListener('mouseup', handleMouseUp);
552
+ window.removeEventListener('scroll', handlePositionUpdate, true);
553
+ window.removeEventListener('resize', handlePositionUpdate);
554
+ if (rafId !== null)
555
+ cancelAnimationFrame(rafId);
556
+ highlightElement(null);
557
+ if (tooltip) {
558
+ tooltip.remove();
559
+ tooltip = null;
560
+ }
561
+ if (overlay) {
562
+ overlay.remove();
563
+ overlay = null;
564
+ }
565
+ if (highlightContainer) {
566
+ highlightContainer.remove();
567
+ highlightContainer = null;
568
+ }
569
+ },
570
+ showDeviceModal: () => { },
571
+ hideModal: () => { },
572
+ showLinkTooltip: () => { },
573
+ hideTooltip: () => {
574
+ hideTooltip();
575
+ highlightElement(null);
576
+ touchTooltipActive = false;
577
+ },
578
+ resetView,
579
+ getScale,
580
+ };
581
+ }
582
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/html/runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ // Auto-generated - do not edit
2
+ export const INTERACTIVE_IIFE = "(()=>{var{defineProperty:v,getOwnPropertyNames:zq,getOwnPropertyDescriptor:Fq}=Object,Lq=Object.prototype.hasOwnProperty;var Jq=new WeakMap,Aq=(J)=>{var I=Jq.get(J),q;if(I)return I;if(I=v({},\"__esModule\",{value:!0}),J&&typeof J===\"object\"||typeof J===\"function\")zq(J).map((Q)=>!Lq.call(I,Q)&&v(I,Q,{get:()=>J[Q],enumerable:!(q=Fq(J,Q))||q.enumerable}));return Jq.set(J,I),I};var Gq=(J,I)=>{for(var q in I)v(J,q,{get:I[q],enumerable:!0,configurable:!0,set:(Q)=>I[q]=()=>Q})};var Wq={};Gq(Wq,{ShumokuInteractive:()=>Qq});var W=null,Y=null,C=null,w=!1;function Uq(){if(!W)W=document.createElement(\"div\"),W.style.cssText=`\n position: fixed;\n z-index: 10000;\n padding: 6px 10px;\n background: #1e293b;\n color: #fff;\n font-size: 12px;\n border-radius: 4px;\n pointer-events: none;\n opacity: 0;\n transition: opacity 0.15s;\n font-family: system-ui, sans-serif;\n max-width: 300px;\n white-space: pre-line;\n `,document.body.appendChild(W);return W}function Kq(J,I,q){let Q=Uq();Q.textContent=J;let j=12,L=I+j,z=q+j;requestAnimationFrame(()=>{let _=Q.getBoundingClientRect();if(L+_.width>window.innerWidth-j)L=I-_.width-j;if(z+_.height>window.innerHeight-j)z=q-_.height-j;Q.style.left=`${Math.max(j,L)}px`,Q.style.top=`${Math.max(j,z)}px`}),Q.style.left=`${L}px`,Q.style.top=`${z}px`,Q.style.opacity=\"1\"}function x(){if(W)W.style.opacity=\"0\"}function Oq(){if(!Y)Y=document.createElement(\"div\"),Y.style.cssText=`\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.5);\n pointer-events: none;\n opacity: 0;\n transition: opacity 0.15s ease;\n z-index: 9998;\n `,document.body.appendChild(Y);return Y}var y=null,X=null;function Zq(){if(!y)y=document.createElement(\"div\"),y.style.cssText=`\n position: fixed;\n top: 0;\n left: 0;\n pointer-events: none;\n z-index: 9999;\n `,document.body.appendChild(y);return y}function p(){if(!C||!X)return;if(!document.contains(C)){R(null);return}let J=C.closest(\"svg\");if(!J)return;let I=J.getBoundingClientRect(),q=J.getAttribute(\"viewBox\");if(q)X.setAttribute(\"viewBox\",q);X.style.left=`${I.left}px`,X.style.top=`${I.top}px`,X.style.width=`${I.width}px`,X.style.height=`${I.height}px`}function R(J){if(J===C)return;if(C)C.classList.remove(\"shumoku-highlight\");let I=Zq();I.innerHTML=\"\",X=null,C=J;let q=Oq();if(J){J.classList.add(\"shumoku-highlight\");let Q=J.closest(\"svg\");if(Q){let j=Q.getAttribute(\"viewBox\");if(j){let L=J.cloneNode(!0);L.classList.remove(\"shumoku-highlight\");let z=document.createElementNS(\"http://www.w3.org/2000/svg\",\"svg\");z.setAttribute(\"viewBox\",j),z.style.cssText=`\n position: absolute;\n overflow: visible;\n filter: drop-shadow(0 0 4px #fff) drop-shadow(0 0 8px #fff) drop-shadow(0 0 12px rgba(100, 150, 255, 0.8));\n `;let _=Q.querySelector(\"defs\");if(_)z.appendChild(_.cloneNode(!0));z.appendChild(L),I.appendChild(z),X=z,p()}}q.style.opacity=\"1\"}else q.style.opacity=\"0\"}function Dq(){}function c(J){let I=J.closest(\".port[data-port]\");if(I){let j=I.getAttribute(\"data-port\")||\"\";return{text:`${I.getAttribute(\"data-port-device\")||\"\"}:${j}`,element:I}}let q=J.closest(\".link-group[data-link-id]\");if(q){let j=q.getAttribute(\"data-link-from\")||\"\",L=q.getAttribute(\"data-link-to\")||\"\",z=q.getAttribute(\"data-link-bandwidth\"),_=q.getAttribute(\"data-link-vlan\"),b=`${j} ↔ ${L}`;if(z)b+=`\n${z}`;if(_)b+=`\nVLAN: ${_}`;return{text:b,element:q}}let Q=J.closest(\".node[data-id]\");if(Q){let j=Q.getAttribute(\"data-device-json\"),L;if(j)try{let z=JSON.parse(j);L=z.label||z.id}catch{L=Q.getAttribute(\"data-id\")||\"\"}else L=Q.getAttribute(\"data-id\")||\"\";return{text:L,element:Q}}return null}function f(J){let I=J.getAttribute(\"viewBox\");if(!I)return null;let q=I.split(/\\s+|,/).map(Number);if(q.length!==4||q.some(Number.isNaN))return null;return{x:q[0],y:q[1],width:q[2],height:q[3]}}function P(J,I){J.setAttribute(\"viewBox\",`${I.x} ${I.y} ${I.width} ${I.height}`)}function Nq(J){let I=typeof J.target===\"string\"?document.querySelector(J.target):J.target;if(!I)throw Error(\"Target not found\");let q=I.closest(\"svg\")||I.querySelector(\"svg\")||I;if(!(q instanceof SVGSVGElement))throw Error(\"SVG element not found\");Dq();let Q=J.panZoom?.enabled??!0,j=J.panZoom?.minScale??0.1,L=J.panZoom?.maxScale??10,z=1.2,_=null;(()=>{if(_=f(q),!_){let $=q.getBBox();_={x:$.x,y:$.y,width:$.width,height:$.height},P(q,_)}})();let $q=()=>{if(!_)return 1;let $=f(q);if(!$)return 1;return _.width/$.width},u=!1,G=!1,T=0,m=0,F=null,s=0,E=null,M=null,h=($)=>{if(G)return;if(w)return;let N=$,K=c(N.target);if(K)Kq(K.text,N.clientX,N.clientY),R(K.element);else x(),R(null)},g=()=>{if(w)return;if(G)return;x(),R(null)},l=($)=>{if(!Q)return;let N=$;if(N.button!==0)return;if(c(N.target))return;G=!0,T=N.clientX,m=N.clientY,F=f(q),q.style.cursor=\"grabbing\",$.preventDefault()},r=($)=>{if(!G||!F)return;let N=$,K=q.getBoundingClientRect(),k=N.clientX-T,A=N.clientY-m,O=F.width/K.width,Z=F.height/K.height;P(q,{x:F.x-k*O,y:F.y-A*Z,width:F.width,height:F.height})},a=()=>{if(G)G=!1,F=null,q.style.cursor=\"\"},n=($)=>{if(!Q)return;let N=$;N.preventDefault();let K=f(q);if(!K||!_)return;let k=q.getBoundingClientRect(),A=(N.clientX-k.left)/k.width,O=(N.clientY-k.top)/k.height,Z=K.x+K.width*A,U=K.y+K.height*O,H=N.deltaY>0?z:1/z,D=K.width*H,B=K.height*H,d=_.width/D;if(d<j||d>L)return;P(q,{x:Z-D*A,y:U-B*O,width:D,height:B})},o=($)=>{w=!0;let N=$;if(N.touches.length===1&&Q){let K=N.touches[0],k=document.elementFromPoint(K.clientX,K.clientY);if(!(k?c(k):null))G=!0,T=K.clientX,m=K.clientY,F=f(q)}else if(N.touches.length===2&&Q){G=!1;let K=N.touches[0],k=N.touches[1];s=Math.hypot(k.clientX-K.clientX,k.clientY-K.clientY),E=f(q);let A=q.getBoundingClientRect(),O=(K.clientX+k.clientX)/2,Z=(K.clientY+k.clientY)/2,U=E;if(U){let H=(O-A.left)/A.width,D=(Z-A.top)/A.height;M={x:U.x+U.width*H,y:U.y+U.height*D}}}},i=($)=>{let N=$;if(N.touches.length===1&&G&&F){let K=N.touches[0],k=q.getBoundingClientRect(),A=K.clientX-T,O=K.clientY-m,Z=F.width/k.width,U=F.height/k.height;P(q,{x:F.x-A*Z,y:F.y-O*U,width:F.width,height:F.height}),N.preventDefault()}else if(N.touches.length===2&&E&&M&&_){let K=N.touches[0],k=N.touches[1],O=Math.hypot(k.clientX-K.clientX,k.clientY-K.clientY)/s,Z=E.width/O,U=E.height/O,H=_.width/Z;if(H<j||H>L)return;let D=q.getBoundingClientRect(),B=(K.clientX+k.clientX)/2,d=(K.clientY+k.clientY)/2,_q=(B-D.left)/D.width,jq=(d-D.top)/D.height;P(q,{x:M.x-Z*_q,y:M.y-U*jq,width:Z,height:U}),N.preventDefault()}},t=($)=>{let N=$;if(N.touches.length===0)G=!1,F=null,E=null,M=null;else if(N.touches.length===1){E=null,M=null,G=!0;let K=N.touches[0];T=K.clientX,m=K.clientY,F=f(q)}},e=($)=>{if(!w)return;if(G)return;let N=$,K=$.target,k=c(K);if(k)Kq(k.text,N.clientX,N.clientY),R(k.element),u=!0,$.preventDefault();else if(u)x(),R(null),u=!1},V=()=>{p()},S=null,qq=\"\",Iq=()=>{if(C){let $=q.getAttribute(\"viewBox\")||\"\";if($!==qq)qq=$,p()}S=requestAnimationFrame(Iq)};S=requestAnimationFrame(Iq);let kq=()=>{if(_)P(q,_)};if(Q)q.style.touchAction=\"none\";return q.addEventListener(\"mousemove\",h),q.addEventListener(\"mouseleave\",g),q.addEventListener(\"mousedown\",l),q.addEventListener(\"click\",e),q.addEventListener(\"wheel\",n,{passive:!1}),q.addEventListener(\"touchstart\",o,{passive:!0}),q.addEventListener(\"touchmove\",i,{passive:!1}),q.addEventListener(\"touchend\",t),document.addEventListener(\"mousemove\",r),document.addEventListener(\"mouseup\",a),window.addEventListener(\"scroll\",V,!0),window.addEventListener(\"resize\",V),{destroy:()=>{if(q.removeEventListener(\"mousemove\",h),q.removeEventListener(\"mouseleave\",g),q.removeEventListener(\"mousedown\",l),q.removeEventListener(\"click\",e),q.removeEventListener(\"wheel\",n),q.removeEventListener(\"touchstart\",o),q.removeEventListener(\"touchmove\",i),q.removeEventListener(\"touchend\",t),document.removeEventListener(\"mousemove\",r),document.removeEventListener(\"mouseup\",a),window.removeEventListener(\"scroll\",V,!0),window.removeEventListener(\"resize\",V),S!==null)cancelAnimationFrame(S);if(R(null),W)W.remove(),W=null;if(Y)Y.remove(),Y=null;if(y)y.remove(),y=null},showDeviceModal:()=>{},hideModal:()=>{},showLinkTooltip:()=>{},hideTooltip:()=>{x(),R(null),u=!1},resetView:kq,getScale:$q}}var Qq={initInteractive:Nq};window.ShumokuInteractive=Qq;})();\n";
@@ -0,0 +1,8 @@
1
+ /**
2
+ * @shumoku/renderer - SVG and HTML renderers for network diagrams
3
+ */
4
+ import * as html from './html/index.js';
5
+ import * as svg from './svg.js';
6
+ export { svg, html };
7
+ export type { DataAttributeOptions, DeviceInfo, EndpointInfo, HTMLRendererOptions, InteractiveInstance, InteractiveOptions, LinkInfo, PortInfo, RenderMode, } from './types.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,IAAI,MAAM,iBAAiB,CAAA;AAEvC,OAAO,KAAK,GAAG,MAAM,UAAU,CAAA;AAE/B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,CAAA;AAGpB,YAAY,EACV,oBAAoB,EACpB,UAAU,EACV,YAAY,EACZ,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,EAClB,QAAQ,EACR,QAAQ,EACR,UAAU,GACX,MAAM,YAAY,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,8 @@
1
+ /**
2
+ * @shumoku/renderer - SVG and HTML renderers for network diagrams
3
+ */
4
+ import * as html from './html/index.js';
5
+ // Namespace exports
6
+ import * as svg from './svg.js';
7
+ export { svg, html };
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,IAAI,MAAM,iBAAiB,CAAA;AACvC,oBAAoB;AACpB,OAAO,KAAK,GAAG,MAAM,UAAU,CAAA;AAE/B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,CAAA"}