@ship-ui/core 0.22.15 → 0.22.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/assets/mcp/components.json +213 -47
  2. package/bin/src/subset.ts +6 -6
  3. package/bin/src/utilities.ts +14 -14
  4. package/fesm2022/ship-ui-core-ship-a11y-keybindings.mjs +12 -86
  5. package/fesm2022/ship-ui-core-ship-a11y-keybindings.mjs.map +1 -1
  6. package/fesm2022/ship-ui-core-ship-accordion.mjs +4 -3
  7. package/fesm2022/ship-ui-core-ship-accordion.mjs.map +1 -1
  8. package/fesm2022/ship-ui-core-ship-alert.mjs +1 -4
  9. package/fesm2022/ship-ui-core-ship-alert.mjs.map +1 -1
  10. package/fesm2022/ship-ui-core-ship-blueprint.mjs +17 -11
  11. package/fesm2022/ship-ui-core-ship-blueprint.mjs.map +1 -1
  12. package/fesm2022/ship-ui-core-ship-checkbox.mjs +3 -2
  13. package/fesm2022/ship-ui-core-ship-checkbox.mjs.map +1 -1
  14. package/fesm2022/ship-ui-core-ship-color-picker.mjs +66 -62
  15. package/fesm2022/ship-ui-core-ship-color-picker.mjs.map +1 -1
  16. package/fesm2022/ship-ui-core-ship-datepicker.mjs +24 -16
  17. package/fesm2022/ship-ui-core-ship-datepicker.mjs.map +1 -1
  18. package/fesm2022/ship-ui-core-ship-dialog.mjs +4 -0
  19. package/fesm2022/ship-ui-core-ship-dialog.mjs.map +1 -1
  20. package/fesm2022/ship-ui-core-ship-editor.mjs +0 -42
  21. package/fesm2022/ship-ui-core-ship-editor.mjs.map +1 -1
  22. package/fesm2022/ship-ui-core-ship-form-field.mjs +0 -1
  23. package/fesm2022/ship-ui-core-ship-form-field.mjs.map +1 -1
  24. package/fesm2022/ship-ui-core-ship-kbd.mjs +0 -6
  25. package/fesm2022/ship-ui-core-ship-kbd.mjs.map +1 -1
  26. package/fesm2022/ship-ui-core-ship-list-item-swipe.mjs +241 -0
  27. package/fesm2022/ship-ui-core-ship-list-item-swipe.mjs.map +1 -0
  28. package/fesm2022/ship-ui-core-ship-menu.mjs +7 -10
  29. package/fesm2022/ship-ui-core-ship-menu.mjs.map +1 -1
  30. package/fesm2022/ship-ui-core-ship-popover.mjs +5 -20
  31. package/fesm2022/ship-ui-core-ship-popover.mjs.map +1 -1
  32. package/fesm2022/ship-ui-core-ship-radio.mjs +3 -2
  33. package/fesm2022/ship-ui-core-ship-radio.mjs.map +1 -1
  34. package/fesm2022/ship-ui-core-ship-range-slider.mjs +7 -9
  35. package/fesm2022/ship-ui-core-ship-range-slider.mjs.map +1 -1
  36. package/fesm2022/ship-ui-core-ship-select.mjs.map +1 -1
  37. package/fesm2022/ship-ui-core-ship-sidenav.mjs +2 -2
  38. package/fesm2022/ship-ui-core-ship-sidenav.mjs.map +1 -1
  39. package/fesm2022/ship-ui-core-ship-sortable.mjs +262 -68
  40. package/fesm2022/ship-ui-core-ship-sortable.mjs.map +1 -1
  41. package/fesm2022/ship-ui-core-ship-spotlight.mjs +0 -11
  42. package/fesm2022/ship-ui-core-ship-spotlight.mjs.map +1 -1
  43. package/fesm2022/ship-ui-core-ship-stepper.mjs +1 -1
  44. package/fesm2022/ship-ui-core-ship-stepper.mjs.map +1 -1
  45. package/fesm2022/ship-ui-core-ship-table.mjs +426 -23
  46. package/fesm2022/ship-ui-core-ship-table.mjs.map +1 -1
  47. package/fesm2022/ship-ui-core-ship-toggle.mjs +3 -2
  48. package/fesm2022/ship-ui-core-ship-toggle.mjs.map +1 -1
  49. package/fesm2022/ship-ui-core-ship-tree.mjs +1 -9
  50. package/fesm2022/ship-ui-core-ship-tree.mjs.map +1 -1
  51. package/fesm2022/ship-ui-core.mjs +37 -53
  52. package/fesm2022/ship-ui-core.mjs.map +1 -1
  53. package/package.json +5 -1
  54. package/types/ship-ui-core-ship-a11y-keybindings.d.ts +0 -55
  55. package/types/ship-ui-core-ship-accordion.d.ts +7 -7
  56. package/types/ship-ui-core-ship-blueprint.d.ts +2 -1
  57. package/types/ship-ui-core-ship-checkbox.d.ts +2 -3
  58. package/types/ship-ui-core-ship-color-picker.d.ts +1 -25
  59. package/types/ship-ui-core-ship-datepicker.d.ts +2 -3
  60. package/types/ship-ui-core-ship-editor.d.ts +10 -10
  61. package/types/ship-ui-core-ship-list-item-swipe.d.ts +25 -0
  62. package/types/ship-ui-core-ship-menu.d.ts +1 -2
  63. package/types/ship-ui-core-ship-radio.d.ts +2 -3
  64. package/types/ship-ui-core-ship-range-slider.d.ts +6 -6
  65. package/types/ship-ui-core-ship-sortable.d.ts +31 -9
  66. package/types/ship-ui-core-ship-table.d.ts +12 -1
  67. package/types/ship-ui-core-ship-toggle.d.ts +2 -3
  68. package/types/ship-ui-core-ship-tree.d.ts +20 -25
  69. package/types/ship-ui-core.d.ts +17 -24
@@ -1,6 +1,6 @@
1
1
  import { isPlatformBrowser, JsonPipe } from '@angular/common';
2
2
  import * as i0 from '@angular/core';
3
- import { inject, DOCUMENT, PLATFORM_ID, ElementRef, computed, input, model, signal, effect, HostListener, ViewChild, ChangeDetectionStrategy, ViewEncapsulation, Component } from '@angular/core';
3
+ import { inject, DOCUMENT, PLATFORM_ID, ElementRef, computed, input, model, signal, viewChild, effect, HostListener, ChangeDetectionStrategy, ViewEncapsulation, Component } from '@angular/core';
4
4
  import { ShipButton } from '@ship-ui/core/ship-button';
5
5
  import { ShipCard } from '@ship-ui/core/ship-card';
6
6
  import { ShipIcon } from '@ship-ui/core/ship-icon';
