@krainovsd/graph 0.10.0-rc4 → 0.10.0-rc6

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 (79) hide show
  1. package/lib/cjs/index.cjs +1909 -1321
  2. package/lib/cjs/index.cjs.map +1 -1
  3. package/lib/esm/constants/force-controls.js +141 -0
  4. package/lib/esm/constants/force-controls.js.map +1 -0
  5. package/lib/esm/constants/graph-controls.js +25 -0
  6. package/lib/esm/constants/graph-controls.js.map +1 -0
  7. package/lib/esm/constants/highlight-controls.js +452 -0
  8. package/lib/esm/constants/highlight-controls.js.map +1 -0
  9. package/lib/esm/constants/link-controls.js +219 -0
  10. package/lib/esm/constants/link-controls.js.map +1 -0
  11. package/lib/esm/constants/node-controls.js +345 -0
  12. package/lib/esm/constants/node-controls.js.map +1 -0
  13. package/lib/esm/index.js +24 -3
  14. package/lib/esm/index.js.map +1 -1
  15. package/lib/esm/lib/fade-rgb.js.map +1 -1
  16. package/lib/esm/lib/rgb-animation-by-progress.js.map +1 -1
  17. package/lib/esm/module/GraphCanvas/GraphCanvas.js +29 -32
  18. package/lib/esm/module/GraphCanvas/GraphCanvas.js.map +1 -1
  19. package/lib/esm/module/GraphCanvas/constants/common-settings.js +7 -0
  20. package/lib/esm/module/GraphCanvas/constants/common-settings.js.map +1 -0
  21. package/lib/esm/module/GraphCanvas/constants/force-settings.js +29 -0
  22. package/lib/esm/module/GraphCanvas/constants/force-settings.js.map +1 -0
  23. package/lib/esm/module/GraphCanvas/constants/graph-settings.js +19 -0
  24. package/lib/esm/module/GraphCanvas/constants/graph-settings.js.map +1 -0
  25. package/lib/esm/module/GraphCanvas/constants/highlight-settings.js +62 -0
  26. package/lib/esm/module/GraphCanvas/constants/highlight-settings.js.map +1 -0
  27. package/lib/esm/module/GraphCanvas/constants/link-settings.js +31 -0
  28. package/lib/esm/module/GraphCanvas/constants/link-settings.js.map +1 -0
  29. package/lib/esm/module/GraphCanvas/constants/node-settings.js +50 -0
  30. package/lib/esm/module/GraphCanvas/constants/node-settings.js.map +1 -0
  31. package/lib/esm/module/GraphCanvas/lib/settings/force-settings-getter.js +3 -1
  32. package/lib/esm/module/GraphCanvas/lib/settings/force-settings-getter.js.map +1 -1
  33. package/lib/esm/module/GraphCanvas/lib/settings/graph-settings-getter.js +1 -1
  34. package/lib/esm/module/GraphCanvas/lib/settings/graph-settings-getter.js.map +1 -1
  35. package/lib/esm/module/GraphCanvas/lib/settings/highlight-settings-getter.js +13 -0
  36. package/lib/esm/module/GraphCanvas/lib/settings/highlight-settings-getter.js.map +1 -0
  37. package/lib/esm/module/GraphCanvas/lib/settings/link-settings-getter.js +13 -11
  38. package/lib/esm/module/GraphCanvas/lib/settings/link-settings-getter.js.map +1 -1
  39. package/lib/esm/module/GraphCanvas/lib/settings/node-settings-getter.js +22 -20
  40. package/lib/esm/module/GraphCanvas/lib/settings/node-settings-getter.js.map +1 -1
  41. package/lib/esm/module/GraphCanvas/lib/utils/calculate-link-position-by-node.js +8 -4
  42. package/lib/esm/module/GraphCanvas/lib/utils/calculate-link-position-by-node.js.map +1 -1
  43. package/lib/esm/module/GraphCanvas/lib/utils/drag-place-coefficient-getter.js.map +1 -1
  44. package/lib/esm/module/GraphCanvas/lib/utils/get-particle-position.js.map +1 -1
  45. package/lib/esm/module/GraphCanvas/lib/utils/is-node-visible.js +3 -1
  46. package/lib/esm/module/GraphCanvas/lib/utils/is-node-visible.js.map +1 -1
  47. package/lib/esm/module/GraphCanvas/lib/utils/is-overlaps-node.js.map +1 -1
  48. package/lib/esm/module/GraphCanvas/lib/utils/link-by-pointer-getter.js +2 -2
  49. package/lib/esm/module/GraphCanvas/lib/utils/link-by-pointer-getter.js.map +1 -1
  50. package/lib/esm/module/GraphCanvas/lib/utils/link-highlight.js +66 -0
  51. package/lib/esm/module/GraphCanvas/lib/utils/link-highlight.js.map +1 -0
  52. package/lib/esm/module/GraphCanvas/lib/utils/link-iteration-extractor.js +2 -3
  53. package/lib/esm/module/GraphCanvas/lib/utils/link-iteration-extractor.js.map +1 -1
  54. package/lib/esm/module/GraphCanvas/lib/utils/node-by-pointer-getter.js.map +1 -1
  55. package/lib/esm/module/GraphCanvas/lib/utils/node-highlight.js +115 -0
  56. package/lib/esm/module/GraphCanvas/lib/utils/node-highlight.js.map +1 -0
  57. package/lib/esm/module/GraphCanvas/lib/utils/node-iteration-extractor.js +2 -3
  58. package/lib/esm/module/GraphCanvas/lib/utils/node-iteration-extractor.js.map +1 -1
  59. package/lib/esm/module/GraphCanvas/slices/draw-links.js +90 -60
  60. package/lib/esm/module/GraphCanvas/slices/draw-links.js.map +1 -1
  61. package/lib/esm/module/GraphCanvas/slices/draw-nodes.js +214 -135
  62. package/lib/esm/module/GraphCanvas/slices/draw-nodes.js.map +1 -1
  63. package/lib/esm/module/GraphCanvas/slices/draw-text.js.map +1 -1
  64. package/lib/esm/module/GraphCanvas/slices/init-dnd.js +4 -4
  65. package/lib/esm/module/GraphCanvas/slices/init-dnd.js.map +1 -1
  66. package/lib/esm/module/GraphCanvas/slices/init-draw.js +4 -15
  67. package/lib/esm/module/GraphCanvas/slices/init-draw.js.map +1 -1
  68. package/lib/esm/module/GraphCanvas/slices/init-pointer.js +17 -17
  69. package/lib/esm/module/GraphCanvas/slices/init-pointer.js.map +1 -1
  70. package/lib/esm/module/GraphCanvas/slices/init-simulation.js +21 -22
  71. package/lib/esm/module/GraphCanvas/slices/init-simulation.js.map +1 -1
  72. package/lib/esm/module/GraphCanvas/slices/init-zoom.js +1 -1
  73. package/lib/esm/module/GraphCanvas/slices/init-zoom.js.map +1 -1
  74. package/lib/index.d.ts +436 -220
  75. package/package.json +1 -1
  76. package/lib/esm/lib/get-controls-info.js +0 -915
  77. package/lib/esm/lib/get-controls-info.js.map +0 -1
  78. package/lib/esm/module/GraphCanvas/constants/settings.js +0 -158
  79. package/lib/esm/module/GraphCanvas/constants/settings.js.map +0 -1
