@krainovsd/graph 0.14.0-beta.8 → 0.15.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 (80) hide show
  1. package/lib/cjs/index.cjs +845 -375
  2. package/lib/cjs/index.cjs.map +1 -1
  3. package/lib/esm/constants/force-controls.js +6 -4
  4. package/lib/esm/constants/force-controls.js.map +1 -1
  5. package/lib/esm/constants/highlight-controls.js +6 -3
  6. package/lib/esm/constants/highlight-controls.js.map +1 -1
  7. package/lib/esm/constants/link-controls.js +6 -3
  8. package/lib/esm/constants/link-controls.js.map +1 -1
  9. package/lib/esm/constants/node-controls.js +6 -3
  10. package/lib/esm/constants/node-controls.js.map +1 -1
  11. package/lib/esm/index.js +8 -6
  12. package/lib/esm/index.js.map +1 -1
  13. package/lib/esm/module/GraphCanvas/GraphCanvas.js +40 -17
  14. package/lib/esm/module/GraphCanvas/GraphCanvas.js.map +1 -1
  15. package/lib/esm/module/GraphCanvas/StaticGraphCanvas.js +127 -0
  16. package/lib/esm/module/GraphCanvas/StaticGraphCanvas.js.map +1 -0
  17. package/lib/esm/module/GraphCanvas/constants/graph-settings.js +6 -7
  18. package/lib/esm/module/GraphCanvas/constants/graph-settings.js.map +1 -1
  19. package/lib/esm/module/GraphCanvas/constants/highlight-settings.js +1 -4
  20. package/lib/esm/module/GraphCanvas/constants/highlight-settings.js.map +1 -1
  21. package/lib/esm/module/GraphCanvas/constants/index.js +6 -4
  22. package/lib/esm/module/GraphCanvas/constants/index.js.map +1 -1
  23. package/lib/esm/module/GraphCanvas/constants/link-settings.js +1 -9
  24. package/lib/esm/module/GraphCanvas/constants/link-settings.js.map +1 -1
  25. package/lib/esm/module/GraphCanvas/constants/node-settings.js +1 -10
  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 +6 -4
  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 +0 -3
  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 +6 -3
  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 +6 -3
  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 +20 -6
  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 +6 -4
  38. package/lib/esm/module/GraphCanvas/lib/utils/calculate-curve-link-position-by-node.js.map +1 -1
  39. package/lib/esm/module/GraphCanvas/lib/utils/calculate-link-position-by-node.js +6 -4
  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/get-particle-position.js +1 -1
  42. package/lib/esm/module/GraphCanvas/lib/utils/get-particle-position.js.map +1 -1
  43. package/lib/esm/module/GraphCanvas/lib/utils/is-node-visible.js +25 -27
  44. package/lib/esm/module/GraphCanvas/lib/utils/is-node-visible.js.map +1 -1
  45. package/lib/esm/module/GraphCanvas/lib/utils/is-overlaps-node.js.map +1 -1
  46. package/lib/esm/module/GraphCanvas/lib/utils/node-by-pointer-getter.js +2 -1
  47. package/lib/esm/module/GraphCanvas/lib/utils/node-by-pointer-getter.js.map +1 -1
  48. package/lib/esm/module/GraphCanvas/lib/utils/node-highlight.js +7 -11
  49. package/lib/esm/module/GraphCanvas/lib/utils/node-highlight.js.map +1 -1
  50. package/lib/esm/module/GraphCanvas/lib/utils/node-iteration-extractor.js +3 -0
  51. package/lib/esm/module/GraphCanvas/lib/utils/node-iteration-extractor.js.map +1 -1
  52. package/lib/esm/module/GraphCanvas/lib/utils/precompute-graph.js +24 -0
  53. package/lib/esm/module/GraphCanvas/lib/utils/precompute-graph.js.map +1 -0
  54. package/lib/esm/module/GraphCanvas/lib/utils/prepare-graph-data.js +49 -0
  55. package/lib/esm/module/GraphCanvas/lib/utils/prepare-graph-data.js.map +1 -0
  56. package/lib/esm/module/GraphCanvas/lib/utils/svg-context.js +159 -0
  57. package/lib/esm/module/GraphCanvas/lib/utils/svg-context.js.map +1 -0
  58. package/lib/esm/module/GraphCanvas/slices/draw-links.js +24 -42
  59. package/lib/esm/module/GraphCanvas/slices/draw-links.js.map +1 -1
  60. package/lib/esm/module/GraphCanvas/slices/draw-nodes.js +80 -168
  61. package/lib/esm/module/GraphCanvas/slices/draw-nodes.js.map +1 -1
  62. package/lib/esm/module/GraphCanvas/slices/draw-text.js +1 -9
  63. package/lib/esm/module/GraphCanvas/slices/draw-text.js.map +1 -1
  64. package/lib/esm/module/GraphCanvas/slices/export-svg.js +62 -0
  65. package/lib/esm/module/GraphCanvas/slices/export-svg.js.map +1 -0
  66. package/lib/esm/module/GraphCanvas/slices/init-dnd.js +15 -3
  67. package/lib/esm/module/GraphCanvas/slices/init-dnd.js.map +1 -1
  68. package/lib/esm/module/GraphCanvas/slices/init-draw.js +212 -8
  69. package/lib/esm/module/GraphCanvas/slices/init-draw.js.map +1 -1
  70. package/lib/esm/module/GraphCanvas/slices/init-pointer.js +6 -8
  71. package/lib/esm/module/GraphCanvas/slices/init-pointer.js.map +1 -1
  72. package/lib/esm/module/GraphCanvas/slices/init-simulation.js +3 -4
  73. package/lib/esm/module/GraphCanvas/slices/init-simulation.js.map +1 -1
  74. package/lib/esm/module/GraphCanvas/slices/init-zoom.js +2 -4
  75. package/lib/esm/module/GraphCanvas/slices/init-zoom.js.map +1 -1
  76. package/lib/esm/module/GraphCanvas/slices/update-link-cache.js +5 -5
  77. package/lib/esm/module/GraphCanvas/slices/update-node-cache.js +17 -29
  78. package/lib/esm/module/GraphCanvas/slices/update-node-cache.js.map +1 -1
  79. package/lib/index.d.ts +95 -43
  80. package/package.json +1 -1
@@ -1,12 +1,12 @@
1
1
  import '../constants/force-settings.js';
2
- import '../constants/graph-settings.js';
3
- import '../constants/highlight-settings.js';
4
- import '../constants/link-settings.js';
5
- import '../constants/node-settings.js';
6
- import { nodeOptionsGetter, nodeRadiusGetter, nodeSizeGetter } from '../lib/settings/node-settings-getter.js';
2
+ import { nodeOptionsGetter, nodeRadiusGetter, nodeSizeGetter, nodeLabelGetter, nodeTextGetter } from '../lib/settings/node-settings-getter.js';
7
3
  import '@krainovsd/js-helpers';
8
4
  import 'd3-array';
9
5
  import { nodeIterationExtractor } from '../lib/utils/node-iteration-extractor.js';
6
+ import 'd3-force';
7
+ import 'd3-selection';
8
+ import 'd3-zoom';
9
+ import 'd3-drag';
10
10
  import { getTextLines } from './draw-text.js';
11
11
 
