@krainovsd/graph 0.13.0-beta1 → 0.14.0-beta.1

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 (72) hide show
  1. package/lib/cjs/index.cjs +984 -497
  2. package/lib/cjs/index.cjs.map +1 -1
  3. package/lib/esm/constants/force-controls.js +4 -2
  4. package/lib/esm/constants/force-controls.js.map +1 -1
  5. package/lib/esm/constants/highlight-controls.js +9 -16
  6. package/lib/esm/constants/highlight-controls.js.map +1 -1
  7. package/lib/esm/constants/link-controls.js +17 -30
  8. package/lib/esm/constants/link-controls.js.map +1 -1
  9. package/lib/esm/constants/node-controls.js +4 -2
  10. package/lib/esm/constants/node-controls.js.map +1 -1
  11. package/lib/esm/index.js +8 -7
  12. package/lib/esm/index.js.map +1 -1
  13. package/lib/esm/module/GraphCanvas/GraphCanvas.js +222 -34
  14. package/lib/esm/module/GraphCanvas/GraphCanvas.js.map +1 -1
  15. package/lib/esm/module/GraphCanvas/constants/force-settings.js +11 -1
  16. package/lib/esm/module/GraphCanvas/constants/force-settings.js.map +1 -1
  17. package/lib/esm/module/GraphCanvas/constants/graph-settings.js +17 -5
  18. package/lib/esm/module/GraphCanvas/constants/graph-settings.js.map +1 -1
  19. package/lib/esm/module/GraphCanvas/constants/highlight-settings.js +5 -3
  20. package/lib/esm/module/GraphCanvas/constants/highlight-settings.js.map +1 -1
  21. package/lib/esm/module/GraphCanvas/constants/index.js +5 -2
  22. package/lib/esm/module/GraphCanvas/constants/index.js.map +1 -1
  23. package/lib/esm/module/GraphCanvas/constants/link-settings.js +19 -9
  24. package/lib/esm/module/GraphCanvas/constants/link-settings.js.map +1 -1
  25. package/lib/esm/module/GraphCanvas/constants/node-settings.js +13 -3
  26. package/lib/esm/module/GraphCanvas/constants/node-settings.js.map +1 -1
  27. package/lib/esm/module/GraphCanvas/lib/settings/force-settings-getter.js +4 -2
  28. package/lib/esm/module/GraphCanvas/lib/settings/force-settings-getter.js.map +1 -1
  29. package/lib/esm/module/GraphCanvas/lib/settings/graph-settings-getter.js +4 -0
  30. package/lib/esm/module/GraphCanvas/lib/settings/graph-settings-getter.js.map +1 -1
  31. package/lib/esm/module/GraphCanvas/lib/settings/highlight-settings-getter.js +4 -2
  32. package/lib/esm/module/GraphCanvas/lib/settings/highlight-settings-getter.js.map +1 -1
  33. package/lib/esm/module/GraphCanvas/lib/settings/link-settings-getter.js +8 -5
  34. package/lib/esm/module/GraphCanvas/lib/settings/link-settings-getter.js.map +1 -1
  35. package/lib/esm/module/GraphCanvas/lib/settings/node-settings-getter.js +14 -2
  36. package/lib/esm/module/GraphCanvas/lib/settings/node-settings-getter.js.map +1 -1
  37. package/lib/esm/module/GraphCanvas/lib/utils/calculate-curve-link-position-by-node.js +45 -0
  38. package/lib/esm/module/GraphCanvas/lib/utils/calculate-curve-link-position-by-node.js.map +1 -0
  39. package/lib/esm/module/GraphCanvas/lib/utils/calculate-link-position-by-node.js +42 -37
  40. package/lib/esm/module/GraphCanvas/lib/utils/calculate-link-position-by-node.js.map +1 -1
  41. package/lib/esm/module/GraphCanvas/lib/utils/compute-graph-bounds.js +26 -0
  42. package/lib/esm/module/GraphCanvas/lib/utils/compute-graph-bounds.js.map +1 -0
  43. package/lib/esm/module/GraphCanvas/lib/utils/get-particle-position.js +40 -30
  44. package/lib/esm/module/GraphCanvas/lib/utils/get-particle-position.js.map +1 -1
  45. package/lib/esm/module/GraphCanvas/lib/utils/is-empty-object.js +11 -0
  46. package/lib/esm/module/GraphCanvas/lib/utils/is-empty-object.js.map +1 -0
  47. package/lib/esm/module/GraphCanvas/lib/utils/is-node-visible.js +5 -2
  48. package/lib/esm/module/GraphCanvas/lib/utils/is-node-visible.js.map +1 -1
  49. package/lib/esm/module/GraphCanvas/lib/utils/link-by-pointer-getter.js +72 -22
  50. package/lib/esm/module/GraphCanvas/lib/utils/link-by-pointer-getter.js.map +1 -1
  51. package/lib/esm/module/GraphCanvas/slices/draw-links.js +115 -77
  52. package/lib/esm/module/GraphCanvas/slices/draw-links.js.map +1 -1
  53. package/lib/esm/module/GraphCanvas/slices/draw-nodes.js +9 -4
  54. package/lib/esm/module/GraphCanvas/slices/draw-nodes.js.map +1 -1
  55. package/lib/esm/module/GraphCanvas/slices/init-dnd.js +21 -4
  56. package/lib/esm/module/GraphCanvas/slices/init-dnd.js.map +1 -1
  57. package/lib/esm/module/GraphCanvas/slices/init-draw.js +1 -52
  58. package/lib/esm/module/GraphCanvas/slices/init-draw.js.map +1 -1
  59. package/lib/esm/module/GraphCanvas/slices/init-pointer.js +12 -34
  60. package/lib/esm/module/GraphCanvas/slices/init-pointer.js.map +1 -1
  61. package/lib/esm/module/GraphCanvas/slices/init-resize.js +7 -0
  62. package/lib/esm/module/GraphCanvas/slices/init-resize.js.map +1 -1
  63. package/lib/esm/module/GraphCanvas/slices/init-simulation.js +12 -2
  64. package/lib/esm/module/GraphCanvas/slices/init-simulation.js.map +1 -1
  65. package/lib/esm/module/GraphCanvas/slices/init-zoom.js +85 -16
  66. package/lib/esm/module/GraphCanvas/slices/init-zoom.js.map +1 -1
  67. package/lib/esm/module/GraphCanvas/slices/update-link-cache.js +63 -3
  68. package/lib/esm/module/GraphCanvas/slices/update-link-cache.js.map +1 -1
  69. package/lib/esm/module/GraphCanvas/slices/update-node-cache.js +61 -16
  70. package/lib/esm/module/GraphCanvas/slices/update-node-cache.js.map +1 -1
  71. package/lib/index.d.ts +90 -36
  72. package/package.json +3 -2
@@ -1,30 +1,40 @@
1
1
  const LINK_SETTINGS = {
2
+ smartCache: true,
2
3
  prettyDraw: true,
4
+ curve: true,
3
5
  linkScaleSwitch: 1,
4
- linkColorAfterScaleSwitch: "#000000FF",
6
+ linkColorAfterScaleSwitch: "#C5C5C5FF",
5
7
  linkColorBeforeScaleSwitch: "#999",
6
8
  linkWidthAfterScaleSwitch: 0.1,
7
9
  linkWidthBeforeScaleSwitch: 1,
8
10
  arrow: true,
9
11
  arrowByHighlight: true,
10
12
  particles: true,
11
- particleFlexSpeed: true,
12
- particleFlexSpeedCoefficient: 4,
13
+ // spawn one more particle for N px
14
+ particleCountByDistance: 25,
15
+ // speed for 1px
16
+ particleSpeedByDistance: 50,
13
17
  };
14
18
  const LINK_OPTIONS = {
15
19
  alpha: 1,
16
20
  arrowAlpha: 1,
17
21
  arrowSize: 2,
18
- arrowBorderColor: "#000000FF",
22
+ arrowBorderColor: "#C5C5C5FF",
19
23
  arrowBorderWidth: 0.1,
20
24
  particleAlpha: 1,
21
- particleColor: "#000000FF",
22
- particleBorderColor: "#000000FF",
25
+ particleColor: "#C5C5C5FF",
26
+ particleBorderColor: "#C5C5C5FF",
23
27
  particleBorderWidth: 0.1,
24
- particleCount: 2,
25
28
  particleRadius: 0.5,
26
- particleSteps: 60,
29
+ };
30
+ const PERFORMANCE_LINK_SETTINGS = {
31
+ ...LINK_SETTINGS,
32
+ particles: false,
33
+ prettyDraw: false,
34
+ };
35
+ const PERFORMANCE_LINK_OPTIONS = {
36
+ ...LINK_OPTIONS,
27
37
  };
28
38
 
29
- export { LINK_OPTIONS, LINK_SETTINGS };
39
+ export { LINK_OPTIONS, LINK_SETTINGS, PERFORMANCE_LINK_OPTIONS, PERFORMANCE_LINK_SETTINGS };
30
40
  //# sourceMappingURL=link-settings.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"link-settings.js","sources":["../../../../../src/module/GraphCanvas/constants/link-settings.ts"],"sourcesContent":["import type { LinkOptionsInterface, LinkSettingsInterface } from \"../types/link-settings\";\n\nexport const LINK_SETTINGS: Omit<\n Required<LinkSettingsInterface<Record<string, unknown>, Record<string, unknown>>>,\n \"options\"\n> = {\n prettyDraw: true,\n linkScaleSwitch: 1,\n linkColorAfterScaleSwitch: \"#000000FF\",\n linkColorBeforeScaleSwitch: \"#999\",\n linkWidthAfterScaleSwitch: 0.1,\n linkWidthBeforeScaleSwitch: 1,\n arrow: true,\n arrowByHighlight: true,\n particles: true,\n particleFlexSpeed: true,\n particleFlexSpeedCoefficient: 4,\n};\n\nexport const LINK_OPTIONS: Omit<\n Required<LinkOptionsInterface<Record<string, unknown>, Record<string, unknown>>>,\n \"color\" | \"width\" | \"drawLink\" | \"drawExtraLink\" | \"arrowColor\"\n> = {\n alpha: 1,\n arrowAlpha: 1,\n arrowSize: 2,\n arrowBorderColor: \"#000000FF\",\n arrowBorderWidth: 0.1,\n particleAlpha: 1,\n particleColor: \"#000000FF\",\n particleBorderColor: \"#000000FF\",\n particleBorderWidth: 0.1,\n particleCount: 2,\n particleRadius: 0.5,\n particleSteps: 60,\n};\n"],"names":[],"mappings":"AAEa,MAAA,aAAa,GAGtB;AACF,IAAA,UAAU,EAAE,IAAI;AAChB,IAAA,eAAe,EAAE,CAAC;AAClB,IAAA,yBAAyB,EAAE,WAAW;AACtC,IAAA,0BAA0B,EAAE,MAAM;AAClC,IAAA,yBAAyB,EAAE,GAAG;AAC9B,IAAA,0BAA0B,EAAE,CAAC;AAC7B,IAAA,KAAK,EAAE,IAAI;AACX,IAAA,gBAAgB,EAAE,IAAI;AACtB,IAAA,SAAS,EAAE,IAAI;AACf,IAAA,iBAAiB,EAAE,IAAI;AACvB,IAAA,4BAA4B,EAAE,CAAC;;AAGpB,MAAA,YAAY,GAGrB;AACF,IAAA,KAAK,EAAE,CAAC;AACR,IAAA,UAAU,EAAE,CAAC;AACb,IAAA,SAAS,EAAE,CAAC;AACZ,IAAA,gBAAgB,EAAE,WAAW;AAC7B,IAAA,gBAAgB,EAAE,GAAG;AACrB,IAAA,aAAa,EAAE,CAAC;AAChB,IAAA,aAAa,EAAE,WAAW;AAC1B,IAAA,mBAAmB,EAAE,WAAW;AAChC,IAAA,mBAAmB,EAAE,GAAG;AACxB,IAAA,aAAa,EAAE,CAAC;AAChB,IAAA,cAAc,EAAE,GAAG;AACnB,IAAA,aAAa,EAAE,EAAE;;;;;"}