@@ -0,0 +1,115 @@
1
+ import { colorToRgb } from '../../../../lib/color-to-rgb.js';
2
+ import { extractRgb } from '../../../../lib/extract-rgb.js';
3
+ import { fadeRgb } from '../../../../lib/fade-rgb.js';
4
+ import { rgbAnimationByProgress } from '../../../../lib/rgb-animation-by-progress.js';
5
+ import { animationByProgress } from './animation-by-progress.js';
6
+
7
+ function nodeHighlight(opts) {
8
+ let color = opts.nodeOptions.color;
9
+ let borderColor = opts.nodeOptions.borderColor;
10
+ let borderWidth = opts.nodeOptions.borderWidth;
11
+ let radiusInitial = opts.nodeOptions.radius;
12
+ let widthInitial = opts.nodeOptions.width;
13
+ let heightInitial = opts.nodeOptions.height;
14
+ let textSize = opts.nodeOptions.textSize;
15
+ let textShiftX = opts.nodeOptions.textShiftX;
16
+ let textShiftY = opts.nodeOptions.textShiftY;
17
+ let textWeight = opts.nodeOptions.textWeight;
18
+ let labelSize = opts.nodeOptions.labelSize;
19
+ let labelWeight = opts.nodeOptions.labelWeight;
20
+ let sizeCoefficient = 1;
21
+ if (opts.highlightForNodeColor) {
22
+ /** Color */
23
+ const colorRgb = extractRgb(colorToRgb(color));
24
+ const colorRgbHighlight = extractRgb(colorToRgb(opts.highlightForNodeColor));
25
+ if (colorRgb && colorRgbHighlight) {
26
+ const colorFadeAnimation = rgbAnimationByProgress(colorRgb, colorRgbHighlight, opts.highlightProgress);
27
+ color = `rgb(${colorFadeAnimation.r}, ${colorFadeAnimation.g}, ${colorFadeAnimation.b})`;
28
+ }
29
+ }
30
+ if (opts.nodeOptions.shape === "circle") {
31
+ /** Radius */
32
+ radiusInitial = animationByProgress(radiusInitial, opts.highlightForNodeSizingAdditional, opts.highlightProgress);
33
+ }
34
+ if (opts.nodeOptions.shape === "square" || opts.nodeOptions.shape === "text") {
35
+ /** Size */
36
+ sizeCoefficient = animationByProgress(sizeCoefficient, opts.highlightForNodeSizingAdditionalCoefficient, opts.highlightProgress);
37
+ widthInitial *= sizeCoefficient;
38
+ heightInitial *= sizeCoefficient;
39
+ }
40
+ if (opts.highlightForNodeBorderColor) {
41
+ /** Border Color */
42
+ const colorRgb = extractRgb(colorToRgb(borderColor));
43
+ const colorRgbHighlight = extractRgb(colorToRgb(opts.highlightForNodeBorderColor));
44
+ if (colorRgb && colorRgbHighlight) {
45
+ const colorFadeAnimation = rgbAnimationByProgress(colorRgb, colorRgbHighlight, opts.highlightProgress);
46
+ borderColor = `rgb(${colorFadeAnimation.r}, ${colorFadeAnimation.g}, ${colorFadeAnimation.b})`;
47
+ }
48
+ }
49
+ /** Border Width */
50
+ borderWidth = animationByProgress(borderWidth, opts.highlightForNodeBorderSizingAdditional, opts.highlightProgress);
51
+ /** Text Size */
52
+ textSize = animationByProgress(textSize, opts.highlightForTextSizingAdditional, opts.highlightProgress);
53
+ /** Text Shift X */
54
+ textShiftX = animationByProgress(textShiftX, opts.highlightForTextShiftXAdditional, opts.highlightProgress);
55
+ /** Text Shift Y */
56
+ textShiftY = animationByProgress(textShiftY, opts.highlightForTextShiftYAdditional, opts.highlightProgress);
57
+ /** Text Weight */
58
+ textWeight = animationByProgress(textWeight, opts.highlightForTextWeightAdditional, opts.highlightProgress);
59
+ if (opts.nodeOptions.label) {
60
+ /** Label Size */
61
+ labelSize = animationByProgress(labelSize, opts.highlightForLabelSizingAdditional, opts.highlightProgress);
62
+ /** Label Weight */
63
+ labelWeight = animationByProgress(labelWeight, opts.highlightForLabelWeightAdditional, opts.highlightProgress);
64
+ }
65
+ return {
66
+ color,
67
+ borderColor,
68
+ borderWidth,
69
+ radiusInitial,
70
+ widthInitial,
71
+ heightInitial,
72
+ textSize,
73
+ textShiftX,
74
+ textShiftY,
75
+ textWeight,
76
+ labelSize,
77
+ labelWeight,
78
+ sizeCoefficient,
79
+ };
80
+ }
81
+ function nodeFade(opts) {
82
+ let alpha = opts.nodeOptions.alpha;
83
+ let color = opts.nodeOptions.color;
84
+ let textAlpha = opts.nodeOptions.textAlpha;
85
+ let labelAlpha = opts.nodeOptions.labelAlpha;
86
+ /** Alpha */
87
+ const alphaMin = opts.highlightForNodeFadingMin < alpha ? opts.highlightForNodeFadingMin : alpha;
88
+ alpha = animationByProgress(alphaMin, alpha - alphaMin, 1 - opts.highlightProgress);
89
+ /** Text Alpha */
90
+ const textAlphaMin = opts.highlightForTextFadingMin < textAlpha ? opts.highlightForTextFadingMin : textAlpha;
91
+ textAlpha = animationByProgress(textAlphaMin, textAlpha - textAlphaMin, 1 - opts.highlightProgress);
92
+ if (opts.nodeOptions.label) {
93
+ /** Label Alpha */
94
+ const labelAlphaMin = opts.highlightForLabelFadingMin < labelAlpha ? opts.highlightForLabelFadingMin : labelAlpha;
95
+ labelAlpha = animationByProgress(labelAlphaMin, labelAlpha - labelAlphaMin, 1 - opts.highlightProgress);
96
+ }
97
+ if (opts.highlightForNodeColorFading) {
98
+ /** Color Fading */
99
+ const colorRgb = extractRgb(colorToRgb(color));
100
+ if (colorRgb) {
101
+ const colorRgbFade = fadeRgb(colorRgb, opts.highlightForNodeColorFadingMin);
102
+ const colorFadeAnimation = rgbAnimationByProgress(colorRgb, colorRgbFade, opts.highlightProgress);
103
+ color = `rgb(${colorFadeAnimation.r}, ${colorFadeAnimation.g}, ${colorFadeAnimation.b})`;
104
+ }
105
+ }
106
+ return {
107
+ alpha,
108
+ color,
109
+ textAlpha,
110
+ labelAlpha,
111
+ };
112
+ }
113
+
114
+ export { nodeFade, nodeHighlight };
115
+ //# sourceMappingURL=node-highlight.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-highlight.js","sources":["../../../../../../src/module/GraphCanvas/lib/utils/node-highlight.ts"],"sourcesContent":["import { colorToRgb, extractRgb, fadeRgb, rgbAnimationByProgress } from \"@/lib\";\nimport type { NodeOptionsInterface } from \"../../types\";\nimport { animationByProgress } from \"./animation-by-progress\";\n\ntype NodeHighlightOptions<\n NodeData extends Record<string, unknown>,\n LinkData extends Record<string, unknown>,\n> = {\n nodeOptions: Required<NodeOptionsInterface<NodeData, LinkData>>;\n highlightProgress: number;\n highlightForNodeColor: string | null;\n highlightForNodeSizingAdditional: number;\n highlightForNodeSizingAdditionalCoefficient: number;\n highlightForNodeBorderColor: string | null;\n highlightForNodeBorderSizingAdditional: number;\n highlightForTextSizingAdditional: number;\n highlightForTextShiftXAdditional: number;\n highlightForTextShiftYAdditional: number;\n highlightForTextWeightAdditional: number;\n highlightForLabelSizingAdditional: number;\n highlightForLabelWeightAdditional: number;\n};\n\nexport function nodeHighlight<\n NodeData extends Record<string, unknown>,\n LinkData extends Record<string, unknown>,\n>(opts: NodeHighlightOptions<NodeData, LinkData>) {\n let color = opts.nodeOptions.color;\n let borderColor = opts.nodeOptions.borderColor;\n let borderWidth = opts.nodeOptions.borderWidth;\n let radiusInitial = opts.nodeOptions.radius;\n let widthInitial = opts.nodeOptions.width;\n let heightInitial = opts.nodeOptions.height;\n let textSize = opts.nodeOptions.textSize;\n let textShiftX = opts.nodeOptions.textShiftX;\n let textShiftY = opts.nodeOptions.textShiftY;\n let textWeight = opts.nodeOptions.textWeight;\n let labelSize = opts.nodeOptions.labelSize;\n let labelWeight = opts.nodeOptions.labelWeight;\n let sizeCoefficient = 1;\n\n if (opts.highlightForNodeColor) {\n /** Color */\n const colorRgb = extractRgb(colorToRgb(color));\n const colorRgbHighlight = extractRgb(colorToRgb(opts.highlightForNodeColor));\n if (colorRgb && colorRgbHighlight) {\n const colorFadeAnimation = rgbAnimationByProgress(\n colorRgb,\n colorRgbHighlight,\n opts.highlightProgress,\n );\n color = `rgb(${colorFadeAnimation.r}, ${colorFadeAnimation.g}, ${colorFadeAnimation.b})`;\n }\n }\n if (opts.nodeOptions.shape === \"circle\") {\n /** Radius */\n radiusInitial = animationByProgress(\n radiusInitial,\n opts.highlightForNodeSizingAdditional,\n opts.highlightProgress,\n );\n }\n if (opts.nodeOptions.shape === \"square\" || opts.nodeOptions.shape === \"text\") {\n /** Size */\n sizeCoefficient = animationByProgress(\n sizeCoefficient,\n opts.highlightForNodeSizingAdditionalCoefficient,\n opts.highlightProgress,\n );\n\n widthInitial *= sizeCoefficient;\n heightInitial *= sizeCoefficient;\n }\n\n if (opts.highlightForNodeBorderColor) {\n /** Border Color */\n const colorRgb = extractRgb(colorToRgb(borderColor));\n const colorRgbHighlight = extractRgb(colorToRgb(opts.highlightForNodeBorderColor));\n if (colorRgb && colorRgbHighlight) {\n const colorFadeAnimation = rgbAnimationByProgress(\n colorRgb,\n colorRgbHighlight,\n opts.highlightProgress,\n );\n borderColor = `rgb(${colorFadeAnimation.r}, ${colorFadeAnimation.g}, ${colorFadeAnimation.b})`;\n }\n }\n /** Border Width */\n borderWidth = animationByProgress(\n borderWidth,\n opts.highlightForNodeBorderSizingAdditional,\n opts.highlightProgress,\n );\n\n /** Text Size */\n textSize = animationByProgress(\n textSize,\n opts.highlightForTextSizingAdditional,\n opts.highlightProgress,\n );\n /** Text Shift X */\n textShiftX = animationByProgress(\n textShiftX,\n opts.highlightForTextShiftXAdditional,\n opts.highlightProgress,\n );\n /** Text Shift Y */\n textShiftY = animationByProgress(\n textShiftY,\n opts.highlightForTextShiftYAdditional,\n opts.highlightProgress,\n );\n /** Text Weight */\n textWeight = animationByProgress(\n textWeight,\n opts.highlightForTextWeightAdditional,\n opts.highlightProgress,\n );\n\n if (opts.nodeOptions.label) {\n /** Label Size */\n labelSize = animationByProgress(\n labelSize,\n opts.highlightForLabelSizingAdditional,\n opts.highlightProgress,\n );\n /** Label Weight */\n labelWeight = animationByProgress(\n labelWeight,\n opts.highlightForLabelWeightAdditional,\n opts.highlightProgress,\n );\n }\n\n return {\n color,\n borderColor,\n borderWidth,\n radiusInitial,\n widthInitial,\n heightInitial,\n textSize,\n textShiftX,\n textShiftY,\n textWeight,\n labelSize,\n labelWeight,\n sizeCoefficient,\n };\n}\n\ntype NodeFadingOptions<\n NodeData extends Record<string, unknown>,\n LinkData extends Record<string, unknown>,\n> = {\n nodeOptions: Required<NodeOptionsInterface<NodeData, LinkData>>;\n highlightProgress: number;\n highlightForNodeFadingMin: number;\n highlightForTextFadingMin: number;\n highlightForLabelFadingMin: number;\n highlightForNodeColorFading: boolean;\n highlightForNodeColorFadingMin: number;\n};\nexport function nodeFade<\n NodeData extends Record<string, unknown>,\n LinkData extends Record<string, unknown>,\n>(opts: NodeFadingOptions<NodeData, LinkData>) {\n let alpha = opts.nodeOptions.alpha;\n let color = opts.nodeOptions.color;\n let textAlpha = opts.nodeOptions.textAlpha;\n let labelAlpha = opts.nodeOptions.labelAlpha;\n\n /** Alpha */\n const alphaMin = opts.highlightForNodeFadingMin < alpha ? opts.highlightForNodeFadingMin : alpha;\n alpha = animationByProgress(alphaMin, alpha - alphaMin, 1 - opts.highlightProgress);\n /** Text Alpha */\n const textAlphaMin =\n opts.highlightForTextFadingMin < textAlpha ? opts.highlightForTextFadingMin : textAlpha;\n textAlpha = animationByProgress(\n textAlphaMin,\n textAlpha - textAlphaMin,\n 1 - opts.highlightProgress,\n );\n if (opts.nodeOptions.label) {\n /** Label Alpha */\n const labelAlphaMin =\n opts.highlightForLabelFadingMin < labelAlpha ? opts.highlightForLabelFadingMin : labelAlpha;\n labelAlpha = animationByProgress(\n labelAlphaMin,\n labelAlpha - labelAlphaMin,\n 1 - opts.highlightProgress,\n );\n }\n if (opts.highlightForNodeColorFading) {\n /** Color Fading */\n const colorRgb = extractRgb(colorToRgb(color));\n if (colorRgb) {\n const colorRgbFade = fadeRgb(colorRgb, opts.highlightForNodeColorFadingMin);\n const colorFadeAnimation = rgbAnimationByProgress(\n colorRgb,\n colorRgbFade,\n opts.highlightProgress,\n );\n color = `rgb(${colorFadeAnimation.r}, ${colorFadeAnimation.g}, ${colorFadeAnimation.b})`;\n }\n }\n\n return {\n alpha,\n color,\n textAlpha,\n labelAlpha,\n };\n}\n"],"names":[],"mappings":"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"}
@@ -1,12 +1,11 @@
1
1
  import { checkType } from '../../../../lib/check-type.js';