@@ -229,6 +229,12 @@ class ShipBlueprint {
229
229
  this.#platformId = inject(PLATFORM_ID);
230
230
  this.#selfRef = inject((ElementRef));
231
231
  this.#keybindings = inject(ShipA11yKeybindingsService);
232
+ this.ariaKeyshortcuts = computed(() => {
233
+ const action = 'blueprint.cancel';
234
+ const shortcut = this.#keybindings.getShortcut(action);
235
+ return shortcut ? (this.#keybindings.getDisplayShortcut(action) || shortcut) : null;
236
+ }, /* @ts-ignore */
237
+ ...(ngDevMode ? [{ debugName: "ariaKeyshortcuts" }] : /* istanbul ignore next */ []));
232
238
  this.#currentClass = classMutationSignal();
233
239
  this.#htmlClass = classMutationSignal(this.#document.documentElement);
234
240
  this.asDots = computed(() => this.#currentClass().includes('dots'), /* @ts-ignore */
@@ -293,6 +299,7 @@ class ShipBlueprint {
293
299
  ...(ngDevMode ? [{ debugName: "#canvasWidth" }] : /* istanbul ignore next */ []));
294
300
  this.#canvasHeight = signal(0, /* @ts-ignore */
295
301
  ...(ngDevMode ? [{ debugName: "#canvasHeight" }] : /* istanbul ignore next */ []));
302
+ this.canvasRef = viewChild.required('blueprintCanvas');
296
303
  this.visibleNodes = computed(() => {
297
304
  const nodes = this.nodes();
298
305
  const panX = this.panX();
@@ -345,7 +352,7 @@ class ShipBlueprint {
345
352
  }
346
353
  ngAfterViewInit() {
347
354
  if (isPlatformBrowser(this.#platformId)) {
348
- const canvas = this.canvasRef.nativeElement;
355
+ const canvas = this.canvasRef().nativeElement;
349
356
  this.#ctx = canvas.getContext('2d');
350
357
  if (typeof ResizeObserver !== 'undefined') {
351
358
  this.#resizeObserver = new ResizeObserver(() => this.updateCanvasSize());
@@ -441,7 +448,7 @@ class ShipBlueprint {
441
448
  this.nodes.set(newNodes);
442
449
  }
443
450
  updateCanvasSize() {
444
- const canvas = this.canvasRef.nativeElement;
451
+ const canvas = this.canvasRef().nativeElement;
445
452
  const rect = this.#selfRef.nativeElement.getBoundingClientRect();
446
453
  const dpr = window.devicePixelRatio || 1;
447
454
  canvas.width = rect.width * dpr;
@@ -457,7 +464,7 @@ class ShipBlueprint {
457
464
  if (!this.#ctx)
458
465
  return;
459
466
  const ctx = this.#ctx;
460
- const { width, height } = this.canvasRef.nativeElement;
467
+ const { width, height } = this.canvasRef().nativeElement;
461
468
  const dpr = window.devicePixelRatio || 1;
462
469
  ctx.clearRect(0, 0, width / dpr, height / dpr);
463
470
  ctx.save();
@@ -471,7 +478,7 @@ class ShipBlueprint {
471
478
  ctx.restore();
472
479
  }
473
480
  drawGrid(ctx) {
474
- const { width, height } = this.canvasRef.nativeElement;
481
+ const { width, height } = this.canvasRef().nativeElement;
475
482
  const dpr = window.devicePixelRatio || 1;
476
483
  const zoom = this.zoomLevel();
477
484
  const panX = this.panX();
@@ -953,7 +960,7 @@ class ShipBlueprint {
953
960
  return Math.max(min, Math.min(max, value));
954
961
  }
955
962
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: ShipBlueprint, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
956
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.0", type: ShipBlueprint, isStandalone: true, selector: "sh-blueprint", inputs: { forceUnique: { classPropertyName: "forceUnique", publicName: "forceUnique", isSignal: true, isRequired: false, transformFunction: null }, autoLayout: { classPropertyName: "autoLayout", publicName: "autoLayout", isSignal: true, isRequired: false, transformFunction: null }, gridSize: { classPropertyName: "gridSize", publicName: "gridSize", isSignal: true, isRequired: false, transformFunction: null }, snapToGrid: { classPropertyName: "snapToGrid", publicName: "snapToGrid", isSignal: true, isRequired: false, transformFunction: null }, gridColor: { classPropertyName: "gridColor", publicName: "gridColor", isSignal: true, isRequired: false, transformFunction: null }, nodes: { classPropertyName: "nodes", publicName: "nodes", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { nodes: "nodesChange" }, host: { listeners: { "document:mouseup": "onMouseUp($event)", "document:click": "onClick($event)", "document:keydown": "onDocumentKeyDown($event)", "document:mousemove": "onMouseMove($event)", "document:touchmove": "onTouchMove($event)", "document:touchend": "onDocumentTouchEnd($event)" } }, viewQueries: [{ propertyName: "canvasRef", first: true, predicate: ["blueprintCanvas"], descendants: true, static: true }], ngImport: i0, template: `
963
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.0", type: ShipBlueprint, isStandalone: true, selector: "sh-blueprint", inputs: { forceUnique: { classPropertyName: "forceUnique", publicName: "forceUnique", isSignal: true, isRequired: false, transformFunction: null }, autoLayout: { classPropertyName: "autoLayout", publicName: "autoLayout", isSignal: true, isRequired: false, transformFunction: null }, gridSize: { classPropertyName: "gridSize", publicName: "gridSize", isSignal: true, isRequired: false, transformFunction: null }, snapToGrid: { classPropertyName: "snapToGrid", publicName: "snapToGrid", isSignal: true, isRequired: false, transformFunction: null }, gridColor: { classPropertyName: "gridColor", publicName: "gridColor", isSignal: true, isRequired: false, transformFunction: null }, nodes: { classPropertyName: "nodes", publicName: "nodes", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { nodes: "nodesChange" }, host: { listeners: { "document:mouseup": "onMouseUp($event)", "document:click": "onClick($event)", "document:keydown": "onDocumentKeyDown($event)", "document:mousemove": "onMouseMove($event)", "document:touchmove": "onTouchMove($event)", "document:touchend": "onDocumentTouchEnd($event)" }, properties: { "attr.aria-keyshortcuts": "ariaKeyshortcuts()" } }, viewQueries: [{ propertyName: "canvasRef", first: true, predicate: ["blueprintCanvas"], descendants: true, isSignal: true }], ngImport: i0, template: `
957
964
  <div
958
965
  class="canvas-container"
959
966
  [class.locked]="isLocked()"
@@ -1129,11 +1136,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
1129
1136
  </div>
1130
1137
  }
1131
1138
  </div>
1132
- `, changeDetection: ChangeDetectionStrategy.OnPush, styles: ["sh-blueprint{--bp-bg: var(--base-1);--bp-icon-c: var(--base-6);--bp-stroke-c: var(--base-7);--bp-stroke-ca: var(--primary-8);display:flex;position:relative;width:100%;height:100%}sh-blueprint>*{box-sizing:border-box}sh-blueprint sh-icon{font-size:1rem;color:var(--bp-icon-c)}sh-blueprint sh-card.type-c{--card-bg: var(--base-1)}sh-blueprint .validation-errors{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);padding:1rem}sh-blueprint .midpoint-div{position:absolute;background-color:var(--base-2);border:var(--border-10);padding:.5rem;gap:.5rem;border-radius:var(--shape-2);transform:translate(-50%,-50%);z-index:100;display:flex;align-items:center;cursor:pointer}sh-blueprint .midpoint-div sh-icon{color:var(--base-12)}sh-blueprint .canvas-container{position:relative;width:100%;height:100%;overflow:hidden}sh-blueprint .canvas-container.hovering-connection{cursor:pointer}sh-blueprint .canvas-container.locked .node{pointer-events:none}sh-blueprint .action-panel{position:absolute;top:.5rem;right:.5rem;gap:.5rem;display:flex;align-items:center;z-index:1000}sh-blueprint canvas{position:absolute;top:0;left:0;width:100%;height:100%}sh-blueprint .nodes-wrapper{position:absolute;top:0;left:0;width:100%;height:100%;will-change:transform}sh-blueprint .canvas{height:100%;width:100%;background-color:var(--bp-bg);overflow:hidden;touch-action:none;position:relative}sh-blueprint .grid{position:absolute;inset:0;will-change:transform}sh-blueprint .tile{position:absolute;box-sizing:border-box;width:800px;height:800px;background-image:repeating-linear-gradient(0deg,var(--bp-grid-c) 0 2px,transparent 2px 100%),repeating-linear-gradient(90deg,var(--bp-grid-c) 0 2px,transparent 2px 100%);background-size:20px 20px}sh-blueprint .node{position:absolute;min-width:150px;padding:0;transition:box-shadow .2s ease-in-out;box-shadow:var(--box-shadow-10);will-change:transform;display:flex;flex-direction:column}sh-blueprint .node header{padding:.5rem;display:flex;align-items:center;justify-content:space-between;background-color:var(--base-2);border-bottom:var(--border-10);cursor:grab;-webkit-user-select:none;user-select:none}sh-blueprint .node header:active{cursor:grabbing}sh-blueprint .node:has(header:hover){box-shadow:0 0 10px 2px var(--primary-6)}sh-blueprint .ports{padding:.5rem 0;display:flex;gap:.5rem}sh-blueprint .inputs,sh-blueprint .outputs{display:flex;flex-direction:column;justify-content:space-around;flex:1 0;height:100%}sh-blueprint .inputs .port{border-radius:0 50% 50% 0;border-left-width:0}sh-blueprint .outputs{align-items:flex-end}sh-blueprint .outputs .port{border-radius:50% 0 0 50%;border-right-width:0}sh-blueprint .port-wrap{display:flex;gap:.25rem;align-items:center}sh-blueprint .port{width:.75rem;height:.75rem;background-color:var(--bp-stroke-c);border-radius:50%;border:var(--border-20);cursor:pointer;position:relative}sh-blueprint .port:hover{background-color:var(--bp-stroke-ca)}sh-blueprint .port-name{font:var(--paragraph-40);color:var(--base-12);white-space:nowrap}sh-blueprint .svg-wrap{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none}sh-blueprint .connections-svg{width:100%;height:100%;pointer-events:none}sh-blueprint .connection-path{stroke:var(--bp-stroke-c);stroke-width:3;fill:none;pointer-events:none}sh-blueprint .drag-path{stroke:var(--bp-stroke-ca);stroke-width:3;fill:none;stroke-dasharray:5,5;pointer-events:none}\n"] }]
1133
- }], ctorParameters: () => [], propDecorators: { forceUnique: [{ type: i0.Input, args: [{ isSignal: true, alias: "forceUnique", required: false }] }], autoLayout: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoLayout", required: false }] }], gridSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "gridSize", required: false }] }], snapToGrid: [{ type: i0.Input, args: [{ isSignal: true, alias: "snapToGrid", required: false }] }], gridColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "gridColor", required: false }] }], nodes: [{ type: i0.Input, args: [{ isSignal: true, alias: "nodes", required: false }] }, { type: i0.Output, args: ["nodesChange"] }], canvasRef: [{
1134
- type: ViewChild,
1135
- args: ['blueprintCanvas', { static: true }]
1136
- }], onMouseUp: [{
1139
+ `, changeDetection: ChangeDetectionStrategy.OnPush, host: {
1140
+ '[attr.aria-keyshortcuts]': 'ariaKeyshortcuts()',
1141
+ }, styles: ["sh-blueprint{--bp-bg: var(--base-1);--bp-icon-c: var(--base-6);--bp-stroke-c: var(--base-7);--bp-stroke-ca: var(--primary-8);display:flex;position:relative;width:100%;height:100%}sh-blueprint>*{box-sizing:border-box}sh-blueprint sh-icon{font-size:1rem;color:var(--bp-icon-c)}sh-blueprint sh-card.type-c{--card-bg: var(--base-1)}sh-blueprint .validation-errors{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);padding:1rem}sh-blueprint .midpoint-div{position:absolute;background-color:var(--base-2);border:var(--border-10);padding:.5rem;gap:.5rem;border-radius:var(--shape-2);transform:translate(-50%,-50%);z-index:100;display:flex;align-items:center;cursor:pointer}sh-blueprint .midpoint-div sh-icon{color:var(--base-12)}sh-blueprint .canvas-container{position:relative;width:100%;height:100%;overflow:hidden}sh-blueprint .canvas-container.hovering-connection{cursor:pointer}sh-blueprint .canvas-container.locked .node{pointer-events:none}sh-blueprint .action-panel{position:absolute;top:.5rem;right:.5rem;gap:.5rem;display:flex;align-items:center;z-index:1000}sh-blueprint canvas{position:absolute;top:0;left:0;width:100%;height:100%}sh-blueprint .nodes-wrapper{position:absolute;top:0;left:0;width:100%;height:100%;will-change:transform}sh-blueprint .canvas{height:100%;width:100%;background-color:var(--bp-bg);overflow:hidden;touch-action:none;position:relative}sh-blueprint .grid{position:absolute;inset:0;will-change:transform}sh-blueprint .tile{position:absolute;box-sizing:border-box;width:800px;height:800px;background-image:repeating-linear-gradient(0deg,var(--bp-grid-c) 0 2px,transparent 2px 100%),repeating-linear-gradient(90deg,var(--bp-grid-c) 0 2px,transparent 2px 100%);background-size:20px 20px}sh-blueprint .node{position:absolute;min-width:150px;padding:0;transition:box-shadow .2s ease-in-out;box-shadow:var(--box-shadow-10);will-change:transform;display:flex;flex-direction:column}sh-blueprint .node header{padding:.5rem;display:flex;align-items:center;justify-content:space-between;background-color:var(--base-2);border-bottom:var(--border-10);cursor:grab;-webkit-user-select:none;user-select:none}sh-blueprint .node header:active{cursor:grabbing}sh-blueprint .node:has(header:hover){box-shadow:0 0 10px 2px var(--primary-6)}sh-blueprint .ports{padding:.5rem 0;display:flex;gap:.5rem}sh-blueprint .inputs,sh-blueprint .outputs{display:flex;flex-direction:column;justify-content:space-around;flex:1 0;height:100%}sh-blueprint .inputs .port{border-radius:0 50% 50% 0;border-left-width:0}sh-blueprint .outputs{align-items:flex-end}sh-blueprint .outputs .port{border-radius:50% 0 0 50%;border-right-width:0}sh-blueprint .port-wrap{display:flex;gap:.25rem;align-items:center}sh-blueprint .port{width:.75rem;height:.75rem;background-color:var(--bp-stroke-c);border-radius:50%;border:var(--border-20);cursor:pointer;position:relative}sh-blueprint .port:hover{background-color:var(--bp-stroke-ca)}sh-blueprint .port-name{font:var(--paragraph-40);color:var(--base-12);white-space:nowrap}sh-blueprint .svg-wrap{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none}sh-blueprint .connections-svg{width:100%;height:100%;pointer-events:none}sh-blueprint .connection-path{stroke:var(--bp-stroke-c);stroke-width:3;fill:none;pointer-events:none}sh-blueprint .drag-path{stroke:var(--bp-stroke-ca);stroke-width:3;fill:none;stroke-dasharray:5,5;pointer-events:none}\n"] }]
1142
+ }], ctorParameters: () => [], propDecorators: { forceUnique: [{ type: i0.Input, args: [{ isSignal: true, alias: "forceUnique", required: false }] }], autoLayout: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoLayout", required: false }] }], gridSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "gridSize", required: false }] }], snapToGrid: [{ type: i0.Input, args: [{ isSignal: true, alias: "snapToGrid", required: false }] }], gridColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "gridColor", required: false }] }], nodes: [{ type: i0.Input, args: [{ isSignal: true, alias: "nodes", required: false }] }, { type: i0.Output, args: ["nodesChange"] }], canvasRef: [{ type: i0.ViewChild, args: ['blueprintCanvas', { isSignal: true }] }], onMouseUp: [{
1137
1143
  type: HostListener,
1138
1144
  args: ['document:mouseup', ['$event']]
1139
1145
  }], onClick: [{
@@ -1 +1 @@
1
- {"version":3,"file":"ship-ui-core-ship-blueprint.mjs","sources":["../../../projects/ship-ui/ship-blueprint/autolayout.ts","../../../projects/ship-ui/ship-blueprint/validatePorts.ts","../../../projects/ship-ui/ship-blueprint/ship-blueprint.ts","../../../projects/ship-ui/ship-blueprint/ship-ui-core-ship-blueprint.ts"],"sourcesContent":["import { BlueprintNode } from './ship-blueprint';\n\nexport function layoutNodes(nodes: BlueprintNode[]): BlueprintNode[] {\n if (!nodes || nodes.length === 0) return nodes;\n\n const layoutedNodes = structuredClone(nodes);\n const visited = new Set<string>();\n const unconnectedNodes: BlueprintNode[] = [];\n const connectedGraphs: BlueprintNode[][] = [];\n\n const allToNodes = new Set(layoutedNodes.flatMap((node) => node.connections).map((conn) => conn.toNode));\n const rootNodes = layoutedNodes.filter((node) => !allToNodes.has(node.id));\n\n for (const node of layoutedNodes) {\n if (!node.connections.length) {\n unconnectedNodes.push(node);\n }\n }\n\n for (const root of rootNodes) {\n if (!visited.has(root.id)) {\n const graph: BlueprintNode[] = [];\n traverseGraph(root, graph, visited, layoutedNodes);\n if (graph.length > 0) {\n connectedGraphs.push(graph);\n }\n }\n }\n\n positionUnconnectedNodes(unconnectedNodes);\n\n let currentX = 20;\n let currentY = 20;\n connectedGraphs.forEach((graph) => {\n const layoutedGraph = traverseAndLayout(graph);\n positionGraph(layoutedGraph, currentX, currentY);\n currentY += getGraphHeight(layoutedGraph) + 200;\n });\n\n return layoutedNodes;\n}\n\nfunction traverseGraph(\n startNode: BlueprintNode,\n graph: BlueprintNode[],\n visited: Set<string>,\n allNodes: BlueprintNode[]\n) {\n const queue = [startNode];\n visited.add(startNode.id);\n let head = 0;\n while (head < queue.length) {\n const node = queue[head++];\n graph.push(node);\n node.connections.forEach((conn) => {\n const toNode = allNodes.find((n) => n.id === conn.toNode);\n if (toNode && !visited.has(toNode.id)) {\n visited.add(toNode.id);\n queue.push(toNode);\n }\n });\n }\n}\n\nfunction positionUnconnectedNodes(nodes: BlueprintNode[]) {\n nodes.forEach((node, index) => {\n node.coordinates[0] = 20 + index * 200;\n node.coordinates[1] = 20;\n });\n}\n\nfunction traverseAndLayout(graph: BlueprintNode[]): BlueprintNode[] {\n const graphNodeMap = new Map<string, BlueprintNode>(graph.map((n) => [n.id, n]));\n const incomingConnectionCount = new Map<string, number>();\n\n graph.forEach((node) => {\n incomingConnectionCount.set(node.id, 0);\n });\n graph\n .flatMap((n) => n.connections)\n .forEach((conn) => {\n if (graphNodeMap.has(conn.toNode)) {\n incomingConnectionCount.set(conn.toNode, (incomingConnectionCount.get(conn.toNode) || 0) + 1);\n }\n });\n\n const roots = graph.filter((node) => (incomingConnectionCount.get(node.id) || 0) === 0);\n const layoutedNodes = new Set<string>();\n\n const queue = [...roots];\n let head = 0;\n\n while (head < queue.length) {\n const currentNode = queue[head++];\n layoutedNodes.add(currentNode.id);\n\n let outputConnectionIndex = 0;\n const connectedNodes: BlueprintNode[] = [];\n\n currentNode.connections.forEach((conn) => {\n const toNode = graphNodeMap.get(conn.toNode);\n if (toNode && !layoutedNodes.has(toNode.id)) {\n connectedNodes.push(toNode);\n }\n });\n\n connectedNodes.forEach((toNode) => {\n toNode.coordinates[0] = currentNode.coordinates[0] + 200;\n if (connectedNodes.length > 1) {\n const verticalOffset = (outputConnectionIndex - (connectedNodes.length - 1) / 2) * 200;\n toNode.coordinates[1] = currentNode.coordinates[1] + verticalOffset;\n } else {\n toNode.coordinates[1] = currentNode.coordinates[1];\n }\n\n queue.push(toNode);\n outputConnectionIndex++;\n });\n }\n return graph;\n}\n\nfunction positionGraph(graph: BlueprintNode[], startX: number, startY: number) {\n const minX = Math.min(...graph.map((n) => n.coordinates[0]));\n const minY = Math.min(...graph.map((n) => n.coordinates[1]));\n graph.forEach((node) => {\n node.coordinates[0] += startX - minX;\n node.coordinates[1] += startY - minY;\n });\n}\n\nfunction getGraphHeight(graph: BlueprintNode[]): number {\n if (!graph.length) return 0;\n const maxY = Math.max(...graph.map((n) => n.coordinates[1]));\n const minY = Math.min(...graph.map((n) => n.coordinates[1]));\n return maxY - minY;\n}\n","import { BlueprintNode } from './ship-blueprint';\n\nexport type PortValidationError = {\n nodeId: string;\n duplicatePortIds: string[];\n};\n\nexport function findDuplicatePortIDs(nodes: BlueprintNode[]): PortValidationError[] {\n const errors: PortValidationError[] = [];\n\n for (const node of nodes) {\n const portIdCounts = new Map<string, number>();\n const allPorts = [...node.inputs, ...node.outputs];\n\n for (const port of allPorts) {\n const count = portIdCounts.get(port.id) || 0;\n portIdCounts.set(port.id, count + 1);\n }\n\n const duplicatePortIds: string[] = [];\n for (const [id, count] of portIdCounts.entries()) {\n if (count > 1) {\n duplicatePortIds.push(id);\n }\n }\n\n if (duplicatePortIds.length > 0) {\n errors.push({\n nodeId: node.id,\n duplicatePortIds: duplicatePortIds,\n });\n }\n }\n\n return errors;\n}\n\nexport function findDuplicateNodeIDs(nodes: BlueprintNode[]): string[] {\n const nodeIdCounts = new Map<string, number>();\n\n for (const node of nodes) {\n const count = nodeIdCounts.get(node.id) || 0;\n nodeIdCounts.set(node.id, count + 1);\n }\n\n const duplicateNodeIds: string[] = [];\n for (const [id, count] of nodeIdCounts.entries()) {\n if (count > 1) {\n duplicateNodeIds.push(id);\n }\n }\n\n return duplicateNodeIds;\n}\n","import { isPlatformBrowser, JsonPipe } from '@angular/common';\nimport { AfterViewInit, ChangeDetectionStrategy, Component, computed, DOCUMENT, effect, ElementRef, HostListener, inject, input, model, OnDestroy, PLATFORM_ID, signal, ViewChild, ViewEncapsulation } from '@angular/core';\nimport { ShipButton } from '@ship-ui/core/ship-button';\nimport { ShipCard } from '@ship-ui/core/ship-card';\nimport { ShipIcon } from '@ship-ui/core/ship-icon';\nimport { ShipA11yKeybindingsService } from '@ship-ui/core/ship-a11y-keybindings';\nimport { classMutationSignal } from '@ship-ui/core';\nimport { layoutNodes } from './autolayout';\nimport { findDuplicateNodeIDs, findDuplicatePortIDs } from './validatePorts';\n\n// TODO - disallow infinite loops\n// TODO - Autolayout should take port order into account\n// TODO - drag and drop new nodes into the canvas (takes an input creatableNodes without coordinates) this are shown in a right side panel and can be dragged into the canvas\n\ntype Port = { id: string; name: string };\n\nexport type BlueprintNode = {\n id: string;\n name?: string;\n coordinates: Coordinates;\n inputs: Port[];\n outputs: Port[];\n connections: Connection[];\n};\n\ntype Connection = { fromNode: string; fromPort: string; toNode: string; toPort: string };\ntype DragState = { fromNode: string; fromPort: string; x2: number; y2: number };\n\nexport type Coordinates = [x: number, y: number];\n\nexport const TEST_NODES: BlueprintNode[] = [\n {\n id: 'a1',\n name: 'hello a1',\n coordinates: [0, 0],\n inputs: [],\n outputs: [{ id: 'out-1', name: 'Start Output' }],\n connections: [{ fromNode: 'a1', fromPort: 'out-1', toNode: 'b1', toPort: 'in-1' }],\n },\n {\n id: 'b1',\n coordinates: [0, 0],\n inputs: [\n { id: 'in-1', name: 'Input A' },\n { id: 'in-1', name: 'Another Input A' },\n ],\n outputs: [{ id: 'out-1', name: 'Output B' }],\n connections: [\n { fromNode: 'b1', fromPort: 'out-1', toNode: 'c6', toPort: 'in-1' },\n { fromNode: 'a1', fromPort: 'out-1', toNode: 'b1', toPort: 'in-1' },\n ],\n },\n {\n id: 'c6',\n name: 'hello c6',\n coordinates: [0, 0],\n inputs: [{ id: 'in-1', name: 'Input C' }],\n outputs: [{ id: 'out-1', name: 'Output D' }],\n connections: [{ fromNode: 'b1', fromPort: 'out-1', toNode: 'c6', toPort: 'in-1' }],\n },\n];\n\ntype ValidationErrors = {\n duplicateNodeIds: string[];\n duplicatePortIds: {\n nodeId: string;\n duplicatePortIds: string[];\n }[];\n};\n\n@Component({\n selector: 'sh-blueprint',\n styleUrl: './ship-blueprint.scss',\n encapsulation: ViewEncapsulation.None,\n imports: [ShipCard, ShipIcon, JsonPipe, ShipButton],\n template: `\n <div\n class=\"canvas-container\"\n [class.locked]=\"isLocked()\"\n [class.hovering-connection]=\"highlightedConnection()\"\n (mousedown)=\"startPan($event)\"\n (mousemove)=\"pan($event)\"\n (wheel)=\"zoom($event)\"\n (touchstart)=\"handleTouchStart($event)\"\n (touchmove)=\"handleTouchMove($event)\"\n (touchend)=\"handleTouchEnd()\">\n <div class=\"action-panel\">\n <button shButton (click)=\"applyAutolayout()\" class=\"small\">\n Autolayout\n <sh-icon>tree-structure</sh-icon>\n </button>\n\n <ng-content />\n </div>\n\n <canvas #blueprintCanvas></canvas>\n\n @if (validationErrors()) {\n <sh-card class=\"validation-errors type-c\">\n Something went wrong you have\n <br />\n duplicate node IDs or port IDs\n <pre>{{ validationErrors() | json }}</pre>\n </sh-card>\n } @else {\n <div\n class=\"nodes-wrapper\"\n [style.transform]=\"'translate(' + panX() + 'px, ' + panY() + 'px) scale(' + zoomLevel() + ')'\"\n [style.transform-origin]=\"'0 0'\">\n @for (node of visibleNodes(); track node.id) {\n <sh-card\n class=\"node type-c\"\n [style.transform]=\"getDisplayCoordinates(node)\"\n (mouseenter)=\"isHoveringNode.set(true)\"\n (mouseleave)=\"isHoveringNode.set(false)\">\n <header (mousedown)=\"startNodeDrag($event, node.id)\" (touchstart)=\"startNodeDrag($event, node.id)\">\n <span class=\"node-title\">{{ node.name ? node.name : node.id }}</span>\n <sh-icon>list</sh-icon>\n </header>\n <div class=\"ports\">\n <div class=\"inputs\">\n @for (inputPort of node.inputs; track inputPort.id) {\n <div\n class=\"port-wrap\"\n [attr.data-node-id]=\"node.id\"\n [attr.data-port-id]=\"inputPort.id\"\n (click)=\"endPortDrag($event, node.id, inputPort.id)\">\n <div class=\"port input-port\"></div>\n <span class=\"port-name\">{{ inputPort.name }}</span>\n </div>\n }\n </div>\n <div class=\"outputs\">\n @for (outputPort of node.outputs; track outputPort.id) {\n <div\n class=\"port-wrap\"\n [attr.data-node-id]=\"node.id\"\n [attr.data-port-id]=\"outputPort.id\"\n (click)=\"startPortDrag($event, node.id, outputPort.id)\">\n <span class=\"port-name\">{{ outputPort.name }}</span>\n <div class=\"port output-port\"></div>\n </div>\n }\n </div>\n </div>\n </sh-card>\n }\n\n @if (showMidpointDiv()) {\n <div\n class=\"midpoint-div\"\n (click)=\"removeConnection()\"\n [style.left.px]=\"midpointDivPosition()?.x\"\n [style.top.px]=\"midpointDivPosition()?.y\">\n Remove connection\n <sh-icon>trash</sh-icon>\n </div>\n }\n </div>\n }\n </div>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ShipBlueprint implements AfterViewInit, OnDestroy {\n readonly #ZOOM_SPEED = 0.01;\n readonly #MAX_ZOOM = 1.5;\n readonly #MIN_ZOOM = 0.5;\n readonly #NODE_WIDTH = 180;\n readonly #NODE_HEADER_HEIGHT = 40;\n readonly #PORT_ROW_HEIGHT = 28;\n\n #document = inject(DOCUMENT);\n #platformId = inject(PLATFORM_ID);\n #selfRef = inject(ElementRef<HTMLElement>);\n #keybindings = inject(ShipA11yKeybindingsService);\n #currentClass = classMutationSignal();\n #htmlClass = classMutationSignal(this.#document.documentElement);\n\n asDots = computed(() => this.#currentClass().includes('dots'));\n lightMode = computed(() => this.#htmlClass().includes('light'));\n\n forceUnique = input<boolean>(true);\n autoLayout = input<boolean>(false);\n gridSize = input(20);\n snapToGrid = input<boolean>(true);\n gridColor = input<[string, string]>(['#d8d8d8', '#2c2c2c']);\n\n nodes = model<BlueprintNode[]>([]);\n\n #currentGridColor = computed(() => this.gridColor()[this.lightMode() ? 0 : 1]);\n\n panX = signal(0);\n panY = signal(0);\n zoomLevel = signal(1);\n gridSnapSize = signal(20);\n\n isHoveringNode = signal(false);\n midpointDivPosition = signal<{ x: number; y: number } | null>(null);\n showMidpointDiv = signal(false);\n isLocked = signal(false);\n draggingConnection = signal<DragState | null>(null);\n validationErrors = signal<ValidationErrors | null>(null);\n highlightedConnection = signal<Connection | null>(null);\n\n #draggingNodeCoordinates = signal<Coordinates | null>(null);\n #isDragging = signal(false);\n #lastMouseX = signal(0);\n #lastMouseY = signal(0);\n #initialPinchDistance = signal(0);\n #isNodeDragging = signal(false);\n #draggedNodeId = signal<string | null>(null);\n #dragOffset = signal<Coordinates | null>(null);\n #connections = signal<Connection[]>([]);\n #canvasWidth = signal(0);\n #canvasHeight = signal(0);\n\n @ViewChild('blueprintCanvas', { static: true }) canvasRef!: ElementRef<HTMLCanvasElement>;\n #ctx!: CanvasRenderingContext2D;\n #resizeObserver!: ResizeObserver;\n\n visibleNodes = computed(() => {\n const nodes = this.nodes();\n const panX = this.panX();\n const panY = this.panY();\n const zoom = this.zoomLevel();\n const width = this.#canvasWidth();\n const height = this.#canvasHeight();\n\n if (width === 0 || height === 0) {\n return nodes;\n }\n\n const bufferX = width / zoom;\n const bufferY = height / zoom;\n\n const viewbox = {\n x1: -panX / zoom - bufferX,\n y1: -panY / zoom - bufferY,\n x2: (-panX + width) / zoom + bufferX,\n y2: (-panY + height) / zoom + bufferY,\n };\n\n return nodes.filter((node) => {\n const [x, y] = node.coordinates;\n return x > viewbox.x1 && x < viewbox.x2 && y > viewbox.y1 && y < viewbox.y2;\n });\n });\n\n constructor() {\n if (isPlatformBrowser(this.#platformId)) {\n effect(() => {\n this.asDots();\n this.panX();\n this.panY();\n this.zoomLevel();\n this.nodes();\n this.#connections();\n this.draggingConnection();\n this.#currentGridColor();\n this.highlightedConnection();\n this.#draggingNodeCoordinates();\n\n requestAnimationFrame(() => this.drawCanvas());\n });\n\n effect(() => {\n const nodes = this.nodes();\n const connectionsFromNodes = nodes.flatMap((node) => node.connections);\n const uniqueConnections = connectionsFromNodes.filter(\n (conn, index, self) =>\n index ===\n self.findIndex(\n (c) =>\n c.fromNode === conn.fromNode &&\n c.fromPort === conn.fromPort &&\n c.toNode === conn.toNode &&\n c.toPort === conn.toPort\n )\n );\n\n this.#connections.set(uniqueConnections);\n });\n }\n }\n\n ngAfterViewInit() {\n if (isPlatformBrowser(this.#platformId)) {\n const canvas = this.canvasRef.nativeElement;\n this.#ctx = canvas.getContext('2d')!;\n if (typeof ResizeObserver !== 'undefined') {\n this.#resizeObserver = new ResizeObserver(() => this.updateCanvasSize());\n this.#resizeObserver.observe(this.#selfRef.nativeElement);\n }\n this.updateCanvasSize();\n\n if (this.autoLayout()) {\n this.applyAutolayout();\n }\n\n if (this.forceUnique()) {\n this.#removeDuplicatesAndReinitiate();\n } else {\n this.#validateNodes();\n }\n }\n }\n\n ngOnDestroy() {\n if (this.#resizeObserver) {\n this.#resizeObserver.disconnect();\n }\n }\n\n @HostListener('document:mouseup', ['$event']) onMouseUp(event: MouseEvent) {\n if (this.isLocked()) return;\n\n this.endPan();\n this.endNodeDrag();\n }\n\n @HostListener('document:click', ['$event']) onClick(event: MouseEvent) {\n const target = event.target as HTMLElement;\n\n if (this.draggingConnection()) {\n if (!target.closest('.port')) {\n this.cancelPortDrag();\n }\n } else if (this.isLocked() && !target.closest('.midpoint-div')) {\n this.closeMidpointDiv();\n } else {\n this.#handleConnectionClick(event);\n }\n }\n\n @HostListener('document:keydown', ['$event']) onDocumentKeyDown(event: KeyboardEvent) {\n if (this.#keybindings.matches(event, 'blueprint.cancel')) {\n if (this.draggingConnection()) {\n this.cancelPortDrag();\n } else if (this.isLocked()) {\n this.closeMidpointDiv();\n }\n }\n }\n\n @HostListener('document:mousemove', ['$event']) onMouseMove(event: MouseEvent) {\n if (this.isLocked()) return;\n if (this.#isNodeDragging()) {\n this.nodeDrag(event);\n } else if (this.draggingConnection()) {\n this.updatePathOnMove(event);\n } else {\n this.pan(event);\n if (this.isHoveringNode()) {\n this.highlightedConnection.set(null);\n } else {\n this.#checkConnectionHover(event);\n }\n }\n }\n\n @HostListener('document:touchmove', ['$event']) onTouchMove(event: TouchEvent) {\n event.preventDefault();\n if (this.isLocked()) return;\n if (this.#isNodeDragging()) {\n this.nodeDrag(event.touches[0]);\n } else if (this.draggingConnection()) {\n this.updatePathOnMove(event.touches[0]);\n } else {\n this.handleTouchMove(event);\n }\n }\n\n @HostListener('document:touchend', ['$event']) onDocumentTouchEnd(event: TouchEvent) {\n if (this.isLocked()) return;\n\n this.handleTouchEnd();\n }\n\n applyAutolayout() {\n const newNodes = layoutNodes(this.nodes());\n this.nodes.set(newNodes);\n }\n\n updateCanvasSize() {\n const canvas = this.canvasRef.nativeElement;\n const rect = this.#selfRef.nativeElement.getBoundingClientRect();\n const dpr = window.devicePixelRatio || 1;\n canvas.width = rect.width * dpr;\n canvas.height = rect.height * dpr;\n this.#ctx.scale(dpr, dpr);\n canvas.style.width = `${rect.width}px`;\n canvas.style.height = `${rect.height}px`;\n\n this.#canvasWidth.set(rect.width);\n this.#canvasHeight.set(rect.height);\n\n this.drawCanvas();\n }\n\n drawCanvas() {\n if (!this.#ctx) return;\n\n const ctx = this.#ctx;\n const { width, height } = this.canvasRef.nativeElement;\n const dpr = window.devicePixelRatio || 1;\n ctx.clearRect(0, 0, width / dpr, height / dpr);\n ctx.save();\n ctx.translate(this.panX(), this.panY());\n ctx.scale(this.zoomLevel(), this.zoomLevel());\n this.drawGrid(ctx);\n this.drawConnections(ctx);\n\n if (this.draggingConnection()) {\n this.drawDraggingPath(ctx);\n }\n\n ctx.restore();\n }\n\n drawGrid(ctx: CanvasRenderingContext2D) {\n const { width, height } = this.canvasRef.nativeElement;\n const dpr = window.devicePixelRatio || 1;\n const zoom = this.zoomLevel();\n const panX = this.panX();\n const panY = this.panY();\n const gridSize = this.gridSize();\n const gridColor = this.#currentGridColor();\n const scaledGridSize = gridSize * zoom;\n const dynamicGridSize = scaledGridSize < 20 ? gridSize * 4 : gridSize;\n const startX = Math.floor(-panX / zoom / dynamicGridSize) * dynamicGridSize;\n const startY = Math.floor(-panY / zoom / dynamicGridSize) * dynamicGridSize;\n const endX = startX + width / dpr / zoom + dynamicGridSize;\n const endY = startY + height / dpr / zoom + dynamicGridSize;\n\n if (this.asDots()) {\n const dotRadius = 1 / zoom;\n ctx.fillStyle = gridColor;\n for (let x = startX; x < endX; x += dynamicGridSize) {\n for (let y = startY; y < endY; y += dynamicGridSize) {\n ctx.beginPath();\n ctx.arc(x, y, dotRadius, 0, 2 * Math.PI);\n ctx.fill();\n }\n }\n } else {\n ctx.beginPath();\n ctx.strokeStyle = gridColor;\n ctx.lineWidth = 1 / zoom;\n for (let x = startX; x < endX; x += dynamicGridSize) {\n ctx.moveTo(x, startY);\n ctx.lineTo(x, endY);\n }\n for (let y = startY; y < endY; y += dynamicGridSize) {\n ctx.moveTo(startX, y);\n ctx.lineTo(endX, y);\n }\n ctx.stroke();\n }\n }\n\n drawConnections(ctx: CanvasRenderingContext2D) {\n const highlighted = this.highlightedConnection();\n ctx.lineWidth = 2 / this.zoomLevel();\n\n for (const conn of this.#connections()) {\n const isHighlighted =\n highlighted?.fromNode === conn.fromNode &&\n highlighted?.fromPort === conn.fromPort &&\n highlighted?.toNode === conn.toNode &&\n highlighted?.toPort === conn.toPort;\n\n ctx.strokeStyle = isHighlighted ? '#ffc107' : '#888';\n ctx.beginPath();\n\n const startPos = this.getNodePortPosition(conn.fromNode, conn.fromPort);\n const endPos = this.getNodePortPosition(conn.toNode, conn.toPort);\n\n this.drawCurvedPath(ctx, startPos, endPos);\n ctx.stroke();\n }\n }\n\n drawDraggingPath(ctx: CanvasRenderingContext2D) {\n const conn = this.draggingConnection()!;\n const startPos = this.getNodePortPosition(conn.fromNode, conn.fromPort);\n const endPos = [conn.x2, conn.y2] as Coordinates;\n ctx.strokeStyle = '#5a9cf8';\n ctx.lineWidth = 2 / this.zoomLevel();\n ctx.beginPath();\n this.drawCurvedPath(ctx, startPos, endPos);\n ctx.stroke();\n }\n\n drawCurvedPath(ctx: CanvasRenderingContext2D, start: Coordinates, end: Coordinates) {\n const [x1, y1] = start;\n const [x2, y2] = end;\n const dx = Math.abs(x1 - x2) * 0.7;\n ctx.moveTo(x1, y1);\n ctx.bezierCurveTo(x1 + dx, y1, x2 - dx, y2, x2, y2);\n }\n\n startNodeDrag(event: MouseEvent | TouchEvent, nodeId: string) {\n event.stopPropagation();\n event.preventDefault();\n\n this.#isNodeDragging.set(true);\n this.#draggedNodeId.set(nodeId);\n\n const clientX = event instanceof MouseEvent ? event.clientX : event.touches[0].clientX;\n const clientY = event instanceof MouseEvent ? event.clientY : event.touches[0].clientY;\n\n const blueprintRect = this.#selfRef.nativeElement.getBoundingClientRect();\n const worldX = (clientX - blueprintRect.left - this.panX()) / this.zoomLevel();\n const worldY = (clientY - blueprintRect.top - this.panY()) / this.zoomLevel();\n const draggedNode = this.nodes().find((n) => n.id === nodeId);\n\n if (draggedNode) {\n this.#dragOffset.set([worldX - draggedNode.coordinates[0], worldY - draggedNode.coordinates[1]]);\n }\n\n this.#lastMouseX.set(clientX);\n this.#lastMouseY.set(clientY);\n }\n\n endNodeDrag() {\n const draggedId = this.#draggedNodeId();\n const finalCoords = this.#draggingNodeCoordinates();\n\n if (draggedId && finalCoords) {\n this.nodes.update((nodes) => {\n const node = nodes.find((n) => n.id === draggedId);\n if (node) {\n node.coordinates = finalCoords;\n }\n return [...nodes];\n });\n }\n\n this.#isNodeDragging.set(false);\n this.#draggedNodeId.set(null);\n this.#dragOffset.set(null);\n this.#draggingNodeCoordinates.set(null);\n }\n\n nodeDrag(event: MouseEvent | Touch) {\n const draggedId = this.#draggedNodeId();\n if (!this.#isNodeDragging() || !draggedId) return;\n\n const { clientX, clientY } = event;\n const blueprintRect = this.#selfRef.nativeElement.getBoundingClientRect();\n const worldX = (clientX - blueprintRect.left - this.panX()) / this.zoomLevel();\n const worldY = (clientY - blueprintRect.top - this.panY()) / this.zoomLevel();\n\n let newX = worldX - this.#dragOffset()![0];\n let newY = worldY - this.#dragOffset()![1];\n\n if (this.snapToGrid() || (event instanceof MouseEvent && event.shiftKey)) {\n const grid = this.gridSnapSize();\n newX = Math.round(newX / grid) * grid;\n newY = Math.round(newY / grid) * grid;\n }\n\n this.#draggingNodeCoordinates.set([newX, newY]);\n this.#lastMouseX.set(clientX);\n this.#lastMouseY.set(clientY);\n }\n\n startPortDrag(event: MouseEvent, nodeId: string, portId: string) {\n event.preventDefault();\n event.stopPropagation();\n\n if (this.draggingConnection()) this.cancelPortDrag();\n\n const node = this.nodes().find((n) => n.id === nodeId);\n\n if (node) {\n this.draggingConnection.set({\n fromNode: nodeId,\n fromPort: portId,\n x2: node.coordinates[0],\n y2: node.coordinates[1],\n });\n }\n\n this.updatePathOnMove(event);\n }\n\n endPortDrag(_: MouseEvent, toNodeId: string, toPortId: string) {\n if (!this.draggingConnection()) return;\n\n const from = this.draggingConnection()!;\n\n if (from.fromNode === toNodeId) {\n this.cancelPortDrag();\n return;\n }\n\n const newConnection: Connection = {\n fromNode: from.fromNode,\n fromPort: from.fromPort,\n toNode: toNodeId,\n toPort: toPortId,\n };\n\n this.nodes.update((nodes) => {\n const fromNode = nodes.find((n) => n.id === newConnection.fromNode);\n const toNode = nodes.find((n) => n.id === newConnection.toNode);\n\n if (fromNode && toNode) {\n const isDuplicateFrom = fromNode.connections.some(\n (c) =>\n c.fromNode === newConnection.fromNode &&\n c.fromPort === newConnection.fromPort &&\n c.toNode === newConnection.toNode &&\n c.toPort === newConnection.toPort\n );\n\n if (!isDuplicateFrom) {\n fromNode.connections = [...fromNode.connections, newConnection];\n }\n\n const isDuplicateTo = toNode.connections.some(\n (c) =>\n c.fromNode === newConnection.fromNode &&\n c.fromPort === newConnection.fromPort &&\n c.toNode === newConnection.toNode &&\n c.toPort === newConnection.toPort\n );\n\n if (!isDuplicateTo) {\n toNode.connections = [...toNode.connections, newConnection];\n }\n }\n return [...nodes];\n });\n\n this.cancelPortDrag();\n }\n\n cancelPortDrag() {\n this.draggingConnection.set(null);\n }\n\n updatePathOnMove(event: MouseEvent | Touch) {\n if (!this.draggingConnection()) return;\n\n const blueprintRect = this.#selfRef.nativeElement.getBoundingClientRect();\n const x2 = (event.clientX - blueprintRect.left - this.panX()) / this.zoomLevel();\n const y2 = (event.clientY - blueprintRect.top - this.panY()) / this.zoomLevel();\n\n this.draggingConnection.update((conn) => (conn ? { ...conn, x2, y2 } : conn));\n }\n\n getNodePortPosition(nodeId: string, portId: string): Coordinates {\n const node = this.nodes().find((n) => n.id === nodeId);\n\n if (!node) return [0, 0];\n\n const portEl = this.#selfRef.nativeElement.querySelector(`[data-node-id=\"${nodeId}\"][data-port-id=\"${portId}\"]`);\n\n if (portEl) {\n const nodeWrapper = this.#selfRef.nativeElement.querySelector('.nodes-wrapper')!;\n const wrapperRect = nodeWrapper.getBoundingClientRect();\n const portRect = portEl.getBoundingClientRect();\n const portCenterX = portRect.left + portRect.width / 2;\n const portCenterY = portRect.top + portRect.height / 2;\n const worldX = (portCenterX - wrapperRect.left) / this.zoomLevel();\n const worldY = (portCenterY - wrapperRect.top) / this.zoomLevel();\n\n return [worldX, worldY];\n }\n\n const isInput = node.inputs.some((p) => p.id === portId);\n const portIndex = isInput\n ? node.inputs.findIndex((p) => p.id === portId)\n : node.outputs.findIndex((p) => p.id === portId);\n\n if (portIndex === -1) return node.coordinates;\n\n const portYOffset = this.#NODE_HEADER_HEIGHT + portIndex * this.#PORT_ROW_HEIGHT + this.#PORT_ROW_HEIGHT / 2;\n const portXOffset = isInput ? 0 : this.#NODE_WIDTH;\n\n return [node.coordinates[0] + portXOffset, node.coordinates[1] + portYOffset];\n }\n\n startPan(event: MouseEvent) {\n if (this.isLocked()) return;\n if (event.target instanceof HTMLElement && event.target.closest('.node')) return;\n\n event.preventDefault();\n\n this.#isDragging.set(true);\n this.#lastMouseX.set(event.clientX);\n this.#lastMouseY.set(event.clientY);\n }\n\n endPan() {\n this.#isDragging.set(false);\n }\n\n pan(event: MouseEvent) {\n if (!this.#isDragging() || this.isLocked()) return;\n\n const dx = event.clientX - this.#lastMouseX();\n const dy = event.clientY - this.#lastMouseY();\n\n this.panX.update((x) => x + dx);\n this.panY.update((y) => y + dy);\n\n this.#lastMouseX.set(event.clientX);\n this.#lastMouseY.set(event.clientY);\n }\n\n zoom(event: WheelEvent) {\n event.preventDefault();\n const oldZoom = this.zoomLevel();\n const newZoom = this.#clamp(oldZoom * (1 - event.deltaY * this.#ZOOM_SPEED), this.#MIN_ZOOM, this.#MAX_ZOOM);\n\n const panRatio = newZoom / oldZoom;\n const newPanX = event.clientX - (event.clientX - this.panX()) * panRatio;\n const newPanY = event.clientY - (event.clientY - this.panY()) * panRatio;\n\n this.zoomLevel.set(newZoom);\n this.panX.set(newPanX);\n this.panY.set(newPanY);\n }\n\n handleTouchStart(event: TouchEvent) {\n if (event.target instanceof HTMLElement && event.target.closest('.node')) return;\n\n event.preventDefault();\n\n if (event.touches.length === 1) {\n this.#isDragging.set(true);\n this.#lastMouseX.set(event.touches[0].clientX);\n this.#lastMouseY.set(event.touches[0].clientY);\n } else if (event.touches.length === 2) {\n this.#isDragging.set(false);\n this.#initialPinchDistance.set(this.#getDistance(event.touches[0], event.touches[1]));\n }\n }\n\n handleTouchMove(event: TouchEvent) {\n event.preventDefault();\n\n if (event.touches.length === 1 && this.#isDragging()) {\n const dx = event.touches[0].clientX - this.#lastMouseX();\n const dy = event.touches[0].clientY - this.#lastMouseY();\n\n this.panX.update((x) => x + dx);\n this.panY.update((y) => y + dy);\n\n this.#lastMouseX.set(event.touches[0].clientX);\n this.#lastMouseY.set(event.touches[0].clientY);\n } else if (event.touches.length === 2) {\n const newPinchDistance = this.#getDistance(event.touches[0], event.touches[1]);\n const pinchRatio = newPinchDistance / this.#initialPinchDistance();\n const oldZoom = this.zoomLevel();\n const newZoom = this.#clamp(oldZoom * pinchRatio, this.#MIN_ZOOM, this.#MAX_ZOOM);\n\n const pinchCenterX = (event.touches[0].clientX + event.touches[1].clientX) / 2;\n const pinchCenterY = (event.touches[0].clientY + event.touches[1].clientY) / 2;\n\n const panRatio = newZoom / oldZoom;\n const newPanX = pinchCenterX - (pinchCenterX - this.panX()) * panRatio;\n const newPanY = pinchCenterY - (pinchCenterY - this.panY()) * panRatio;\n\n this.zoomLevel.set(newZoom);\n this.panX.set(newPanX);\n this.panY.set(newPanY);\n\n this.#initialPinchDistance.set(newPinchDistance);\n }\n }\n\n handleTouchEnd() {\n this.#isDragging.set(false);\n this.endNodeDrag();\n\n if (this.draggingConnection()) {\n this.cancelPortDrag();\n }\n }\n\n closeMidpointDiv() {\n this.showMidpointDiv.set(false);\n this.midpointDivPosition.set(null);\n this.isLocked.set(false);\n }\n\n getDisplayCoordinates(node: BlueprintNode) {\n const draggedId = this.#draggedNodeId();\n const draggingCoords = this.#draggingNodeCoordinates();\n\n if (draggedId === node.id && draggingCoords) {\n return `translate(${draggingCoords[0]}px, ${draggingCoords[1]}px)`;\n }\n\n return `translate(${node.coordinates[0]}px, ${node.coordinates[1]}px)`;\n }\n\n removeConnection() {\n const conn = this.highlightedConnection();\n\n if (!conn) return;\n\n this.#connections.update((conns) =>\n conns.filter(\n (c) =>\n !(\n c.fromNode === conn.fromNode &&\n c.fromPort === conn.fromPort &&\n c.toNode === conn.toNode &&\n c.toPort === conn.toPort\n )\n )\n );\n\n this.nodes.update((nodes) =>\n nodes.map((n) => ({\n ...n,\n connections: n.connections.filter(\n (c) =>\n !(\n c.fromNode === conn.fromNode &&\n c.fromPort === conn.fromPort &&\n c.toNode === conn.toNode &&\n c.toPort === conn.toPort\n )\n ),\n }))\n );\n this.highlightedConnection.set(null);\n this.closeMidpointDiv();\n }\n\n #removeDuplicatesAndReinitiate() {\n const nodes = this.nodes();\n const uniqueNodesMap = new Map<string, BlueprintNode>();\n const uniqueNodes: BlueprintNode[] = [];\n\n for (const node of nodes) {\n if (!uniqueNodesMap.has(node.id)) {\n uniqueNodesMap.set(node.id, node);\n uniqueNodes.push(node);\n }\n }\n\n const nodesWithUniquePorts = uniqueNodes.map((node) => {\n const uniqueInputs = new Map<string, Port>();\n const uniqueOutputs = new Map<string, Port>();\n\n const uniqueNodeInputs = node.inputs.filter((port) => {\n if (!uniqueInputs.has(port.id)) {\n uniqueInputs.set(port.id, port);\n return true;\n }\n return false;\n });\n\n const uniqueNodeOutputs = node.outputs.filter((port) => {\n if (!uniqueOutputs.has(port.id)) {\n uniqueOutputs.set(port.id, port);\n return true;\n }\n return false;\n });\n\n return {\n ...node,\n inputs: uniqueNodeInputs,\n outputs: uniqueNodeOutputs,\n };\n });\n\n const finalNodes = nodesWithUniquePorts.map((node) => {\n const validConnections = node.connections.filter((conn) => {\n const fromNodeExists = nodesWithUniquePorts.some((n) => n.id === conn.fromNode);\n const toNodeExists = nodesWithUniquePorts.some((n) => n.id === conn.toNode);\n const fromPortExists = nodesWithUniquePorts\n .find((n) => n.id === conn.fromNode)\n ?.outputs.some((p) => p.id === conn.fromPort);\n const toPortExists = nodesWithUniquePorts\n .find((n) => n.id === conn.toNode)\n ?.inputs.some((p) => p.id === conn.toPort);\n\n return fromNodeExists && toNodeExists && fromPortExists && toPortExists;\n });\n return { ...node, connections: validConnections };\n });\n\n this.nodes.set(finalNodes);\n }\n\n #handleConnectionClick(event: MouseEvent) {\n if (this.highlightedConnection()) {\n const conn = this.highlightedConnection()!;\n const startPos = this.getNodePortPosition(conn.fromNode, conn.fromPort);\n const endPos = this.getNodePortPosition(conn.toNode, conn.toPort);\n const midpoint = this.#getBezierMidpoint(startPos, endPos);\n\n this.midpointDivPosition.set({ x: midpoint[0], y: midpoint[1] });\n this.showMidpointDiv.set(true);\n this.isLocked.set(true);\n }\n }\n\n #getBezierMidpoint(start: Coordinates, end: Coordinates): Coordinates {\n const t = 0.5;\n const [x1, y1] = start;\n const [x2, y2] = end;\n const dx = Math.abs(x1 - x2) * 0.7;\n const cp1x = x1 + dx;\n const cp1y = y1;\n const cp2x = x2 - dx;\n const cp2y = y2;\n\n const mx =\n Math.pow(1 - t, 3) * x1 +\n 3 * Math.pow(1 - t, 2) * t * cp1x +\n 3 * (1 - t) * Math.pow(t, 2) * cp2x +\n Math.pow(t, 3) * x2;\n\n const my =\n Math.pow(1 - t, 3) * y1 +\n 3 * Math.pow(1 - t, 2) * t * cp1y +\n 3 * (1 - t) * Math.pow(t, 2) * cp2y +\n Math.pow(t, 3) * y2;\n\n return [mx, my];\n }\n\n #checkConnectionHover(event: MouseEvent) {\n const blueprintRect = this.#selfRef.nativeElement.getBoundingClientRect();\n const worldX = (event.clientX - blueprintRect.left - this.panX()) / this.zoomLevel();\n const worldY = (event.clientY - blueprintRect.top - this.panY()) / this.zoomLevel();\n const cursorPoint: Coordinates = [worldX, worldY];\n\n let hoveredConn: Connection | null = null;\n const tolerance = 10 / this.zoomLevel();\n\n for (const conn of this.#connections()) {\n const startPos = this.getNodePortPosition(conn.fromNode, conn.fromPort);\n const endPos = this.getNodePortPosition(conn.toNode, conn.toPort);\n\n if (this.#isPointNearBezierCurve(cursorPoint, startPos, endPos, tolerance)) {\n hoveredConn = conn;\n break;\n }\n }\n\n this.highlightedConnection.set(hoveredConn);\n }\n\n #isPointNearBezierCurve(point: Coordinates, start: Coordinates, end: Coordinates, tolerance: number = 10): boolean {\n const [x1, y1] = start;\n const [x2, y2] = end;\n const dx = Math.abs(x1 - x2) * 0.7;\n const cp1x = x1 + dx;\n const cp1y = y1;\n const cp2x = x2 - dx;\n const cp2y = y2;\n\n const steps = 20;\n for (let i = 0; i <= steps; i++) {\n const t = i / steps;\n\n const x =\n Math.pow(1 - t, 3) * x1 +\n 3 * Math.pow(1 - t, 2) * t * cp1x +\n 3 * (1 - t) * Math.pow(t, 2) * cp2x +\n Math.pow(t, 3) * x2;\n const y =\n Math.pow(1 - t, 3) * y1 +\n 3 * Math.pow(1 - t, 2) * t * cp1y +\n 3 * (1 - t) * Math.pow(t, 2) * cp2y +\n Math.pow(t, 3) * y2;\n\n const distance = Math.sqrt(Math.pow(point[0] - x, 2) + Math.pow(point[1] - y, 2));\n if (distance < tolerance) {\n return true;\n }\n }\n\n return false;\n }\n\n public getNewNodeCoordinates(panToCoordinates = false): Coordinates {\n let lowestY = 0;\n if (this.nodes().length > 0) {\n lowestY = this.nodes().reduce((max, node) => Math.max(max, node.coordinates[1]), 0);\n }\n\n const newCoordinates: Coordinates = [20, lowestY + 200];\n\n if (panToCoordinates) {\n this.#panToCoordinates(newCoordinates);\n }\n\n return newCoordinates;\n }\n\n #validateNodes() {\n const duplicatePortIds = findDuplicatePortIDs(this.nodes());\n const duplicateNodeIds = findDuplicateNodeIDs(this.nodes());\n\n this.validationErrors.set({\n duplicateNodeIds,\n duplicatePortIds,\n });\n }\n\n #panToCoordinates(coords: Coordinates): void {\n const [x, y] = coords;\n const rect = this.#selfRef.nativeElement.getBoundingClientRect();\n\n this.panX.set(rect.width / 2 - x * this.zoomLevel());\n this.panY.set(rect.height / 2 - y * this.zoomLevel());\n }\n\n #getDistance(touch1: Touch, touch2: Touch) {\n const dx = touch1.clientX - touch2.clientX;\n const dy = touch1.clientY - touch2.clientY;\n\n return Math.sqrt(dx * dx + dy * dy);\n }\n\n #clamp(value: number, min: number, max: number) {\n return Math.max(min, Math.min(max, value));\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ship-ui-core-ship-blueprint.mjs","sources":["../../../projects/ship-ui/ship-blueprint/autolayout.ts","../../../projects/ship-ui/ship-blueprint/validatePorts.ts","../../../projects/ship-ui/ship-blueprint/ship-blueprint.ts","../../../projects/ship-ui/ship-blueprint/ship-ui-core-ship-blueprint.ts"],"sourcesContent":["import { BlueprintNode } from './ship-blueprint';\n\nexport function layoutNodes(nodes: BlueprintNode[]): BlueprintNode[] {\n if (!nodes || nodes.length === 0) return nodes;\n\n const layoutedNodes = structuredClone(nodes);\n const visited = new Set<string>();\n const unconnectedNodes: BlueprintNode[] = [];\n const connectedGraphs: BlueprintNode[][] = [];\n\n const allToNodes = new Set(layoutedNodes.flatMap((node) => node.connections).map((conn) => conn.toNode));\n const rootNodes = layoutedNodes.filter((node) => !allToNodes.has(node.id));\n\n for (const node of layoutedNodes) {\n if (!node.connections.length) {\n unconnectedNodes.push(node);\n }\n }\n\n for (const root of rootNodes) {\n if (!visited.has(root.id)) {\n const graph: BlueprintNode[] = [];\n traverseGraph(root, graph, visited, layoutedNodes);\n if (graph.length > 0) {\n connectedGraphs.push(graph);\n }\n }\n }\n\n positionUnconnectedNodes(unconnectedNodes);\n\n let currentX = 20;\n let currentY = 20;\n connectedGraphs.forEach((graph) => {\n const layoutedGraph = traverseAndLayout(graph);\n positionGraph(layoutedGraph, currentX, currentY);\n currentY += getGraphHeight(layoutedGraph) + 200;\n });\n\n return layoutedNodes;\n}\n\nfunction traverseGraph(\n startNode: BlueprintNode,\n graph: BlueprintNode[],\n visited: Set<string>,\n allNodes: BlueprintNode[]\n) {\n const queue = [startNode];\n visited.add(startNode.id);\n let head = 0;\n while (head < queue.length) {\n const node = queue[head++];\n graph.push(node);\n node.connections.forEach((conn) => {\n const toNode = allNodes.find((n) => n.id === conn.toNode);\n if (toNode && !visited.has(toNode.id)) {\n visited.add(toNode.id);\n queue.push(toNode);\n }\n });\n }\n}\n\nfunction positionUnconnectedNodes(nodes: BlueprintNode[]) {\n nodes.forEach((node, index) => {\n node.coordinates[0] = 20 + index * 200;\n node.coordinates[1] = 20;\n });\n}\n\nfunction traverseAndLayout(graph: BlueprintNode[]): BlueprintNode[] {\n const graphNodeMap = new Map<string, BlueprintNode>(graph.map((n) => [n.id, n]));\n const incomingConnectionCount = new Map<string, number>();\n\n graph.forEach((node) => {\n incomingConnectionCount.set(node.id, 0);\n });\n graph\n .flatMap((n) => n.connections)\n .forEach((conn) => {\n if (graphNodeMap.has(conn.toNode)) {\n incomingConnectionCount.set(conn.toNode, (incomingConnectionCount.get(conn.toNode) || 0) + 1);\n }\n });\n\n const roots = graph.filter((node) => (incomingConnectionCount.get(node.id) || 0) === 0);\n const layoutedNodes = new Set<string>();\n\n const queue = [...roots];\n let head = 0;\n\n while (head < queue.length) {\n const currentNode = queue[head++];\n layoutedNodes.add(currentNode.id);\n\n let outputConnectionIndex = 0;\n const connectedNodes: BlueprintNode[] = [];\n\n currentNode.connections.forEach((conn) => {\n const toNode = graphNodeMap.get(conn.toNode);\n if (toNode && !layoutedNodes.has(toNode.id)) {\n connectedNodes.push(toNode);\n }\n });\n\n connectedNodes.forEach((toNode) => {\n toNode.coordinates[0] = currentNode.coordinates[0] + 200;\n if (connectedNodes.length > 1) {\n const verticalOffset = (outputConnectionIndex - (connectedNodes.length - 1) / 2) * 200;\n toNode.coordinates[1] = currentNode.coordinates[1] + verticalOffset;\n } else {\n toNode.coordinates[1] = currentNode.coordinates[1];\n }\n\n queue.push(toNode);\n outputConnectionIndex++;\n });\n }\n return graph;\n}\n\nfunction positionGraph(graph: BlueprintNode[], startX: number, startY: number) {\n const minX = Math.min(...graph.map((n) => n.coordinates[0]));\n const minY = Math.min(...graph.map((n) => n.coordinates[1]));\n graph.forEach((node) => {\n node.coordinates[0] += startX - minX;\n node.coordinates[1] += startY - minY;\n });\n}\n\nfunction getGraphHeight(graph: BlueprintNode[]): number {\n if (!graph.length) return 0;\n const maxY = Math.max(...graph.map((n) => n.coordinates[1]));\n const minY = Math.min(...graph.map((n) => n.coordinates[1]));\n return maxY - minY;\n}\n","import { BlueprintNode } from './ship-blueprint';\n\nexport type PortValidationError = {\n nodeId: string;\n duplicatePortIds: string[];\n};\n\nexport function findDuplicatePortIDs(nodes: BlueprintNode[]): PortValidationError[] {\n const errors: PortValidationError[] = [];\n\n for (const node of nodes) {\n const portIdCounts = new Map<string, number>();\n const allPorts = [...node.inputs, ...node.outputs];\n\n for (const port of allPorts) {\n const count = portIdCounts.get(port.id) || 0;\n portIdCounts.set(port.id, count + 1);\n }\n\n const duplicatePortIds: string[] = [];\n for (const [id, count] of portIdCounts.entries()) {\n if (count > 1) {\n duplicatePortIds.push(id);\n }\n }\n\n if (duplicatePortIds.length > 0) {\n errors.push({\n nodeId: node.id,\n duplicatePortIds: duplicatePortIds,\n });\n }\n }\n\n return errors;\n}\n\nexport function findDuplicateNodeIDs(nodes: BlueprintNode[]): string[] {\n const nodeIdCounts = new Map<string, number>();\n\n for (const node of nodes) {\n const count = nodeIdCounts.get(node.id) || 0;\n nodeIdCounts.set(node.id, count + 1);\n }\n\n const duplicateNodeIds: string[] = [];\n for (const [id, count] of nodeIdCounts.entries()) {\n if (count > 1) {\n duplicateNodeIds.push(id);\n }\n }\n\n return duplicateNodeIds;\n}\n","import { isPlatformBrowser, JsonPipe } from '@angular/common';\nimport { AfterViewInit, ChangeDetectionStrategy, Component, computed, DOCUMENT, effect, ElementRef, HostListener, inject, input, model, OnDestroy, PLATFORM_ID, signal, viewChild, ViewEncapsulation } from '@angular/core';\nimport { ShipButton } from '@ship-ui/core/ship-button';\nimport { ShipCard } from '@ship-ui/core/ship-card';\nimport { ShipIcon } from '@ship-ui/core/ship-icon';\nimport { ShipA11yKeybindingsService } from '@ship-ui/core/ship-a11y-keybindings';\nimport { classMutationSignal } from '@ship-ui/core';\nimport { layoutNodes } from './autolayout';\nimport { findDuplicateNodeIDs, findDuplicatePortIDs } from './validatePorts';\n\n\n\n\n\ntype Port = { id: string; name: string };\n\nexport type BlueprintNode = {\n id: string;\n name?: string;\n coordinates: Coordinates;\n inputs: Port[];\n outputs: Port[];\n connections: Connection[];\n};\n\ntype Connection = { fromNode: string; fromPort: string; toNode: string; toPort: string };\ntype DragState = { fromNode: string; fromPort: string; x2: number; y2: number };\n\nexport type Coordinates = [x: number, y: number];\n\nexport const TEST_NODES: BlueprintNode[] = [\n {\n id: 'a1',\n name: 'hello a1',\n coordinates: [0, 0],\n inputs: [],\n outputs: [{ id: 'out-1', name: 'Start Output' }],\n connections: [{ fromNode: 'a1', fromPort: 'out-1', toNode: 'b1', toPort: 'in-1' }],\n },\n {\n id: 'b1',\n coordinates: [0, 0],\n inputs: [\n { id: 'in-1', name: 'Input A' },\n { id: 'in-1', name: 'Another Input A' },\n ],\n outputs: [{ id: 'out-1', name: 'Output B' }],\n connections: [\n { fromNode: 'b1', fromPort: 'out-1', toNode: 'c6', toPort: 'in-1' },\n { fromNode: 'a1', fromPort: 'out-1', toNode: 'b1', toPort: 'in-1' },\n ],\n },\n {\n id: 'c6',\n name: 'hello c6',\n coordinates: [0, 0],\n inputs: [{ id: 'in-1', name: 'Input C' }],\n outputs: [{ id: 'out-1', name: 'Output D' }],\n connections: [{ fromNode: 'b1', fromPort: 'out-1', toNode: 'c6', toPort: 'in-1' }],\n },\n];\n\ntype ValidationErrors = {\n duplicateNodeIds: string[];\n duplicatePortIds: {\n nodeId: string;\n duplicatePortIds: string[];\n }[];\n};\n\n@Component({\n selector: 'sh-blueprint',\n styleUrl: './ship-blueprint.scss',\n encapsulation: ViewEncapsulation.None,\n imports: [ShipCard, ShipIcon, JsonPipe, ShipButton],\n template: `\n <div\n class=\"canvas-container\"\n [class.locked]=\"isLocked()\"\n [class.hovering-connection]=\"highlightedConnection()\"\n (mousedown)=\"startPan($event)\"\n (mousemove)=\"pan($event)\"\n (wheel)=\"zoom($event)\"\n (touchstart)=\"handleTouchStart($event)\"\n (touchmove)=\"handleTouchMove($event)\"\n (touchend)=\"handleTouchEnd()\">\n <div class=\"action-panel\">\n <button shButton (click)=\"applyAutolayout()\" class=\"small\">\n Autolayout\n <sh-icon>tree-structure</sh-icon>\n </button>\n\n <ng-content />\n </div>\n\n <canvas #blueprintCanvas></canvas>\n\n @if (validationErrors()) {\n <sh-card class=\"validation-errors type-c\">\n Something went wrong you have\n <br />\n duplicate node IDs or port IDs\n <pre>{{ validationErrors() | json }}</pre>\n </sh-card>\n } @else {\n <div\n class=\"nodes-wrapper\"\n [style.transform]=\"'translate(' + panX() + 'px, ' + panY() + 'px) scale(' + zoomLevel() + ')'\"\n [style.transform-origin]=\"'0 0'\">\n @for (node of visibleNodes(); track node.id) {\n <sh-card\n class=\"node type-c\"\n [style.transform]=\"getDisplayCoordinates(node)\"\n (mouseenter)=\"isHoveringNode.set(true)\"\n (mouseleave)=\"isHoveringNode.set(false)\">\n <header (mousedown)=\"startNodeDrag($event, node.id)\" (touchstart)=\"startNodeDrag($event, node.id)\">\n <span class=\"node-title\">{{ node.name ? node.name : node.id }}</span>\n <sh-icon>list</sh-icon>\n </header>\n <div class=\"ports\">\n <div class=\"inputs\">\n @for (inputPort of node.inputs; track inputPort.id) {\n <div\n class=\"port-wrap\"\n [attr.data-node-id]=\"node.id\"\n [attr.data-port-id]=\"inputPort.id\"\n (click)=\"endPortDrag($event, node.id, inputPort.id)\">\n <div class=\"port input-port\"></div>\n <span class=\"port-name\">{{ inputPort.name }}</span>\n </div>\n }\n </div>\n <div class=\"outputs\">\n @for (outputPort of node.outputs; track outputPort.id) {\n <div\n class=\"port-wrap\"\n [attr.data-node-id]=\"node.id\"\n [attr.data-port-id]=\"outputPort.id\"\n (click)=\"startPortDrag($event, node.id, outputPort.id)\">\n <span class=\"port-name\">{{ outputPort.name }}</span>\n <div class=\"port output-port\"></div>\n </div>\n }\n </div>\n </div>\n </sh-card>\n }\n\n @if (showMidpointDiv()) {\n <div\n class=\"midpoint-div\"\n (click)=\"removeConnection()\"\n [style.left.px]=\"midpointDivPosition()?.x\"\n [style.top.px]=\"midpointDivPosition()?.y\">\n Remove connection\n <sh-icon>trash</sh-icon>\n </div>\n }\n </div>\n }\n </div>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[attr.aria-keyshortcuts]': 'ariaKeyshortcuts()',\n },\n})\nexport class ShipBlueprint implements AfterViewInit, OnDestroy {\n #ZOOM_SPEED = 0.01;\n #MAX_ZOOM = 1.5;\n #MIN_ZOOM = 0.5;\n #NODE_WIDTH = 180;\n #NODE_HEADER_HEIGHT = 40;\n #PORT_ROW_HEIGHT = 28;\n\n #document = inject(DOCUMENT);\n #platformId = inject(PLATFORM_ID);\n #selfRef = inject(ElementRef<HTMLElement>);\n #keybindings = inject(ShipA11yKeybindingsService);\n\n ariaKeyshortcuts = computed(() => {\n const action = 'blueprint.cancel';\n const shortcut = this.#keybindings.getShortcut(action);\n return shortcut ? (this.#keybindings.getDisplayShortcut(action) || shortcut) : null;\n });\n\n #currentClass = classMutationSignal();\n #htmlClass = classMutationSignal(this.#document.documentElement);\n\n asDots = computed(() => this.#currentClass().includes('dots'));\n lightMode = computed(() => this.#htmlClass().includes('light'));\n\n forceUnique = input<boolean>(true);\n autoLayout = input<boolean>(false);\n gridSize = input(20);\n snapToGrid = input<boolean>(true);\n gridColor = input<[string, string]>(['#d8d8d8', '#2c2c2c']);\n\n nodes = model<BlueprintNode[]>([]);\n\n #currentGridColor = computed(() => this.gridColor()[this.lightMode() ? 0 : 1]);\n\n panX = signal(0);\n panY = signal(0);\n zoomLevel = signal(1);\n gridSnapSize = signal(20);\n\n isHoveringNode = signal(false);\n midpointDivPosition = signal<{ x: number; y: number } | null>(null);\n showMidpointDiv = signal(false);\n isLocked = signal(false);\n draggingConnection = signal<DragState | null>(null);\n validationErrors = signal<ValidationErrors | null>(null);\n highlightedConnection = signal<Connection | null>(null);\n\n #draggingNodeCoordinates = signal<Coordinates | null>(null);\n #isDragging = signal(false);\n #lastMouseX = signal(0);\n #lastMouseY = signal(0);\n #initialPinchDistance = signal(0);\n #isNodeDragging = signal(false);\n #draggedNodeId = signal<string | null>(null);\n #dragOffset = signal<Coordinates | null>(null);\n #connections = signal<Connection[]>([]);\n #canvasWidth = signal(0);\n #canvasHeight = signal(0);\n\n canvasRef = viewChild.required<ElementRef<HTMLCanvasElement>>('blueprintCanvas');\n #ctx!: CanvasRenderingContext2D;\n #resizeObserver!: ResizeObserver;\n\n visibleNodes = computed(() => {\n const nodes = this.nodes();\n const panX = this.panX();\n const panY = this.panY();\n const zoom = this.zoomLevel();\n const width = this.#canvasWidth();\n const height = this.#canvasHeight();\n\n if (width === 0 || height === 0) {\n return nodes;\n }\n\n const bufferX = width / zoom;\n const bufferY = height / zoom;\n\n const viewbox = {\n x1: -panX / zoom - bufferX,\n y1: -panY / zoom - bufferY,\n x2: (-panX + width) / zoom + bufferX,\n y2: (-panY + height) / zoom + bufferY,\n };\n\n return nodes.filter((node) => {\n const [x, y] = node.coordinates;\n return x > viewbox.x1 && x < viewbox.x2 && y > viewbox.y1 && y < viewbox.y2;\n });\n });\n\n constructor() {\n if (isPlatformBrowser(this.#platformId)) {\n effect(() => {\n this.asDots();\n this.panX();\n this.panY();\n this.zoomLevel();\n this.nodes();\n this.#connections();\n this.draggingConnection();\n this.#currentGridColor();\n this.highlightedConnection();\n this.#draggingNodeCoordinates();\n\n requestAnimationFrame(() => this.drawCanvas());\n });\n\n effect(() => {\n const nodes = this.nodes();\n const connectionsFromNodes = nodes.flatMap((node) => node.connections);\n const uniqueConnections = connectionsFromNodes.filter(\n (conn, index, self) =>\n index ===\n self.findIndex(\n (c) =>\n c.fromNode === conn.fromNode &&\n c.fromPort === conn.fromPort &&\n c.toNode === conn.toNode &&\n c.toPort === conn.toPort\n )\n );\n\n this.#connections.set(uniqueConnections);\n });\n }\n }\n\n ngAfterViewInit() {\n if (isPlatformBrowser(this.#platformId)) {\n const canvas = this.canvasRef().nativeElement;\n this.#ctx = canvas.getContext('2d')!;\n if (typeof ResizeObserver !== 'undefined') {\n this.#resizeObserver = new ResizeObserver(() => this.updateCanvasSize());\n this.#resizeObserver.observe(this.#selfRef.nativeElement);\n }\n this.updateCanvasSize();\n\n if (this.autoLayout()) {\n this.applyAutolayout();\n }\n\n if (this.forceUnique()) {\n this.#removeDuplicatesAndReinitiate();\n } else {\n this.#validateNodes();\n }\n }\n }\n\n ngOnDestroy() {\n if (this.#resizeObserver) {\n this.#resizeObserver.disconnect();\n }\n }\n\n @HostListener('document:mouseup', ['$event']) onMouseUp(event: MouseEvent) {\n if (this.isLocked()) return;\n\n this.endPan();\n this.endNodeDrag();\n }\n\n @HostListener('document:click', ['$event']) onClick(event: MouseEvent) {\n const target = event.target as HTMLElement;\n\n if (this.draggingConnection()) {\n if (!target.closest('.port')) {\n this.cancelPortDrag();\n }\n } else if (this.isLocked() && !target.closest('.midpoint-div')) {\n this.closeMidpointDiv();\n } else {\n this.#handleConnectionClick(event);\n }\n }\n\n @HostListener('document:keydown', ['$event']) onDocumentKeyDown(event: KeyboardEvent) {\n if (this.#keybindings.matches(event, 'blueprint.cancel')) {\n if (this.draggingConnection()) {\n this.cancelPortDrag();\n } else if (this.isLocked()) {\n this.closeMidpointDiv();\n }\n }\n }\n\n @HostListener('document:mousemove', ['$event']) onMouseMove(event: MouseEvent) {\n if (this.isLocked()) return;\n if (this.#isNodeDragging()) {\n this.nodeDrag(event);\n } else if (this.draggingConnection()) {\n this.updatePathOnMove(event);\n } else {\n this.pan(event);\n if (this.isHoveringNode()) {\n this.highlightedConnection.set(null);\n } else {\n this.#checkConnectionHover(event);\n }\n }\n }\n\n @HostListener('document:touchmove', ['$event']) onTouchMove(event: TouchEvent) {\n event.preventDefault();\n if (this.isLocked()) return;\n if (this.#isNodeDragging()) {\n this.nodeDrag(event.touches[0]);\n } else if (this.draggingConnection()) {\n this.updatePathOnMove(event.touches[0]);\n } else {\n this.handleTouchMove(event);\n }\n }\n\n @HostListener('document:touchend', ['$event']) onDocumentTouchEnd(event: TouchEvent) {\n if (this.isLocked()) return;\n\n this.handleTouchEnd();\n }\n\n applyAutolayout() {\n const newNodes = layoutNodes(this.nodes());\n this.nodes.set(newNodes);\n }\n\n updateCanvasSize() {\n const canvas = this.canvasRef().nativeElement;\n const rect = this.#selfRef.nativeElement.getBoundingClientRect();\n const dpr = window.devicePixelRatio || 1;\n canvas.width = rect.width * dpr;\n canvas.height = rect.height * dpr;\n this.#ctx.scale(dpr, dpr);\n canvas.style.width = `${rect.width}px`;\n canvas.style.height = `${rect.height}px`;\n\n this.#canvasWidth.set(rect.width);\n this.#canvasHeight.set(rect.height);\n\n this.drawCanvas();\n }\n\n drawCanvas() {\n if (!this.#ctx) return;\n\n const ctx = this.#ctx;\n const { width, height } = this.canvasRef().nativeElement;\n const dpr = window.devicePixelRatio || 1;\n ctx.clearRect(0, 0, width / dpr, height / dpr);\n ctx.save();\n ctx.translate(this.panX(), this.panY());\n ctx.scale(this.zoomLevel(), this.zoomLevel());\n this.drawGrid(ctx);\n this.drawConnections(ctx);\n\n if (this.draggingConnection()) {\n this.drawDraggingPath(ctx);\n }\n\n ctx.restore();\n }\n\n drawGrid(ctx: CanvasRenderingContext2D) {\n const { width, height } = this.canvasRef().nativeElement;\n const dpr = window.devicePixelRatio || 1;\n const zoom = this.zoomLevel();\n const panX = this.panX();\n const panY = this.panY();\n const gridSize = this.gridSize();\n const gridColor = this.#currentGridColor();\n const scaledGridSize = gridSize * zoom;\n const dynamicGridSize = scaledGridSize < 20 ? gridSize * 4 : gridSize;\n const startX = Math.floor(-panX / zoom / dynamicGridSize) * dynamicGridSize;\n const startY = Math.floor(-panY / zoom / dynamicGridSize) * dynamicGridSize;\n const endX = startX + width / dpr / zoom + dynamicGridSize;\n const endY = startY + height / dpr / zoom + dynamicGridSize;\n\n if (this.asDots()) {\n const dotRadius = 1 / zoom;\n ctx.fillStyle = gridColor;\n for (let x = startX; x < endX; x += dynamicGridSize) {\n for (let y = startY; y < endY; y += dynamicGridSize) {\n ctx.beginPath();\n ctx.arc(x, y, dotRadius, 0, 2 * Math.PI);\n ctx.fill();\n }\n }\n } else {\n ctx.beginPath();\n ctx.strokeStyle = gridColor;\n ctx.lineWidth = 1 / zoom;\n for (let x = startX; x < endX; x += dynamicGridSize) {\n ctx.moveTo(x, startY);\n ctx.lineTo(x, endY);\n }\n for (let y = startY; y < endY; y += dynamicGridSize) {\n ctx.moveTo(startX, y);\n ctx.lineTo(endX, y);\n }\n ctx.stroke();\n }\n }\n\n drawConnections(ctx: CanvasRenderingContext2D) {\n const highlighted = this.highlightedConnection();\n ctx.lineWidth = 2 / this.zoomLevel();\n\n for (const conn of this.#connections()) {\n const isHighlighted =\n highlighted?.fromNode === conn.fromNode &&\n highlighted?.fromPort === conn.fromPort &&\n highlighted?.toNode === conn.toNode &&\n highlighted?.toPort === conn.toPort;\n\n ctx.strokeStyle = isHighlighted ? '#ffc107' : '#888';\n ctx.beginPath();\n\n const startPos = this.getNodePortPosition(conn.fromNode, conn.fromPort);\n const endPos = this.getNodePortPosition(conn.toNode, conn.toPort);\n\n this.drawCurvedPath(ctx, startPos, endPos);\n ctx.stroke();\n }\n }\n\n drawDraggingPath(ctx: CanvasRenderingContext2D) {\n const conn = this.draggingConnection()!;\n const startPos = this.getNodePortPosition(conn.fromNode, conn.fromPort);\n const endPos = [conn.x2, conn.y2] as Coordinates;\n ctx.strokeStyle = '#5a9cf8';\n ctx.lineWidth = 2 / this.zoomLevel();\n ctx.beginPath();\n this.drawCurvedPath(ctx, startPos, endPos);\n ctx.stroke();\n }\n\n drawCurvedPath(ctx: CanvasRenderingContext2D, start: Coordinates, end: Coordinates) {\n const [x1, y1] = start;\n const [x2, y2] = end;\n const dx = Math.abs(x1 - x2) * 0.7;\n ctx.moveTo(x1, y1);\n ctx.bezierCurveTo(x1 + dx, y1, x2 - dx, y2, x2, y2);\n }\n\n startNodeDrag(event: MouseEvent | TouchEvent, nodeId: string) {\n event.stopPropagation();\n event.preventDefault();\n\n this.#isNodeDragging.set(true);\n this.#draggedNodeId.set(nodeId);\n\n const clientX = event instanceof MouseEvent ? event.clientX : event.touches[0].clientX;\n const clientY = event instanceof MouseEvent ? event.clientY : event.touches[0].clientY;\n\n const blueprintRect = this.#selfRef.nativeElement.getBoundingClientRect();\n const worldX = (clientX - blueprintRect.left - this.panX()) / this.zoomLevel();\n const worldY = (clientY - blueprintRect.top - this.panY()) / this.zoomLevel();\n const draggedNode = this.nodes().find((n) => n.id === nodeId);\n\n if (draggedNode) {\n this.#dragOffset.set([worldX - draggedNode.coordinates[0], worldY - draggedNode.coordinates[1]]);\n }\n\n this.#lastMouseX.set(clientX);\n this.#lastMouseY.set(clientY);\n }\n\n endNodeDrag() {\n const draggedId = this.#draggedNodeId();\n const finalCoords = this.#draggingNodeCoordinates();\n\n if (draggedId && finalCoords) {\n this.nodes.update((nodes) => {\n const node = nodes.find((n) => n.id === draggedId);\n if (node) {\n node.coordinates = finalCoords;\n }\n return [...nodes];\n });\n }\n\n this.#isNodeDragging.set(false);\n this.#draggedNodeId.set(null);\n this.#dragOffset.set(null);\n this.#draggingNodeCoordinates.set(null);\n }\n\n nodeDrag(event: MouseEvent | Touch) {\n const draggedId = this.#draggedNodeId();\n if (!this.#isNodeDragging() || !draggedId) return;\n\n const { clientX, clientY } = event;\n const blueprintRect = this.#selfRef.nativeElement.getBoundingClientRect();\n const worldX = (clientX - blueprintRect.left - this.panX()) / this.zoomLevel();\n const worldY = (clientY - blueprintRect.top - this.panY()) / this.zoomLevel();\n\n let newX = worldX - this.#dragOffset()![0];\n let newY = worldY - this.#dragOffset()![1];\n\n if (this.snapToGrid() || (event instanceof MouseEvent && event.shiftKey)) {\n const grid = this.gridSnapSize();\n newX = Math.round(newX / grid) * grid;\n newY = Math.round(newY / grid) * grid;\n }\n\n this.#draggingNodeCoordinates.set([newX, newY]);\n this.#lastMouseX.set(clientX);\n this.#lastMouseY.set(clientY);\n }\n\n startPortDrag(event: MouseEvent, nodeId: string, portId: string) {\n event.preventDefault();\n event.stopPropagation();\n\n if (this.draggingConnection()) this.cancelPortDrag();\n\n const node = this.nodes().find((n) => n.id === nodeId);\n\n if (node) {\n this.draggingConnection.set({\n fromNode: nodeId,\n fromPort: portId,\n x2: node.coordinates[0],\n y2: node.coordinates[1],\n });\n }\n\n this.updatePathOnMove(event);\n }\n\n endPortDrag(_: MouseEvent, toNodeId: string, toPortId: string) {\n if (!this.draggingConnection()) return;\n\n const from = this.draggingConnection()!;\n\n if (from.fromNode === toNodeId) {\n this.cancelPortDrag();\n return;\n }\n\n const newConnection: Connection = {\n fromNode: from.fromNode,\n fromPort: from.fromPort,\n toNode: toNodeId,\n toPort: toPortId,\n };\n\n this.nodes.update((nodes) => {\n const fromNode = nodes.find((n) => n.id === newConnection.fromNode);\n const toNode = nodes.find((n) => n.id === newConnection.toNode);\n\n if (fromNode && toNode) {\n const isDuplicateFrom = fromNode.connections.some(\n (c) =>\n c.fromNode === newConnection.fromNode &&\n c.fromPort === newConnection.fromPort &&\n c.toNode === newConnection.toNode &&\n c.toPort === newConnection.toPort\n );\n\n if (!isDuplicateFrom) {\n fromNode.connections = [...fromNode.connections, newConnection];\n }\n\n const isDuplicateTo = toNode.connections.some(\n (c) =>\n c.fromNode === newConnection.fromNode &&\n c.fromPort === newConnection.fromPort &&\n c.toNode === newConnection.toNode &&\n c.toPort === newConnection.toPort\n );\n\n if (!isDuplicateTo) {\n toNode.connections = [...toNode.connections, newConnection];\n }\n }\n return [...nodes];\n });\n\n this.cancelPortDrag();\n }\n\n cancelPortDrag() {\n this.draggingConnection.set(null);\n }\n\n updatePathOnMove(event: MouseEvent | Touch) {\n if (!this.draggingConnection()) return;\n\n const blueprintRect = this.#selfRef.nativeElement.getBoundingClientRect();\n const x2 = (event.clientX - blueprintRect.left - this.panX()) / this.zoomLevel();\n const y2 = (event.clientY - blueprintRect.top - this.panY()) / this.zoomLevel();\n\n this.draggingConnection.update((conn) => (conn ? { ...conn, x2, y2 } : conn));\n }\n\n getNodePortPosition(nodeId: string, portId: string): Coordinates {\n const node = this.nodes().find((n) => n.id === nodeId);\n\n if (!node) return [0, 0];\n\n const portEl = this.#selfRef.nativeElement.querySelector(`[data-node-id=\"${nodeId}\"][data-port-id=\"${portId}\"]`);\n\n if (portEl) {\n const nodeWrapper = this.#selfRef.nativeElement.querySelector('.nodes-wrapper')!;\n const wrapperRect = nodeWrapper.getBoundingClientRect();\n const portRect = portEl.getBoundingClientRect();\n const portCenterX = portRect.left + portRect.width / 2;\n const portCenterY = portRect.top + portRect.height / 2;\n const worldX = (portCenterX - wrapperRect.left) / this.zoomLevel();\n const worldY = (portCenterY - wrapperRect.top) / this.zoomLevel();\n\n return [worldX, worldY];\n }\n\n const isInput = node.inputs.some((p) => p.id === portId);\n const portIndex = isInput\n ? node.inputs.findIndex((p) => p.id === portId)\n : node.outputs.findIndex((p) => p.id === portId);\n\n if (portIndex === -1) return node.coordinates;\n\n const portYOffset = this.#NODE_HEADER_HEIGHT + portIndex * this.#PORT_ROW_HEIGHT + this.#PORT_ROW_HEIGHT / 2;\n const portXOffset = isInput ? 0 : this.#NODE_WIDTH;\n\n return [node.coordinates[0] + portXOffset, node.coordinates[1] + portYOffset];\n }\n\n startPan(event: MouseEvent) {\n if (this.isLocked()) return;\n if (event.target instanceof HTMLElement && event.target.closest('.node')) return;\n\n event.preventDefault();\n\n this.#isDragging.set(true);\n this.#lastMouseX.set(event.clientX);\n this.#lastMouseY.set(event.clientY);\n }\n\n endPan() {\n this.#isDragging.set(false);\n }\n\n pan(event: MouseEvent) {\n if (!this.#isDragging() || this.isLocked()) return;\n\n const dx = event.clientX - this.#lastMouseX();\n const dy = event.clientY - this.#lastMouseY();\n\n this.panX.update((x) => x + dx);\n this.panY.update((y) => y + dy);\n\n this.#lastMouseX.set(event.clientX);\n this.#lastMouseY.set(event.clientY);\n }\n\n zoom(event: WheelEvent) {\n event.preventDefault();\n const oldZoom = this.zoomLevel();\n const newZoom = this.#clamp(oldZoom * (1 - event.deltaY * this.#ZOOM_SPEED), this.#MIN_ZOOM, this.#MAX_ZOOM);\n\n const panRatio = newZoom / oldZoom;\n const newPanX = event.clientX - (event.clientX - this.panX()) * panRatio;\n const newPanY = event.clientY - (event.clientY - this.panY()) * panRatio;\n\n this.zoomLevel.set(newZoom);\n this.panX.set(newPanX);\n this.panY.set(newPanY);\n }\n\n handleTouchStart(event: TouchEvent) {\n if (event.target instanceof HTMLElement && event.target.closest('.node')) return;\n\n event.preventDefault();\n\n if (event.touches.length === 1) {\n this.#isDragging.set(true);\n this.#lastMouseX.set(event.touches[0].clientX);\n this.#lastMouseY.set(event.touches[0].clientY);\n } else if (event.touches.length === 2) {\n this.#isDragging.set(false);\n this.#initialPinchDistance.set(this.#getDistance(event.touches[0], event.touches[1]));\n }\n }\n\n handleTouchMove(event: TouchEvent) {\n event.preventDefault();\n\n if (event.touches.length === 1 && this.#isDragging()) {\n const dx = event.touches[0].clientX - this.#lastMouseX();\n const dy = event.touches[0].clientY - this.#lastMouseY();\n\n this.panX.update((x) => x + dx);\n this.panY.update((y) => y + dy);\n\n this.#lastMouseX.set(event.touches[0].clientX);\n this.#lastMouseY.set(event.touches[0].clientY);\n } else if (event.touches.length === 2) {\n const newPinchDistance = this.#getDistance(event.touches[0], event.touches[1]);\n const pinchRatio = newPinchDistance / this.#initialPinchDistance();\n const oldZoom = this.zoomLevel();\n const newZoom = this.#clamp(oldZoom * pinchRatio, this.#MIN_ZOOM, this.#MAX_ZOOM);\n\n const pinchCenterX = (event.touches[0].clientX + event.touches[1].clientX) / 2;\n const pinchCenterY = (event.touches[0].clientY + event.touches[1].clientY) / 2;\n\n const panRatio = newZoom / oldZoom;\n const newPanX = pinchCenterX - (pinchCenterX - this.panX()) * panRatio;\n const newPanY = pinchCenterY - (pinchCenterY - this.panY()) * panRatio;\n\n this.zoomLevel.set(newZoom);\n this.panX.set(newPanX);\n this.panY.set(newPanY);\n\n this.#initialPinchDistance.set(newPinchDistance);\n }\n }\n\n handleTouchEnd() {\n this.#isDragging.set(false);\n this.endNodeDrag();\n\n if (this.draggingConnection()) {\n this.cancelPortDrag();\n }\n }\n\n closeMidpointDiv() {\n this.showMidpointDiv.set(false);\n this.midpointDivPosition.set(null);\n this.isLocked.set(false);\n }\n\n getDisplayCoordinates(node: BlueprintNode) {\n const draggedId = this.#draggedNodeId();\n const draggingCoords = this.#draggingNodeCoordinates();\n\n if (draggedId === node.id && draggingCoords) {\n return `translate(${draggingCoords[0]}px, ${draggingCoords[1]}px)`;\n }\n\n return `translate(${node.coordinates[0]}px, ${node.coordinates[1]}px)`;\n }\n\n removeConnection() {\n const conn = this.highlightedConnection();\n\n if (!conn) return;\n\n this.#connections.update((conns) =>\n conns.filter(\n (c) =>\n !(\n c.fromNode === conn.fromNode &&\n c.fromPort === conn.fromPort &&\n c.toNode === conn.toNode &&\n c.toPort === conn.toPort\n )\n )\n );\n\n this.nodes.update((nodes) =>\n nodes.map((n) => ({\n ...n,\n connections: n.connections.filter(\n (c) =>\n !(\n c.fromNode === conn.fromNode &&\n c.fromPort === conn.fromPort &&\n c.toNode === conn.toNode &&\n c.toPort === conn.toPort\n )\n ),\n }))\n );\n this.highlightedConnection.set(null);\n this.closeMidpointDiv();\n }\n\n #removeDuplicatesAndReinitiate() {\n const nodes = this.nodes();\n const uniqueNodesMap = new Map<string, BlueprintNode>();\n const uniqueNodes: BlueprintNode[] = [];\n\n for (const node of nodes) {\n if (!uniqueNodesMap.has(node.id)) {\n uniqueNodesMap.set(node.id, node);\n uniqueNodes.push(node);\n }\n }\n\n const nodesWithUniquePorts = uniqueNodes.map((node) => {\n const uniqueInputs = new Map<string, Port>();\n const uniqueOutputs = new Map<string, Port>();\n\n const uniqueNodeInputs = node.inputs.filter((port) => {\n if (!uniqueInputs.has(port.id)) {\n uniqueInputs.set(port.id, port);\n return true;\n }\n return false;\n });\n\n const uniqueNodeOutputs = node.outputs.filter((port) => {\n if (!uniqueOutputs.has(port.id)) {\n uniqueOutputs.set(port.id, port);\n return true;\n }\n return false;\n });\n\n return {\n ...node,\n inputs: uniqueNodeInputs,\n outputs: uniqueNodeOutputs,\n };\n });\n\n const finalNodes = nodesWithUniquePorts.map((node) => {\n const validConnections = node.connections.filter((conn) => {\n const fromNodeExists = nodesWithUniquePorts.some((n) => n.id === conn.fromNode);\n const toNodeExists = nodesWithUniquePorts.some((n) => n.id === conn.toNode);\n const fromPortExists = nodesWithUniquePorts\n .find((n) => n.id === conn.fromNode)\n ?.outputs.some((p) => p.id === conn.fromPort);\n const toPortExists = nodesWithUniquePorts\n .find((n) => n.id === conn.toNode)\n ?.inputs.some((p) => p.id === conn.toPort);\n\n return fromNodeExists && toNodeExists && fromPortExists && toPortExists;\n });\n return { ...node, connections: validConnections };\n });\n\n this.nodes.set(finalNodes);\n }\n\n #handleConnectionClick(event: MouseEvent) {\n if (this.highlightedConnection()) {\n const conn = this.highlightedConnection()!;\n const startPos = this.getNodePortPosition(conn.fromNode, conn.fromPort);\n const endPos = this.getNodePortPosition(conn.toNode, conn.toPort);\n const midpoint = this.#getBezierMidpoint(startPos, endPos);\n\n this.midpointDivPosition.set({ x: midpoint[0], y: midpoint[1] });\n this.showMidpointDiv.set(true);\n this.isLocked.set(true);\n }\n }\n\n #getBezierMidpoint(start: Coordinates, end: Coordinates): Coordinates {\n const t = 0.5;\n const [x1, y1] = start;\n const [x2, y2] = end;\n const dx = Math.abs(x1 - x2) * 0.7;\n const cp1x = x1 + dx;\n const cp1y = y1;\n const cp2x = x2 - dx;\n const cp2y = y2;\n\n const mx =\n Math.pow(1 - t, 3) * x1 +\n 3 * Math.pow(1 - t, 2) * t * cp1x +\n 3 * (1 - t) * Math.pow(t, 2) * cp2x +\n Math.pow(t, 3) * x2;\n\n const my =\n Math.pow(1 - t, 3) * y1 +\n 3 * Math.pow(1 - t, 2) * t * cp1y +\n 3 * (1 - t) * Math.pow(t, 2) * cp2y +\n Math.pow(t, 3) * y2;\n\n return [mx, my];\n }\n\n #checkConnectionHover(event: MouseEvent) {\n const blueprintRect = this.#selfRef.nativeElement.getBoundingClientRect();\n const worldX = (event.clientX - blueprintRect.left - this.panX()) / this.zoomLevel();\n const worldY = (event.clientY - blueprintRect.top - this.panY()) / this.zoomLevel();\n const cursorPoint: Coordinates = [worldX, worldY];\n\n let hoveredConn: Connection | null = null;\n const tolerance = 10 / this.zoomLevel();\n\n for (const conn of this.#connections()) {\n const startPos = this.getNodePortPosition(conn.fromNode, conn.fromPort);\n const endPos = this.getNodePortPosition(conn.toNode, conn.toPort);\n\n if (this.#isPointNearBezierCurve(cursorPoint, startPos, endPos, tolerance)) {\n hoveredConn = conn;\n break;\n }\n }\n\n this.highlightedConnection.set(hoveredConn);\n }\n\n #isPointNearBezierCurve(point: Coordinates, start: Coordinates, end: Coordinates, tolerance: number = 10): boolean {\n const [x1, y1] = start;\n const [x2, y2] = end;\n const dx = Math.abs(x1 - x2) * 0.7;\n const cp1x = x1 + dx;\n const cp1y = y1;\n const cp2x = x2 - dx;\n const cp2y = y2;\n\n const steps = 20;\n for (let i = 0; i <= steps; i++) {\n const t = i / steps;\n\n const x =\n Math.pow(1 - t, 3) * x1 +\n 3 * Math.pow(1 - t, 2) * t * cp1x +\n 3 * (1 - t) * Math.pow(t, 2) * cp2x +\n Math.pow(t, 3) * x2;\n const y =\n Math.pow(1 - t, 3) * y1 +\n 3 * Math.pow(1 - t, 2) * t * cp1y +\n 3 * (1 - t) * Math.pow(t, 2) * cp2y +\n Math.pow(t, 3) * y2;\n\n const distance = Math.sqrt(Math.pow(point[0] - x, 2) + Math.pow(point[1] - y, 2));\n if (distance < tolerance) {\n return true;\n }\n }\n\n return false;\n }\n\n getNewNodeCoordinates(panToCoordinates = false): Coordinates {\n let lowestY = 0;\n if (this.nodes().length > 0) {\n lowestY = this.nodes().reduce((max, node) => Math.max(max, node.coordinates[1]), 0);\n }\n\n const newCoordinates: Coordinates = [20, lowestY + 200];\n\n if (panToCoordinates) {\n this.#panToCoordinates(newCoordinates);\n }\n\n return newCoordinates;\n }\n\n #validateNodes() {\n const duplicatePortIds = findDuplicatePortIDs(this.nodes());\n const duplicateNodeIds = findDuplicateNodeIDs(this.nodes());\n\n this.validationErrors.set({\n duplicateNodeIds,\n duplicatePortIds,\n });\n }\n\n #panToCoordinates(coords: Coordinates): void {\n const [x, y] = coords;\n const rect = this.#selfRef.nativeElement.getBoundingClientRect();\n\n this.panX.set(rect.width / 2 - x * this.zoomLevel());\n this.panY.set(rect.height / 2 - y * this.zoomLevel());\n }\n\n #getDistance(touch1: Touch, touch2: Touch) {\n const dx = touch1.clientX - touch2.clientX;\n const dy = touch1.clientY - touch2.clientY;\n\n return Math.sqrt(dx * dx + dy * dy);\n }\n\n #clamp(value: number, min: number, max: number) {\n return Math.max(min, Math.min(max, value));\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -6,7 +6,7 @@ import { contentProjectionSignal, classMutationSignal, shipComponentClasses } fr
6
6
 
7
7
  class ShipCheckbox {
8
8
  constructor() {
9
- this._elementRef = inject(ElementRef);
9
+ this.#elementRef = inject(ElementRef);
10
10
  this.#keybindings = inject(ShipA11yKeybindingsService);
11
11
  this.internalInput = viewChild('internalInput', /* @ts-ignore */
12
12
  ...(ngDevMode ? [{ debugName: "internalInput" }] : /* istanbul ignore next */ []));
@@ -33,6 +33,7 @@ class ShipCheckbox {
33
33
  readonly: this.readonly,
34
34
  });
35
35
  }
36
+ #elementRef;
36
37
  #keybindings;
37
38
  onInternalInputChange(event) {
38
39
  if (this.disabled())
@@ -47,7 +48,7 @@ class ShipCheckbox {
47
48
  inputEl.click();
48
49
  }
49
50
  else {
50
- this._elementRef.nativeElement.click();
51
+ this.#elementRef.nativeElement.click();
51
52
  }
52
53
  event.preventDefault();
53
54
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ship-ui-core-ship-checkbox.mjs","sources":["../../../projects/ship-ui/ship-checkbox/ship-checkbox.ts","../../../projects/ship-ui/ship-checkbox/ship-ui-core-ship-checkbox.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, ElementRef, HostListener, inject, input, model, viewChild, ViewEncapsulation } from '@angular/core';\nimport { ShipIcon } from '@ship-ui/core/ship-icon';\nimport { ShipA11yKeybindingsService } from '@ship-ui/core/ship-a11y-keybindings';\nimport { classMutationSignal } from '@ship-ui/core';\nimport { contentProjectionSignal } from '@ship-ui/core';\nimport { shipComponentClasses } from '@ship-ui/core';\nimport { ShipColor, ShipSheetVariant } from '@ship-ui/core';\n\n@Component({\n selector: 'sh-checkbox',\n styleUrl: './ship-checkbox.scss',\n encapsulation: ViewEncapsulation.None,\n imports: [ShipIcon],\n template: `\n <div class=\"box sh-sheet\" [class]=\"currentClassList()\">\n <sh-icon class=\"inherit default-indicator\">check-bold</sh-icon>\n <sh-icon class=\"inherit indeterminate-indicator\">minus-bold</sh-icon>\n </div>\n\n <div class=\"label\">\n <ng-content />\n </div>\n\n @if (projectedInputs().length === 0 && !noInternalInput()) {\n <input\n #internalInput\n type=\"checkbox\"\n class=\"internal-input\"\n [attr.disabled]=\"disabled() ? '' : null\"\n [checked]=\"checked()\"\n (change)=\"onInternalInputChange($event)\" />\n }\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'hostClasses()',\n '[attr.disabled]': 'disabled() ? \"\" : null',\n '[attr.role]': 'noInternalInput() ? \"checkbox\" : null',\n '[attr.aria-checked]': 'noInternalInput() ? checked() : null',\n '[attr.tabindex]': 'noInternalInput() ? (disabled() ? \"-1\" : \"0\") : null',\n },\n})\nexport class ShipCheckbox {\n private readonly _elementRef = inject(ElementRef);\n #keybindings = inject(ShipA11yKeybindingsService);\n\n internalInput = viewChild<ElementRef<HTMLInputElement>>('internalInput');\n projectedInputs = contentProjectionSignal<HTMLInputElement>('input:not(.internal-input)', {\n childList: true,\n attributes: true,\n });\n\n checked = model<boolean>(false);\n currentClassList = classMutationSignal();\n color = input<ShipColor | null>(null);\n variant = input<ShipSheetVariant | null>(null);\n readonly = input<boolean>(false);\n disabled = input<boolean>(false);\n noInternalInput = input<boolean>(false);\n\n protected onInternalInputChange(event: Event) {\n if (this.disabled()) return;\n\n const input = event.target as HTMLInputElement;\n this.checked.set(input.checked);\n }\n\n hostClasses = shipComponentClasses('checkbox', {\n color: this.color,\n variant: this.variant,\n readonly: this.readonly,\n });\n\n @HostListener('keydown', ['$event'])\n protected onKeyDown(event: KeyboardEvent) {\n if (this.#keybindings.matches(event, 'checkbox.toggle')) {\n const inputEl = this.internalInput()?.nativeElement;\n if (inputEl && getComputedStyle(inputEl).display !== 'none') {\n inputEl.click();\n } else {\n this._elementRef.nativeElement.click();\n }\n event.preventDefault();\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ship-ui-core-ship-checkbox.mjs","sources":["../../../projects/ship-ui/ship-checkbox/ship-checkbox.ts","../../../projects/ship-ui/ship-checkbox/ship-ui-core-ship-checkbox.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, ElementRef, HostListener, inject, input, model, viewChild, ViewEncapsulation } from '@angular/core';\nimport { ShipIcon } from '@ship-ui/core/ship-icon';\nimport { ShipA11yKeybindingsService } from '@ship-ui/core/ship-a11y-keybindings';\nimport { classMutationSignal } from '@ship-ui/core';\nimport { contentProjectionSignal } from '@ship-ui/core';\nimport { shipComponentClasses } from '@ship-ui/core';\nimport { ShipColor, ShipSheetVariant } from '@ship-ui/core';\n\n@Component({\n selector: 'sh-checkbox',\n styleUrl: './ship-checkbox.scss',\n encapsulation: ViewEncapsulation.None,\n imports: [ShipIcon],\n template: `\n <div class=\"box sh-sheet\" [class]=\"currentClassList()\">\n <sh-icon class=\"inherit default-indicator\">check-bold</sh-icon>\n <sh-icon class=\"inherit indeterminate-indicator\">minus-bold</sh-icon>\n </div>\n\n <div class=\"label\">\n <ng-content />\n </div>\n\n @if (projectedInputs().length === 0 && !noInternalInput()) {\n <input\n #internalInput\n type=\"checkbox\"\n class=\"internal-input\"\n [attr.disabled]=\"disabled() ? '' : null\"\n [checked]=\"checked()\"\n (change)=\"onInternalInputChange($event)\" />\n }\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'hostClasses()',\n '[attr.disabled]': 'disabled() ? \"\" : null',\n '[attr.role]': 'noInternalInput() ? \"checkbox\" : null',\n '[attr.aria-checked]': 'noInternalInput() ? checked() : null',\n '[attr.tabindex]': 'noInternalInput() ? (disabled() ? \"-1\" : \"0\") : null',\n },\n})\nexport class ShipCheckbox {\n #elementRef = inject(ElementRef);\n #keybindings = inject(ShipA11yKeybindingsService);\n\n internalInput = viewChild<ElementRef<HTMLInputElement>>('internalInput');\n projectedInputs = contentProjectionSignal<HTMLInputElement>('input:not(.internal-input)', {\n childList: true,\n attributes: true,\n });\n\n checked = model<boolean>(false);\n currentClassList = classMutationSignal();\n color = input<ShipColor | null>(null);\n variant = input<ShipSheetVariant | null>(null);\n readonly = input<boolean>(false);\n disabled = input<boolean>(false);\n noInternalInput = input<boolean>(false);\n\n onInternalInputChange(event: Event) {\n if (this.disabled()) return;\n\n const input = event.target as HTMLInputElement;\n this.checked.set(input.checked);\n }\n\n hostClasses = shipComponentClasses('checkbox', {\n color: this.color,\n variant: this.variant,\n readonly: this.readonly,\n });\n\n @HostListener('keydown', ['$event'])\n onKeyDown(event: KeyboardEvent) {\n if (this.#keybindings.matches(event, 'checkbox.toggle')) {\n const inputEl = this.internalInput()?.nativeElement;\n if (inputEl && getComputedStyle(inputEl).display !== 'none') {\n inputEl.click();\n } else {\n this.#elementRef.nativeElement.click();\n }\n event.preventDefault();\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}