12
12
  function updateNodeCache() {
@@ -89,30 +89,25 @@ function updateNodeCache() {
89
89
  nodeOptions.labelSize = labelSize;
90
90
  this.nodeOptionsCache[i] = nodeOptions;
91
91
  }
92
- let nodeOptions = this.nodeOptionsCache[i];
92
+ const nodeOptions = this.nodeOptionsCache[i];
93
93
  if (!nodeOptions)
94
94
  continue;
95
95
  /** label */
96
96
  if (label) {
97
- if (!options) {
98
- nodeOptions = nodeIterationExtractor(node, i, this.nodes, this, this.nodeSettings.options ?? {}, nodeOptionsGetter);
99
- const cache = this.nodeOptionsCache[i];
100
- if (cache)
101
- cache.label = nodeOptions.label;
102
- }
97
+ const label = nodeIterationExtractor(node, i, this.nodes, this, this.nodeSettings.label, nodeLabelGetter);
103
98
  /** label in not text shape */
104
- if (nodeOptions.shape !== "text" && nodeOptions.label) {
99
+ if (nodeOptions.shape !== "text" && label) {
105
100
  this.context.font = `${nodeOptions.labelStyle} normal ${nodeOptions.labelWeight} ${nodeOptions.labelSize}px ${nodeOptions.labelFont}`;
106
101
  this.context.fillStyle = nodeOptions.labelColor;
107
102
  this.context.textAlign = nodeOptions.labelAlign;
108
103
  if (nodeOptions.labelWidth == undefined ||
109
- this.context.measureText(nodeOptions.label).width <= nodeOptions.labelWidth) {
110
- this.cachedNodeLabel[i] = [nodeOptions.label];
104
+ this.context.measureText(label).width <= nodeOptions.labelWidth) {
105
+ this.cachedNodeLabel[i] = [label];
111
106
  }
112
107
  const { lines } = getTextLines({
113
108
  context: this.context,
114
109
  maxWidth: nodeOptions.labelWidth,
115
- text: nodeOptions.label,
110
+ text: label,
116
111
  textAlign: nodeOptions.labelAlign,
117
112
  textColor: nodeOptions.labelColor,
118
113
  textFont: nodeOptions.labelFont,
@@ -123,10 +118,10 @@ function updateNodeCache() {
123
118
  this.cachedNodeLabel[i] = lines;
124
119
  /** label in text shape */
125
120
  }
126
- else if (nodeOptions.shape === "text" && nodeOptions.label) {
121
+ else if (nodeOptions.shape === "text" && label) {
127
122
  const textInfo = getTextLines({
128
123
  context: this.context,
129
- text: nodeOptions.label,
124
+ text: label,
130
125
  textAlign: nodeOptions.labelAlign,
131
126
  textColor: nodeOptions.labelColor,
132
127
  textFont: nodeOptions.labelFont,
@@ -152,17 +147,10 @@ function updateNodeCache() {
152
147
  }
153
148
  /** text */
154
149
  if (text) {
155
- if (!options) {
156
- nodeOptions = nodeIterationExtractor(node, i, this.nodes, this, this.nodeSettings.options ?? {}, nodeOptionsGetter);
157
- const cache = this.nodeOptionsCache[i];
158
- if (cache) {
159
- cache.text = nodeOptions.text;
160
- cache.textVisible = nodeOptions.textVisible;
161
- }
162
- }
163
- if (!nodeOptions.text) {
150
+ const text = nodeIterationExtractor(node, i, this.nodes, this, this.nodeSettings.text, nodeTextGetter);
151
+ if (!text) {
164
152
  this.cachedNodeText[i] = [];
165
- return;
153
+ continue;
166
154
  }
167
155
  this.context.font = `${nodeOptions.textStyle} normal ${nodeOptions.textWeight} ${nodeOptions.textSize}px ${nodeOptions.textFont}`;
168
156
  this.context.fillStyle = nodeOptions.textColor;
@@ -170,7 +158,7 @@ function updateNodeCache() {
170
158
  const { lines } = getTextLines({
171
159
  context: this.context,
172
160
  maxWidth: nodeOptions.textWidth,
173
- text: nodeOptions.text,
161
+ text,
174
162
  textAlign: nodeOptions.textAlign,
175
163
  textColor: nodeOptions.textColor,
176
164
  textFont: nodeOptions.textFont,
@@ -1 +1 @@
1
- {"version":3,"file":"update-node-cache.js","sources":["../../../../../src/module/GraphCanvas/slices/update-node-cache.ts"],"sourcesContent":["import type { GraphCanvas } from \"../GraphCanvas\";\nimport {\n nodeIterationExtractor,\n nodeOptionsGetter,\n nodeRadiusGetter,\n nodeSizeGetter,\n} from \"../lib\";\nimport { getTextLines } from \"./draw-text\";\n\nexport function updateNodeCache<\n NodeData extends Record<string, unknown>,\n LinkData extends Record<string, unknown>,\n>(this: GraphCanvas<NodeData, LinkData>) {\n if (!this.context) return;\n\n const currentZoom = this.areaTransform.k;\n const options = this.nodeOptionsCache.length === 0;\n const label = this.cachedNodeLabel.length === 0;\n let text = this.cachedNodeText.length === 0;\n\n if (\n this.nodeSettings.smartCache &&\n this._lastNodeZoomK !== undefined &&\n !options &&\n !text &&\n !label\n ) {\n const thresholds = this.nodeSettings.textScaleSteps;\n if (thresholds && thresholds.length > 0) {\n const min = Math.min(this._lastNodeZoomK, currentZoom);\n const max = Math.max(this._lastNodeZoomK, currentZoom);\n const crossed = thresholds.some((t) => t >= min && t <= max);\n this._lastNodeZoomK = currentZoom;\n if (!crossed) return;\n }\n this.cachedNodeText.length = 0;\n text = true;\n }\n this._lastNodeZoomK = currentZoom;\n\n for (let i = 0; i < this.nodes.length; i++) {\n const node = this.nodes[i];\n if (options) {\n const nodeOptions = nodeIterationExtractor(\n node,\n i,\n this.nodes,\n this,\n this.nodeSettings.options ?? {},\n nodeOptionsGetter,\n );\n const radius =\n nodeOptions.shape === \"circle\"\n ? nodeRadiusGetter({\n radiusFlexible: this.nodeSettings.nodeRadiusFlexible,\n radiusInitial: nodeOptions.radius,\n radiusIncrementByStep: this.nodeSettings.nodeRadiusIncrementByStep,\n radiusLinkCountForStep: this.nodeSettings.nodeRadiusLinkCountForStep,\n radiusMaxLinearSteps: this.nodeSettings.nodeRadiusMaxLinearSteps,\n radiusLogFactor: this.nodeSettings.nodeRadiusLogFactor,\n radiusLinkCountDividerForLog: this.nodeSettings.nodeRadiusLinkCountDividerForLog,\n linkCount: node.linkCount,\n })\n : nodeOptions.radius;\n\n let width = nodeOptions.width;\n let height = nodeOptions.height;\n let labelSize = nodeOptions.labelSize;\n if (nodeOptions.shape === \"square\") {\n const size = nodeSizeGetter({\n heightInitial: nodeOptions.height,\n widthInitial: nodeOptions.width,\n linkCount: node.linkCount,\n sizeFlexible: this.nodeSettings.nodeSizeFlexible,\n sizeIncrementByStep: this.nodeSettings.nodeSizeIncrementByStep,\n sizeLinkCountForStep: this.nodeSettings.nodeSizeLinkCountForStep,\n sizeMaxLinearSteps: this.nodeSettings.nodeSizeMaxLinearSteps,\n sizeLogFactor: this.nodeSettings.nodeSizeLogFactor,\n sizeLinkCountDividerForLog: this.nodeSettings.nodeSizeLinkCountDividerForLog,\n });\n width = size.width;\n height = size.height;\n }\n if (nodeOptions.shape === \"text\") {\n width = nodeOptions.width;\n const size = nodeSizeGetter({\n heightInitial: nodeOptions.height,\n widthInitial: width,\n linkCount: node.linkCount,\n sizeFlexible: this.nodeSettings.nodeSizeFlexible,\n sizeIncrementByStep: this.nodeSettings.nodeSizeIncrementByStep,\n sizeLinkCountForStep: this.nodeSettings.nodeSizeLinkCountForStep,\n sizeMaxLinearSteps: this.nodeSettings.nodeSizeMaxLinearSteps,\n sizeLogFactor: this.nodeSettings.nodeSizeLogFactor,\n sizeLinkCountDividerForLog: this.nodeSettings.nodeSizeLinkCountDividerForLog,\n });\n\n labelSize *= size.additionalSizeCoefficient;\n }\n\n nodeOptions.width = node.visible === false ? 0 : width;\n nodeOptions.height = node.visible === false ? 0 : height;\n nodeOptions.radius = node.visible === false ? 0 : radius;\n nodeOptions.labelSize = labelSize;\n this.nodeOptionsCache[i] = nodeOptions;\n }\n\n let nodeOptions = this.nodeOptionsCache[i];\n if (!nodeOptions) continue;\n /** label */\n if (label) {\n if (!options) {\n nodeOptions = nodeIterationExtractor(\n node,\n i,\n this.nodes,\n this,\n this.nodeSettings.options ?? {},\n nodeOptionsGetter,\n );\n const cache = this.nodeOptionsCache[i];\n if (cache) cache.label = nodeOptions.label;\n }\n /** label in not text shape */\n if (nodeOptions.shape !== \"text\" && nodeOptions.label) {\n this.context.font = `${nodeOptions.labelStyle} normal ${nodeOptions.labelWeight} ${nodeOptions.labelSize}px ${nodeOptions.labelFont}`;\n this.context.fillStyle = nodeOptions.labelColor;\n this.context.textAlign = nodeOptions.labelAlign;\n\n if (\n nodeOptions.labelWidth == undefined ||\n this.context.measureText(nodeOptions.label).width <= nodeOptions.labelWidth\n ) {\n this.cachedNodeLabel[i] = [nodeOptions.label];\n }\n\n const { lines } = getTextLines({\n context: this.context,\n maxWidth: nodeOptions.labelWidth,\n text: nodeOptions.label,\n textAlign: nodeOptions.labelAlign,\n textColor: nodeOptions.labelColor,\n textFont: nodeOptions.labelFont,\n textSize: nodeOptions.labelSize,\n textStyle: nodeOptions.labelStyle,\n textWeight: nodeOptions.labelWeight,\n });\n this.cachedNodeLabel[i] = lines;\n /** label in text shape */\n } else if (nodeOptions.shape === \"text\" && nodeOptions.label) {\n const textInfo = getTextLines({\n context: this.context,\n text: nodeOptions.label,\n textAlign: nodeOptions.labelAlign,\n textColor: nodeOptions.labelColor,\n textFont: nodeOptions.labelFont,\n textSize: nodeOptions.labelSize,\n maxWidth: nodeOptions.labelWidth,\n textStyle: nodeOptions.labelStyle,\n textWeight: nodeOptions.textWeight,\n });\n const textNodeParameters = [textInfo.currentMaxSize, nodeOptions.labelSize];\n const lines = textInfo.lines;\n const textSizeCoefficient = nodeOptions.labelSize / textNodeParameters[1];\n const maxSize = textNodeParameters[0] * textSizeCoefficient;\n\n nodeOptions.height =\n lines.length * nodeOptions.labelSize +\n (lines.length - 1) * nodeOptions.labelGap +\n nodeOptions.labelYPadding;\n\n nodeOptions.width = maxSize + nodeOptions.labelXPadding;\n this.cachedNodeLabel[i] = lines;\n } else {\n this.cachedNodeLabel[i] = [];\n }\n }\n\n /** text */\n if (text) {\n if (!options) {\n nodeOptions = nodeIterationExtractor(\n node,\n i,\n this.nodes,\n this,\n this.nodeSettings.options ?? {},\n nodeOptionsGetter,\n );\n const cache = this.nodeOptionsCache[i];\n if (cache) {\n cache.text = nodeOptions.text;\n cache.textVisible = nodeOptions.textVisible;\n }\n }\n if (!nodeOptions.text) {\n this.cachedNodeText[i] = [];\n return;\n }\n this.context.font = `${nodeOptions.textStyle} normal ${nodeOptions.textWeight} ${nodeOptions.textSize}px ${nodeOptions.textFont}`;\n this.context.fillStyle = nodeOptions.textColor;\n this.context.textAlign = nodeOptions.textAlign;\n const { lines } = getTextLines({\n context: this.context,\n maxWidth: nodeOptions.textWidth,\n text: nodeOptions.text,\n textAlign: nodeOptions.textAlign,\n textColor: nodeOptions.textColor,\n textFont: nodeOptions.textFont,\n textSize: nodeOptions.textSize,\n textStyle: nodeOptions.textStyle,\n textWeight: nodeOptions.textWeight,\n });\n this.cachedNodeText[i] = lines;\n }\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"update-node-cache.js","sources":["../../../../../src/module/GraphCanvas/slices/update-node-cache.ts"],"sourcesContent":["import type { GraphCanvas } from \"../GraphCanvas\";\nimport {\n nodeIterationExtractor,\n nodeLabelGetter,\n nodeOptionsGetter,\n nodeRadiusGetter,\n nodeSizeGetter,\n nodeTextGetter,\n} from \"../lib\";\nimport { getTextLines } from \"./draw-text\";\n\nexport function updateNodeCache<\n NodeData extends Record<string, unknown>,\n LinkData extends Record<string, unknown>,\n>(this: GraphCanvas<NodeData, LinkData>) {\n if (!this.context) return;\n\n const currentZoom = this.areaTransform.k;\n const options = this.nodeOptionsCache.length === 0;\n const label = this.cachedNodeLabel.length === 0;\n let text = this.cachedNodeText.length === 0;\n\n if (\n this.nodeSettings.smartCache &&\n this._lastNodeZoomK !== undefined &&\n !options &&\n !text &&\n !label\n ) {\n const thresholds = this.nodeSettings.textScaleSteps;\n if (thresholds && thresholds.length > 0) {\n const min = Math.min(this._lastNodeZoomK, currentZoom);\n const max = Math.max(this._lastNodeZoomK, currentZoom);\n const crossed = thresholds.some((t) => t >= min && t <= max);\n this._lastNodeZoomK = currentZoom;\n if (!crossed) return;\n }\n this.cachedNodeText.length = 0;\n text = true;\n }\n this._lastNodeZoomK = currentZoom;\n\n for (let i = 0; i < this.nodes.length; i++) {\n const node = this.nodes[i];\n if (options) {\n const nodeOptions = nodeIterationExtractor(\n node,\n i,\n this.nodes,\n this,\n this.nodeSettings.options ?? {},\n nodeOptionsGetter,\n );\n const radius =\n nodeOptions.shape === \"circle\"\n ? nodeRadiusGetter({\n radiusFlexible: this.nodeSettings.nodeRadiusFlexible,\n radiusInitial: nodeOptions.radius,\n radiusIncrementByStep: this.nodeSettings.nodeRadiusIncrementByStep,\n radiusLinkCountForStep: this.nodeSettings.nodeRadiusLinkCountForStep,\n radiusMaxLinearSteps: this.nodeSettings.nodeRadiusMaxLinearSteps,\n radiusLogFactor: this.nodeSettings.nodeRadiusLogFactor,\n radiusLinkCountDividerForLog: this.nodeSettings.nodeRadiusLinkCountDividerForLog,\n linkCount: node.linkCount,\n })\n : nodeOptions.radius;\n\n let width = nodeOptions.width;\n let height = nodeOptions.height;\n let labelSize = nodeOptions.labelSize;\n if (nodeOptions.shape === \"square\") {\n const size = nodeSizeGetter({\n heightInitial: nodeOptions.height,\n widthInitial: nodeOptions.width,\n linkCount: node.linkCount,\n sizeFlexible: this.nodeSettings.nodeSizeFlexible,\n sizeIncrementByStep: this.nodeSettings.nodeSizeIncrementByStep,\n sizeLinkCountForStep: this.nodeSettings.nodeSizeLinkCountForStep,\n sizeMaxLinearSteps: this.nodeSettings.nodeSizeMaxLinearSteps,\n sizeLogFactor: this.nodeSettings.nodeSizeLogFactor,\n sizeLinkCountDividerForLog: this.nodeSettings.nodeSizeLinkCountDividerForLog,\n });\n width = size.width;\n height = size.height;\n }\n if (nodeOptions.shape === \"text\") {\n width = nodeOptions.width;\n const size = nodeSizeGetter({\n heightInitial: nodeOptions.height,\n widthInitial: width,\n linkCount: node.linkCount,\n sizeFlexible: this.nodeSettings.nodeSizeFlexible,\n sizeIncrementByStep: this.nodeSettings.nodeSizeIncrementByStep,\n sizeLinkCountForStep: this.nodeSettings.nodeSizeLinkCountForStep,\n sizeMaxLinearSteps: this.nodeSettings.nodeSizeMaxLinearSteps,\n sizeLogFactor: this.nodeSettings.nodeSizeLogFactor,\n sizeLinkCountDividerForLog: this.nodeSettings.nodeSizeLinkCountDividerForLog,\n });\n\n labelSize *= size.additionalSizeCoefficient;\n }\n\n nodeOptions.width = node.visible === false ? 0 : width;\n nodeOptions.height = node.visible === false ? 0 : height;\n nodeOptions.radius = node.visible === false ? 0 : radius;\n nodeOptions.labelSize = labelSize;\n this.nodeOptionsCache[i] = nodeOptions;\n }\n\n const nodeOptions = this.nodeOptionsCache[i];\n if (!nodeOptions) continue;\n /** label */\n if (label) {\n const label = nodeIterationExtractor(\n node,\n i,\n this.nodes,\n this,\n this.nodeSettings.label,\n nodeLabelGetter,\n );\n /** label in not text shape */\n if (nodeOptions.shape !== \"text\" && label) {\n this.context.font = `${nodeOptions.labelStyle} normal ${nodeOptions.labelWeight} ${nodeOptions.labelSize}px ${nodeOptions.labelFont}`;\n this.context.fillStyle = nodeOptions.labelColor;\n this.context.textAlign = nodeOptions.labelAlign;\n\n if (\n nodeOptions.labelWidth == undefined ||\n this.context.measureText(label).width <= nodeOptions.labelWidth\n ) {\n this.cachedNodeLabel[i] = [label];\n }\n\n const { lines } = getTextLines({\n context: this.context,\n maxWidth: nodeOptions.labelWidth,\n text: label,\n textAlign: nodeOptions.labelAlign,\n textColor: nodeOptions.labelColor,\n textFont: nodeOptions.labelFont,\n textSize: nodeOptions.labelSize,\n textStyle: nodeOptions.labelStyle,\n textWeight: nodeOptions.labelWeight,\n });\n this.cachedNodeLabel[i] = lines;\n /** label in text shape */\n } else if (nodeOptions.shape === \"text\" && label) {\n const textInfo = getTextLines({\n context: this.context,\n text: label,\n textAlign: nodeOptions.labelAlign,\n textColor: nodeOptions.labelColor,\n textFont: nodeOptions.labelFont,\n textSize: nodeOptions.labelSize,\n maxWidth: nodeOptions.labelWidth,\n textStyle: nodeOptions.labelStyle,\n textWeight: nodeOptions.textWeight,\n });\n const textNodeParameters = [textInfo.currentMaxSize, nodeOptions.labelSize];\n const lines = textInfo.lines;\n const textSizeCoefficient = nodeOptions.labelSize / textNodeParameters[1];\n const maxSize = textNodeParameters[0] * textSizeCoefficient;\n\n nodeOptions.height =\n lines.length * nodeOptions.labelSize +\n (lines.length - 1) * nodeOptions.labelGap +\n nodeOptions.labelYPadding;\n\n nodeOptions.width = maxSize + nodeOptions.labelXPadding;\n this.cachedNodeLabel[i] = lines;\n } else {\n this.cachedNodeLabel[i] = [];\n }\n }\n\n /** text */\n if (text) {\n const text = nodeIterationExtractor(\n node,\n i,\n this.nodes,\n this,\n this.nodeSettings.text,\n nodeTextGetter,\n );\n if (!text) {\n this.cachedNodeText[i] = [];\n continue;\n }\n this.context.font = `${nodeOptions.textStyle} normal ${nodeOptions.textWeight} ${nodeOptions.textSize}px ${nodeOptions.textFont}`;\n this.context.fillStyle = nodeOptions.textColor;\n this.context.textAlign = nodeOptions.textAlign;\n const { lines } = getTextLines({\n context: this.context,\n maxWidth: nodeOptions.textWidth,\n text,\n textAlign: nodeOptions.textAlign,\n textColor: nodeOptions.textColor,\n textFont: nodeOptions.textFont,\n textSize: nodeOptions.textSize,\n textStyle: nodeOptions.textStyle,\n textWeight: nodeOptions.textWeight,\n });\n this.cachedNodeText[i] = lines;\n }\n }\n}\n"],"names":[],"mappings":"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"}
package/lib/index.d.ts CHANGED
@@ -3,6 +3,8 @@ import { ValueOf } from '@krainovsd/js-helpers';
3
3
  import { SimulationNodeDatum, SimulationLinkDatum, Simulation } from 'd3-force';
4
4
  import { D3DragEvent } from 'd3-drag';
5
5
 
6
+ declare function initDraw<NodeData extends Record<string, unknown>, LinkData extends Record<string, unknown>>(this: GraphCanvas<NodeData, LinkData>): (recursive?: boolean) => void;
7
+
6
8
  declare const COMMON_SETTINGS: {
7
9
  nodeRadius: number;
8
10
  nodeSize: number;
@@ -32,6 +34,21 @@ interface NodeInterface<NodeData extends Record<string, unknown>> extends Simula
32
34
  type NodeShape = "circle" | "square" | "text";
33
35
  type TextStyleEnum = "normal" | "italic" | "oblique";
34
36
  type CachedNodeTextInterface = Record<string | number, string[] | undefined>;
37
+ type NodeDrawBatch = {
38
+ shape: NodeShape;
39
+ x: number;
40
+ y: number;
41
+ radius: number;
42
+ width: number;
43
+ height: number;
44
+ image: HTMLImageElement | undefined;
45
+ };
46
+ type NodeTextDrawBatch = {
47
+ text: string;
48
+ x: number;
49
+ y: number;
50
+ };
51
+ type DeferredDraw = () => void;
35
52
 
36
53
  interface LinkInterface<NodeData extends Record<string, unknown>, LinkData extends Record<string, unknown>> extends SimulationLinkDatum<NodeInterface<NodeData>> {
37
54
  data?: LinkData;
@@ -58,11 +75,37 @@ type LinkParticle = {
58
75
  _lastDistance?: number;
59
76
  _lastTime?: number;
60
77
  };
78
+ type LinkDrawBatch = {
79
+ curve: boolean;
80
+ xStart: number;
81
+ yStart: number;
82
+ xEnd: number;
83
+ yEnd: number;
84
+ xControl: number;
85
+ yControl: number;
86
+ };
87
+ type LinkParticleDrawBatch = {
88
+ x: number;
89
+ y: number;
90
+ r: number;
91
+ };
92
+ type LinkArrowDrawBatch = {
93
+ x: number;
94
+ y: number;
95
+ size: number;
96
+ angle: number;
97
+ };
61
98
 
62
99
  type NodeIterationPropsInterface<NodeData extends Record<string, unknown>, LinkData extends Record<string, unknown>, Return = number> = (this: GraphCanvas<NodeData, LinkData>, node: NodeInterface<NodeData>, i: number, nodes: NodeInterface<NodeData>[]) => Return;
63
100
  type LinkIterationPropsInterface<NodeData extends Record<string, unknown>, LinkData extends Record<string, unknown>, Return = number> = (this: GraphCanvas<NodeData, LinkData>, link: LinkInterface<NodeData, LinkData>, i: number, links: LinkInterface<NodeData, LinkData>[]) => Return;
64
101
  type NodeIterationPropsNoThisInterface<NodeData extends Record<string, unknown>, Return = number> = (node: NodeInterface<NodeData>, i: number, nodes: NodeInterface<NodeData>[]) => Return;
65
102
  type LinkIterationPropsNoThisInterface<NodeData extends Record<string, unknown>, LinkData extends Record<string, unknown>, Return = number> = (link: LinkInterface<NodeData, LinkData>, i: number, links: LinkInterface<NodeData, LinkData>[]) => Return;
103
+ type Area = {
104
+ left: number;
105
+ right: number;
106
+ top: number;
107
+ bottom: number;
108
+ };
66
109
 
67
110
  type PrecomputeForceSettingsInterface = {
68
111
  precompute?: boolean;
@@ -123,10 +166,10 @@ type GraphSettingsInterface<NodeData extends Record<string, unknown>> = {
123
166
  dragPlaceCoefficient?: (node: NodeInterface<NodeData>, pxEvent: number, pyEvent: number) => number | undefined;
124
167
  showDrawTime?: boolean;
125
168
  showDrawTimeEveryTick?: boolean;
169
+ maxFps?: number;
126
170
  };
127
171
 
128
172
  declare const GRAPH_SETTINGS: Required<GraphSettingsInterface<Record<string, unknown>>>;
129
- declare const PERFORMANCE_GRAPH_SETTINGS: Required<GraphSettingsInterface<Record<string, unknown>>>;
130
173
 
131
174
  type HighlightSettingsInterface = HighlighCommonSettingsInterface & HighlightByNodeForNodeSettingsInterface & HighlightByNodeForLabelSettingsInterface & HighlightByNodeForTextSettingsInterface & HighlightByNodeForLinkSettingsInterface & HighlightByNodeForArrowSettingsInterface & HighlightByLinkForNodeSettingsInterface & HighlightByLinkForTextSettingsInterface & HighlightByLinkForLabelSettingsInterface & HighlightByLinkForLinkSettingsInterface & HighlightByLinkForArrowSettingsInterface;
132
175
  type HighlighCommonSettingsInterface = {
@@ -204,8 +247,8 @@ type HighlightByLinkForArrowSettingsInterface = {
204
247
  };
205
248
 
206
249
  declare const HIGHLIGHT_SETTINGS: Required<HighlightSettingsInterface>;
207
- declare const PERFORMANCE_HIGHLIGHT_SETTINGS: Required<HighlightSettingsInterface>;
208
250
 
251
+ type GraphLinkSettingsInterface<NodeData extends Record<string, unknown>, LinkData extends Record<string, unknown>> = Required<Omit<LinkSettingsInterface<NodeData, LinkData>, "options">> & Pick<LinkSettingsInterface<NodeData, LinkData>, "options">;
209
252
  type LinkSettingsInterface<NodeData extends Record<string, unknown>, LinkData extends Record<string, unknown>> = {
210
253
  smartCache?: boolean;
211
254
  prettyDraw?: boolean;
@@ -248,8 +291,6 @@ type LinkOptionsParticleInterface = {
248
291
 
249
292
  declare const LINK_SETTINGS: Omit<Required<LinkSettingsInterface<Record<string, unknown>, Record<string, unknown>>>, "options">;
250
293
  declare const LINK_OPTIONS: Omit<Required<LinkOptionsInterface<Record<string, unknown>, Record<string, unknown>>>, "color" | "width" | "drawLink" | "drawExtraLink" | "arrowColor">;
251
- declare const PERFORMANCE_LINK_SETTINGS: Omit<Required<LinkSettingsInterface<Record<string, unknown>, Record<string, unknown>>>, "options">;
252
- declare const PERFORMANCE_LINK_OPTIONS: Omit<Required<LinkOptionsInterface<Record<string, unknown>, Record<string, unknown>>>, "color" | "width" | "drawLink" | "drawExtraLink" | "arrowColor">;
253
294
 
254
295
  type NodeSettingsInterface<NodeData extends Record<string, unknown>, LinkData extends Record<string, unknown>> = {
255
296
  smartCache?: boolean;
@@ -275,7 +316,10 @@ type NodeSettingsInterface<NodeData extends Record<string, unknown>, LinkData ex
275
316
  textShiftYMax?: number;
276
317
  idGetter?: NodeIterationPropsInterface<NodeData, LinkData, string | number>;
277
318
  options?: NodeIterationPropsInterface<NodeData, LinkData, NodeOptionsInterface<NodeData, LinkData>> | NodeOptionsInterface<NodeData, LinkData>;
319
+ text?: NodeIterationPropsInterface<NodeData, LinkData, string | null> | string | null;
320
+ label?: NodeIterationPropsInterface<NodeData, LinkData, string | null> | string | null;
278
321
  };
322
+ type GraphNodeSettingsInterface<NodeData extends Record<string, unknown>, LinkData extends Record<string, unknown>> = Required<Omit<NodeSettingsInterface<NodeData, LinkData>, "options" | "label" | "text">> & Pick<NodeSettingsInterface<NodeData, LinkData>, "options" | "label" | "text">;
279
323
  type NodeOptionsInterface<NodeData extends Record<string, unknown>, LinkData extends Record<string, unknown>> = {
280
324
  nodeDraw?: ((this: GraphCanvas<NodeData, LinkData>, node: NodeInterface<NodeData>, options: Required<NodeOptionsInterface<NodeData, LinkData>>) => void) | null;
281
325
  textDraw?: ((this: GraphCanvas<NodeData, LinkData>, node: NodeInterface<NodeData>, options: Required<NodeOptionsInterface<NodeData, LinkData>>) => void) | null;
@@ -294,8 +338,6 @@ type NodeOptionsNodeInterface = {
294
338
  borderWidth?: number;
295
339
  };
296
340
  type NodeOptionsTextInterface = {
297
- textVisible?: boolean;
298
- text?: string | null;
299
341
  textColor?: string;
300
342
  textSize?: number;
301
343
  textAlpha?: number;
@@ -320,13 +362,10 @@ type NodeOptionsLabelInterface = {
320
362
  labelStyle?: TextStyleEnum;
321
363
  labelWeight?: number;
322
364
  labelGap?: number;
323
- label?: string | null;
324
365
  };
325
366
 
326
- declare const NODE_SETTINGS: Omit<Required<NodeSettingsInterface<Record<string, unknown>, Record<string, unknown>>>, "options" | "idGetter">;
367
+ declare const NODE_SETTINGS: Omit<Required<NodeSettingsInterface<Record<string, unknown>, Record<string, unknown>>>, "options" | "idGetter" | "text" | "label">;
327
368
  declare const NODE_OPTIONS: Omit<Required<NodeOptionsInterface<Record<string, unknown>, Record<string, unknown>>>, "color" | "text" | "textVisible" | "textSize" | "textShiftY" | "nodeDraw" | "nodeExtraDraw" | "textDraw" | "textExtraDraw">;
328
- declare const PERFORMANCE_NODE_SETTINGS: Omit<Required<NodeSettingsInterface<Record<string, unknown>, Record<string, unknown>>>, "options" | "idGetter">;
329
- declare const PERFOMANCE_NODE_OPTIONS: Omit<Required<NodeOptionsInterface<Record<string, unknown>, Record<string, unknown>>>, "color" | "text" | "textVisible" | "textSize" | "textShiftY" | "nodeDraw" | "nodeExtraDraw" | "textDraw" | "textExtraDraw">;
330
369
 
331
370
  declare const GRAPH_CACHE_TYPE: {
332
371
  readonly NodeOptions: "nodeOptions";
@@ -370,6 +409,10 @@ type GraphCanvasInterface<NodeData extends Record<string, unknown>, LinkData ext
370
409
  type GraphCanvasSimulation<NodeData extends Record<string, unknown>, LinkData extends Record<string, unknown>> = Simulation<NodeInterface<NodeData>, LinkInterface<NodeData, LinkData>>;
371
410
  type GraphCanvasCacheKeys = ValueOf<typeof GRAPH_CACHE_TYPE>;
372
411
 
412
+ declare function getDrawLink<NodeData extends Record<string, unknown>, LinkData extends Record<string, unknown>>(linkBatch: Record<string, LinkDrawBatch[]>, particleBatch: Record<string, LinkParticleDrawBatch[]>, arrowBatch: Record<string, LinkArrowDrawBatch[]>, now: number): (this: GraphCanvas<NodeData, LinkData>, link: LinkInterface<NodeData, LinkData>, index: number) => void;
413
+
414
+ declare function getDrawNode<NodeData extends Record<string, unknown>, LinkData extends Record<string, unknown>>(nodeBatch: Record<string, NodeDrawBatch[]>, nodeImageBatch: Record<string, NodeDrawBatch[]>, textBatch: Record<string, Record<string, NodeTextDrawBatch[]>>, deferredNodeRender: DeferredDraw[], deferredTextRender: DeferredDraw[], area: Area): (this: GraphCanvas<NodeData, LinkData>, node: NodeInterface<NodeData>, index: number) => void;
415
+
373
416
  declare class GraphCanvas<NodeData extends Record<string, unknown>, LinkData extends Record<string, unknown>> {
374
417
  /** initial data */
375
418
  protected nodes: NodeInterface<NodeData>[];
@@ -384,8 +427,8 @@ declare class GraphCanvas<NodeData extends Record<string, unknown>, LinkData ext
384
427
  protected graphSettings: Required<GraphSettingsInterface<NodeData>>;
385
428
  protected forceSettings: Required<ForceSettingsInterface<NodeData, LinkData>>;
386
429
  protected highlightSettings: Required<HighlightSettingsInterface>;
387
- protected nodeSettings: Required<Omit<NodeSettingsInterface<NodeData, LinkData>, "options">> & Pick<NodeSettingsInterface<NodeData, LinkData>, "options">;
388
- protected linkSettings: Required<Omit<LinkSettingsInterface<NodeData, LinkData>, "options">> & Pick<LinkSettingsInterface<NodeData, LinkData>, "options">;
430
+ protected nodeSettings: GraphNodeSettingsInterface<NodeData, LinkData>;
431
+ protected linkSettings: GraphLinkSettingsInterface<NodeData, LinkData>;
389
432
  protected listeners: ListenersInterface<NodeData, LinkData>;
390
433
  /** service */
391
434
  protected context: CanvasRenderingContext2D | null | undefined;
@@ -393,6 +436,7 @@ declare class GraphCanvas<NodeData extends Record<string, unknown>, LinkData ext
393
436
  protected areaTransform: ZoomTransform;
394
437
  protected _translateExtent: [[number, number], [number, number]] | undefined;
395
438
  protected draw: (this: GraphCanvas<NodeData, LinkData>) => void;
439
+ protected instantDraw: (this: GraphCanvas<NodeData, LinkData>) => void;
396
440
  protected eventAbortController: AbortController;
397
441
  protected cachedNodeText: (string[] | undefined)[];
398
442
  protected cachedNodeLabel: (string[] | undefined)[];
@@ -423,6 +467,7 @@ declare class GraphCanvas<NodeData extends Record<string, unknown>, LinkData ext
423
467
  getData: () => Pick<GraphCanvasInterface<NodeData, LinkData>, "nodes" | "links">;
424
468
  fitToView: (margin?: number, duration?: number) => void;
425
469
  focusOnNode: (nodeId: string | number, scale?: number, duration?: number) => void;
470
+ exportToSvg: (filename?: string, fit?: boolean) => void;
426
471
  changeData: (options: Pick<Partial<GraphCanvasInterface<NodeData, LinkData>>, "links" | "nodes">, alpha?: number, clearCache?: boolean | GraphCanvasCacheKeys[], precompute?: boolean) => void;
427
472
  changeSettings: (options: Omit<Partial<GraphCanvasInterface<NodeData, LinkData>>, "links" | "nodes" | "listeners">, clearCache?: boolean | GraphCanvasCacheKeys[], precompute?: boolean) => undefined;
428
473
  updateRect: () => void;
@@ -430,10 +475,10 @@ declare class GraphCanvas<NodeData extends Record<string, unknown>, LinkData ext
430
475
  clearCache: (keys: boolean | GraphCanvasCacheKeys[]) => void;
431
476
  tick: () => void;
432
477
  restart: (alpha?: number, options?: Partial<PrecomputeForceSettingsInterface>) => void;
433
- start: () => void;
434
- stop: () => void;
435
478
  create: () => void;
436
479
  destroy: () => void;
480
+ precompute: () => void;
481
+ protected initSmartDraw: (draw: ReturnType<typeof initDraw>) => () => void;
437
482
  protected getPointerAreaPosition: (event: MouseEvent | TouchEvent) => number[];
438
483
  protected clearHTMLElements: () => void;
439
484
  protected updateSimulation: (precompute?: boolean) => void;
@@ -444,18 +489,32 @@ declare class GraphCanvas<NodeData extends Record<string, unknown>, LinkData ext
444
489
  protected animateZoom: (area: HTMLCanvasElement, target: ZoomTransform, start: ZoomTransform, duration: number) => void;
445
490
  }
446
491
 
492
+ declare class StaticGraphCanvas<NodeData extends Record<string, unknown>, LinkData extends Record<string, unknown>> extends GraphCanvas<NodeData, LinkData> {
493
+ protected get simulationWorking(): boolean;
494
+ protected _rafTickId: number | undefined;
495
+ protected init: () => void;
496
+ tick: () => void;
497
+ restart: () => void;
498
+ changeData: (options: Pick<Partial<GraphCanvasInterface<NodeData, LinkData>>, "links" | "nodes">, _alpha?: number, clearCache?: boolean | GraphCanvasCacheKeys[]) => void;
499
+ changeSettings: (options: Omit<Partial<GraphCanvasInterface<NodeData, LinkData>>, "links" | "nodes" | "listeners" | "forceSettings">, clearCache?: boolean | GraphCanvasCacheKeys[]) => undefined;
500
+ destroy: () => void;
501
+ protected updateData: (_alpha?: number, clearCache?: boolean | GraphCanvasCacheKeys[]) => void;
502
+ }
503
+
447
504
  declare function forceSettingsGetter<NodeData extends Record<string, unknown>, LinkData extends Record<string, unknown>>(settings: ForceSettingsInterface<NodeData, LinkData> | undefined, prevSettings?: Required<ForceSettingsInterface<NodeData, LinkData>>): Required<ForceSettingsInterface<NodeData, LinkData>>;
448
505
 
449
506
  declare function graphSettingsGetter<NodeData extends Record<string, unknown>>(settings: GraphSettingsInterface<NodeData> | undefined, prevSettings?: Required<GraphSettingsInterface<NodeData>>): Required<GraphSettingsInterface<NodeData>>;
450
507
 
451
- declare function linkSettingsGetter<NodeData extends Record<string, unknown>, LinkData extends Record<string, unknown>>(settings: LinkSettingsInterface<NodeData, LinkData> | undefined, prevSettings?: Required<Omit<LinkSettingsInterface<NodeData, LinkData>, "options">> & Pick<LinkSettingsInterface<NodeData, LinkData>, "options">): Required<Omit<LinkSettingsInterface<NodeData, LinkData>, "options">> & Pick<LinkSettingsInterface<NodeData, LinkData>, "options">;
508
+ declare function linkSettingsGetter<NodeData extends Record<string, unknown>, LinkData extends Record<string, unknown>>(settings: LinkSettingsInterface<NodeData, LinkData> | undefined, prevSettings?: GraphLinkSettingsInterface<NodeData, LinkData>): GraphLinkSettingsInterface<NodeData, LinkData>;
452
509
  declare function linkOptionsGetter<NodeData extends Record<string, unknown>, LinkData extends Record<string, unknown>>(this: GraphCanvas<NodeData, LinkData>): Required<LinkOptionsInterface<NodeData, LinkData>>;
453
510
 
454
511
  declare function listenersGetter<NodeData extends Record<string, unknown>, LinkData extends Record<string, unknown>>(settings: ListenersInterface<NodeData, LinkData> | undefined): ListenersInterface<NodeData, LinkData>;
455
512
 
456
- declare function nodeSettingsGetter<NodeData extends Record<string, unknown>, LinkData extends Record<string, unknown>>(settings: NodeSettingsInterface<NodeData, LinkData> | undefined, prevNodeSettings?: Required<Omit<NodeSettingsInterface<NodeData, LinkData>, "options">> & Pick<NodeSettingsInterface<NodeData, LinkData>, "options">): Required<Omit<NodeSettingsInterface<NodeData, LinkData>, "options">> & Pick<NodeSettingsInterface<NodeData, LinkData>, "options">;
513
+ declare function nodeSettingsGetter<NodeData extends Record<string, unknown>, LinkData extends Record<string, unknown>>(settings: NodeSettingsInterface<NodeData, LinkData> | undefined, prevNodeSettings?: GraphNodeSettingsInterface<NodeData, LinkData>): GraphNodeSettingsInterface<NodeData, LinkData>;
457
514
  declare function nodeOptionsGetter<NodeData extends Record<string, unknown>, LinkData extends Record<string, unknown>>(this: GraphCanvas<NodeData, LinkData>, node: NodeInterface<NodeData>): Required<NodeOptionsInterface<NodeData, LinkData>>;
458
- declare function nodeTextSizeGetter<NodeData extends Record<string, unknown>, LinkData extends Record<string, unknown>>(transform: ZoomTransform | undefined, nodeSettings: Required<Omit<NodeSettingsInterface<NodeData, LinkData>, "options">> & Pick<NodeSettingsInterface<NodeData, LinkData>, "options">): {
515
+ declare function nodeTextGetter<NodeData extends Record<string, unknown>, LinkData extends Record<string, unknown>>(this: GraphCanvas<NodeData, LinkData>, node: NodeInterface<NodeData>, index: number): Required<string | null>;
516
+ declare function nodeLabelGetter<NodeData extends Record<string, unknown>, LinkData extends Record<string, unknown>>(this: GraphCanvas<NodeData, LinkData>, node: NodeInterface<NodeData>, index: number): Required<string | null>;
517
+ declare function nodeTextSizeGetter<NodeData extends Record<string, unknown>, LinkData extends Record<string, unknown>>(transform: ZoomTransform | undefined, nodeSettings: GraphNodeSettingsInterface<NodeData, LinkData>): {
459
518
  textSize: number;
460
519
  textShiftY: number;
461
520
  };
@@ -498,6 +557,13 @@ interface GraphBounds {
498
557
  }
499
558
  declare function computeGraphBounds<NodeData extends Record<string, unknown>>(nodes: NodeInterface<NodeData>[]): GraphBounds | null;
500
559
 
560
+ type PrepareGraphOptions<NodeData extends Record<string, unknown>, LinkData extends Record<string, unknown>> = {
561
+ nodes: NodeInterface<NodeData>[];
562
+ links: LinkInterface<NodeData, LinkData>[];
563
+ neighbors?: boolean;
564
+ };
565
+ declare function prepareGraph<NodeData extends Record<string, unknown>, LinkData extends Record<string, unknown>>(opts: PrepareGraphOptions<NodeData, LinkData>): void;
566
+
501
567
  declare function pointerGetter(mouseEvent: MouseEvent | TouchEvent, areaRect: DOMRect | undefined, areaTransform: ZoomTransform): number[];
502
568
 
503
569
  declare function dragPlaceCoefficientGetter<NodeData extends Record<string, unknown>>(node: NodeInterface<NodeData>, pointerX: number, pointerY: number): number | undefined;
@@ -529,13 +595,7 @@ declare function calculateLinkPositionByNode<NodeData extends Record<string, unk
529
595
 
530
596
  declare function animationByProgress(initial: number, additional: number, progress: number): number;
531
597
 
532
- type IsNodeVisibleOptions<NodeData extends Record<string, unknown>> = {
533
- width: number;
534
- height: number;
535
- transform: ZoomTransform;
536
- node: NodeInterface<NodeData>;
537
- };
538
- declare function isNodeVisible<NodeData extends Record<string, unknown>>(opts: IsNodeVisibleOptions<NodeData>): boolean;
598
+ declare function isNodeVisible<NodeData extends Record<string, unknown>>(node: NodeInterface<NodeData>, area: Area): boolean;
539
599
 
540
600
  type GetParticlePositionOptions = {
541
601
  particle: LinkParticle;
@@ -548,6 +608,7 @@ type GetParticlePositionOptions = {
548
608
  distance: number;
549
609
  totalCount: number;
550
610
  speed: number;
611
+ now: number;
551
612
  };
552
613
  declare function getParticlePosition(opts: GetParticlePositionOptions): void;
553
614
  declare function approximateQuadraticBezierLength(x0: number, y0: number, x1: number, y1: number, x2: number, y2: number): number;
@@ -647,24 +708,15 @@ declare function extractLinkPointIds<NodeData extends Record<string, unknown>, L
647
708
 
648
709
  declare function isEmptyObject(obj: Record<string, unknown>): boolean;
649
710
 
650
- declare function getDrawLink<NodeData extends Record<string, unknown>, LinkData extends Record<string, unknown>>(): (this: GraphCanvas<NodeData, LinkData>, link: LinkInterface<NodeData, LinkData>, index: number) => void;
651
-
652
- declare function getDrawNode<NodeData extends Record<string, unknown>, LinkData extends Record<string, unknown>>(nodeRenders: (() => void)[], textRenders: (() => void)[]): (this: GraphCanvas<NodeData, LinkData>, node: NodeInterface<NodeData>, index: number) => void;
653
-
654
- type DrawTextOptions = {
655
- lines: string[];
656
- x: number;
657
- y: number;
658
- textSize: number;
659
- textStyle: TextStyleEnum;
660
- textWeight: number;
661
- textFont: string;
662
- textColor: string;
663
- textGap: number;
664
- textAlign: CanvasTextAlign;
665
- context: CanvasRenderingContext2D;
711
+ type PrecomputeGraphOptions<NodeData extends Record<string, unknown>, LinkData extends Record<string, unknown>> = {
712
+ nodes: NodeInterface<NodeData>[];
713
+ links: LinkInterface<NodeData, LinkData>[];
714
+ forceSettings?: ForceSettingsInterface<NodeData, LinkData>;
715
+ nodeSettings?: NodeSettingsInterface<NodeData, LinkData>;
716
+ linkSettings?: LinkSettingsInterface<NodeData, LinkData>;
717
+ maxMs?: number;
666
718
  };
667
- declare function drawText({ context, textAlign, textColor, textFont, textStyle, textGap, textWeight, textSize, x, y, lines, }: DrawTextOptions): void;
719
+ declare function precomputeGraph<NodeData extends Record<string, unknown>, LinkData extends Record<string, unknown>>(opts: PrecomputeGraphOptions<NodeData, LinkData>): void;
668
720
 
669
721
  type GraphSettingsInputRange<I extends string> = {
670
722
  type: "range";
@@ -747,5 +799,5 @@ declare const NODE_OPTIONS_NODE_CONTROLS: GraphSettingsInputInterface<keyof Node
747
799
  declare const NODE_OPTIONS_TEXT_CONTROLS: GraphSettingsInputInterface<keyof NodeOptionsTextInterface>[];
748
800
  declare const NODE_OPTIONS_LABEL_CONTROLS: GraphSettingsInputInterface<keyof NodeOptionsLabelInterface>[];
749
801
 
750
- export { COMMON_SETTINGS, FORCE_CONTROLS, FORCE_SETTINGS, GRAPH_CACHE_TYPE, GRAPH_SETTINGS, GraphCanvas, HIGHLIGHT_BY_LINK_FOR_ARROW_CONTROLS, HIGHLIGHT_BY_LINK_FOR_LABEL_CONTROLS, HIGHLIGHT_BY_LINK_FOR_LINK_CONTROLS, HIGHLIGHT_BY_LINK_FOR_NODE_CONTROLS, HIGHLIGHT_BY_LINK_FOR_TEXT_CONTROLS, HIGHLIGHT_BY_NODE_FOR_ARROW_CONTROLS, HIGHLIGHT_BY_NODE_FOR_LABEL_CONTROLS, HIGHLIGHT_BY_NODE_FOR_LINK_CONTROLS, HIGHLIGHT_BY_NODE_FOR_NODE_CONTROLS, HIGHLIGHT_BY_NODE_FOR_TEXT_CONTROLS, HIGHLIGHT_COMMON_CONTROLS, HIGHLIGHT_SETTINGS, LINK_OPTIONS, LINK_OPTIONS_ARROW_CONTROLS, LINK_OPTIONS_LINK_CONTROLS, LINK_OPTIONS_PARTICLE_CONTROLS, LINK_SETTINGS, LINK_SETTINGS_CONTROLS, NODE_OPTIONS, NODE_OPTIONS_LABEL_CONTROLS, NODE_OPTIONS_NODE_CONTROLS, NODE_OPTIONS_TEXT_CONTROLS, NODE_SETTINGS, NODE_SETTINGS_CONTROLS, PERFOMANCE_NODE_OPTIONS, PERFORMANCE_FORCE_SETTINGS, PERFORMANCE_GRAPH_SETTINGS, PERFORMANCE_HIGHLIGHT_SETTINGS, PERFORMANCE_LINK_OPTIONS, PERFORMANCE_LINK_SETTINGS, PERFORMANCE_NODE_SETTINGS, animationByProgress, approximateQuadraticBezierLength, calculateLinkPositionByNode, colorGetter, colorToRgb, computeGraphBounds, dragPlaceCoefficientGetter, drawText, extractLinkPointIds, extractRgb, fadeRgb, forceSettingsGetter, getDrawLink, getDrawNode, getParticlePosition, graphSettingsGetter, highlightSettingsGetter, isEmptyObject, isNodeVisible, isOverlapsNode, linkByPointerGetter, linkFade, linkHighlight, linkIterationExtractor, linkOptionsGetter, linkSettingsGetter, listenersGetter, nodeByPointerGetter, nodeFade, nodeHighlight, nodeIdGetter, nodeIterationExtractor, nodeOptionsGetter, nodeRadiusGetter, nodeSettingsGetter, nodeSizeGetter, nodeTextSizeGetter, pointerGetter, rgbAnimationByProgress };
751
- export type { CachedNodeTextInterface, DragEventInterface, ForceSettingsInterface, GraphBounds, GraphCanvasCacheKeys, GraphCanvasInterface, GraphCanvasSimulation, GraphSettingsInputInterface, GraphSettingsInterface, HighlighCommonSettingsInterface, HighlightByLinkForArrowSettingsInterface, HighlightByLinkForLabelSettingsInterface, HighlightByLinkForLinkSettingsInterface, HighlightByLinkForNodeSettingsInterface, HighlightByLinkForTextSettingsInterface, HighlightByNodeForArrowSettingsInterface, HighlightByNodeForLabelSettingsInterface, HighlightByNodeForLinkSettingsInterface, HighlightByNodeForNodeSettingsInterface, HighlightByNodeForTextSettingsInterface, HighlightSettingsInterface, LinkByPointerGetterOptions, LinkInterface, LinkIterationPropsInterface, LinkIterationPropsNoThisInterface, LinkOptionsArrowInterface, LinkOptionsInterface, LinkOptionsLinkInterface, LinkOptionsParticleInterface, LinkParticle, LinkSettingsInterface, ListenersInterface, NodeByPointerGetterOptions, NodeInterface, NodeIterationPropsInterface, NodeIterationPropsNoThisInterface, NodeOptionsInterface, NodeOptionsLabelInterface, NodeOptionsNodeInterface, NodeOptionsTextInterface, NodeRadiusGetterOptions, NodeSettingsInterface, NodeShape, NodeSizeGetterOptions, PrecomputeForceSettingsInterface, RGB, TextStyleEnum, ZoomEventInterface };
802
+ export { COMMON_SETTINGS, FORCE_CONTROLS, FORCE_SETTINGS, GRAPH_CACHE_TYPE, GRAPH_SETTINGS, GraphCanvas, HIGHLIGHT_BY_LINK_FOR_ARROW_CONTROLS, HIGHLIGHT_BY_LINK_FOR_LABEL_CONTROLS, HIGHLIGHT_BY_LINK_FOR_LINK_CONTROLS, HIGHLIGHT_BY_LINK_FOR_NODE_CONTROLS, HIGHLIGHT_BY_LINK_FOR_TEXT_CONTROLS, HIGHLIGHT_BY_NODE_FOR_ARROW_CONTROLS, HIGHLIGHT_BY_NODE_FOR_LABEL_CONTROLS, HIGHLIGHT_BY_NODE_FOR_LINK_CONTROLS, HIGHLIGHT_BY_NODE_FOR_NODE_CONTROLS, HIGHLIGHT_BY_NODE_FOR_TEXT_CONTROLS, HIGHLIGHT_COMMON_CONTROLS, HIGHLIGHT_SETTINGS, LINK_OPTIONS, LINK_OPTIONS_ARROW_CONTROLS, LINK_OPTIONS_LINK_CONTROLS, LINK_OPTIONS_PARTICLE_CONTROLS, LINK_SETTINGS, LINK_SETTINGS_CONTROLS, NODE_OPTIONS, NODE_OPTIONS_LABEL_CONTROLS, NODE_OPTIONS_NODE_CONTROLS, NODE_OPTIONS_TEXT_CONTROLS, NODE_SETTINGS, NODE_SETTINGS_CONTROLS, PERFORMANCE_FORCE_SETTINGS, StaticGraphCanvas, animationByProgress, approximateQuadraticBezierLength, calculateLinkPositionByNode, colorGetter, colorToRgb, computeGraphBounds, dragPlaceCoefficientGetter, extractLinkPointIds, extractRgb, fadeRgb, forceSettingsGetter, getDrawLink, getDrawNode, getParticlePosition, graphSettingsGetter, highlightSettingsGetter, isEmptyObject, isNodeVisible, isOverlapsNode, linkByPointerGetter, linkFade, linkHighlight, linkIterationExtractor, linkOptionsGetter, linkSettingsGetter, listenersGetter, nodeByPointerGetter, nodeFade, nodeHighlight, nodeIdGetter, nodeIterationExtractor, nodeLabelGetter, nodeOptionsGetter, nodeRadiusGetter, nodeSettingsGetter, nodeSizeGetter, nodeTextGetter, nodeTextSizeGetter, pointerGetter, precomputeGraph, prepareGraph, rgbAnimationByProgress };
803
+ export type { Area, CachedNodeTextInterface, DeferredDraw, DragEventInterface, ForceSettingsInterface, GraphBounds, GraphCanvasCacheKeys, GraphCanvasInterface, GraphCanvasSimulation, GraphLinkSettingsInterface, GraphNodeSettingsInterface, GraphSettingsInputInterface, GraphSettingsInterface, HighlighCommonSettingsInterface, HighlightByLinkForArrowSettingsInterface, HighlightByLinkForLabelSettingsInterface, HighlightByLinkForLinkSettingsInterface, HighlightByLinkForNodeSettingsInterface, HighlightByLinkForTextSettingsInterface, HighlightByNodeForArrowSettingsInterface, HighlightByNodeForLabelSettingsInterface, HighlightByNodeForLinkSettingsInterface, HighlightByNodeForNodeSettingsInterface, HighlightByNodeForTextSettingsInterface, HighlightSettingsInterface, LinkArrowDrawBatch, LinkByPointerGetterOptions, LinkDrawBatch, LinkInterface, LinkIterationPropsInterface, LinkIterationPropsNoThisInterface, LinkOptionsArrowInterface, LinkOptionsInterface, LinkOptionsLinkInterface, LinkOptionsParticleInterface, LinkParticle, LinkParticleDrawBatch, LinkSettingsInterface, ListenersInterface, NodeByPointerGetterOptions, NodeDrawBatch, NodeInterface, NodeIterationPropsInterface, NodeIterationPropsNoThisInterface, NodeOptionsInterface, NodeOptionsLabelInterface, NodeOptionsNodeInterface, NodeOptionsTextInterface, NodeRadiusGetterOptions, NodeSettingsInterface, NodeShape, NodeSizeGetterOptions, NodeTextDrawBatch, PrecomputeForceSettingsInterface, RGB, TextStyleEnum, ZoomEventInterface };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@krainovsd/graph",
3
- "version": "0.14.0-beta.8",
3
+ "version": "0.15.0-beta.1",
4
4
  "description": "Krainov graph",
5
5
  "type": "module",
6
6
  "author": "KrainovSD <denislosev48@gmail.com>",