1
+ {"version":3,"file":"link-settings.js","sources":["../../../../../src/module/GraphCanvas/constants/link-settings.ts"],"sourcesContent":["import type { LinkOptionsInterface, LinkSettingsInterface } from \"../types/link-settings\";\n\nexport const LINK_SETTINGS: Omit<\n Required<LinkSettingsInterface<Record<string, unknown>, Record<string, unknown>>>,\n \"options\"\n> = {\n smartCache: true,\n prettyDraw: true,\n curve: true,\n linkScaleSwitch: 1,\n linkColorAfterScaleSwitch: \"#C5C5C5FF\",\n linkColorBeforeScaleSwitch: \"#999\",\n linkWidthAfterScaleSwitch: 0.1,\n linkWidthBeforeScaleSwitch: 1,\n arrow: true,\n arrowByHighlight: true,\n particles: true,\n // spawn one more particle for N px\n particleCountByDistance: 25,\n // speed for 1px\n particleSpeedByDistance: 50,\n};\n\nexport const LINK_OPTIONS: Omit<\n Required<LinkOptionsInterface<Record<string, unknown>, Record<string, unknown>>>,\n \"color\" | \"width\" | \"drawLink\" | \"drawExtraLink\" | \"arrowColor\"\n> = {\n alpha: 1,\n arrowAlpha: 1,\n arrowSize: 2,\n arrowBorderColor: \"#C5C5C5FF\",\n arrowBorderWidth: 0.1,\n particleAlpha: 1,\n particleColor: \"#C5C5C5FF\",\n particleBorderColor: \"#C5C5C5FF\",\n particleBorderWidth: 0.1,\n particleRadius: 0.5,\n};\n\nexport const PERFORMANCE_LINK_SETTINGS: Omit<\n Required<LinkSettingsInterface<Record<string, unknown>, Record<string, unknown>>>,\n \"options\"\n> = {\n ...LINK_SETTINGS,\n particles: false,\n prettyDraw: false,\n};\n\nexport const PERFORMANCE_LINK_OPTIONS: Omit<\n Required<LinkOptionsInterface<Record<string, unknown>, Record<string, unknown>>>,\n \"color\" | \"width\" | \"drawLink\" | \"drawExtraLink\" | \"arrowColor\"\n> = {\n ...LINK_OPTIONS,\n};\n"],"names":[],"mappings":"AAEa,MAAA,aAAa,GAGtB;AACF,IAAA,UAAU,EAAE,IAAI;AAChB,IAAA,UAAU,EAAE,IAAI;AAChB,IAAA,KAAK,EAAE,IAAI;AACX,IAAA,eAAe,EAAE,CAAC;AAClB,IAAA,yBAAyB,EAAE,WAAW;AACtC,IAAA,0BAA0B,EAAE,MAAM;AAClC,IAAA,yBAAyB,EAAE,GAAG;AAC9B,IAAA,0BAA0B,EAAE,CAAC;AAC7B,IAAA,KAAK,EAAE,IAAI;AACX,IAAA,gBAAgB,EAAE,IAAI;AACtB,IAAA,SAAS,EAAE,IAAI;;AAEf,IAAA,uBAAuB,EAAE,EAAE;;AAE3B,IAAA,uBAAuB,EAAE,EAAE;;AAGhB,MAAA,YAAY,GAGrB;AACF,IAAA,KAAK,EAAE,CAAC;AACR,IAAA,UAAU,EAAE,CAAC;AACb,IAAA,SAAS,EAAE,CAAC;AACZ,IAAA,gBAAgB,EAAE,WAAW;AAC7B,IAAA,gBAAgB,EAAE,GAAG;AACrB,IAAA,aAAa,EAAE,CAAC;AAChB,IAAA,aAAa,EAAE,WAAW;AAC1B,IAAA,mBAAmB,EAAE,WAAW;AAChC,IAAA,mBAAmB,EAAE,GAAG;AACxB,IAAA,cAAc,EAAE,GAAG;;AAGR,MAAA,yBAAyB,GAGlC;AACF,IAAA,GAAG,aAAa;AAChB,IAAA,SAAS,EAAE,KAAK;AAChB,IAAA,UAAU,EAAE,KAAK;;AAGN,MAAA,wBAAwB,GAGjC;AACF,IAAA,GAAG,YAAY;;;;;"}
@@ -1,4 +1,6 @@
1
1
  const NODE_SETTINGS = {
2
+ smartCache: true,
3
+ textScaleSteps: [],
2
4
  nodeRadiusFlexible: true,
3
5
  nodeRadiusLinkCountForStep: 5,
4
6
  nodeRadiusIncrementByStep: 1,
@@ -35,14 +37,14 @@ const NODE_OPTIONS = {
35
37
  textShiftX: 0,
36
38
  textFont: "Arial",
37
39
  textAlign: "center",
38
- textColor: "#333",
40
+ textColor: "#d2d2d2",
39
41
  textStyle: "normal",
40
42
  textWeight: 500,
41
43
  textGap: 0,
42
44
  label: null,
43
45
  labelAlpha: 1,
44
46
  labelAlign: "center",
45
- labelColor: "#333",
47
+ labelColor: "#ffffff",
46
48
  labelFont: "Arial",
47
49
  labelGap: 0,
48
50
  labelSize: 3.5,
@@ -50,6 +52,14 @@ const NODE_OPTIONS = {
50
52
  labelWeight: 500,
51
53
  labelWidth: 20,
52
54
  };
55
+ const PERFORMANCE_NODE_SETTINGS = {
56
+ ...NODE_SETTINGS,
57
+ nodeRadiusFlexible: false,
58
+ nodeSizeFlexible: false,
59
+ };
60
+ const PERFOMANCE_NODE_OPTIONS = {
61
+ ...NODE_OPTIONS,
62
+ };
53
63
 
54
- export { NODE_OPTIONS, NODE_SETTINGS };
64
+ export { NODE_OPTIONS, NODE_SETTINGS, PERFOMANCE_NODE_OPTIONS, PERFORMANCE_NODE_SETTINGS };
55
65
  //# sourceMappingURL=node-settings.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"node-settings.js","sources":["../../../../../src/module/GraphCanvas/constants/node-settings.ts"],"sourcesContent":["import type { NodeOptionsInterface, NodeSettingsInterface } from \"../types/node-settings\";\n\nexport const NODE_SETTINGS: Omit<\n Required<NodeSettingsInterface<Record<string, unknown>, Record<string, unknown>>>,\n \"options\" | \"idGetter\"\n> = {\n nodeRadiusFlexible: true,\n nodeRadiusLinkCountForStep: 5,\n nodeRadiusIncrementByStep: 1,\n nodeRadiusMaxLinearSteps: 5,\n nodeRadiusLinkCountDividerForLog: 25,\n nodeRadiusLogFactor: 2.5,\n nodeSizeFlexible: true,\n nodeSizeLinkCountForStep: 5,\n nodeSizeIncrementByStep: 0.1,\n nodeSizeMaxLinearSteps: 5,\n nodeSizeLinkCountDividerForLog: 25,\n nodeSizeLogFactor: 2.5,\n textScaleMin: 1.5,\n textScaleMax: 18,\n textSizeMin: 3.5,\n textSizeMax: 1.5,\n textShiftYMin: 4,\n textShiftYMax: 2.5,\n textNodeDebug: false,\n};\n\nexport const NODE_OPTIONS: Omit<\n Required<NodeOptionsInterface<Record<string, unknown>, Record<string, unknown>>>,\n | \"color\"\n | \"text\"\n | \"textVisible\"\n | \"textSize\"\n | \"textShiftY\"\n | \"nodeDraw\"\n | \"nodeExtraDraw\"\n | \"textDraw\"\n | \"textExtraDraw\"\n> = {\n shape: \"circle\",\n height: 10,\n width: 15,\n borderRadius: 0,\n radius: 4,\n alpha: 1,\n labelXPadding: 1,\n labelYPadding: 1,\n borderWidth: 0.1,\n borderColor: \"#000000FF\",\n textAlpha: 1,\n textWidth: 20,\n textShiftX: 0,\n textFont: \"Arial\",\n textAlign: \"center\" as CanvasTextAlign,\n textColor: \"#333\",\n textStyle: \"normal\",\n textWeight: 500,\n textGap: 0,\n label: null,\n labelAlpha: 1,\n labelAlign: \"center\",\n labelColor: \"#333\",\n labelFont: \"Arial\",\n labelGap: 0,\n labelSize: 3.5,\n labelStyle: \"normal\",\n labelWeight: 500,\n labelWidth: 20,\n};\n"],"names":[],"mappings":"AAEa,MAAA,aAAa,GAGtB;AACF,IAAA,kBAAkB,EAAE,IAAI;AACxB,IAAA,0BAA0B,EAAE,CAAC;AAC7B,IAAA,yBAAyB,EAAE,CAAC;AAC5B,IAAA,wBAAwB,EAAE,CAAC;AAC3B,IAAA,gCAAgC,EAAE,EAAE;AACpC,IAAA,mBAAmB,EAAE,GAAG;AACxB,IAAA,gBAAgB,EAAE,IAAI;AACtB,IAAA,wBAAwB,EAAE,CAAC;AAC3B,IAAA,uBAAuB,EAAE,GAAG;AAC5B,IAAA,sBAAsB,EAAE,CAAC;AACzB,IAAA,8BAA8B,EAAE,EAAE;AAClC,IAAA,iBAAiB,EAAE,GAAG;AACtB,IAAA,YAAY,EAAE,GAAG;AACjB,IAAA,YAAY,EAAE,EAAE;AAChB,IAAA,WAAW,EAAE,GAAG;AAChB,IAAA,WAAW,EAAE,GAAG;AAChB,IAAA,aAAa,EAAE,CAAC;AAChB,IAAA,aAAa,EAAE,GAAG;AAClB,IAAA,aAAa,EAAE,KAAK;;AAGT,MAAA,YAAY,GAWrB;AACF,IAAA,KAAK,EAAE,QAAQ;AACf,IAAA,MAAM,EAAE,EAAE;AACV,IAAA,KAAK,EAAE,EAAE;AACT,IAAA,YAAY,EAAE,CAAC;AACf,IAAA,MAAM,EAAE,CAAC;AACT,IAAA,KAAK,EAAE,CAAC;AACR,IAAA,aAAa,EAAE,CAAC;AAChB,IAAA,aAAa,EAAE,CAAC;AAChB,IAAA,WAAW,EAAE,GAAG;AAChB,IAAA,WAAW,EAAE,WAAW;AACxB,IAAA,SAAS,EAAE,CAAC;AACZ,IAAA,SAAS,EAAE,EAAE;AACb,IAAA,UAAU,EAAE,CAAC;AACb,IAAA,QAAQ,EAAE,OAAO;AACjB,IAAA,SAAS,EAAE,QAA2B;AACtC,IAAA,SAAS,EAAE,MAAM;AACjB,IAAA,SAAS,EAAE,QAAQ;AACnB,IAAA,UAAU,EAAE,GAAG;AACf,IAAA,OAAO,EAAE,CAAC;AACV,IAAA,KAAK,EAAE,IAAI;AACX,IAAA,UAAU,EAAE,CAAC;AACb,IAAA,UAAU,EAAE,QAAQ;AACpB,IAAA,UAAU,EAAE,MAAM;AAClB,IAAA,SAAS,EAAE,OAAO;AAClB,IAAA,QAAQ,EAAE,CAAC;AACX,IAAA,SAAS,EAAE,GAAG;AACd,IAAA,UAAU,EAAE,QAAQ;AACpB,IAAA,WAAW,EAAE,GAAG;AAChB,IAAA,UAAU,EAAE,EAAE;;;;;"}
1
+ {"version":3,"file":"node-settings.js","sources":["../../../../../src/module/GraphCanvas/constants/node-settings.ts"],"sourcesContent":["import type { NodeOptionsInterface, NodeSettingsInterface } from \"../types/node-settings\";\n\nexport const NODE_SETTINGS: Omit<\n Required<NodeSettingsInterface<Record<string, unknown>, Record<string, unknown>>>,\n \"options\" | \"idGetter\"\n> = {\n smartCache: true,\n textScaleSteps: [],\n nodeRadiusFlexible: true,\n nodeRadiusLinkCountForStep: 5,\n nodeRadiusIncrementByStep: 1,\n nodeRadiusMaxLinearSteps: 5,\n nodeRadiusLinkCountDividerForLog: 25,\n nodeRadiusLogFactor: 2.5,\n nodeSizeFlexible: true,\n nodeSizeLinkCountForStep: 5,\n nodeSizeIncrementByStep: 0.1,\n nodeSizeMaxLinearSteps: 5,\n nodeSizeLinkCountDividerForLog: 25,\n nodeSizeLogFactor: 2.5,\n textScaleMin: 1.5,\n textScaleMax: 18,\n textSizeMin: 3.5,\n textSizeMax: 1.5,\n textShiftYMin: 4,\n textShiftYMax: 2.5,\n textNodeDebug: false,\n};\n\nexport const NODE_OPTIONS: Omit<\n Required<NodeOptionsInterface<Record<string, unknown>, Record<string, unknown>>>,\n | \"color\"\n | \"text\"\n | \"textVisible\"\n | \"textSize\"\n | \"textShiftY\"\n | \"nodeDraw\"\n | \"nodeExtraDraw\"\n | \"textDraw\"\n | \"textExtraDraw\"\n> = {\n shape: \"circle\",\n height: 10,\n width: 15,\n borderRadius: 0,\n radius: 4,\n alpha: 1,\n labelXPadding: 1,\n labelYPadding: 1,\n borderWidth: 0.1,\n borderColor: \"#000000FF\",\n textAlpha: 1,\n textWidth: 20,\n textShiftX: 0,\n textFont: \"Arial\",\n textAlign: \"center\" as CanvasTextAlign,\n textColor: \"#d2d2d2\",\n textStyle: \"normal\",\n textWeight: 500,\n textGap: 0,\n label: null,\n labelAlpha: 1,\n labelAlign: \"center\",\n labelColor: \"#ffffff\",\n labelFont: \"Arial\",\n labelGap: 0,\n labelSize: 3.5,\n labelStyle: \"normal\",\n labelWeight: 500,\n labelWidth: 20,\n};\n\nexport const PERFORMANCE_NODE_SETTINGS: Omit<\n Required<NodeSettingsInterface<Record<string, unknown>, Record<string, unknown>>>,\n \"options\" | \"idGetter\"\n> = {\n ...NODE_SETTINGS,\n nodeRadiusFlexible: false,\n nodeSizeFlexible: false,\n};\n\nexport const PERFOMANCE_NODE_OPTIONS: Omit<\n Required<NodeOptionsInterface<Record<string, unknown>, Record<string, unknown>>>,\n | \"color\"\n | \"text\"\n | \"textVisible\"\n | \"textSize\"\n | \"textShiftY\"\n | \"nodeDraw\"\n | \"nodeExtraDraw\"\n | \"textDraw\"\n | \"textExtraDraw\"\n> = {\n ...NODE_OPTIONS,\n};\n"],"names":[],"mappings":"AAEa,MAAA,aAAa,GAGtB;AACF,IAAA,UAAU,EAAE,IAAI;AAChB,IAAA,cAAc,EAAE,EAAE;AAClB,IAAA,kBAAkB,EAAE,IAAI;AACxB,IAAA,0BAA0B,EAAE,CAAC;AAC7B,IAAA,yBAAyB,EAAE,CAAC;AAC5B,IAAA,wBAAwB,EAAE,CAAC;AAC3B,IAAA,gCAAgC,EAAE,EAAE;AACpC,IAAA,mBAAmB,EAAE,GAAG;AACxB,IAAA,gBAAgB,EAAE,IAAI;AACtB,IAAA,wBAAwB,EAAE,CAAC;AAC3B,IAAA,uBAAuB,EAAE,GAAG;AAC5B,IAAA,sBAAsB,EAAE,CAAC;AACzB,IAAA,8BAA8B,EAAE,EAAE;AAClC,IAAA,iBAAiB,EAAE,GAAG;AACtB,IAAA,YAAY,EAAE,GAAG;AACjB,IAAA,YAAY,EAAE,EAAE;AAChB,IAAA,WAAW,EAAE,GAAG;AAChB,IAAA,WAAW,EAAE,GAAG;AAChB,IAAA,aAAa,EAAE,CAAC;AAChB,IAAA,aAAa,EAAE,GAAG;AAClB,IAAA,aAAa,EAAE,KAAK;;AAGT,MAAA,YAAY,GAWrB;AACF,IAAA,KAAK,EAAE,QAAQ;AACf,IAAA,MAAM,EAAE,EAAE;AACV,IAAA,KAAK,EAAE,EAAE;AACT,IAAA,YAAY,EAAE,CAAC;AACf,IAAA,MAAM,EAAE,CAAC;AACT,IAAA,KAAK,EAAE,CAAC;AACR,IAAA,aAAa,EAAE,CAAC;AAChB,IAAA,aAAa,EAAE,CAAC;AAChB,IAAA,WAAW,EAAE,GAAG;AAChB,IAAA,WAAW,EAAE,WAAW;AACxB,IAAA,SAAS,EAAE,CAAC;AACZ,IAAA,SAAS,EAAE,EAAE;AACb,IAAA,UAAU,EAAE,CAAC;AACb,IAAA,QAAQ,EAAE,OAAO;AACjB,IAAA,SAAS,EAAE,QAA2B;AACtC,IAAA,SAAS,EAAE,SAAS;AACpB,IAAA,SAAS,EAAE,QAAQ;AACnB,IAAA,UAAU,EAAE,GAAG;AACf,IAAA,OAAO,EAAE,CAAC;AACV,IAAA,KAAK,EAAE,IAAI;AACX,IAAA,UAAU,EAAE,CAAC;AACb,IAAA,UAAU,EAAE,QAAQ;AACpB,IAAA,UAAU,EAAE,SAAS;AACrB,IAAA,SAAS,EAAE,OAAO;AAClB,IAAA,QAAQ,EAAE,CAAC;AACX,IAAA,SAAS,EAAE,GAAG;AACd,IAAA,UAAU,EAAE,QAAQ;AACpB,IAAA,WAAW,EAAE,GAAG;AAChB,IAAA,UAAU,EAAE,EAAE;;AAGH,MAAA,yBAAyB,GAGlC;AACF,IAAA,GAAG,aAAa;AAChB,IAAA,kBAAkB,EAAE,KAAK;AACzB,IAAA,gBAAgB,EAAE,KAAK;;AAGZ,MAAA,uBAAuB,GAWhC;AACF,IAAA,GAAG,YAAY;;;;;"}
@@ -1,6 +1,8 @@
1
1
  import { FORCE_SETTINGS } from '../../constants/force-settings.js';
2
- import '@krainovsd/js-helpers';
3
- import 'd3-array';
2
+ import '../../constants/graph-settings.js';
3
+ import '../../constants/highlight-settings.js';
4
+ import '../../constants/link-settings.js';
5
+ import '../../constants/node-settings.js';
4
6
 
5
7
  function forceSettingsGetter(settings, prevSettings) {
6
8
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"force-settings-getter.js","sources":["../../../../../../src/module/GraphCanvas/lib/settings/force-settings-getter.ts"],"sourcesContent":["import { FORCE_SETTINGS } from \"../../constants\";\nimport type { ForceSettingsInterface } from \"../../types\";\n\nexport function forceSettingsGetter<\n NodeData extends Record<string, unknown>,\n LinkData extends Record<string, unknown>,\n>(\n settings: ForceSettingsInterface<NodeData, LinkData> | undefined,\n prevSettings?: Required<ForceSettingsInterface<NodeData, LinkData>>,\n): Required<ForceSettingsInterface<NodeData, LinkData>> {\n return {\n ...(prevSettings ?? (FORCE_SETTINGS as Required<ForceSettingsInterface<NodeData, LinkData>>)),\n ...settings,\n };\n}\n"],"names":[],"mappings":";;;;AAGgB,SAAA,mBAAmB,CAIjC,QAAgE,EAChE,YAAmE,EAAA;IAEnE,OAAO;AACL,QAAA,IAAI,YAAY,IAAK,cAAuE,CAAC;AAC7F,QAAA,GAAG,QAAQ;KACZ;AACH;;;;"}
1
+ {"version":3,"file":"force-settings-getter.js","sources":["../../../../../../src/module/GraphCanvas/lib/settings/force-settings-getter.ts"],"sourcesContent":["import { FORCE_SETTINGS } from \"../../constants\";\nimport type { ForceSettingsInterface } from \"../../types\";\n\nexport function forceSettingsGetter<\n NodeData extends Record<string, unknown>,\n LinkData extends Record<string, unknown>,\n>(\n settings: ForceSettingsInterface<NodeData, LinkData> | undefined,\n prevSettings?: Required<ForceSettingsInterface<NodeData, LinkData>>,\n): Required<ForceSettingsInterface<NodeData, LinkData>> {\n return {\n ...(prevSettings ?? (FORCE_SETTINGS as Required<ForceSettingsInterface<NodeData, LinkData>>)),\n ...settings,\n };\n}\n"],"names":[],"mappings":";;;;;;AAGgB,SAAA,mBAAmB,CAIjC,QAAgE,EAChE,YAAmE,EAAA;IAEnE,OAAO;AACL,QAAA,IAAI,YAAY,IAAK,cAAuE,CAAC;AAC7F,QAAA,GAAG,QAAQ;KACZ;AACH;;;;"}
@@ -1,4 +1,8 @@
1
+ import '../../constants/force-settings.js';
1
2
  import { GRAPH_SETTINGS } from '../../constants/graph-settings.js';
3
+ import '../../constants/highlight-settings.js';
4
+ import '../../constants/link-settings.js';
5
+ import '../../constants/node-settings.js';
2
6
 
3
7
  function graphSettingsGetter(settings, prevSettings) {
4
8
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"graph-settings-getter.js","sources":["../../../../../../src/module/GraphCanvas/lib/settings/graph-settings-getter.ts"],"sourcesContent":["import { GRAPH_SETTINGS } from \"../../constants\";\nimport type { GraphSettingsInterface } from \"../../types/graph-settings\";\n\nexport function graphSettingsGetter<NodeData extends Record<string, unknown>>(\n settings: GraphSettingsInterface<NodeData> | undefined,\n prevSettings?: Required<GraphSettingsInterface<NodeData>>,\n): Required<GraphSettingsInterface<NodeData>> {\n return {\n ...(prevSettings ?? GRAPH_SETTINGS),\n ...settings,\n };\n}\n"],"names":[],"mappings":";;AAGgB,SAAA,mBAAmB,CACjC,QAAsD,EACtD,YAAyD,EAAA;IAEzD,OAAO;AACL,QAAA,IAAI,YAAY,IAAI,cAAc,CAAC;AACnC,QAAA,GAAG,QAAQ;KACZ;AACH;;;;"}
1
+ {"version":3,"file":"graph-settings-getter.js","sources":["../../../../../../src/module/GraphCanvas/lib/settings/graph-settings-getter.ts"],"sourcesContent":["import { GRAPH_SETTINGS } from \"../../constants\";\nimport type { GraphSettingsInterface } from \"../../types/graph-settings\";\n\nexport function graphSettingsGetter<NodeData extends Record<string, unknown>>(\n settings: GraphSettingsInterface<NodeData> | undefined,\n prevSettings?: Required<GraphSettingsInterface<NodeData>>,\n): Required<GraphSettingsInterface<NodeData>> {\n return {\n ...(prevSettings ?? GRAPH_SETTINGS),\n ...settings,\n };\n}\n"],"names":[],"mappings":";;;;;;AAGgB,SAAA,mBAAmB,CACjC,QAAsD,EACtD,YAAyD,EAAA;IAEzD,OAAO;AACL,QAAA,IAAI,YAAY,IAAI,cAAc,CAAC;AACnC,QAAA,GAAG,QAAQ;KACZ;AACH;;;;"}
@@ -1,6 +1,8 @@
1
- import '@krainovsd/js-helpers';
2
- import 'd3-array';
1
+ import '../../constants/force-settings.js';
2
+ import '../../constants/graph-settings.js';
3
3
  import { HIGHLIGHT_SETTINGS } from '../../constants/highlight-settings.js';
4
+ import '../../constants/link-settings.js';
5
+ import '../../constants/node-settings.js';
4
6
 
5
7
  function highlightSettingsGetter(settings, prevSettings) {
6
8
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"highlight-settings-getter.js","sources":["../../../../../../src/module/GraphCanvas/lib/settings/highlight-settings-getter.ts"],"sourcesContent":["import { HIGHLIGHT_SETTINGS } from \"../../constants\";\nimport type { HighlightSettingsInterface } from \"../../types\";\n\nexport function highlightSettingsGetter(\n settings: HighlightSettingsInterface | undefined,\n prevSettings?: Required<HighlightSettingsInterface>,\n): Required<HighlightSettingsInterface> {\n return {\n ...(prevSettings ?? HIGHLIGHT_SETTINGS),\n ...settings,\n };\n}\n"],"names":[],"mappings":";;;;AAGgB,SAAA,uBAAuB,CACrC,QAAgD,EAChD,YAAmD,EAAA;IAEnD,OAAO;AACL,QAAA,IAAI,YAAY,IAAI,kBAAkB,CAAC;AACvC,QAAA,GAAG,QAAQ;KACZ;AACH;;;;"}
1
+ {"version":3,"file":"highlight-settings-getter.js","sources":["../../../../../../src/module/GraphCanvas/lib/settings/highlight-settings-getter.ts"],"sourcesContent":["import { HIGHLIGHT_SETTINGS } from \"../../constants\";\nimport type { HighlightSettingsInterface } from \"../../types\";\n\nexport function highlightSettingsGetter(\n settings: HighlightSettingsInterface | undefined,\n prevSettings?: Required<HighlightSettingsInterface>,\n): Required<HighlightSettingsInterface> {\n return {\n ...(prevSettings ?? HIGHLIGHT_SETTINGS),\n ...settings,\n };\n}\n"],"names":[],"mappings":";;;;;;AAGgB,SAAA,uBAAuB,CACrC,QAAgD,EAChD,YAAmD,EAAA;IAEnD,OAAO;AACL,QAAA,IAAI,YAAY,IAAI,kBAAkB,CAAC;AACvC,QAAA,GAAG,QAAQ;KACZ;AACH;;;;"}
@@ -1,22 +1,25 @@
1
- import '@krainovsd/js-helpers';
2
- import 'd3-array';
1
+ import '../../constants/force-settings.js';
2
+ import '../../constants/graph-settings.js';
3
+ import '../../constants/highlight-settings.js';
3
4
  import { LINK_SETTINGS, LINK_OPTIONS } from '../../constants/link-settings.js';
5
+ import '../../constants/node-settings.js';
4
6
 
5
7
  function linkSettingsGetter(settings, prevSettings) {
6
8
  return { ...(prevSettings ?? LINK_SETTINGS), ...settings };
7
9
  }
8
10
  function linkOptionsGetter() {
11
+ const aboveScale = this.areaTransform && this.areaTransform.k > this.linkSettings.linkScaleSwitch;
9
12
  return {
10
13
  ...LINK_OPTIONS,
11
14
  drawExtraLink: null,
12
15
  drawLink: null,
13
- color: this.areaTransform && this.areaTransform.k > this.linkSettings.linkScaleSwitch
16
+ color: aboveScale
14
17
  ? this.linkSettings.linkColorAfterScaleSwitch
15
18
  : this.linkSettings.linkColorBeforeScaleSwitch,
16
- arrowColor: this.areaTransform && this.areaTransform.k > this.linkSettings.linkScaleSwitch
19
+ arrowColor: aboveScale
17
20
  ? this.linkSettings.linkColorAfterScaleSwitch
18
21
  : this.linkSettings.linkColorBeforeScaleSwitch,
19
- width: this.areaTransform && this.areaTransform.k > this.linkSettings.linkScaleSwitch
22
+ width: aboveScale
20
23
  ? this.linkSettings.linkWidthAfterScaleSwitch
21
24
  : this.linkSettings.linkWidthBeforeScaleSwitch,
22
25
  };
@@ -1 +1 @@
1
- {"version":3,"file":"link-settings-getter.js","sources":["../../../../../../src/module/GraphCanvas/lib/settings/link-settings-getter.ts"],"sourcesContent":["import type { GraphCanvas } from \"../../GraphCanvas\";\nimport { LINK_OPTIONS, LINK_SETTINGS } from \"../../constants\";\nimport type { LinkOptionsInterface, LinkSettingsInterface } from \"../../types\";\n\nexport function linkSettingsGetter<\n NodeData extends Record<string, unknown>,\n LinkData extends Record<string, unknown>,\n>(\n settings: LinkSettingsInterface<NodeData, LinkData> | undefined,\n prevSettings?: Required<Omit<LinkSettingsInterface<NodeData, LinkData>, \"options\">> &\n Pick<LinkSettingsInterface<NodeData, LinkData>, \"options\">,\n): Required<Omit<LinkSettingsInterface<NodeData, LinkData>, \"options\">> &\n Pick<LinkSettingsInterface<NodeData, LinkData>, \"options\"> {\n return { ...(prevSettings ?? LINK_SETTINGS), ...settings };\n}\n\nexport function linkOptionsGetter<\n NodeData extends Record<string, unknown>,\n LinkData extends Record<string, unknown>,\n>(this: GraphCanvas<NodeData, LinkData>): Required<LinkOptionsInterface<NodeData, LinkData>> {\n return {\n ...LINK_OPTIONS,\n drawExtraLink: null,\n drawLink: null,\n color:\n this.areaTransform && this.areaTransform.k > this.linkSettings.linkScaleSwitch\n ? this.linkSettings.linkColorAfterScaleSwitch\n : this.linkSettings.linkColorBeforeScaleSwitch,\n arrowColor:\n this.areaTransform && this.areaTransform.k > this.linkSettings.linkScaleSwitch\n ? this.linkSettings.linkColorAfterScaleSwitch\n : this.linkSettings.linkColorBeforeScaleSwitch,\n width:\n this.areaTransform && this.areaTransform.k > this.linkSettings.linkScaleSwitch\n ? this.linkSettings.linkWidthAfterScaleSwitch\n : this.linkSettings.linkWidthBeforeScaleSwitch,\n };\n}\n"],"names":[],"mappings":";;;;AAIgB,SAAA,kBAAkB,CAIhC,QAA+D,EAC/D,YAC4D,EAAA;IAG5D,OAAO,EAAE,IAAI,YAAY,IAAI,aAAa,CAAC,EAAE,GAAG,QAAQ,EAAE;AAC5D;SAEgB,iBAAiB,GAAA;IAI/B,OAAO;AACL,QAAA,GAAG,YAAY;AACf,QAAA,aAAa,EAAE,IAAI;AACnB,QAAA,QAAQ,EAAE,IAAI;AACd,QAAA,KAAK,EACH,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,aAAa,CAAC,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC;AAC7D,cAAE,IAAI,CAAC,YAAY,CAAC;AACpB,cAAE,IAAI,CAAC,YAAY,CAAC,0BAA0B;AAClD,QAAA,UAAU,EACR,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,aAAa,CAAC,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC;AAC7D,cAAE,IAAI,CAAC,YAAY,CAAC;AACpB,cAAE,IAAI,CAAC,YAAY,CAAC,0BAA0B;AAClD,QAAA,KAAK,EACH,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,aAAa,CAAC,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC;AAC7D,cAAE,IAAI,CAAC,YAAY,CAAC;AACpB,cAAE,IAAI,CAAC,YAAY,CAAC,0BAA0B;KACnD;AACH;;;;"}
1
+ {"version":3,"file":"link-settings-getter.js","sources":["../../../../../../src/module/GraphCanvas/lib/settings/link-settings-getter.ts"],"sourcesContent":["import type { GraphCanvas } from \"../../GraphCanvas\";\nimport { LINK_OPTIONS, LINK_SETTINGS } from \"../../constants\";\nimport type { LinkOptionsInterface, LinkSettingsInterface } from \"../../types\";\n\nexport function linkSettingsGetter<\n NodeData extends Record<string, unknown>,\n LinkData extends Record<string, unknown>,\n>(\n settings: LinkSettingsInterface<NodeData, LinkData> | undefined,\n prevSettings?: Required<Omit<LinkSettingsInterface<NodeData, LinkData>, \"options\">> &\n Pick<LinkSettingsInterface<NodeData, LinkData>, \"options\">,\n): Required<Omit<LinkSettingsInterface<NodeData, LinkData>, \"options\">> &\n Pick<LinkSettingsInterface<NodeData, LinkData>, \"options\"> {\n return { ...(prevSettings ?? LINK_SETTINGS), ...settings };\n}\n\nexport function linkOptionsGetter<\n NodeData extends Record<string, unknown>,\n LinkData extends Record<string, unknown>,\n>(this: GraphCanvas<NodeData, LinkData>): Required<LinkOptionsInterface<NodeData, LinkData>> {\n const aboveScale = this.areaTransform && this.areaTransform.k > this.linkSettings.linkScaleSwitch;\n\n return {\n ...LINK_OPTIONS,\n drawExtraLink: null,\n drawLink: null,\n color: aboveScale\n ? this.linkSettings.linkColorAfterScaleSwitch\n : this.linkSettings.linkColorBeforeScaleSwitch,\n arrowColor: aboveScale\n ? this.linkSettings.linkColorAfterScaleSwitch\n : this.linkSettings.linkColorBeforeScaleSwitch,\n width: aboveScale\n ? this.linkSettings.linkWidthAfterScaleSwitch\n : this.linkSettings.linkWidthBeforeScaleSwitch,\n };\n}\n"],"names":[],"mappings":";;;;;;AAIgB,SAAA,kBAAkB,CAIhC,QAA+D,EAC/D,YAC4D,EAAA;IAG5D,OAAO,EAAE,IAAI,YAAY,IAAI,aAAa,CAAC,EAAE,GAAG,QAAQ,EAAE;AAC5D;SAEgB,iBAAiB,GAAA;AAI/B,IAAA,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,aAAa,CAAC,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,eAAe;IAEjG,OAAO;AACL,QAAA,GAAG,YAAY;AACf,QAAA,aAAa,EAAE,IAAI;AACnB,QAAA,QAAQ,EAAE,IAAI;AACd,QAAA,KAAK,EAAE;AACL,cAAE,IAAI,CAAC,YAAY,CAAC;AACpB,cAAE,IAAI,CAAC,YAAY,CAAC,0BAA0B;AAChD,QAAA,UAAU,EAAE;AACV,cAAE,IAAI,CAAC,YAAY,CAAC;AACpB,cAAE,IAAI,CAAC,YAAY,CAAC,0BAA0B;AAChD,QAAA,KAAK,EAAE;AACL,cAAE,IAAI,CAAC,YAAY,CAAC;AACpB,cAAE,IAAI,CAAC,YAAY,CAAC,0BAA0B;KACjD;AACH;;;;"}
@@ -1,14 +1,26 @@
1
1
  import { colorGetter } from '../../../../lib/color-getter.js';
2
2
  import '@krainovsd/js-helpers';
3
- import 'd3-array';
3
+ import '../../constants/force-settings.js';
4
+ import '../../constants/graph-settings.js';
5
+ import '../../constants/highlight-settings.js';
6
+ import '../../constants/link-settings.js';
4
7
  import { NODE_SETTINGS, NODE_OPTIONS } from '../../constants/node-settings.js';
5
8
 
6
9
  function nodeSettingsGetter(settings, prevNodeSettings) {
7
- return {
10
+ const result = {
8
11
  ...(prevNodeSettings ?? NODE_SETTINGS),
9
12
  idGetter: nodeIdGetter,
10
13
  ...settings,
11
14
  };
15
+ if (result.smartCache && (!result.textScaleSteps || result.textScaleSteps.length === 0)) {
16
+ const step = (result.textScaleMax - result.textScaleMin) / 9;
17
+ const steps = [];
18
+ for (let i = 0; i < 10; i++) {
19
+ steps.push(result.textScaleMin + i * step);
20
+ }
21
+ result.textScaleSteps = steps;
22
+ }
23
+ return result;
12
24
  }
13
25
  const color = colorGetter();
14
26
  function nodeOptionsGetter(node) {
@@ -1 +1 @@
1
- {"version":3,"file":"node-settings-getter.js","sources":["../../../../../../src/module/GraphCanvas/lib/settings/node-settings-getter.ts"],"sourcesContent":["import type { ZoomTransform } from \"d3-zoom\";\nimport { colorGetter } from \"@/lib\";\nimport type { GraphCanvas } from \"../../GraphCanvas\";\nimport { NODE_OPTIONS, NODE_SETTINGS } from \"../../constants\";\nimport type { NodeInterface, NodeOptionsInterface, NodeSettingsInterface } from \"../../types\";\n\nexport function nodeSettingsGetter<\n NodeData extends Record<string, unknown>,\n LinkData extends Record<string, unknown>,\n>(\n settings: NodeSettingsInterface<NodeData, LinkData> | undefined,\n prevNodeSettings?: Required<Omit<NodeSettingsInterface<NodeData, LinkData>, \"options\">> &\n Pick<NodeSettingsInterface<NodeData, LinkData>, \"options\">,\n): Required<Omit<NodeSettingsInterface<NodeData, LinkData>, \"options\">> &\n Pick<NodeSettingsInterface<NodeData, LinkData>, \"options\"> {\n return {\n ...(prevNodeSettings ?? NODE_SETTINGS),\n idGetter: nodeIdGetter,\n ...settings,\n };\n}\n\nconst color = colorGetter();\n\nexport function nodeOptionsGetter<\n NodeData extends Record<string, unknown>,\n LinkData extends Record<string, unknown>,\n>(\n this: GraphCanvas<NodeData, LinkData>,\n node: NodeInterface<NodeData>,\n): Required<NodeOptionsInterface<NodeData, LinkData>> {\n const { textShiftY, textSize } = nodeTextSizeGetter(this.areaTransform, this.nodeSettings);\n\n return {\n ...NODE_OPTIONS,\n nodeDraw: null,\n nodeExtraDraw: null,\n textDraw: null,\n textExtraDraw: null,\n color: color(String(node.group ?? \"_DEFAULT\")),\n textVisible: Boolean(this.areaTransform.k > this.nodeSettings.textScaleMin),\n text: node.name ?? node.id.toString(),\n textShiftY,\n textSize,\n };\n}\n\nexport function nodeTextSizeGetter<\n NodeData extends Record<string, unknown>,\n LinkData extends Record<string, unknown>,\n>(\n transform: ZoomTransform | undefined,\n nodeSettings: Required<Omit<NodeSettingsInterface<NodeData, LinkData>, \"options\">> &\n Pick<NodeSettingsInterface<NodeData, LinkData>, \"options\">,\n) {\n let textSize: number = nodeSettings.textSizeMin;\n let textShiftY: number = nodeSettings.textShiftYMin;\n\n if (transform) {\n if (transform.k >= nodeSettings.textScaleMax) {\n textSize = nodeSettings.textSizeMax;\n textShiftY = nodeSettings.textShiftYMax;\n } else if (transform.k > nodeSettings.textScaleMin) {\n textSize =\n nodeSettings.textSizeMin +\n ((transform.k - nodeSettings.textScaleMin) *\n (nodeSettings.textSizeMax - nodeSettings.textSizeMin)) /\n (nodeSettings.textScaleMax - nodeSettings.textScaleMin);\n\n textShiftY =\n nodeSettings.textShiftYMin +\n ((transform.k - nodeSettings.textScaleMin) *\n (nodeSettings.textShiftYMax - nodeSettings.textShiftYMin)) /\n (nodeSettings.textScaleMax - nodeSettings.textScaleMin);\n }\n }\n\n return { textSize, textShiftY };\n}\n\nexport type NodeRadiusGetterOptions = {\n linkCount: number | undefined;\n radiusFlexible: boolean;\n radiusInitial: number;\n radiusLinkCountForStep: number;\n radiusIncrementByStep: number;\n radiusMaxLinearSteps: number;\n radiusLogFactor: number;\n radiusLinkCountDividerForLog: number;\n};\n\nexport function nodeRadiusGetter({\n radiusFlexible,\n linkCount,\n radiusInitial,\n radiusIncrementByStep,\n radiusLinkCountDividerForLog,\n radiusLinkCountForStep,\n radiusLogFactor,\n radiusMaxLinearSteps,\n}: NodeRadiusGetterOptions) {\n if (!radiusFlexible || !linkCount) return radiusInitial;\n const steps = linkCount / radiusLinkCountForStep;\n\n if (steps < radiusMaxLinearSteps) {\n return steps * radiusIncrementByStep + radiusInitial;\n }\n\n return (\n radiusInitial +\n radiusMaxLinearSteps * radiusIncrementByStep +\n radiusLogFactor * Math.log10(linkCount / radiusLinkCountDividerForLog)\n );\n}\n\nexport type NodeSizeGetterOptions = {\n linkCount: number | undefined;\n sizeFlexible: boolean;\n widthInitial: number;\n heightInitial: number;\n sizeLinkCountForStep: number;\n sizeIncrementByStep: number;\n sizeMaxLinearSteps: number;\n sizeLogFactor: number;\n sizeLinkCountDividerForLog: number;\n};\n\nexport function nodeSizeGetter({\n heightInitial,\n linkCount,\n sizeFlexible,\n widthInitial,\n sizeIncrementByStep,\n sizeLinkCountDividerForLog,\n sizeLinkCountForStep,\n sizeLogFactor,\n sizeMaxLinearSteps,\n}: NodeSizeGetterOptions) {\n let additionalSizeCoefficient = 1;\n if (sizeFlexible && linkCount != undefined) {\n const steps = linkCount / sizeLinkCountForStep;\n if (steps < sizeMaxLinearSteps) {\n additionalSizeCoefficient += steps * sizeIncrementByStep;\n } else {\n additionalSizeCoefficient +=\n sizeMaxLinearSteps * sizeIncrementByStep +\n sizeLogFactor * Math.log10(linkCount / sizeLinkCountDividerForLog);\n }\n }\n\n return {\n width: widthInitial * additionalSizeCoefficient,\n height: heightInitial * additionalSizeCoefficient,\n additionalSizeCoefficient,\n };\n}\n\nexport function nodeIdGetter<NodeData extends Record<string, unknown>>(\n node: NodeInterface<NodeData>,\n) {\n return node.id;\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"node-settings-getter.js","sources":["../../../../../../src/module/GraphCanvas/lib/settings/node-settings-getter.ts"],"sourcesContent":["import type { ZoomTransform } from \"d3-zoom\";\nimport { colorGetter } from \"@/lib\";\nimport type { GraphCanvas } from \"../../GraphCanvas\";\nimport { NODE_OPTIONS, NODE_SETTINGS } from \"../../constants\";\nimport type { NodeInterface, NodeOptionsInterface, NodeSettingsInterface } from \"../../types\";\n\nexport function nodeSettingsGetter<\n NodeData extends Record<string, unknown>,\n LinkData extends Record<string, unknown>,\n>(\n settings: NodeSettingsInterface<NodeData, LinkData> | undefined,\n prevNodeSettings?: Required<Omit<NodeSettingsInterface<NodeData, LinkData>, \"options\">> &\n Pick<NodeSettingsInterface<NodeData, LinkData>, \"options\">,\n): Required<Omit<NodeSettingsInterface<NodeData, LinkData>, \"options\">> &\n Pick<NodeSettingsInterface<NodeData, LinkData>, \"options\"> {\n const result = {\n ...(prevNodeSettings ?? NODE_SETTINGS),\n idGetter: nodeIdGetter,\n ...settings,\n };\n if (result.smartCache && (!result.textScaleSteps || result.textScaleSteps.length === 0)) {\n const step = (result.textScaleMax - result.textScaleMin) / 9;\n const steps: number[] = [];\n for (let i = 0; i < 10; i++) {\n steps.push(result.textScaleMin + i * step);\n }\n result.textScaleSteps = steps;\n }\n return result as Required<Omit<NodeSettingsInterface<NodeData, LinkData>, \"options\">> &\n Pick<NodeSettingsInterface<NodeData, LinkData>, \"options\">;\n}\n\nconst color = colorGetter();\n\nexport function nodeOptionsGetter<\n NodeData extends Record<string, unknown>,\n LinkData extends Record<string, unknown>,\n>(\n this: GraphCanvas<NodeData, LinkData>,\n node: NodeInterface<NodeData>,\n): Required<NodeOptionsInterface<NodeData, LinkData>> {\n const { textShiftY, textSize } = nodeTextSizeGetter(this.areaTransform, this.nodeSettings);\n\n return {\n ...NODE_OPTIONS,\n nodeDraw: null,\n nodeExtraDraw: null,\n textDraw: null,\n textExtraDraw: null,\n color: color(String(node.group ?? \"_DEFAULT\")),\n textVisible: Boolean(this.areaTransform.k > this.nodeSettings.textScaleMin),\n text: node.name ?? node.id.toString(),\n textShiftY,\n textSize,\n };\n}\n\nexport function nodeTextSizeGetter<\n NodeData extends Record<string, unknown>,\n LinkData extends Record<string, unknown>,\n>(\n transform: ZoomTransform | undefined,\n nodeSettings: Required<Omit<NodeSettingsInterface<NodeData, LinkData>, \"options\">> &\n Pick<NodeSettingsInterface<NodeData, LinkData>, \"options\">,\n) {\n let textSize: number = nodeSettings.textSizeMin;\n let textShiftY: number = nodeSettings.textShiftYMin;\n\n if (transform) {\n if (transform.k >= nodeSettings.textScaleMax) {\n textSize = nodeSettings.textSizeMax;\n textShiftY = nodeSettings.textShiftYMax;\n } else if (transform.k > nodeSettings.textScaleMin) {\n textSize =\n nodeSettings.textSizeMin +\n ((transform.k - nodeSettings.textScaleMin) *\n (nodeSettings.textSizeMax - nodeSettings.textSizeMin)) /\n (nodeSettings.textScaleMax - nodeSettings.textScaleMin);\n\n textShiftY =\n nodeSettings.textShiftYMin +\n ((transform.k - nodeSettings.textScaleMin) *\n (nodeSettings.textShiftYMax - nodeSettings.textShiftYMin)) /\n (nodeSettings.textScaleMax - nodeSettings.textScaleMin);\n }\n }\n\n return { textSize, textShiftY };\n}\n\nexport type NodeRadiusGetterOptions = {\n linkCount: number | undefined;\n radiusFlexible: boolean;\n radiusInitial: number;\n radiusLinkCountForStep: number;\n radiusIncrementByStep: number;\n radiusMaxLinearSteps: number;\n radiusLogFactor: number;\n radiusLinkCountDividerForLog: number;\n};\n\nexport function nodeRadiusGetter({\n radiusFlexible,\n linkCount,\n radiusInitial,\n radiusIncrementByStep,\n radiusLinkCountDividerForLog,\n radiusLinkCountForStep,\n radiusLogFactor,\n radiusMaxLinearSteps,\n}: NodeRadiusGetterOptions) {\n if (!radiusFlexible || !linkCount) return radiusInitial;\n const steps = linkCount / radiusLinkCountForStep;\n\n if (steps < radiusMaxLinearSteps) {\n return steps * radiusIncrementByStep + radiusInitial;\n }\n\n return (\n radiusInitial +\n radiusMaxLinearSteps * radiusIncrementByStep +\n radiusLogFactor * Math.log10(linkCount / radiusLinkCountDividerForLog)\n );\n}\n\nexport type NodeSizeGetterOptions = {\n linkCount: number | undefined;\n sizeFlexible: boolean;\n widthInitial: number;\n heightInitial: number;\n sizeLinkCountForStep: number;\n sizeIncrementByStep: number;\n sizeMaxLinearSteps: number;\n sizeLogFactor: number;\n sizeLinkCountDividerForLog: number;\n};\n\nexport function nodeSizeGetter({\n heightInitial,\n linkCount,\n sizeFlexible,\n widthInitial,\n sizeIncrementByStep,\n sizeLinkCountDividerForLog,\n sizeLinkCountForStep,\n sizeLogFactor,\n sizeMaxLinearSteps,\n}: NodeSizeGetterOptions) {\n let additionalSizeCoefficient = 1;\n if (sizeFlexible && linkCount != undefined) {\n const steps = linkCount / sizeLinkCountForStep;\n if (steps < sizeMaxLinearSteps) {\n additionalSizeCoefficient += steps * sizeIncrementByStep;\n } else {\n additionalSizeCoefficient +=\n sizeMaxLinearSteps * sizeIncrementByStep +\n sizeLogFactor * Math.log10(linkCount / sizeLinkCountDividerForLog);\n }\n }\n\n return {\n width: widthInitial * additionalSizeCoefficient,\n height: heightInitial * additionalSizeCoefficient,\n additionalSizeCoefficient,\n };\n}\n\nexport function nodeIdGetter<NodeData extends Record<string, unknown>>(\n node: NodeInterface<NodeData>,\n) {\n return node.id;\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import { COMMON_SETTINGS } from '../../constants/common-settings.js';
2
+ import '../../constants/force-settings.js';
3
+ import '../../constants/graph-settings.js';
4
+ import '../../constants/highlight-settings.js';
5
+ import '../../constants/link-settings.js';
6
+ import '../../constants/node-settings.js';
7
+
8
+ function calculateCurveLinkPositionByNode(xStart, yStart, xEnd, yEnd, sourceNode, targetNode, groupIndex, arrowSize = 0) {
9
+ const sourceRadius = (sourceNode._radius ?? COMMON_SETTINGS.nodeRadius) + (sourceNode._borderWidth ?? 0) * 0.5;
10
+ const targetRadius = (targetNode._radius ?? COMMON_SETTINGS.nodeRadius) + (targetNode._borderWidth ?? 0) * 0.5;
11
+ const effectiveTargetRadius = targetRadius + arrowSize * 0.9;
12
+ const mx = (xStart + xEnd) * 0.5;
13
+ const my = (yStart + yEnd) * 0.5;
14
+ const dx = xEnd - xStart;
15
+ const dy = yEnd - yStart;
16
+ const lenSq = dx * dx + dy * dy;
17
+ const len = lenSq > 0 ? Math.sqrt(lenSq) : 1;
18
+ const nx = -dy / len;
19
+ const ny = dx / len;
20
+ const offset = 0.12 * len * groupIndex;
21
+ const xControl = mx + nx * offset;
22
+ const yControl = my + ny * offset;
23
+ const [xStartP, yStartP] = adjustPoint(xStart, yStart, xControl, yControl, sourceRadius);
24
+ const [xEndP, yEndP] = adjustPoint(xEnd, yEnd, xControl, yControl, effectiveTargetRadius);
25
+ const [xEndArrow, yEndArrow] = adjustPoint(xEnd, yEnd, xControl, yControl, targetRadius);
26
+ return {
27
+ xStart: xStartP,
28
+ yStart: yStartP,
29
+ xEnd: xEndP,
30
+ yEnd: yEndP,
31
+ xControl,
32
+ yControl,
33
+ xEndArrow,
34
+ yEndArrow,
35
+ };
36
+ }
37
+ function adjustPoint(x, y, xControl, yControl, radius) {
38
+ const dxToControl = xControl - x;
39
+ const dyToControl = yControl - y;
40
+ const distToControl = Math.sqrt(dxToControl * dxToControl + dyToControl * dyToControl) || 1;
41
+ return [x + (dxToControl / distToControl) * radius, y + (dyToControl / distToControl) * radius];
42
+ }
43
+
44
+ export { calculateCurveLinkPositionByNode };
45
+ //# sourceMappingURL=calculate-curve-link-position-by-node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calculate-curve-link-position-by-node.js","sources":["../../../../../../src/module/GraphCanvas/lib/utils/calculate-curve-link-position-by-node.ts"],"sourcesContent":["import { COMMON_SETTINGS } from \"../../constants\";\nimport type { NodeInterface } from \"../../types\";\n\nexport function calculateCurveLinkPositionByNode<NodeData extends Record<string, unknown>>(\n xStart: number,\n yStart: number,\n xEnd: number,\n yEnd: number,\n sourceNode: NodeInterface<NodeData>,\n targetNode: NodeInterface<NodeData>,\n groupIndex: number,\n arrowSize: number = 0,\n) {\n const sourceRadius =\n (sourceNode._radius ?? COMMON_SETTINGS.nodeRadius) + (sourceNode._borderWidth ?? 0) * 0.5;\n const targetRadius =\n (targetNode._radius ?? COMMON_SETTINGS.nodeRadius) + (targetNode._borderWidth ?? 0) * 0.5;\n const effectiveTargetRadius = targetRadius + arrowSize * 0.9;\n\n const mx = (xStart + xEnd) * 0.5;\n const my = (yStart + yEnd) * 0.5;\n const dx = xEnd - xStart;\n const dy = yEnd - yStart;\n const lenSq = dx * dx + dy * dy;\n const len = lenSq > 0 ? Math.sqrt(lenSq) : 1;\n\n const nx = -dy / len;\n const ny = dx / len;\n\n const offset = 0.12 * len * groupIndex;\n\n const xControl = mx + nx * offset;\n const yControl = my + ny * offset;\n\n const [xStartP, yStartP] = adjustPoint(xStart, yStart, xControl, yControl, sourceRadius);\n const [xEndP, yEndP] = adjustPoint(xEnd, yEnd, xControl, yControl, effectiveTargetRadius);\n const [xEndArrow, yEndArrow] = adjustPoint(xEnd, yEnd, xControl, yControl, targetRadius);\n\n return {\n xStart: xStartP,\n yStart: yStartP,\n xEnd: xEndP,\n yEnd: yEndP,\n xControl,\n yControl,\n xEndArrow,\n yEndArrow,\n };\n}\n\nfunction adjustPoint(\n x: number,\n y: number,\n xControl: number,\n yControl: number,\n radius: number,\n): [number, number] {\n const dxToControl = xControl - x;\n const dyToControl = yControl - y;\n const distToControl = Math.sqrt(dxToControl * dxToControl + dyToControl * dyToControl) || 1;\n\n return [x + (dxToControl / distToControl) * radius, y + (dyToControl / distToControl) * radius];\n}\n"],"names":[],"mappings":";;;;;;;SAGgB,gCAAgC,CAC9C,MAAc,EACd,MAAc,EACd,IAAY,EACZ,IAAY,EACZ,UAAmC,EACnC,UAAmC,EACnC,UAAkB,EAClB,YAAoB,CAAC,EAAA;IAErB,MAAM,YAAY,GAChB,CAAC,UAAU,CAAC,OAAO,IAAI,eAAe,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,YAAY,IAAI,CAAC,IAAI,GAAG;IAC3F,MAAM,YAAY,GAChB,CAAC,UAAU,CAAC,OAAO,IAAI,eAAe,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,YAAY,IAAI,CAAC,IAAI,GAAG;AAC3F,IAAA,MAAM,qBAAqB,GAAG,YAAY,GAAG,SAAS,GAAG,GAAG;IAE5D,MAAM,EAAE,GAAG,CAAC,MAAM,GAAG,IAAI,IAAI,GAAG;IAChC,MAAM,EAAE,GAAG,CAAC,MAAM,GAAG,IAAI,IAAI,GAAG;AAChC,IAAA,MAAM,EAAE,GAAG,IAAI,GAAG,MAAM;AACxB,IAAA,MAAM,EAAE,GAAG,IAAI,GAAG,MAAM;IACxB,MAAM,KAAK,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;AAC/B,IAAA,MAAM,GAAG,GAAG,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;AAE5C,IAAA,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,GAAG;AACpB,IAAA,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG;AAEnB,IAAA,MAAM,MAAM,GAAG,IAAI,GAAG,GAAG,GAAG,UAAU;AAEtC,IAAA,MAAM,QAAQ,GAAG,EAAE,GAAG,EAAE,GAAG,MAAM;AACjC,IAAA,MAAM,QAAQ,GAAG,EAAE,GAAG,EAAE,GAAG,MAAM;AAEjC,IAAA,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,CAAC;AACxF,IAAA,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,qBAAqB,CAAC;AACzF,IAAA,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,GAAG,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,CAAC;IAExF,OAAO;AACL,QAAA,MAAM,EAAE,OAAO;AACf,QAAA,MAAM,EAAE,OAAO;AACf,QAAA,IAAI,EAAE,KAAK;AACX,QAAA,IAAI,EAAE,KAAK;QACX,QAAQ;QACR,QAAQ;QACR,SAAS;QACT,SAAS;KACV;AACH;AAEA,SAAS,WAAW,CAClB,CAAS,EACT,CAAS,EACT,QAAgB,EAChB,QAAgB,EAChB,MAAc,EAAA;AAEd,IAAA,MAAM,WAAW,GAAG,QAAQ,GAAG,CAAC;AAChC,IAAA,MAAM,WAAW,GAAG,QAAQ,GAAG,CAAC;AAChC,IAAA,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,WAAW,GAAG,WAAW,GAAG,WAAW,CAAC,IAAI,CAAC;IAE3F,OAAO,CAAC,CAAC,GAAG,CAAC,WAAW,GAAG,aAAa,IAAI,MAAM,EAAE,CAAC,GAAG,CAAC,WAAW,GAAG,aAAa,IAAI,MAAM,CAAC;AACjG;;;;"}
@@ -1,51 +1,56 @@
1
1
  import { COMMON_SETTINGS } from '../../constants/common-settings.js';
2
- import '@krainovsd/js-helpers';
3
- import 'd3-array';
2
+ import '../../constants/force-settings.js';
3
+ import '../../constants/graph-settings.js';
4
+ import '../../constants/highlight-settings.js';
5
+ import '../../constants/link-settings.js';
6
+ import '../../constants/node-settings.js';
4
7
 
5
- function calculateLinkPositionByNode(link, arrowSize = 0) {
6
- const source = link.source;
7
- const target = link.target;
8
- if (typeof source != "object" || typeof target != "object")
9
- return null;
8
+ function calculateLinkPositionByNode(xStart, yStart, xEnd, yEnd, sourceNode, targetNode, arrowSize = 0) {
10
9
  const sourcePoint = getLinkPoint({
10
+ xStart,
11
+ yStart,
12
+ xEnd,
13
+ yEnd,
11
14
  arrowSize: 0,
12
- node: source,
13
- oppositeNode: target,
14
- });
15
+ node: sourceNode});
15
16
  const targetPoint = getLinkPoint({
16
- arrowSize: arrowSize > 0 ? arrowSize * 0.85 : 0,
17
- node: target,
18
- oppositeNode: source,
19
- });
20
- if (!sourcePoint || !targetPoint)
21
- return null;
17
+ xStart: xEnd,
18
+ yStart: yEnd,
19
+ xEnd: xStart,
20
+ yEnd: yStart,
21
+ arrowSize: arrowSize > 0 ? arrowSize * 0.9 : 0,
22
+ node: targetNode});
23
+ const targetPointArrow = getLinkPoint({
24
+ xStart: xEnd,
25
+ yStart: yEnd,
26
+ xEnd: xStart,
27
+ yEnd: yStart,
28
+ arrowSize: 0,
29
+ node: targetNode});
22
30
  const distance = targetPoint && sourcePoint
23
31
  ? Math.sqrt((targetPoint.x - sourcePoint.x) ** 2 + (targetPoint.y - sourcePoint.y) ** 2)
24
32
  : 0;
25
33
  return {
26
- x1: sourcePoint.x,
27
- y1: sourcePoint.y,
28
- x2: targetPoint.x,
29
- y2: targetPoint.y,
34
+ xStart: sourcePoint.x,
35
+ yStart: sourcePoint.y,
36
+ xEnd: targetPoint.x,
37
+ yEnd: targetPoint.y,
38
+ xEndArrow: targetPointArrow.x,
39
+ yEndArrow: targetPointArrow.y,
30
40
  distance,
31
41
  };
32
42
  }
33
43
  function getLinkPoint(opts) {
34
- if (opts.node.x == undefined ||
35
- opts.node.y == undefined ||
36
- opts.oppositeNode.x == undefined ||
37
- opts.oppositeNode.y == undefined)
38
- return null;
39
44
  let nodePoint;
40
45
  switch (opts.node._shape) {
41
46
  case "circle": {
42
47
  nodePoint = getCircleIntersection({
43
- x: opts.node.x,
44
- y: opts.node.y,
48
+ x: opts.xStart,
49
+ y: opts.yStart,
45
50
  radius: (opts.node._radius ?? COMMON_SETTINGS.nodeRadius) +
46
51
  (opts.node._borderWidth ? opts.node._borderWidth / 2 : 0),
47
- oppositeX: opts.oppositeNode.x,
48
- oppositeY: opts.oppositeNode.y,
52
+ oppositeX: opts.xEnd,
53
+ oppositeY: opts.yEnd,
49
54
  arrowSize: opts.arrowSize,
50
55
  });
51
56
  break;
@@ -54,23 +59,23 @@ function getLinkPoint(opts) {
54
59
  case "text": {
55
60
  nodePoint = getRectangleIntersection({
56
61
  arrowSize: opts.arrowSize,
57
- x: opts.node.x,
58
- y: opts.node.y,
62
+ x: opts.xStart,
63
+ y: opts.yStart,
59
64
  height: (opts.node._height ?? COMMON_SETTINGS.nodeSize) + (opts.node._borderWidth ?? 0),
60
65
  width: (opts.node._width ?? COMMON_SETTINGS.nodeSize) + (opts.node._borderWidth ?? 0),
61
- oppositeX: opts.oppositeNode.x,
62
- oppositeY: opts.oppositeNode.y,
66
+ oppositeX: opts.xEnd,
67
+ oppositeY: opts.yEnd,
63
68
  borderRadius: opts.node._shape === "text" ? 0 : (opts.node._borderRadius ?? 0),
64
69
  });
65
70
  break;
66
71
  }
67
72
  default: {
68
73
  nodePoint = getCircleIntersection({
69
- x: opts.node.x,
70
- y: opts.node.y,
74
+ x: opts.xStart,
75
+ y: opts.yStart,
71
76
  radius: opts.node._radius ?? COMMON_SETTINGS.nodeRadius,
72
- oppositeX: opts.oppositeNode.x,
73
- oppositeY: opts.oppositeNode.y,
77
+ oppositeX: opts.xEnd,
78
+ oppositeY: opts.yEnd,
74
79
  arrowSize: opts.arrowSize,
75
80
  });
76
81
  }
@@ -1 +1 @@
1
- {"version":3,"file":"calculate-link-position-by-node.js","sources":["../../../../../../src/module/GraphCanvas/lib/utils/calculate-link-position-by-node.ts"],"sourcesContent":["import { COMMON_SETTINGS } from \"../../constants\";\nimport type { LinkInterface, NodeInterface } from \"../../types\";\n\ntype Point = {\n x: number;\n y: number;\n};\n\nexport function calculateLinkPositionByNode<\n NodeData extends Record<string, unknown>,\n LinkData extends Record<string, unknown>,\n>(link: LinkInterface<NodeData, LinkData>, arrowSize = 0) {\n const source = link.source;\n const target = link.target;\n\n if (typeof source != \"object\" || typeof target != \"object\") return null;\n\n const sourcePoint = getLinkPoint({\n arrowSize: 0,\n node: source,\n oppositeNode: target,\n });\n const targetPoint = getLinkPoint({\n arrowSize: arrowSize > 0 ? arrowSize * 0.85 : 0,\n node: target,\n oppositeNode: source,\n });\n\n if (!sourcePoint || !targetPoint) return null;\n\n const distance =\n targetPoint && sourcePoint\n ? Math.sqrt((targetPoint.x - sourcePoint.x) ** 2 + (targetPoint.y - sourcePoint.y) ** 2)\n : 0;\n\n return {\n x1: sourcePoint.x,\n y1: sourcePoint.y,\n x2: targetPoint.x,\n y2: targetPoint.y,\n distance,\n };\n}\n\ntype GetLinkPointProps<NodeData extends Record<string, unknown>> = {\n arrowSize: number;\n node: NodeInterface<NodeData>;\n oppositeNode: NodeInterface<NodeData>;\n};\nfunction getLinkPoint<NodeData extends Record<string, unknown>>(opts: GetLinkPointProps<NodeData>) {\n if (\n opts.node.x == undefined ||\n opts.node.y == undefined ||\n opts.oppositeNode.x == undefined ||\n opts.oppositeNode.y == undefined\n )\n return null;\n\n let nodePoint: Point;\n switch (opts.node._shape) {\n case \"circle\": {\n nodePoint = getCircleIntersection({\n x: opts.node.x,\n y: opts.node.y,\n radius:\n (opts.node._radius ?? COMMON_SETTINGS.nodeRadius) +\n (opts.node._borderWidth ? opts.node._borderWidth / 2 : 0),\n oppositeX: opts.oppositeNode.x,\n oppositeY: opts.oppositeNode.y,\n arrowSize: opts.arrowSize,\n });\n break;\n }\n case \"square\":\n case \"text\": {\n nodePoint = getRectangleIntersection({\n arrowSize: opts.arrowSize,\n x: opts.node.x,\n y: opts.node.y,\n height: (opts.node._height ?? COMMON_SETTINGS.nodeSize) + (opts.node._borderWidth ?? 0),\n width: (opts.node._width ?? COMMON_SETTINGS.nodeSize) + (opts.node._borderWidth ?? 0),\n oppositeX: opts.oppositeNode.x,\n oppositeY: opts.oppositeNode.y,\n borderRadius: opts.node._shape === \"text\" ? 0 : (opts.node._borderRadius ?? 0),\n });\n break;\n }\n default: {\n nodePoint = getCircleIntersection({\n x: opts.node.x,\n y: opts.node.y,\n radius: opts.node._radius ?? COMMON_SETTINGS.nodeRadius,\n oppositeX: opts.oppositeNode.x,\n oppositeY: opts.oppositeNode.y,\n arrowSize: opts.arrowSize,\n });\n }\n }\n\n return nodePoint;\n}\n\ntype GetCircleIntersection = {\n x: number;\n y: number;\n radius: number;\n oppositeX: number;\n oppositeY: number;\n arrowSize: number;\n};\n\nfunction getCircleIntersection(opts: GetCircleIntersection): Point {\n const dx = opts.oppositeX - opts.x;\n const dy = opts.oppositeY - opts.y;\n const dr = Math.sqrt(dx * dx + dy * dy);\n\n const radius = opts.radius + opts.arrowSize;\n\n return {\n x: opts.x + (dx * radius) / dr,\n y: opts.y + (dy * radius) / dr,\n };\n}\n\ntype GetRectangleIntersection = {\n x: number;\n y: number;\n width: number;\n height: number;\n oppositeX: number;\n oppositeY: number;\n arrowSize: number;\n borderRadius: number;\n};\n\nfunction getRectangleIntersection(opts: GetRectangleIntersection): Point {\n const halfWidth = opts.width / 2;\n const halfHeight = opts.height / 2;\n\n const dx = opts.oppositeX - opts.x;\n const dy = opts.oppositeY - opts.y;\n\n let relX: number, relY: number;\n\n if (Math.abs(dx) <= halfWidth && Math.abs(dy) <= halfHeight) {\n const distToRight = halfWidth - dx;\n const distToLeft = halfWidth + dx;\n const distToTop = halfHeight - dy;\n const distToBottom = halfHeight + dy;\n\n const minDist = Math.min(distToRight, distToLeft, distToTop, distToBottom);\n\n relX = minDist === distToRight ? halfWidth : minDist === distToLeft ? -halfWidth : dx;\n relY = minDist === distToTop ? halfHeight : minDist === distToBottom ? -halfHeight : dy;\n } else {\n const absDx = Math.abs(dx);\n const absDy = Math.abs(dy);\n\n if (halfWidth * absDy < halfHeight * absDx) {\n relX = dx > 0 ? halfWidth : -halfWidth;\n relY = (relX * dy) / dx;\n if (Math.abs(relY) > halfHeight) {\n relY = dy > 0 ? halfHeight : -halfHeight;\n relX = (relY * dx) / dy;\n }\n } else {\n relY = dy > 0 ? halfHeight : -halfHeight;\n relX = (relY * dx) / dy;\n if (Math.abs(relX) > halfWidth) {\n relX = dx > 0 ? halfWidth : -halfWidth;\n relY = (relX * dy) / dx;\n }\n }\n }\n\n if (opts.borderRadius != undefined) {\n const { x, y } = squareRadiusFix(relX, relY, halfWidth, halfHeight, opts.borderRadius);\n if (x != undefined) relX = x;\n if (y != undefined) relY = y;\n }\n\n if (opts.arrowSize > 0) {\n const edgeDist = Math.sqrt(relX * relX + relY * relY);\n const scale = (edgeDist + opts.arrowSize) / edgeDist;\n relX *= scale;\n relY *= scale;\n }\n\n return {\n x: opts.x + relX,\n y: opts.y + relY,\n };\n}\n\n// eslint-disable-next-line no-warning-comments\n// TODO: Need upgrade\nfunction squareRadiusFix(\n relX: number,\n relY: number,\n halfWidth: number,\n halfHeight: number,\n borderRadius: number,\n) {\n const epsilon = 1e-6;\n const absX = Math.abs(relX);\n const absY = Math.abs(relY);\n\n let side: string | null = null;\n if (absX >= halfWidth - epsilon) {\n side = relX > 0 ? \"right\" : \"left\";\n } else if (absY >= halfHeight - epsilon) {\n side = relY > 0 ? \"top\" : \"bottom\";\n }\n\n if (side) {\n const topBound = halfHeight - borderRadius;\n const bottomBound = -topBound;\n const rightBound = halfWidth - borderRadius;\n const leftBound = -rightBound;\n\n switch (side) {\n case \"right\":\n if (relY > topBound) {\n return checkIntersection(relX, relY, halfWidth, halfHeight, borderRadius, \"right-top\");\n } else if (relY < bottomBound) {\n return checkIntersection(relX, relY, halfWidth, halfHeight, borderRadius, \"right-bottom\");\n }\n break;\n case \"left\":\n if (relY > topBound) {\n return checkIntersection(relX, relY, halfWidth, halfHeight, borderRadius, \"left-top\");\n } else if (relY < bottomBound) {\n return checkIntersection(relX, relY, halfWidth, halfHeight, borderRadius, \"left-bottom\");\n }\n break;\n case \"top\":\n if (relX > rightBound) {\n return checkIntersection(relX, relY, halfWidth, halfHeight, borderRadius, \"top-right\");\n } else if (relX < leftBound) {\n return checkIntersection(relX, relY, halfWidth, halfHeight, borderRadius, \"top-left\");\n }\n break;\n case \"bottom\":\n if (relX > rightBound) {\n return checkIntersection(relX, relY, halfWidth, halfHeight, borderRadius, \"bottom-right\");\n } else if (relX < leftBound) {\n return checkIntersection(relX, relY, halfWidth, halfHeight, borderRadius, \"bottom-left\");\n }\n break;\n default:\n break;\n }\n }\n\n return { x: undefined, y: undefined };\n}\n\nfunction checkIntersection(\n relX: number,\n relY: number,\n halfWidth: number,\n halfHeight: number,\n r: number,\n corner: Parameters<typeof intersectWithCircle>[5],\n) {\n const intersect = intersectWithCircle(relX, relY, halfWidth, halfHeight, r, corner);\n\n return intersect ?? { x: undefined, y: undefined };\n}\n\nfunction intersectWithCircle(\n relX: number,\n relY: number,\n halfWidth: number,\n halfHeight: number,\n r: number,\n corner:\n | \"right-top\"\n | \"right-bottom\"\n | \"left-top\"\n | \"left-bottom\"\n | \"top-right\"\n | \"top-left\"\n | \"bottom-right\"\n | \"bottom-left\",\n) {\n switch (corner) {\n case \"top-right\":\n corner = \"right-top\";\n break;\n case \"bottom-right\":\n corner = \"right-bottom\";\n break;\n case \"top-left\":\n corner = \"left-top\";\n break;\n case \"bottom-left\":\n corner = \"left-bottom\";\n break;\n default:\n break;\n }\n\n let cx: number, cy: number;\n switch (corner) {\n case \"right-top\":\n cx = halfWidth - r;\n cy = halfHeight - r;\n break;\n case \"right-bottom\":\n cx = halfWidth - r;\n cy = -halfHeight + r;\n break;\n case \"left-top\":\n cx = -halfWidth + r;\n cy = halfHeight - r;\n break;\n case \"left-bottom\":\n cx = -halfWidth + r;\n cy = -halfHeight + r;\n break;\n default:\n return null;\n }\n\n const a = relX ** 2 + relY ** 2;\n if (a === 0) return null;\n\n const b = -2 * (relX * cx + relY * cy);\n const c = cx ** 2 + cy ** 2 - r ** 2;\n const discriminant = b ** 2 - 4 * a * c;\n\n if (discriminant < 0) return null;\n const sqrtD = Math.sqrt(discriminant);\n\n const t2 = (-b - sqrtD) / (2 * a);\n const t1 = (-b + sqrtD) / (2 * a);\n const t = t2 > 0 ? t2 : t1 > 0 ? t1 : null;\n\n if (t === null || t >= 1) return null;\n\n const x = t * relX;\n const y = t * relY;\n\n let valid = false;\n switch (corner) {\n case \"right-top\":\n valid = x >= cx && y >= cy;\n break;\n case \"right-bottom\":\n valid = x >= cx && y <= cy;\n break;\n case \"left-top\":\n valid = x <= cx && y >= cy;\n break;\n case \"left-bottom\":\n valid = x <= cx && y <= cy;\n break;\n default:\n break;\n }\n\n return valid ? { x, y } : null;\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"calculate-link-position-by-node.js","sources":["../../../../../../src/module/GraphCanvas/lib/utils/calculate-link-position-by-node.ts"],"sourcesContent":["import { COMMON_SETTINGS } from \"../../constants\";\nimport type { NodeInterface } from \"../../types\";\n\ntype Point = {\n x: number;\n y: number;\n};\n\nexport function calculateLinkPositionByNode<NodeData extends Record<string, unknown>>(\n xStart: number,\n yStart: number,\n xEnd: number,\n yEnd: number,\n sourceNode: NodeInterface<NodeData>,\n targetNode: NodeInterface<NodeData>,\n arrowSize = 0,\n) {\n const sourcePoint = getLinkPoint({\n xStart,\n yStart,\n xEnd,\n yEnd,\n arrowSize: 0,\n node: sourceNode,\n oppositeNode: targetNode,\n });\n const targetPoint = getLinkPoint({\n xStart: xEnd,\n yStart: yEnd,\n xEnd: xStart,\n yEnd: yStart,\n arrowSize: arrowSize > 0 ? arrowSize * 0.9 : 0,\n node: targetNode,\n oppositeNode: sourceNode,\n });\n const targetPointArrow = getLinkPoint({\n xStart: xEnd,\n yStart: yEnd,\n xEnd: xStart,\n yEnd: yStart,\n arrowSize: 0,\n node: targetNode,\n oppositeNode: sourceNode,\n });\n\n const distance =\n targetPoint && sourcePoint\n ? Math.sqrt((targetPoint.x - sourcePoint.x) ** 2 + (targetPoint.y - sourcePoint.y) ** 2)\n : 0;\n\n return {\n xStart: sourcePoint.x,\n yStart: sourcePoint.y,\n xEnd: targetPoint.x,\n yEnd: targetPoint.y,\n xEndArrow: targetPointArrow.x,\n yEndArrow: targetPointArrow.y,\n distance,\n };\n}\n\ntype GetLinkPointProps<NodeData extends Record<string, unknown>> = {\n xStart: number;\n yStart: number;\n xEnd: number;\n yEnd: number;\n arrowSize: number;\n node: NodeInterface<NodeData>;\n oppositeNode: NodeInterface<NodeData>;\n};\nfunction getLinkPoint<NodeData extends Record<string, unknown>>(opts: GetLinkPointProps<NodeData>) {\n let nodePoint: Point;\n switch (opts.node._shape) {\n case \"circle\": {\n nodePoint = getCircleIntersection({\n x: opts.xStart,\n y: opts.yStart,\n radius:\n (opts.node._radius ?? COMMON_SETTINGS.nodeRadius) +\n (opts.node._borderWidth ? opts.node._borderWidth / 2 : 0),\n oppositeX: opts.xEnd,\n oppositeY: opts.yEnd,\n arrowSize: opts.arrowSize,\n });\n break;\n }\n case \"square\":\n case \"text\": {\n nodePoint = getRectangleIntersection({\n arrowSize: opts.arrowSize,\n x: opts.xStart,\n y: opts.yStart,\n height: (opts.node._height ?? COMMON_SETTINGS.nodeSize) + (opts.node._borderWidth ?? 0),\n width: (opts.node._width ?? COMMON_SETTINGS.nodeSize) + (opts.node._borderWidth ?? 0),\n oppositeX: opts.xEnd,\n oppositeY: opts.yEnd,\n borderRadius: opts.node._shape === \"text\" ? 0 : (opts.node._borderRadius ?? 0),\n });\n break;\n }\n default: {\n nodePoint = getCircleIntersection({\n x: opts.xStart,\n y: opts.yStart,\n radius: opts.node._radius ?? COMMON_SETTINGS.nodeRadius,\n oppositeX: opts.xEnd,\n oppositeY: opts.yEnd,\n arrowSize: opts.arrowSize,\n });\n }\n }\n\n return nodePoint;\n}\n\ntype GetCircleIntersection = {\n x: number;\n y: number;\n radius: number;\n oppositeX: number;\n oppositeY: number;\n arrowSize: number;\n};\n\nfunction getCircleIntersection(opts: GetCircleIntersection): Point {\n const dx = opts.oppositeX - opts.x;\n const dy = opts.oppositeY - opts.y;\n const dr = Math.sqrt(dx * dx + dy * dy);\n\n const radius = opts.radius + opts.arrowSize;\n\n return {\n x: opts.x + (dx * radius) / dr,\n y: opts.y + (dy * radius) / dr,\n };\n}\n\ntype GetRectangleIntersection = {\n x: number;\n y: number;\n width: number;\n height: number;\n oppositeX: number;\n oppositeY: number;\n arrowSize: number;\n borderRadius: number;\n};\n\nfunction getRectangleIntersection(opts: GetRectangleIntersection): Point {\n const halfWidth = opts.width / 2;\n const halfHeight = opts.height / 2;\n\n const dx = opts.oppositeX - opts.x;\n const dy = opts.oppositeY - opts.y;\n\n let relX: number, relY: number;\n\n if (Math.abs(dx) <= halfWidth && Math.abs(dy) <= halfHeight) {\n const distToRight = halfWidth - dx;\n const distToLeft = halfWidth + dx;\n const distToTop = halfHeight - dy;\n const distToBottom = halfHeight + dy;\n\n const minDist = Math.min(distToRight, distToLeft, distToTop, distToBottom);\n\n relX = minDist === distToRight ? halfWidth : minDist === distToLeft ? -halfWidth : dx;\n relY = minDist === distToTop ? halfHeight : minDist === distToBottom ? -halfHeight : dy;\n } else {\n const absDx = Math.abs(dx);\n const absDy = Math.abs(dy);\n\n if (halfWidth * absDy < halfHeight * absDx) {\n relX = dx > 0 ? halfWidth : -halfWidth;\n relY = (relX * dy) / dx;\n if (Math.abs(relY) > halfHeight) {\n relY = dy > 0 ? halfHeight : -halfHeight;\n relX = (relY * dx) / dy;\n }\n } else {\n relY = dy > 0 ? halfHeight : -halfHeight;\n relX = (relY * dx) / dy;\n if (Math.abs(relX) > halfWidth) {\n relX = dx > 0 ? halfWidth : -halfWidth;\n relY = (relX * dy) / dx;\n }\n }\n }\n\n if (opts.borderRadius != undefined) {\n const { x, y } = squareRadiusFix(relX, relY, halfWidth, halfHeight, opts.borderRadius);\n if (x != undefined) relX = x;\n if (y != undefined) relY = y;\n }\n\n if (opts.arrowSize > 0) {\n const edgeDist = Math.sqrt(relX * relX + relY * relY);\n const scale = (edgeDist + opts.arrowSize) / edgeDist;\n relX *= scale;\n relY *= scale;\n }\n\n return {\n x: opts.x + relX,\n y: opts.y + relY,\n };\n}\n\n// eslint-disable-next-line no-warning-comments\n// TODO: Need upgrade\nfunction squareRadiusFix(\n relX: number,\n relY: number,\n halfWidth: number,\n halfHeight: number,\n borderRadius: number,\n) {\n const epsilon = 1e-6;\n const absX = Math.abs(relX);\n const absY = Math.abs(relY);\n\n let side: string | null = null;\n if (absX >= halfWidth - epsilon) {\n side = relX > 0 ? \"right\" : \"left\";\n } else if (absY >= halfHeight - epsilon) {\n side = relY > 0 ? \"top\" : \"bottom\";\n }\n\n if (side) {\n const topBound = halfHeight - borderRadius;\n const bottomBound = -topBound;\n const rightBound = halfWidth - borderRadius;\n const leftBound = -rightBound;\n\n switch (side) {\n case \"right\":\n if (relY > topBound) {\n return checkIntersection(relX, relY, halfWidth, halfHeight, borderRadius, \"right-top\");\n } else if (relY < bottomBound) {\n return checkIntersection(relX, relY, halfWidth, halfHeight, borderRadius, \"right-bottom\");\n }\n break;\n case \"left\":\n if (relY > topBound) {\n return checkIntersection(relX, relY, halfWidth, halfHeight, borderRadius, \"left-top\");\n } else if (relY < bottomBound) {\n return checkIntersection(relX, relY, halfWidth, halfHeight, borderRadius, \"left-bottom\");\n }\n break;\n case \"top\":\n if (relX > rightBound) {\n return checkIntersection(relX, relY, halfWidth, halfHeight, borderRadius, \"top-right\");\n } else if (relX < leftBound) {\n return checkIntersection(relX, relY, halfWidth, halfHeight, borderRadius, \"top-left\");\n }\n break;\n case \"bottom\":\n if (relX > rightBound) {\n return checkIntersection(relX, relY, halfWidth, halfHeight, borderRadius, \"bottom-right\");\n } else if (relX < leftBound) {\n return checkIntersection(relX, relY, halfWidth, halfHeight, borderRadius, \"bottom-left\");\n }\n break;\n default:\n break;\n }\n }\n\n return { x: undefined, y: undefined };\n}\n\nfunction checkIntersection(\n relX: number,\n relY: number,\n halfWidth: number,\n halfHeight: number,\n r: number,\n corner: Parameters<typeof intersectWithCircle>[5],\n) {\n const intersect = intersectWithCircle(relX, relY, halfWidth, halfHeight, r, corner);\n\n return intersect ?? { x: undefined, y: undefined };\n}\n\nfunction intersectWithCircle(\n relX: number,\n relY: number,\n halfWidth: number,\n halfHeight: number,\n r: number,\n corner:\n | \"right-top\"\n | \"right-bottom\"\n | \"left-top\"\n | \"left-bottom\"\n | \"top-right\"\n | \"top-left\"\n | \"bottom-right\"\n | \"bottom-left\",\n) {\n switch (corner) {\n case \"top-right\":\n corner = \"right-top\";\n break;\n case \"bottom-right\":\n corner = \"right-bottom\";\n break;\n case \"top-left\":\n corner = \"left-top\";\n break;\n case \"bottom-left\":\n corner = \"left-bottom\";\n break;\n default:\n break;\n }\n\n let cx: number, cy: number;\n switch (corner) {\n case \"right-top\":\n cx = halfWidth - r;\n cy = halfHeight - r;\n break;\n case \"right-bottom\":\n cx = halfWidth - r;\n cy = -halfHeight + r;\n break;\n case \"left-top\":\n cx = -halfWidth + r;\n cy = halfHeight - r;\n break;\n case \"left-bottom\":\n cx = -halfWidth + r;\n cy = -halfHeight + r;\n break;\n default:\n return null;\n }\n\n const a = relX ** 2 + relY ** 2;\n if (a === 0) return null;\n\n const b = -2 * (relX * cx + relY * cy);\n const c = cx ** 2 + cy ** 2 - r ** 2;\n const discriminant = b ** 2 - 4 * a * c;\n\n if (discriminant < 0) return null;\n const sqrtD = Math.sqrt(discriminant);\n\n const t2 = (-b - sqrtD) / (2 * a);\n const t1 = (-b + sqrtD) / (2 * a);\n const t = t2 > 0 ? t2 : t1 > 0 ? t1 : null;\n\n if (t === null || t >= 1) return null;\n\n const x = t * relX;\n const y = t * relY;\n\n let valid = false;\n switch (corner) {\n case \"right-top\":\n valid = x >= cx && y >= cy;\n break;\n case \"right-bottom\":\n valid = x >= cx && y <= cy;\n break;\n case \"left-top\":\n valid = x <= cx && y >= cy;\n break;\n case \"left-bottom\":\n valid = x <= cx && y <= cy;\n break;\n default:\n break;\n }\n\n return valid ? { x, y } : null;\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ function computeGraphBounds(nodes) {
2
+ if (!nodes.length)
3
+ return null;
4
+ let minX = Infinity;
5
+ let minY = Infinity;
6
+ let maxX = -Infinity;
7
+ let maxY = -Infinity;
8
+ for (const node of nodes) {
9
+ if (node.x === null || node.x === undefined || node.y === null || node.y === undefined)
10
+ continue;
11
+ if (node.visible === false)
12
+ continue;
13
+ let radius = node._radius;
14
+ radius ??= Math.max(node._width ?? 0, node._height ?? 0) / 2;
15
+ minX = Math.min(minX, node.x - radius);
16
+ minY = Math.min(minY, node.y - radius);
17
+ maxX = Math.max(maxX, node.x + radius);
18
+ maxY = Math.max(maxY, node.y + radius);
19
+ }
20
+ if (!isFinite(minX))
21
+ return null;
22
+ return { minX, minY, maxX, maxY };
23
+ }
24
+
25
+ export { computeGraphBounds };
26
+ //# sourceMappingURL=compute-graph-bounds.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compute-graph-bounds.js","sources":["../../../../../../src/module/GraphCanvas/lib/utils/compute-graph-bounds.ts"],"sourcesContent":["import type { NodeInterface } from \"../../types\";\n\nexport interface GraphBounds {\n minX: number;\n minY: number;\n maxX: number;\n maxY: number;\n}\n\nexport function computeGraphBounds<NodeData extends Record<string, unknown>>(\n nodes: NodeInterface<NodeData>[],\n): GraphBounds | null {\n if (!nodes.length) return null;\n\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n\n for (const node of nodes) {\n if (node.x === null || node.x === undefined || node.y === null || node.y === undefined)\n continue;\n if (node.visible === false) continue;\n\n let radius = node._radius;\n radius ??= Math.max(node._width ?? 0, node._height ?? 0) / 2;\n minX = Math.min(minX, node.x - radius);\n minY = Math.min(minY, node.y - radius);\n maxX = Math.max(maxX, node.x + radius);\n maxY = Math.max(maxY, node.y + radius);\n }\n\n if (!isFinite(minX)) return null;\n\n return { minX, minY, maxX, maxY };\n}\n"],"names":[],"mappings":"AASM,SAAU,kBAAkB,CAChC,KAAgC,EAAA;IAEhC,IAAI,CAAC,KAAK,CAAC,MAAM;AAAE,QAAA,OAAO,IAAI;IAE9B,IAAI,IAAI,GAAG,QAAQ;IACnB,IAAI,IAAI,GAAG,QAAQ;AACnB,IAAA,IAAI,IAAI,GAAG,CAAC,QAAQ;AACpB,IAAA,IAAI,IAAI,GAAG,CAAC,QAAQ;AAEpB,IAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;QACxB,IAAI,IAAI,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,KAAK,SAAS,IAAI,IAAI,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,KAAK,SAAS;YACpF;AACF,QAAA,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK;YAAE;AAE5B,QAAA,IAAI,MAAM,GAAG,IAAI,CAAC,OAAO;AACzB,QAAA,MAAM,KAAK,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,GAAG,CAAC;AAC5D,QAAA,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC;AACtC,QAAA,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC;AACtC,QAAA,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC;AACtC,QAAA,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC;;AAGxC,IAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;AAAE,QAAA,OAAO,IAAI;IAEhC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;AACnC;;;;"}