2
2
  import '@krainovsd/js-helpers';
3
- import 'd3-array';
4
3
 
5
4
  function nodeIterationExtractor(node, i, nodes, state, option, optionConstantGetter) {
6
5
  let customOptions;
7
6
  let constantOptions;
8
7
  if (typeof option === "function")
9
- customOptions = option(node, i, nodes, state);
8
+ customOptions = option.call(state, node, i, nodes);
10
9
  else
11
10
  customOptions = option;
12
11
  if (customOptions && typeof customOptions === "object" && !Array.isArray(customOptions)) {
@@ -17,7 +16,7 @@ function nodeIterationExtractor(node, i, nodes, state, option, optionConstantGet
17
16
  }
18
17
  if (optionConstantGetter) {
19
18
  if (typeof optionConstantGetter === "function")
20
- constantOptions = optionConstantGetter(node, i, nodes, state);
19
+ constantOptions = optionConstantGetter.call(state, node, i, nodes);
21
20
  else
22
21
  constantOptions = optionConstantGetter;
23
22
  if (constantOptions &&
@@ -1 +1 @@
1
- {"version":3,"file":"node-iteration-extractor.js","sources":["../../../../../../src/module/GraphCanvas/lib/utils/node-iteration-extractor.ts"],"sourcesContent":["import { checkType } from \"@/lib\";\nimport type { NodeInterface } from \"@/types\";\nimport type { GraphState, NodeIterationPropsInterface } from \"../../types\";\n\nexport function nodeIterationExtractor<\n NodeData extends Record<string, unknown>,\n LinkData extends Record<string, unknown>,\n Result extends string | number | boolean | Record<string, unknown> | unknown[] | undefined | null,\n>(\n node: NodeInterface<NodeData>,\n i: number,\n nodes: NodeInterface<NodeData>[],\n state: GraphState<NodeData, LinkData>,\n option: NodeIterationPropsInterface<NodeData, LinkData, Result> | Result,\n optionConstantGetter: undefined,\n): Result;\nexport function nodeIterationExtractor<\n NodeData extends Record<string, unknown>,\n LinkData extends Record<string, unknown>,\n Result extends string | number | boolean | Record<string, unknown> | unknown[] | undefined | null,\n>(\n node: NodeInterface<NodeData>,\n i: number,\n nodes: NodeInterface<NodeData>[],\n state: GraphState<NodeData, LinkData>,\n option: NodeIterationPropsInterface<NodeData, LinkData, Result> | Result,\n optionConstantGetter: NodeIterationPropsInterface<NodeData, LinkData, Result> | Result,\n): Required<Result>;\nexport function nodeIterationExtractor<\n NodeData extends Record<string, unknown>,\n LinkData extends Record<string, unknown>,\n Result extends string | number | boolean | Record<string, unknown> | unknown[] | undefined | null,\n>(\n node: NodeInterface<NodeData>,\n i: number,\n nodes: NodeInterface<NodeData>[],\n state: GraphState<NodeData, LinkData>,\n option: NodeIterationPropsInterface<NodeData, LinkData, Result> | Result,\n optionConstantGetter:\n | NodeIterationPropsInterface<NodeData, LinkData, Result>\n | Result\n | undefined,\n) {\n let customOptions: Result | undefined;\n let constantOptions: Result | undefined;\n\n if (typeof option === \"function\") customOptions = option(node, i, nodes, state);\n else customOptions = option;\n\n if (customOptions && typeof customOptions === \"object\" && !Array.isArray(customOptions)) {\n for (const key in customOptions) {\n if (customOptions[key] === undefined) delete customOptions[key];\n }\n }\n\n if (optionConstantGetter) {\n if (typeof optionConstantGetter === \"function\")\n constantOptions = optionConstantGetter(node, i, nodes, state);\n else constantOptions = optionConstantGetter;\n\n if (\n constantOptions &&\n typeof constantOptions === \"object\" &&\n !Array.isArray(constantOptions) &&\n checkType<Record<string, unknown> | undefined>(\n customOptions,\n customOptions === undefined ||\n (typeof customOptions === \"object\" && !Array.isArray(customOptions)),\n )\n ) {\n return {\n ...(constantOptions as Record<string, unknown> | undefined),\n ...(customOptions as Record<string, unknown> | undefined),\n } as Result;\n }\n }\n\n return customOptions;\n}\n"],"names":[],"mappings":";;;;AA4BgB,SAAA,sBAAsB,CAKpC,IAA6B,EAC7B,CAAS,EACT,KAAgC,EAChC,KAAqC,EACrC,MAAwE,EACxE,oBAGa,EAAA;AAEb,IAAA,IAAI,aAAiC;AACrC,IAAA,IAAI,eAAmC;IAEvC,IAAI,OAAO,MAAM,KAAK,UAAU;QAAE,aAAa,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC;;QAC1E,aAAa,GAAG,MAAM;AAE3B,IAAA,IAAI,aAAa,IAAI,OAAO,aAAa,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE;AACvF,QAAA,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE;AAC/B,YAAA,IAAI,aAAa,CAAC,GAAG,CAAC,KAAK,SAAS;AAAE,gBAAA,OAAO,aAAa,CAAC,GAAG,CAAC;;;IAInE,IAAI,oBAAoB,EAAE;QACxB,IAAI,OAAO,oBAAoB,KAAK,UAAU;YAC5C,eAAe,GAAG,oBAAoB,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC;;YAC1D,eAAe,GAAG,oBAAoB;AAE3C,QAAA,IACE,eAAe;YACf,OAAO,eAAe,KAAK,QAAQ;AACnC,YAAA,CAAC,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC;AAC/B,YAAA,SAAS,CACP,aAAa,EACb,aAAa,KAAK,SAAS;AACzB,iBAAC,OAAO,aAAa,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CACvE,EACD;YACA,OAAO;AACL,gBAAA,GAAI,eAAuD;AAC3D,gBAAA,GAAI,aAAqD;aAChD;;;AAIf,IAAA,OAAO,aAAa;AACtB;;;;"}
1
+ {"version":3,"file":"node-iteration-extractor.js","sources":["../../../../../../src/module/GraphCanvas/lib/utils/node-iteration-extractor.ts"],"sourcesContent":["import { checkType } from \"@/lib\";\nimport type { GraphCanvas } from \"../../GraphCanvas\";\nimport type { NodeInterface, NodeIterationPropsInterface } from \"../../types\";\n\nexport function nodeIterationExtractor<\n NodeData extends Record<string, unknown>,\n LinkData extends Record<string, unknown>,\n Result extends string | number | boolean | Record<string, unknown> | unknown[] | undefined | null,\n>(\n node: NodeInterface<NodeData>,\n i: number,\n nodes: NodeInterface<NodeData>[],\n state: GraphCanvas<NodeData, LinkData>,\n option: NodeIterationPropsInterface<NodeData, LinkData, Result> | Result,\n optionConstantGetter: undefined,\n): Result;\nexport function nodeIterationExtractor<\n NodeData extends Record<string, unknown>,\n LinkData extends Record<string, unknown>,\n Result extends string | number | boolean | Record<string, unknown> | unknown[] | undefined | null,\n>(\n node: NodeInterface<NodeData>,\n i: number,\n nodes: NodeInterface<NodeData>[],\n state: GraphCanvas<NodeData, LinkData>,\n option: NodeIterationPropsInterface<NodeData, LinkData, Result> | Result,\n optionConstantGetter: NodeIterationPropsInterface<NodeData, LinkData, Result> | Result,\n): Required<Result>;\nexport function nodeIterationExtractor<\n NodeData extends Record<string, unknown>,\n LinkData extends Record<string, unknown>,\n Result extends string | number | boolean | Record<string, unknown> | unknown[] | undefined | null,\n>(\n node: NodeInterface<NodeData>,\n i: number,\n nodes: NodeInterface<NodeData>[],\n state: GraphCanvas<NodeData, LinkData>,\n option: NodeIterationPropsInterface<NodeData, LinkData, Result> | Result,\n optionConstantGetter:\n | NodeIterationPropsInterface<NodeData, LinkData, Result>\n | Result\n | undefined,\n) {\n let customOptions: Result | undefined;\n let constantOptions: Result | undefined;\n\n if (typeof option === \"function\") customOptions = option.call(state, node, i, nodes);\n else customOptions = option;\n\n if (customOptions && typeof customOptions === \"object\" && !Array.isArray(customOptions)) {\n for (const key in customOptions) {\n if (customOptions[key] === undefined) delete customOptions[key];\n }\n }\n\n if (optionConstantGetter) {\n if (typeof optionConstantGetter === \"function\")\n constantOptions = optionConstantGetter.call(state, node, i, nodes);\n else constantOptions = optionConstantGetter;\n\n if (\n constantOptions &&\n typeof constantOptions === \"object\" &&\n !Array.isArray(constantOptions) &&\n checkType<Record<string, unknown> | undefined>(\n customOptions,\n customOptions === undefined ||\n (typeof customOptions === \"object\" && !Array.isArray(customOptions)),\n )\n ) {\n return {\n ...(constantOptions as Record<string, unknown> | undefined),\n ...(customOptions as Record<string, unknown> | undefined),\n } as Result;\n }\n }\n\n return customOptions;\n}\n"],"names":[],"mappings":";;;AA4BgB,SAAA,sBAAsB,CAKpC,IAA6B,EAC7B,CAAS,EACT,KAAgC,EAChC,KAAsC,EACtC,MAAwE,EACxE,oBAGa,EAAA;AAEb,IAAA,IAAI,aAAiC;AACrC,IAAA,IAAI,eAAmC;IAEvC,IAAI,OAAO,MAAM,KAAK,UAAU;AAAE,QAAA,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC;;QAC/E,aAAa,GAAG,MAAM;AAE3B,IAAA,IAAI,aAAa,IAAI,OAAO,aAAa,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE;AACvF,QAAA,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE;AAC/B,YAAA,IAAI,aAAa,CAAC,GAAG,CAAC,KAAK,SAAS;AAAE,gBAAA,OAAO,aAAa,CAAC,GAAG,CAAC;;;IAInE,IAAI,oBAAoB,EAAE;QACxB,IAAI,OAAO,oBAAoB,KAAK,UAAU;AAC5C,YAAA,eAAe,GAAG,oBAAoB,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC;;YAC/D,eAAe,GAAG,oBAAoB;AAE3C,QAAA,IACE,eAAe;YACf,OAAO,eAAe,KAAK,QAAQ;AACnC,YAAA,CAAC,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC;AAC/B,YAAA,SAAS,CACP,aAAa,EACb,aAAa,KAAK,SAAS;AACzB,iBAAC,OAAO,aAAa,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CACvE,EACD;YACA,OAAO;AACL,gBAAA,GAAI,eAAuD;AAC3D,gBAAA,GAAI,aAAqD;aAChD;;;AAIf,IAAA,OAAO,aAAa;AACtB;;;;"}
@@ -3,10 +3,10 @@ import '@krainovsd/js-helpers';
3
3
  import { linkIterationExtractor } from '../lib/utils/link-iteration-extractor.js';
4
4
  import 'd3-array';
5
5
  import { calculateLinkPositionByNode } from '../lib/utils/calculate-link-position-by-node.js';
6
- import { animationByProgress } from '../lib/utils/animation-by-progress.js';
7
6
  import { getParticlePosition } from '../lib/utils/get-particle-position.js';
7
+ import { linkFade, linkHighlight } from '../lib/utils/link-highlight.js';
8
8
 
9
- function getDrawLink(state) {
9
+ function getDrawLink() {
10
10
  return function drawLink(link, index) {
11
11
  if (!this.context ||
12
12
  typeof link.source !== "object" ||
@@ -20,88 +20,114 @@ function getDrawLink(state) {
20
20
  return;
21
21
  const id = `${link.target.id}${link.source.id}`;
22
22
  let linkOptions;
23
- if (this.linkSettings.cache && this.linkOptionsCache[id]) {
23
+ if (this.linkSettings.cacheOptions && this.linkOptionsCache[id]) {
24
24
  linkOptions = this.linkOptionsCache[id];
25
25
  }
26
26
  else {
27
- linkOptions = linkIterationExtractor(link, index, this.links, state, this.linkSettings.options ?? {}, linkOptionsGetter);
28
- if (this.linkSettings.cache) {
27
+ linkOptions = linkIterationExtractor(link, index, this.links, this, this.linkSettings.options ?? {}, linkOptionsGetter);
28
+ if (this.linkSettings.cacheOptions) {
29
29
  this.linkOptionsCache[id] = linkOptions;
30
30
  }
31
31
  }
32
32
  if (linkOptions.drawLink) {
33
- linkOptions.drawLink(link, linkOptions, state);
33
+ linkOptions.drawLink.call(this, link, linkOptions);
34
34
  return;
35
35
  }
36
36
  let alpha = linkOptions.alpha;
37
+ let color = linkOptions.color;
38
+ let width = linkOptions.width;
37
39
  let arrowAlpha = this.linkSettings.arrowByHighlight ? 0 : linkOptions.arrowAlpha;
38
- /** NODE HIGHLIGHT */
40
+ let arrowColor = linkOptions.arrowColor;
41
+ let arrowSize = linkOptions.arrowSize;
42
+ let arrowBorderWidth = linkOptions.arrowBorderWidth;
43
+ let arrowBorderColor = linkOptions.arrowBorderColor;
44
+ /** Highlight */
39
45
  if (this.highlightedNeighbors && this.highlightedNode) {
40
- /** Not highlighted */
46
+ /** By Node Not Highlight */
41
47
  if (this.highlightedNode.id != link.source.id && this.highlightedNode.id != link.target.id) {
42
- if (this.linkSettings.highlightByNodeLinkFading) {
43
- const min = this.linkSettings.highlightByNodeLinkFadingMin < alpha
44
- ? this.linkSettings.highlightByNodeLinkFadingMin
45
- : alpha;
46
- alpha = animationByProgress(min, alpha - min, 1 - this.highlightProgress);
47
- }
48
- if (this.linkSettings.arrow &&
49
- this.linkSettings.highlightByNodeArrowFading &&
50
- !this.linkSettings.arrowByHighlight) {
51
- const min = this.linkSettings.highlightByNodeArrowFadingMin < arrowAlpha
52
- ? this.linkSettings.highlightByNodeArrowFadingMin
53
- : arrowAlpha;
54
- arrowAlpha = animationByProgress(min, arrowAlpha - min, 1 - this.highlightProgress);
55
- }
48
+ const fadeOptions = linkFade({
49
+ arrow: this.linkSettings.arrow,
50
+ arrowByHighlight: this.linkSettings.arrowByHighlight,
51
+ linkOptions,
52
+ highlightProgress: this.highlightProgress,
53
+ highlightForArrowFadingMin: this.highlightSettings.highlightByNodeForArrowFadingMin,
54
+ highlightForLinkFadingMin: this.highlightSettings.highlightByNodeForLinkFadingMin,
55
+ });
56
+ alpha = fadeOptions.alpha;
57
+ arrowAlpha = fadeOptions.arrowAlpha;
56
58
  }
57
59
  else {
58
- // eslint-disable-next-line no-lonely-if
59
- if (this.linkSettings.arrow && this.linkSettings.arrowByHighlight) {
60
- /** Highlighted */
61
- arrowAlpha = animationByProgress(0, linkOptions.arrowAlpha, this.highlightProgress);
62
- }
60
+ const highlightOptions = linkHighlight({
61
+ arrow: this.linkSettings.arrow,
62
+ arrowByHighlight: this.linkSettings.arrowByHighlight,
63
+ linkOptions,
64
+ highlightProgress: this.highlightProgress,
65
+ highlightForArrowBorderColor: this.highlightSettings.highlightByNodeForArrowBorderColor,
66
+ highlightForArrowBorderSizingAdditional: this.highlightSettings.highlightByNodeForArrowBorderSizingAdditional,
67
+ highlightForArrowColor: this.highlightSettings.highlightByNodeForArrowColor,
68
+ highlightForArrowSizeAdditional: this.highlightSettings.highlightByNodeForArrowSizeAdditional,
69
+ highlightForLinkColor: this.highlightSettings.highlightByNodeForLinkColor,
70
+ highlightForLinkSizeAdditional: this.highlightSettings.highlightByNodeForLinkSizeAdditional,
71
+ });
72
+ arrowAlpha = highlightOptions.arrowAlpha;
73
+ color = highlightOptions.color;
74
+ width = highlightOptions.width;
75
+ arrowColor = highlightOptions.arrowColor;
76
+ arrowSize = highlightOptions.arrowSize;
77
+ arrowBorderWidth = highlightOptions.arrowBorderWidth;
78
+ arrowBorderColor = highlightOptions.arrowBorderColor;
63
79
  }
64
80
  }
65
- /** LINK HIGHLIGHT */
66
81
  if (this.highlightedNeighbors && this.highlightedLink) {
67
- /** Not highlighted */
82
+ /** By Link Not Highlight */
68
83
  if (this.highlightedLink !== link) {
69
- if (this.linkSettings.highlightByLinkLinkFading) {
70
- const min = this.linkSettings.highlightByLinkLinkFadingMin < alpha
71
- ? this.linkSettings.highlightByLinkLinkFadingMin
72
- : alpha;
73
- alpha = animationByProgress(min, alpha - min, 1 - this.highlightProgress);
74
- }
75
- if (this.linkSettings.arrow &&
76
- this.linkSettings.highlightByLinkArrowFading &&
77
- !this.linkSettings.arrowByHighlight) {
78
- const min = this.linkSettings.highlightByLinkArrowFadingMin < arrowAlpha
79
- ? this.linkSettings.highlightByLinkArrowFadingMin
80
- : arrowAlpha;
81
- arrowAlpha = animationByProgress(min, arrowAlpha - min, 1 - this.highlightProgress);
82
- }
84
+ const fadeOptions = linkFade({
85
+ arrow: this.linkSettings.arrow,
86
+ arrowByHighlight: this.linkSettings.arrowByHighlight,
87
+ linkOptions,
88
+ highlightProgress: this.highlightProgress,
89
+ highlightForArrowFadingMin: this.highlightSettings.highlightByLinkForArrowFadingMin,
90
+ highlightForLinkFadingMin: this.highlightSettings.highlightByLinkForLinkFadingMin,
91
+ });
92
+ alpha = fadeOptions.alpha;
93
+ arrowAlpha = fadeOptions.arrowAlpha;
83
94
  }
84
95
  else {
85
- // eslint-disable-next-line no-lonely-if
86
- if (this.linkSettings.arrow && this.linkSettings.arrowByHighlight) {
87
- /** Highlighted */
88
- arrowAlpha = animationByProgress(0, linkOptions.arrowAlpha, this.highlightProgress);
89
- }
96
+ /** By Link Highlight */
97
+ const highlightOptions = linkHighlight({
98
+ arrow: this.linkSettings.arrow,
99
+ arrowByHighlight: this.linkSettings.arrowByHighlight,
100
+ linkOptions,
101
+ highlightProgress: this.highlightProgress,
102
+ highlightForArrowBorderColor: this.highlightSettings.highlightByLinkForArrowBorderColor,
103
+ highlightForArrowBorderSizingAdditional: this.highlightSettings.highlightByLinkForArrowBorderSizingAdditional,
104
+ highlightForArrowColor: this.highlightSettings.highlightByLinkForArrowColor,
105
+ highlightForArrowSizeAdditional: this.highlightSettings.highlightByLinkForArrowSizeAdditional,
106
+ highlightForLinkColor: this.highlightSettings.highlightByLinkForLinkColor,
107
+ highlightForLinkSizeAdditional: this.highlightSettings.highlightByLinkForLinkSizeAdditional,
108
+ });
109
+ arrowAlpha = highlightOptions.arrowAlpha;
110
+ color = highlightOptions.color;
111
+ width = highlightOptions.width;
112
+ arrowColor = highlightOptions.arrowColor;
113
+ arrowSize = highlightOptions.arrowSize;
114
+ arrowBorderWidth = highlightOptions.arrowBorderWidth;
115
+ arrowBorderColor = highlightOptions.arrowBorderColor;
90
116
  }
91
117
  }
92
118
  /** Link */
93
119
  this.context.beginPath();
94
120
  this.context.globalAlpha = alpha;
95
- this.context.strokeStyle = linkOptions.color;
96
- this.context.lineWidth = linkOptions.width;
121
+ this.context.strokeStyle = color;
122
+ this.context.lineWidth = width;
97
123
  let xStart = link.source.x;
98
124
  let yStart = link.source.y;
99
125
  let xEnd = link.target.x;
100
126
  let yEnd = link.target.y;
101
127
  let linkDistance = 0;
102
- if (this.linkSettings.pretty || this.linkSettings.particleFlexSpeed) {
128
+ if (this.linkSettings.prettyDraw || this.linkSettings.particleFlexSpeed) {
103
129
  const isHasArrow = this.linkSettings.arrow && arrowAlpha > 0;
104
- const position = calculateLinkPositionByNode(link, isHasArrow ? linkOptions.arrowSize : 0);
130
+ const position = calculateLinkPositionByNode(link, isHasArrow ? arrowSize : 0);
105
131
  if (position) {
106
132
  xStart = position.x1;
107
133
  xEnd = position.x2;
@@ -171,7 +197,9 @@ function getDrawLink(state) {
171
197
  this.context.arc(particle.x, particle.y, linkOptions.particleRadius, 0, Math.PI * 2);
172
198
  this.context.fillStyle = linkOptions.particleColor;
173
199
  this.context.fill();
174
- this.context.stroke();
200
+ if (linkOptions.particleBorderWidth > 0) {
201
+ this.context.stroke();
202
+ }
175
203
  }
176
204
  });
177
205
  }
@@ -186,19 +214,21 @@ function getDrawLink(state) {
186
214
  };
187
215
  this.context.beginPath();
188
216
  this.context.globalAlpha = arrowAlpha;
189
- this.context.strokeStyle = linkOptions.arrowBorderColor;
190
- this.context.lineWidth = linkOptions.arrowBorderWidth;
191
- this.context.fillStyle = linkOptions.arrowColor;
217
+ this.context.strokeStyle = arrowBorderColor;
218
+ this.context.lineWidth = arrowBorderWidth;
219
+ this.context.fillStyle = arrowColor;
192
220
  const angle = Math.atan2(yEnd - yStart, xEnd - xStart);
193
221
  this.context.moveTo(xEnd, yEnd);
194
- this.context.lineTo(xEnd - linkOptions.arrowSize * Math.cos(angle - Math.PI / 6), yEnd - linkOptions.arrowSize * Math.sin(angle - Math.PI / 6));
195
- this.context.lineTo(xEnd - linkOptions.arrowSize * Math.cos(angle + Math.PI / 6), yEnd - linkOptions.arrowSize * Math.sin(angle + Math.PI / 6));
222
+ this.context.lineTo(xEnd - arrowSize * Math.cos(angle - Math.PI / 6), yEnd - arrowSize * Math.sin(angle - Math.PI / 6));
223
+ this.context.lineTo(xEnd - arrowSize * Math.cos(angle + Math.PI / 6), yEnd - arrowSize * Math.sin(angle + Math.PI / 6));
196
224
  this.context.closePath();
197
225
  this.context.fill();
198
- this.context.stroke();
226
+ if (arrowBorderWidth > 0) {
227
+ this.context.stroke();
228
+ }
199
229
  }
200
230
  if (linkOptions.drawExtraLink) {
201
- linkOptions.drawExtraLink(link, { ...linkOptions, alpha }, state);
231
+ linkOptions.drawExtraLink.call(this, link, { ...linkOptions, alpha });
202
232
  }
203
233
  };
204
234
  }
@@ -1 +1 @@
1
- {"version":3,"file":"draw-links.js","sources":["../../../../../src/module/GraphCanvas/slices/draw-links.ts"],"sourcesContent":["import type { LinkInterface } from \"@/types\";\nimport type { GraphCanvas } from \"../GraphCanvas\";\nimport {\n animationByProgress,\n calculateLinkPositionByNode,\n getParticlePosition,\n linkIterationExtractor,\n linkOptionsGetter,\n} from \"../lib\";\nimport type { GraphParticle, GraphState, LinkOptionsInterface } from \"../types\";\n\nexport function getDrawLink<\n NodeData extends Record<string, unknown>,\n LinkData extends Record<string, unknown>,\n>(state: GraphState<NodeData, LinkData>) {\n return function drawLink(\n this: GraphCanvas<NodeData, LinkData>,\n link: LinkInterface<NodeData, LinkData>,\n index: number,\n ) {\n if (\n !this.context ||\n typeof link.source !== \"object\" ||\n typeof link.target !== \"object\" ||\n !link.source.x ||\n !link.source.y ||\n !link.target.x ||\n !link.target.y\n )\n return;\n\n if (!link.source._visible && !link.target._visible) return;\n\n const id = `${link.target.id}${link.source.id}`;\n let linkOptions: Required<LinkOptionsInterface<NodeData, LinkData>>;\n if (this.linkSettings.cache && this.linkOptionsCache[id]) {\n linkOptions = this.linkOptionsCache[id];\n } else {\n linkOptions = linkIterationExtractor(\n link,\n index,\n this.links,\n state,\n this.linkSettings.options ?? {},\n linkOptionsGetter,\n );\n if (this.linkSettings.cache) {\n this.linkOptionsCache[id] = linkOptions;\n }\n }\n\n if (linkOptions.drawLink) {\n linkOptions.drawLink(link, linkOptions, state);\n\n return;\n }\n\n let alpha = linkOptions.alpha;\n let arrowAlpha = this.linkSettings.arrowByHighlight ? 0 : linkOptions.arrowAlpha;\n\n /** NODE HIGHLIGHT */\n if (this.highlightedNeighbors && this.highlightedNode) {\n /** Not highlighted */\n if (this.highlightedNode.id != link.source.id && this.highlightedNode.id != link.target.id) {\n if (this.linkSettings.highlightByNodeLinkFading) {\n const min =\n this.linkSettings.highlightByNodeLinkFadingMin < alpha\n ? this.linkSettings.highlightByNodeLinkFadingMin\n : alpha;\n alpha = animationByProgress(min, alpha - min, 1 - this.highlightProgress);\n }\n if (\n this.linkSettings.arrow &&\n this.linkSettings.highlightByNodeArrowFading &&\n !this.linkSettings.arrowByHighlight\n ) {\n const min =\n this.linkSettings.highlightByNodeArrowFadingMin < arrowAlpha\n ? this.linkSettings.highlightByNodeArrowFadingMin\n : arrowAlpha;\n arrowAlpha = animationByProgress(min, arrowAlpha - min, 1 - this.highlightProgress);\n }\n } else {\n // eslint-disable-next-line no-lonely-if\n if (this.linkSettings.arrow && this.linkSettings.arrowByHighlight) {\n /** Highlighted */\n arrowAlpha = animationByProgress(0, linkOptions.arrowAlpha, this.highlightProgress);\n }\n }\n }\n /** LINK HIGHLIGHT */\n if (this.highlightedNeighbors && this.highlightedLink) {\n /** Not highlighted */\n if (this.highlightedLink !== link) {\n if (this.linkSettings.highlightByLinkLinkFading) {\n const min =\n this.linkSettings.highlightByLinkLinkFadingMin < alpha\n ? this.linkSettings.highlightByLinkLinkFadingMin\n : alpha;\n alpha = animationByProgress(min, alpha - min, 1 - this.highlightProgress);\n }\n if (\n this.linkSettings.arrow &&\n this.linkSettings.highlightByLinkArrowFading &&\n !this.linkSettings.arrowByHighlight\n ) {\n const min =\n this.linkSettings.highlightByLinkArrowFadingMin < arrowAlpha\n ? this.linkSettings.highlightByLinkArrowFadingMin\n : arrowAlpha;\n arrowAlpha = animationByProgress(min, arrowAlpha - min, 1 - this.highlightProgress);\n }\n } else {\n // eslint-disable-next-line no-lonely-if\n if (this.linkSettings.arrow && this.linkSettings.arrowByHighlight) {\n /** Highlighted */\n arrowAlpha = animationByProgress(0, linkOptions.arrowAlpha, this.highlightProgress);\n }\n }\n }\n\n /** Link */\n this.context.beginPath();\n\n this.context.globalAlpha = alpha;\n this.context.strokeStyle = linkOptions.color;\n this.context.lineWidth = linkOptions.width;\n\n let xStart = link.source.x;\n let yStart = link.source.y;\n let xEnd = link.target.x;\n let yEnd = link.target.y;\n let linkDistance = 0;\n if (this.linkSettings.pretty || this.linkSettings.particleFlexSpeed) {\n const isHasArrow = this.linkSettings.arrow && arrowAlpha > 0;\n const position = calculateLinkPositionByNode(link, isHasArrow ? linkOptions.arrowSize : 0);\n\n if (position) {\n xStart = position.x1;\n xEnd = position.x2;\n yStart = position.y1;\n yEnd = position.y2;\n linkDistance = position.distance;\n }\n }\n this.context.moveTo(xStart, yStart);\n this.context.lineTo(xEnd, yEnd);\n this.context.stroke();\n\n /** Particle */\n if (\n this.linkSettings.particles &&\n ((this.highlightedNode &&\n (this.highlightedNode.id === link.source.id ||\n this.highlightedNode.id === link.target.id)) ||\n (this.highlightedLink && this.highlightedLink === link))\n ) {\n const particleSteps = this.linkSettings.particleFlexSpeed\n ? linkDistance <= 0\n ? 0\n : linkDistance * this.linkSettings.particleFlexSpeedCoefficient\n : linkOptions.particleSteps;\n const particleCount = linkOptions.particleCount;\n\n if (!this.particles[id]) {\n const sourceId = link.source.id;\n const targetId = link.target.id;\n\n const particles: GraphParticle[] = [];\n let prevParticle: GraphParticle | undefined;\n\n for (let i = 0; i < particleCount; i++) {\n const particle: GraphParticle = {\n step: 0,\n sourceId,\n targetId,\n prev: prevParticle,\n next: undefined,\n index: i,\n };\n if (prevParticle) prevParticle.next = particle;\n particles.push(particle);\n prevParticle = particle;\n }\n if (particles.length >= 2) {\n particles[0].prev = particles[particles.length - 1];\n particles[particles.length - 1].next = particles[0];\n }\n this.particles[id] = particles;\n }\n\n if (particleSteps !== 0) {\n this.particles[id].forEach((particle) => {\n if (!this.context) return;\n\n const distance = particleSteps / particleCount;\n getParticlePosition({\n distance,\n particle,\n totalSteps: particleSteps,\n totalCount: particleCount,\n xEnd,\n xStart,\n yEnd,\n yStart,\n });\n if (particle.x != undefined && particle.y != undefined) {\n this.context.beginPath();\n this.context.strokeStyle = linkOptions.particleBorderColor;\n this.context.lineWidth = linkOptions.particleBorderWidth;\n this.context.arc(particle.x, particle.y, linkOptions.particleRadius, 0, Math.PI * 2);\n this.context.fillStyle = linkOptions.particleColor;\n this.context.fill();\n this.context.stroke();\n }\n });\n }\n }\n\n /** Arrow */\n if (this.linkSettings.arrow && arrowAlpha > 0) {\n const {\n x1: xStart,\n x2: xEnd,\n y1: yStart,\n y2: yEnd,\n } = calculateLinkPositionByNode(link) ?? {\n x1: 0,\n x2: 0,\n y1: 0,\n y2: 0,\n };\n\n this.context.beginPath();\n this.context.globalAlpha = arrowAlpha;\n this.context.strokeStyle = linkOptions.arrowBorderColor;\n this.context.lineWidth = linkOptions.arrowBorderWidth;\n this.context.fillStyle = linkOptions.arrowColor;\n const angle = Math.atan2(yEnd - yStart, xEnd - xStart);\n this.context.moveTo(xEnd, yEnd);\n this.context.lineTo(\n xEnd - linkOptions.arrowSize * Math.cos(angle - Math.PI / 6),\n yEnd - linkOptions.arrowSize * Math.sin(angle - Math.PI / 6),\n );\n this.context.lineTo(\n xEnd - linkOptions.arrowSize * Math.cos(angle + Math.PI / 6),\n yEnd - linkOptions.arrowSize * Math.sin(angle + Math.PI / 6),\n );\n this.context.closePath();\n this.context.fill();\n this.context.stroke();\n }\n\n if (linkOptions.drawExtraLink) {\n linkOptions.drawExtraLink(link, { ...linkOptions, alpha }, state);\n }\n };\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"draw-links.js","sources":["../../../../../src/module/GraphCanvas/slices/draw-links.ts"],"sourcesContent":["import type { GraphCanvas } from \"../GraphCanvas\";\nimport {\n calculateLinkPositionByNode,\n getParticlePosition,\n linkFade,\n linkHighlight,\n linkIterationExtractor,\n linkOptionsGetter,\n} from \"../lib\";\nimport type { LinkInterface, LinkOptionsInterface, LinkParticle } from \"../types\";\n\nexport function getDrawLink<\n NodeData extends Record<string, unknown>,\n LinkData extends Record<string, unknown>,\n>() {\n return function drawLink(\n this: GraphCanvas<NodeData, LinkData>,\n link: LinkInterface<NodeData, LinkData>,\n index: number,\n ) {\n if (\n !this.context ||\n typeof link.source !== \"object\" ||\n typeof link.target !== \"object\" ||\n !link.source.x ||\n !link.source.y ||\n !link.target.x ||\n !link.target.y\n )\n return;\n\n if (!link.source._visible && !link.target._visible) return;\n\n const id = `${link.target.id}${link.source.id}`;\n let linkOptions: Required<LinkOptionsInterface<NodeData, LinkData>>;\n if (this.linkSettings.cacheOptions && this.linkOptionsCache[id]) {\n linkOptions = this.linkOptionsCache[id];\n } else {\n linkOptions = linkIterationExtractor(\n link,\n index,\n this.links,\n this,\n this.linkSettings.options ?? {},\n linkOptionsGetter,\n );\n if (this.linkSettings.cacheOptions) {\n this.linkOptionsCache[id] = linkOptions;\n }\n }\n\n if (linkOptions.drawLink) {\n linkOptions.drawLink.call(this, link, linkOptions);\n\n return;\n }\n\n let alpha = linkOptions.alpha;\n let color = linkOptions.color;\n let width = linkOptions.width;\n let arrowAlpha = this.linkSettings.arrowByHighlight ? 0 : linkOptions.arrowAlpha;\n let arrowColor = linkOptions.arrowColor;\n let arrowSize = linkOptions.arrowSize;\n let arrowBorderWidth = linkOptions.arrowBorderWidth;\n let arrowBorderColor = linkOptions.arrowBorderColor;\n\n /** Highlight */\n if (this.highlightedNeighbors && this.highlightedNode) {\n /** By Node Not Highlight */\n if (this.highlightedNode.id != link.source.id && this.highlightedNode.id != link.target.id) {\n const fadeOptions = linkFade({\n arrow: this.linkSettings.arrow,\n arrowByHighlight: this.linkSettings.arrowByHighlight,\n linkOptions,\n highlightProgress: this.highlightProgress,\n highlightForArrowFadingMin: this.highlightSettings.highlightByNodeForArrowFadingMin,\n highlightForLinkFadingMin: this.highlightSettings.highlightByNodeForLinkFadingMin,\n });\n alpha = fadeOptions.alpha;\n arrowAlpha = fadeOptions.arrowAlpha;\n } else {\n const highlightOptions = linkHighlight({\n arrow: this.linkSettings.arrow,\n arrowByHighlight: this.linkSettings.arrowByHighlight,\n linkOptions,\n highlightProgress: this.highlightProgress,\n highlightForArrowBorderColor: this.highlightSettings.highlightByNodeForArrowBorderColor,\n highlightForArrowBorderSizingAdditional:\n this.highlightSettings.highlightByNodeForArrowBorderSizingAdditional,\n highlightForArrowColor: this.highlightSettings.highlightByNodeForArrowColor,\n highlightForArrowSizeAdditional:\n this.highlightSettings.highlightByNodeForArrowSizeAdditional,\n highlightForLinkColor: this.highlightSettings.highlightByNodeForLinkColor,\n highlightForLinkSizeAdditional:\n this.highlightSettings.highlightByNodeForLinkSizeAdditional,\n });\n arrowAlpha = highlightOptions.arrowAlpha;\n color = highlightOptions.color;\n width = highlightOptions.width;\n arrowColor = highlightOptions.arrowColor;\n arrowSize = highlightOptions.arrowSize;\n arrowBorderWidth = highlightOptions.arrowBorderWidth;\n arrowBorderColor = highlightOptions.arrowBorderColor;\n }\n }\n if (this.highlightedNeighbors && this.highlightedLink) {\n /** By Link Not Highlight */\n if (this.highlightedLink !== link) {\n const fadeOptions = linkFade({\n arrow: this.linkSettings.arrow,\n arrowByHighlight: this.linkSettings.arrowByHighlight,\n linkOptions,\n highlightProgress: this.highlightProgress,\n highlightForArrowFadingMin: this.highlightSettings.highlightByLinkForArrowFadingMin,\n highlightForLinkFadingMin: this.highlightSettings.highlightByLinkForLinkFadingMin,\n });\n alpha = fadeOptions.alpha;\n arrowAlpha = fadeOptions.arrowAlpha;\n } else {\n /** By Link Highlight */\n const highlightOptions = linkHighlight({\n arrow: this.linkSettings.arrow,\n arrowByHighlight: this.linkSettings.arrowByHighlight,\n linkOptions,\n highlightProgress: this.highlightProgress,\n highlightForArrowBorderColor: this.highlightSettings.highlightByLinkForArrowBorderColor,\n highlightForArrowBorderSizingAdditional:\n this.highlightSettings.highlightByLinkForArrowBorderSizingAdditional,\n highlightForArrowColor: this.highlightSettings.highlightByLinkForArrowColor,\n highlightForArrowSizeAdditional:\n this.highlightSettings.highlightByLinkForArrowSizeAdditional,\n highlightForLinkColor: this.highlightSettings.highlightByLinkForLinkColor,\n highlightForLinkSizeAdditional:\n this.highlightSettings.highlightByLinkForLinkSizeAdditional,\n });\n arrowAlpha = highlightOptions.arrowAlpha;\n color = highlightOptions.color;\n width = highlightOptions.width;\n arrowColor = highlightOptions.arrowColor;\n arrowSize = highlightOptions.arrowSize;\n arrowBorderWidth = highlightOptions.arrowBorderWidth;\n arrowBorderColor = highlightOptions.arrowBorderColor;\n }\n }\n\n /** Link */\n this.context.beginPath();\n\n this.context.globalAlpha = alpha;\n this.context.strokeStyle = color;\n this.context.lineWidth = width;\n\n let xStart = link.source.x;\n let yStart = link.source.y;\n let xEnd = link.target.x;\n let yEnd = link.target.y;\n let linkDistance = 0;\n if (this.linkSettings.prettyDraw || this.linkSettings.particleFlexSpeed) {\n const isHasArrow = this.linkSettings.arrow && arrowAlpha > 0;\n const position = calculateLinkPositionByNode(link, isHasArrow ? arrowSize : 0);\n\n if (position) {\n xStart = position.x1;\n xEnd = position.x2;\n yStart = position.y1;\n yEnd = position.y2;\n linkDistance = position.distance;\n }\n }\n this.context.moveTo(xStart, yStart);\n this.context.lineTo(xEnd, yEnd);\n this.context.stroke();\n\n /** Particle */\n if (\n this.linkSettings.particles &&\n ((this.highlightedNode &&\n (this.highlightedNode.id === link.source.id ||\n this.highlightedNode.id === link.target.id)) ||\n (this.highlightedLink && this.highlightedLink === link))\n ) {\n const particleSteps = this.linkSettings.particleFlexSpeed\n ? linkDistance <= 0\n ? 0\n : linkDistance * this.linkSettings.particleFlexSpeedCoefficient\n : linkOptions.particleSteps;\n const particleCount = linkOptions.particleCount;\n\n if (!this.particles[id]) {\n const sourceId = link.source.id;\n const targetId = link.target.id;\n\n const particles: LinkParticle[] = [];\n let prevParticle: LinkParticle | undefined;\n\n for (let i = 0; i < particleCount; i++) {\n const particle: LinkParticle = {\n step: 0,\n sourceId,\n targetId,\n prev: prevParticle,\n next: undefined,\n index: i,\n };\n if (prevParticle) prevParticle.next = particle;\n particles.push(particle);\n prevParticle = particle;\n }\n if (particles.length >= 2) {\n particles[0].prev = particles[particles.length - 1];\n particles[particles.length - 1].next = particles[0];\n }\n this.particles[id] = particles;\n }\n\n if (particleSteps !== 0) {\n this.particles[id].forEach((particle) => {\n if (!this.context) return;\n\n const distance = particleSteps / particleCount;\n getParticlePosition({\n distance,\n particle,\n totalSteps: particleSteps,\n totalCount: particleCount,\n xEnd,\n xStart,\n yEnd,\n yStart,\n });\n if (particle.x != undefined && particle.y != undefined) {\n this.context.beginPath();\n this.context.strokeStyle = linkOptions.particleBorderColor;\n this.context.lineWidth = linkOptions.particleBorderWidth;\n this.context.arc(particle.x, particle.y, linkOptions.particleRadius, 0, Math.PI * 2);\n this.context.fillStyle = linkOptions.particleColor;\n this.context.fill();\n if (linkOptions.particleBorderWidth > 0) {\n this.context.stroke();\n }\n }\n });\n }\n }\n\n /** Arrow */\n if (this.linkSettings.arrow && arrowAlpha > 0) {\n const {\n x1: xStart,\n x2: xEnd,\n y1: yStart,\n y2: yEnd,\n } = calculateLinkPositionByNode(link) ?? {\n x1: 0,\n x2: 0,\n y1: 0,\n y2: 0,\n };\n\n this.context.beginPath();\n this.context.globalAlpha = arrowAlpha;\n this.context.strokeStyle = arrowBorderColor;\n this.context.lineWidth = arrowBorderWidth;\n this.context.fillStyle = arrowColor;\n const angle = Math.atan2(yEnd - yStart, xEnd - xStart);\n this.context.moveTo(xEnd, yEnd);\n this.context.lineTo(\n xEnd - arrowSize * Math.cos(angle - Math.PI / 6),\n yEnd - arrowSize * Math.sin(angle - Math.PI / 6),\n );\n this.context.lineTo(\n xEnd - arrowSize * Math.cos(angle + Math.PI / 6),\n yEnd - arrowSize * Math.sin(angle + Math.PI / 6),\n );\n this.context.closePath();\n this.context.fill();\n if (arrowBorderWidth > 0) {\n this.context.stroke();\n }\n }\n\n if (linkOptions.drawExtraLink) {\n linkOptions.drawExtraLink.call(this, link, { ...linkOptions, alpha });\n }\n };\n}\n"],"names":[],"mappings":"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"}