@krainovsd/graph 0.7.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. package/lib/cjs/index.cjs +945 -165
  2. package/lib/cjs/index.cjs.map +1 -1
  3. package/lib/esm/index.js +3 -0
  4. package/lib/esm/index.js.map +1 -1
  5. package/lib/esm/lib/draw-time.js +25 -0
  6. package/lib/esm/lib/draw-time.js.map +1 -0
  7. package/lib/esm/lib/get-controls-info.js +541 -0
  8. package/lib/esm/lib/get-controls-info.js.map +1 -0
  9. package/lib/esm/module/GraphCanvas/GraphCanvas.js +218 -67
  10. package/lib/esm/module/GraphCanvas/GraphCanvas.js.map +1 -1
  11. package/lib/esm/module/GraphCanvas/constants/settings.js +26 -7
  12. package/lib/esm/module/GraphCanvas/constants/settings.js.map +1 -1
  13. package/lib/esm/module/GraphCanvas/lib/settings/link-settings-getter.js +7 -4
  14. package/lib/esm/module/GraphCanvas/lib/settings/link-settings-getter.js.map +1 -1
  15. package/lib/esm/module/GraphCanvas/lib/settings/node-settings-getter.js +6 -5
  16. package/lib/esm/module/GraphCanvas/lib/settings/node-settings-getter.js.map +1 -1
  17. package/lib/esm/module/GraphCanvas/lib/utils/animation-by-progress.js +12 -0
  18. package/lib/esm/module/GraphCanvas/lib/utils/animation-by-progress.js.map +1 -0
  19. package/lib/esm/module/GraphCanvas/lib/utils/calculate-link-position-by-radius.js +2 -2
  20. package/lib/esm/module/GraphCanvas/lib/utils/calculate-link-position-by-radius.js.map +1 -1
  21. package/lib/esm/module/GraphCanvas/lib/utils/get-particle-position.js +24 -0
  22. package/lib/esm/module/GraphCanvas/lib/utils/get-particle-position.js.map +1 -0
  23. package/lib/esm/module/GraphCanvas/lib/utils/is-node-visible.js +14 -0
  24. package/lib/esm/module/GraphCanvas/lib/utils/is-node-visible.js.map +1 -0
  25. package/lib/esm/module/GraphCanvas/lib/utils/link-iteration-extractor.js +1 -0
  26. package/lib/esm/module/GraphCanvas/lib/utils/link-iteration-extractor.js.map +1 -1
  27. package/lib/esm/module/GraphCanvas/lib/utils/node-iteration-extractor.js +1 -0
  28. package/lib/esm/module/GraphCanvas/lib/utils/node-iteration-extractor.js.map +1 -1
  29. package/lib/index.d.ts +72 -3
  30. package/package.json +4 -2
@@ -0,0 +1,24 @@
1
+ function getParticlePosition(opts) {
2
+ if (opts.particle.wait > 0) {
3
+ opts.particle.wait--;
4
+ return;
5
+ }
6
+ const remainingSteps = opts.totalSteps - opts.particle.step;
7
+ const progress = opts.particle.step / opts.totalSteps;
8
+ if (remainingSteps === 0) {
9
+ opts.particle.x = opts.xEnd;
10
+ opts.particle.y = opts.yEnd;
11
+ opts.particle.step = 0;
12
+ return;
13
+ }
14
+ const dx = opts.xEnd - opts.xStart;
15
+ const dy = opts.yEnd - opts.yStart;
16
+ const newX = opts.xStart + dx * progress;
17
+ const newY = opts.yStart + dy * progress;
18
+ opts.particle.x = newX;
19
+ opts.particle.y = newY;
20
+ opts.particle.step++;
21
+ }
22
+
23
+ export { getParticlePosition };
24
+ //# sourceMappingURL=get-particle-position.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-particle-position.js","sources":["../../../../../../src/module/GraphCanvas/lib/utils/get-particle-position.ts"],"sourcesContent":["import type { GraphParticle } from \"../../types\";\n\ntype GetParticlePositionOptions = {\n particle: GraphParticle;\n xStart: number;\n yStart: number;\n xEnd: number;\n yEnd: number;\n totalSteps: number;\n};\n\nexport function getParticlePosition(opts: GetParticlePositionOptions) {\n if (opts.particle.wait > 0) {\n opts.particle.wait--;\n\n return;\n }\n\n const remainingSteps = opts.totalSteps - opts.particle.step;\n const progress = opts.particle.step / opts.totalSteps;\n\n if (remainingSteps === 0) {\n opts.particle.x = opts.xEnd;\n opts.particle.y = opts.yEnd;\n opts.particle.step = 0;\n\n return;\n }\n\n const dx = opts.xEnd - opts.xStart;\n const dy = opts.yEnd - opts.yStart;\n\n const newX = opts.xStart + dx * progress;\n const newY = opts.yStart + dy * progress;\n\n opts.particle.x = newX;\n opts.particle.y = newY;\n opts.particle.step++;\n}\n"],"names":[],"mappings":"AAWM,SAAU,mBAAmB,CAAC,IAAgC,EAAA;IAClE,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,EAAE;AAC1B,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;QAEpB;;IAGF,MAAM,cAAc,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI;IAC3D,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC,UAAU;AAErD,IAAA,IAAI,cAAc,KAAK,CAAC,EAAE;QACxB,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI;QAC3B,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI;AAC3B,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC;QAEtB;;IAGF,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM;IAClC,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM;IAElC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,QAAQ;IACxC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,QAAQ;AAExC,IAAA,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI;AACtB,IAAA,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI;AACtB,IAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;AACtB;;;;"}
@@ -0,0 +1,14 @@
1
+ const ADDITIONAL_VIEWPORT = 10;
2
+ function isNodeVisible(opts) {
3
+ const left = -opts.transform.x / opts.transform.k;
4
+ const right = (opts.width - opts.transform.x) / opts.transform.k;
5
+ const top = -opts.transform.y / opts.transform.k;
6
+ const bottom = (opts.height - opts.transform.y) / opts.transform.k;
7
+ return (left < opts.x + opts.radius + ADDITIONAL_VIEWPORT &&
8
+ opts.x - opts.radius - ADDITIONAL_VIEWPORT < right &&
9
+ top < opts.y + opts.radius + ADDITIONAL_VIEWPORT &&
10
+ opts.y - opts.radius - ADDITIONAL_VIEWPORT < bottom);
11
+ }
12
+
13
+ export { isNodeVisible };
14
+ //# sourceMappingURL=is-node-visible.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"is-node-visible.js","sources":["../../../../../../src/module/GraphCanvas/lib/utils/is-node-visible.ts"],"sourcesContent":["import type { ZoomTransform } from \"d3-zoom\";\n\ntype IsNodeVisibleOptions = {\n x: number;\n y: number;\n radius: number;\n width: number;\n height: number;\n transform: ZoomTransform;\n};\n\nconst ADDITIONAL_VIEWPORT = 10;\n\nexport function isNodeVisible(opts: IsNodeVisibleOptions) {\n const left = -opts.transform.x / opts.transform.k;\n const right = (opts.width - opts.transform.x) / opts.transform.k;\n const top = -opts.transform.y / opts.transform.k;\n const bottom = (opts.height - opts.transform.y) / opts.transform.k;\n\n return (\n left < opts.x + opts.radius + ADDITIONAL_VIEWPORT &&\n opts.x - opts.radius - ADDITIONAL_VIEWPORT < right &&\n top < opts.y + opts.radius + ADDITIONAL_VIEWPORT &&\n opts.y - opts.radius - ADDITIONAL_VIEWPORT < bottom\n );\n}\n"],"names":[],"mappings":"AAWA,MAAM,mBAAmB,GAAG,EAAE;AAExB,SAAU,aAAa,CAAC,IAA0B,EAAA;AACtD,IAAA,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;AACjD,IAAA,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC;AAChE,IAAA,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;AAChD,IAAA,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC;IAElE,QACE,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,mBAAmB;QACjD,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,mBAAmB,GAAG,KAAK;QAClD,GAAG,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,mBAAmB;QAChD,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,mBAAmB,GAAG,MAAM;AAEvD;;;;"}
@@ -1,5 +1,6 @@
1
1
  import { checkType } from '../../../../lib/check-type.js';
2
2
  import '@krainovsd/js-helpers';
3
+ import 'd3-array';
3
4
 
4
5
  function linkIterationExtractor(link, i, links, state, option, optionConstantGetter) {
5
6
  let customOptions;
@@ -1 +1 @@
1
- {"version":3,"file":"link-iteration-extractor.js","sources":["../../../../../../src/module/GraphCanvas/lib/utils/link-iteration-extractor.ts"],"sourcesContent":["import { checkType } from \"@/lib\";\nimport type { LinkInterface } from \"@/types\";\nimport type { GraphState, LinkIterationPropsInterface } from \"../../types\";\n\nexport function linkIterationExtractor<\n NodeData extends Record<string, unknown>,\n LinkData extends Record<string, unknown>,\n Result extends string | number | boolean | Record<string, unknown> | unknown[],\n>(\n link: LinkInterface<NodeData, LinkData>,\n i: number,\n links: LinkInterface<NodeData, LinkData>[],\n state: GraphState<NodeData, LinkData>,\n option: LinkIterationPropsInterface<NodeData, LinkData, Result> | Result,\n optionConstantGetter: undefined,\n): Result;\n\nexport function linkIterationExtractor<\n NodeData extends Record<string, unknown>,\n LinkData extends Record<string, unknown>,\n Result extends string | number | boolean | Record<string, unknown> | unknown[],\n>(\n link: LinkInterface<NodeData, LinkData>,\n i: number,\n links: LinkInterface<NodeData, LinkData>[],\n state: GraphState<NodeData, LinkData>,\n option: LinkIterationPropsInterface<NodeData, LinkData, Result> | Result,\n optionConstantGetter:\n | LinkIterationPropsInterface<NodeData, LinkData, Required<Result>>\n | Required<Result>,\n): Required<Result>;\n\nexport function linkIterationExtractor<\n NodeData extends Record<string, unknown>,\n LinkData extends Record<string, unknown>,\n Result extends string | number | boolean | Record<string, unknown> | unknown[],\n>(\n link: LinkInterface<NodeData, LinkData>,\n i: number,\n links: LinkInterface<NodeData, LinkData>[],\n state: GraphState<NodeData, LinkData>,\n option: LinkIterationPropsInterface<NodeData, LinkData, Result> | Result,\n optionConstantGetter:\n | LinkIterationPropsInterface<NodeData, LinkData, Required<Result>>\n | Required<Result>\n | undefined,\n): Result {\n let customOptions: Result | undefined;\n let constantOptions: Result | undefined;\n\n if (typeof option === \"function\") customOptions = option(link, i, links, 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(link, i, links, 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":";;;AAgCgB,SAAA,sBAAsB,CAKpC,IAAuC,EACvC,CAAS,EACT,KAA0C,EAC1C,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":"link-iteration-extractor.js","sources":["../../../../../../src/module/GraphCanvas/lib/utils/link-iteration-extractor.ts"],"sourcesContent":["import { checkType } from \"@/lib\";\nimport type { LinkInterface } from \"@/types\";\nimport type { GraphState, LinkIterationPropsInterface } from \"../../types\";\n\nexport function linkIterationExtractor<\n NodeData extends Record<string, unknown>,\n LinkData extends Record<string, unknown>,\n Result extends string | number | boolean | Record<string, unknown> | unknown[],\n>(\n link: LinkInterface<NodeData, LinkData>,\n i: number,\n links: LinkInterface<NodeData, LinkData>[],\n state: GraphState<NodeData, LinkData>,\n option: LinkIterationPropsInterface<NodeData, LinkData, Result> | Result,\n optionConstantGetter: undefined,\n): Result;\n\nexport function linkIterationExtractor<\n NodeData extends Record<string, unknown>,\n LinkData extends Record<string, unknown>,\n Result extends string | number | boolean | Record<string, unknown> | unknown[],\n>(\n link: LinkInterface<NodeData, LinkData>,\n i: number,\n links: LinkInterface<NodeData, LinkData>[],\n state: GraphState<NodeData, LinkData>,\n option: LinkIterationPropsInterface<NodeData, LinkData, Result> | Result,\n optionConstantGetter:\n | LinkIterationPropsInterface<NodeData, LinkData, Required<Result>>\n | Required<Result>,\n): Required<Result>;\n\nexport function linkIterationExtractor<\n NodeData extends Record<string, unknown>,\n LinkData extends Record<string, unknown>,\n Result extends string | number | boolean | Record<string, unknown> | unknown[],\n>(\n link: LinkInterface<NodeData, LinkData>,\n i: number,\n links: LinkInterface<NodeData, LinkData>[],\n state: GraphState<NodeData, LinkData>,\n option: LinkIterationPropsInterface<NodeData, LinkData, Result> | Result,\n optionConstantGetter:\n | LinkIterationPropsInterface<NodeData, LinkData, Required<Result>>\n | Required<Result>\n | undefined,\n): Result {\n let customOptions: Result | undefined;\n let constantOptions: Result | undefined;\n\n if (typeof option === \"function\") customOptions = option(link, i, links, 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(link, i, links, 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":";;;;AAgCgB,SAAA,sBAAsB,CAKpC,IAAuC,EACvC,CAAS,EACT,KAA0C,EAC1C,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,5 +1,6 @@
1
1
  import { checkType } from '../../../../lib/check-type.js';
2
2
  import '@krainovsd/js-helpers';
3
+ import 'd3-array';
3
4
 
4
5
  function nodeIterationExtractor(node, i, nodes, state, option, optionConstantGetter) {
5
6
  let customOptions;
@@ -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 { 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;;;;"}
package/lib/index.d.ts CHANGED
@@ -8,6 +8,7 @@ interface NodeInterface<NodeData extends Record<string, unknown>> extends Simula
8
8
  group?: number | string;
9
9
  neighbors?: (string | number)[];
10
10
  _radius?: number;
11
+ _visible?: boolean;
11
12
  name?: string;
12
13
  data?: NodeData;
13
14
  drag?: boolean;
@@ -40,6 +41,7 @@ type GraphSettingsInterface<NodeData extends Record<string, unknown>> = {
40
41
  highlightOnlyRoot?: boolean;
41
42
  highlightFadingMin?: number;
42
43
  highlightLinkFadingMin?: number;
44
+ highlightArrowFadingMin?: number;
43
45
  highlightColorFadingMin?: number;
44
46
  highlightTextFadingMin?: number;
45
47
  highlightSizingAdditional?: number;
@@ -66,6 +68,8 @@ type GraphSettingsInterface<NodeData extends Record<string, unknown>> = {
66
68
  nodeRadiusCoefficient?: number;
67
69
  nodeRadiusFactor?: number;
68
70
  nodeRadiusFlexible?: boolean;
71
+ showDrawTime?: boolean;
72
+ showDrawTimeEveryTick?: boolean;
69
73
  };
70
74
  type ForceSettingsInterface<NodeData extends Record<string, unknown>, LinkData extends Record<string, unknown>> = {
71
75
  collideOn?: boolean;
@@ -94,6 +98,7 @@ type ForceSettingsInterface<NodeData extends Record<string, unknown>, LinkData e
94
98
  yStrength?: NodeIterationPropsInterface<NodeData, LinkData> | number;
95
99
  };
96
100
  type NodeSettingsInterface<NodeData extends Record<string, unknown>, LinkData extends Record<string, unknown>> = {
101
+ cache?: boolean;
97
102
  idGetter?: NodeIterationPropsInterface<NodeData, LinkData, string | number>;
98
103
  options?: NodeIterationPropsInterface<NodeData, LinkData, NodeOptionsInterface<NodeData, LinkData>> | NodeOptionsInterface<NodeData, LinkData>;
99
104
  };
@@ -110,7 +115,6 @@ type NodeOptionsInterface<NodeData extends Record<string, unknown>, LinkData ext
110
115
  borderColor?: string;
111
116
  borderWidth?: number;
112
117
  radius?: number;
113
- width?: number;
114
118
  alpha?: number;
115
119
  color?: string;
116
120
  textVisible?: boolean;
@@ -129,6 +133,8 @@ type NodeOptionsInterface<NodeData extends Record<string, unknown>, LinkData ext
129
133
  };
130
134
  type NodeIterationPropsInterface<NodeData extends Record<string, unknown>, LinkData extends Record<string, unknown>, Return = number> = (node: NodeInterface<NodeData>, i: number, nodes: NodeInterface<NodeData>[], state?: GraphState<NodeData, LinkData>) => Return;
131
135
  type LinkSettingsInterface<NodeData extends Record<string, unknown>, LinkData extends Record<string, unknown>> = {
136
+ particles?: boolean;
137
+ cache?: boolean;
132
138
  options?: LinkIterationPropsInterface<NodeData, LinkData, LinkOptionsInterface<NodeData, LinkData>> | LinkOptionsInterface<NodeData, LinkData>;
133
139
  };
134
140
  type LinkOptionsInterface<NodeData extends Record<string, unknown>, LinkData extends Record<string, unknown>> = {
@@ -139,6 +145,17 @@ type LinkOptionsInterface<NodeData extends Record<string, unknown>, LinkData ext
139
145
  width?: number;
140
146
  highlightFading?: boolean;
141
147
  pretty?: boolean;
148
+ arrow?: boolean;
149
+ arrowAlpha?: number;
150
+ arrowColor?: string;
151
+ arrowSize?: number;
152
+ arrowHighlightFading?: boolean;
153
+ arrowReverseAppear?: boolean;
154
+ particleAlpha?: number;
155
+ particleColor?: string;
156
+ particleRadius?: number;
157
+ particleCount?: number;
158
+ particleSteps?: number;
142
159
  };
143
160
  type LinkIterationPropsInterface<NodeData extends Record<string, unknown>, LinkData extends Record<string, unknown>, Return = number> = (link: LinkInterface<NodeData, LinkData>, i: number, links: LinkInterface<NodeData, LinkData>[], state?: GraphState<NodeData, LinkData>) => Return;
144
161
  type TextStyleEnum = "normal" | "italic" | "oblique";
@@ -181,11 +198,20 @@ type RGB = {
181
198
  g: number;
182
199
  b: number;
183
200
  };
201
+ type GraphParticle = {
202
+ step: number;
203
+ wait: number;
204
+ x?: number;
205
+ y?: number;
206
+ sourceId: number;
207
+ targetId: number;
208
+ };
184
209
 
185
210
  declare class GraphCanvas<NodeData extends Record<string, unknown>, LinkData extends Record<string, unknown>> {
186
211
  /** initial data */
187
212
  private nodes;
188
213
  private links;
214
+ private particles;
189
215
  private width;
190
216
  private height;
191
217
  private root;
@@ -205,6 +231,8 @@ declare class GraphCanvas<NodeData extends Record<string, unknown>, LinkData ext
205
231
  private draw;
206
232
  private eventAbortController;
207
233
  private cachedNodeText;
234
+ private linkOptionsCache;
235
+ private nodeOptionsCache;
208
236
  private isDragging;
209
237
  private highlightedNode;
210
238
  private highlightedNeighbors;
@@ -218,6 +246,7 @@ declare class GraphCanvas<NodeData extends Record<string, unknown>, LinkData ext
218
246
  getData(): Pick<GraphCanvasInterface<NodeData, LinkData>, "nodes" | "links">;
219
247
  changeData(options: Pick<Partial<GraphCanvasInterface<NodeData, LinkData>>, "links" | "nodes">, alpha?: number): void;
220
248
  changeSettings(options: Omit<Partial<GraphCanvasInterface<NodeData, LinkData>>, "links" | "nodes" | "listeners">): undefined;
249
+ clearCache(): void;
221
250
  tick(): void;
222
251
  restart(alpha?: number): void;
223
252
  start(): void;
@@ -278,13 +307,25 @@ type DrawTextOptions = {
278
307
  };
279
308
  declare function drawText({ context, id, textAlign, textColor, textFont, textStyle, textGap, textWeight, textSize, text, x, y, cachedNodeText, maxWidth, }: DrawTextOptions): void;
280
309
 
281
- declare function calculateLinkPositionByRadius<NodeData extends Record<string, unknown>, LinkData extends Record<string, unknown>>(link: LinkInterface<NodeData, LinkData>): {
310
+ declare function calculateLinkPositionByRadius<NodeData extends Record<string, unknown>, LinkData extends Record<string, unknown>>(link: LinkInterface<NodeData, LinkData>, arrowSize?: number): {
282
311
  x1: number;
283
312
  y1: number;
284
313
  x2: number;
285
314
  y2: number;
286
315
  } | null;
287
316
 
317
+ declare function animationByProgress(initial: number, additional: number, progress: number): number;
318
+
319
+ type GetParticlePositionOptions = {
320
+ particle: GraphParticle;
321
+ xStart: number;
322
+ yStart: number;
323
+ xEnd: number;
324
+ yEnd: number;
325
+ totalSteps: number;
326
+ };
327
+ declare function getParticlePosition(opts: GetParticlePositionOptions): void;
328
+
288
329
  declare function colorToRgb(color: string): string | null;
289
330
 
290
331
  declare function extractRgb(color: string | null): {
@@ -297,4 +338,32 @@ declare function fadeRgb(color: RGB, fade: number): RGB;
297
338
 
298
339
  declare function rgbAnimationByProgress(start: RGB, end: RGB, progress: number): RGB;
299
340
 
300
- export { type CachedNodeTextInterface, type DragEventInterface, type ForceSettingsInterface, GraphCanvas, type GraphCanvasInterface, type GraphCanvasSimulation, type GraphSettingsInterface, type GraphState, type LinkInterface, type LinkIterationPropsInterface, type LinkOptionsInterface, type LinkSettingsInterface, type ListenersInterface, type NodeInterface, type NodeIterationPropsInterface, type NodeOptionsInterface, type NodeSettingsInterface, type RGB, type TextStyleEnum, type ZoomEventInterface, calculateLinkPositionByRadius, colorToRgb, drawText, extractRgb, fadeRgb, linkIterationExtractor, linkOptionsGetter, nodeIterationExtractor, nodeOptionsGetter, nodeRadiusGetter, rgbAnimationByProgress };
341
+ type GraphSettingsInputRange<I extends string> = {
342
+ type: "range";
343
+ min: number;
344
+ max: number;
345
+ step: number;
346
+ initialValue: number;
347
+ id: I;
348
+ label: string;
349
+ };
350
+ type GraphSettingsInputCheckBox<I extends string> = {
351
+ type: "checkbox";
352
+ id: I;
353
+ initialValue: boolean;
354
+ label: string;
355
+ };
356
+ type GraphSettingsInputColorBox<I extends string> = {
357
+ type: "color";
358
+ id: I;
359
+ initialValue: string;
360
+ label: string;
361
+ };
362
+ type GraphSettingsInputInterface<I extends string> = GraphSettingsInputRange<I> | GraphSettingsInputCheckBox<I> | GraphSettingsInputColorBox<I>;
363
+
364
+ declare function getForceControls<NodeData extends Record<string, unknown>, LinkData extends Record<string, unknown>>(keys?: (keyof ForceSettingsInterface<NodeData, LinkData>)[]): GraphSettingsInputInterface<keyof ForceSettingsInterface<NodeData, LinkData>>[];
365
+ declare function getGraphControls<NodeData extends Record<string, unknown>>(keys?: (keyof GraphSettingsInterface<NodeData>)[]): GraphSettingsInputInterface<keyof GraphSettingsInterface<NodeData>>[];
366
+ declare function getNodeControls<NodeData extends Record<string, unknown>, LinkData extends Record<string, unknown>>(keys?: (keyof NodeOptionsInterface<NodeData, LinkData>)[]): GraphSettingsInputInterface<keyof NodeOptionsInterface<NodeData, LinkData>>[];
367
+ declare function getLinkControls<NodeData extends Record<string, unknown>, LinkData extends Record<string, unknown>>(keys?: (keyof LinkOptionsInterface<NodeData, LinkData>)[]): GraphSettingsInputInterface<keyof LinkOptionsInterface<NodeData, LinkData>>[];
368
+
369
+ export { type CachedNodeTextInterface, type DragEventInterface, type ForceSettingsInterface, GraphCanvas, type GraphCanvasInterface, type GraphCanvasSimulation, type GraphParticle, type GraphSettingsInterface, type GraphState, type LinkInterface, type LinkIterationPropsInterface, type LinkOptionsInterface, type LinkSettingsInterface, type ListenersInterface, type NodeInterface, type NodeIterationPropsInterface, type NodeOptionsInterface, type NodeSettingsInterface, type RGB, type TextStyleEnum, type ZoomEventInterface, animationByProgress, calculateLinkPositionByRadius, colorToRgb, drawText, extractRgb, fadeRgb, getForceControls, getGraphControls, getLinkControls, getNodeControls, getParticlePosition, linkIterationExtractor, linkOptionsGetter, nodeIterationExtractor, nodeOptionsGetter, nodeRadiusGetter, rgbAnimationByProgress };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@krainovsd/graph",
3
- "version": "0.7.0",
3
+ "version": "0.8.0",
4
4
  "description": "Krainov graph",
5
5
  "type": "module",
6
6
  "author": "KrainovSD <denislosev48@gmail.com>",
@@ -55,7 +55,9 @@
55
55
  "@types/d3-drag": "3.0.7",
56
56
  "@types/d3-array": "3.2.1",
57
57
  "vite": "6.0.11",
58
- "@types/lodash": "4.17.14"
58
+ "@types/lodash": "4.17.14",
59
+ "@sveltejs/vite-plugin-svelte": "5.0.3",
60
+ "svelte": "5.23.2"
59
61
  },
60
62
  "dependencies": {
61
63
  "@krainovsd/js-helpers": "0.12.0",