@plait/graph-viz 0.62.0 → 0.63.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.
@@ -9,6 +9,10 @@ export const DEFAULT_ACTIVE_NODE_SIZE_MULTIPLIER = 1.2;
9
9
  export const DEFAULT_ACTIVE_WAVE_NODE_SIZE_MULTIPLIER = 1.5;
10
10
  export const DEFAULT_NODE_LABEL_MARGIN_TOP = 4;
11
11
  export const DEFAULT_NODE_LABEL_FONT_SIZE = 12;
12
+ export const DEFAULT_NODE_LABEL_WIDTH = 150;
13
+ export const DEFAULT_NODE_LABEL_HEIGHT = 22;
14
+ export const DEFAULT_NODE_LABEL_STYLE = `user-select:none;max-width:${DEFAULT_NODE_LABEL_WIDTH}px;text-align:center;line-height:${DEFAULT_NODE_LABEL_HEIGHT}px;font-size:${DEFAULT_NODE_LABEL_FONT_SIZE}px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;`;
15
+ export const NODE_LABEL_CLASS_NAME = 'force-atlas-node-label';
12
16
  export const SECOND_DEPTH_NODE_ALPHA = 0.5;
13
17
  export const SECOND_DEPTH_LINE_ALPHA = 0.5;
14
18
  export const ACTIVE_BACKGROUND_NODE_ALPHA = 0.1;
@@ -31,4 +35,4 @@ export const DEFAULT_LINE_STYLES = {
31
35
  [EdgeDirection.NONE]: `#ddd`
32
36
  }
33
37
  };
34
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvZ3JhcGgtdml6L3NyYy9mb3JjZS1hdGxhcy9jb25zdGFudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFeEMsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQVk7SUFDeEMsR0FBRyxjQUFjO0lBQ2pCLE1BQU0sRUFBRSxNQUFNO0NBQ2pCLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxFQUFFLENBQUM7QUFFcEMsTUFBTSxDQUFDLE1BQU0sbUNBQW1DLEdBQUcsR0FBRyxDQUFDO0FBRXZELE1BQU0sQ0FBQyxNQUFNLHdDQUF3QyxHQUFHLEdBQUcsQ0FBQztBQUU1RCxNQUFNLENBQUMsTUFBTSw2QkFBNkIsR0FBRyxDQUFDLENBQUM7QUFFL0MsTUFBTSxDQUFDLE1BQU0sNEJBQTRCLEdBQUcsRUFBRSxDQUFDO0FBRS9DLE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLEdBQUcsQ0FBQztBQUUzQyxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxHQUFHLENBQUM7QUFFM0MsTUFBTSxDQUFDLE1BQU0sNEJBQTRCLEdBQUcsR0FBRyxDQUFDO0FBRWhELE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLHVCQUF1QixDQUFDO0FBRTVELE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUFHLDhCQUE4QixDQUFDO0FBRTFFLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLEVBQUUsQ0FBQztBQUV0QyxNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBRyxFQUFFLENBQUM7QUFFN0MsTUFBTSxDQUFDLE1BQU0sNkJBQTZCLEdBQUcsU0FBUyxDQUFDO0FBRXZELE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLE1BQU0sQ0FBQztBQUU5QyxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBWTtJQUN4QyxHQUFHLGNBQWM7SUFDakIsSUFBSSxFQUFFLDZCQUE2QjtJQUNuQyxXQUFXLEVBQUUsQ0FBQztDQUNqQixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQUcsRUFBRSxDQUFDO0FBRTdDLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHO0lBQy9CLEtBQUssRUFBRTtRQUNILENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFNBQVM7UUFDN0IsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLEVBQUUsU0FBUztRQUM5QixDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNO0tBQy9CO0NBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9wdGlvbnMgfSBmcm9tICdyb3VnaGpzL2Jpbi9jb3JlJztcbmltcG9ydCB7IERFRkFVTFRfU1RZTEVTIH0gZnJvbSAnLi4vY29uc3RhbnRzL2RlZmF1bHQnO1xuaW1wb3J0IHsgRWRnZURpcmVjdGlvbiB9IGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9FREdFX1NUWUxFUzogT3B0aW9ucyA9IHtcbiAgICAuLi5ERUZBVUxUX1NUWUxFUyxcbiAgICBzdHJva2U6ICcjZGRkJ1xufTtcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfTk9ERV9TSVpFID0gMzA7XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0FDVElWRV9OT0RFX1NJWkVfTVVMVElQTElFUiA9IDEuMjtcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfQUNUSVZFX1dBVkVfTk9ERV9TSVpFX01VTFRJUExJRVIgPSAxLjU7XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX05PREVfTEFCRUxfTUFSR0lOX1RPUCA9IDQ7XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX05PREVfTEFCRUxfRk9OVF9TSVpFID0gMTI7XG5cbmV4cG9ydCBjb25zdCBTRUNPTkRfREVQVEhfTk9ERV9BTFBIQSA9IDAuNTtcblxuZXhwb3J0IGNvbnN0IFNFQ09ORF9ERVBUSF9MSU5FX0FMUEhBID0gMC41O1xuXG5leHBvcnQgY29uc3QgQUNUSVZFX0JBQ0tHUk9VTkRfTk9ERV9BTFBIQSA9IDAuMTtcblxuZXhwb3J0IGNvbnN0IE5PREVfSUNPTl9DTEFTU19OQU1FID0gJ2ZvcmNlLWF0bGFzLW5vZGUtaWNvbic7XG5cbmV4cG9ydCBjb25zdCBBQ1RJVkVfTk9ERV9JQ09OX0NMQVNTX05BTUUgPSAnZm9yY2UtYXRsYXMtbm9kZS1pY29uLWFjdGl2ZSc7XG5cbmV4cG9ydCBjb25zdCBOT0RFX0lDT05fRk9OVF9TSVpFID0gMTY7XG5cbmV4cG9ydCBjb25zdCBBQ1RJVkVfTk9ERV9JQ09OX0ZPTlRfU0laRSA9IDE4O1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9OT0RFX0JBQ0tHUk9VTkRfQ09MT1IgPSAnIzljOWNmYic7XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX05PREVfSUNPTl9DT0xPUiA9ICcjZmZmJztcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfTk9ERV9TVFlMRVM6IE9wdGlvbnMgPSB7XG4gICAgLi4uREVGQVVMVF9TVFlMRVMsXG4gICAgZmlsbDogREVGQVVMVF9OT0RFX0JBQ0tHUk9VTkRfQ09MT1IsXG4gICAgc3Ryb2tlV2lkdGg6IDBcbn07XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX05PREVfU0NBTElOR19SQVRJTyA9IDIwO1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9MSU5FX1NUWUxFUyA9IHtcbiAgICBjb2xvcjoge1xuICAgICAgICBbRWRnZURpcmVjdGlvbi5JTl06ICcjNzNEODk3JyxcbiAgICAgICAgW0VkZ2VEaXJlY3Rpb24uT1VUXTogJyM2Njk4RkYnLFxuICAgICAgICBbRWRnZURpcmVjdGlvbi5OT05FXTogYCNkZGRgXG4gICAgfVxufTtcbiJdfQ==
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvZ3JhcGgtdml6L3NyYy9mb3JjZS1hdGxhcy9jb25zdGFudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFeEMsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQVk7SUFDeEMsR0FBRyxjQUFjO0lBQ2pCLE1BQU0sRUFBRSxNQUFNO0NBQ2pCLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxFQUFFLENBQUM7QUFFcEMsTUFBTSxDQUFDLE1BQU0sbUNBQW1DLEdBQUcsR0FBRyxDQUFDO0FBRXZELE1BQU0sQ0FBQyxNQUFNLHdDQUF3QyxHQUFHLEdBQUcsQ0FBQztBQUU1RCxNQUFNLENBQUMsTUFBTSw2QkFBNkIsR0FBRyxDQUFDLENBQUM7QUFFL0MsTUFBTSxDQUFDLE1BQU0sNEJBQTRCLEdBQUcsRUFBRSxDQUFDO0FBRS9DLE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLEdBQUcsQ0FBQztBQUU1QyxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBRyxFQUFFLENBQUM7QUFFNUMsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQUcsOEJBQThCLHdCQUF3QixvQ0FBb0MseUJBQXlCLGdCQUFnQiw0QkFBNEIsK0RBQStELENBQUM7QUFFdlEsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsd0JBQXdCLENBQUM7QUFFOUQsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsR0FBRyxDQUFDO0FBRTNDLE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLEdBQUcsQ0FBQztBQUUzQyxNQUFNLENBQUMsTUFBTSw0QkFBNEIsR0FBRyxHQUFHLENBQUM7QUFFaEQsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsdUJBQXVCLENBQUM7QUFFNUQsTUFBTSxDQUFDLE1BQU0sMkJBQTJCLEdBQUcsOEJBQThCLENBQUM7QUFFMUUsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsRUFBRSxDQUFDO0FBRXRDLE1BQU0sQ0FBQyxNQUFNLDBCQUEwQixHQUFHLEVBQUUsQ0FBQztBQUU3QyxNQUFNLENBQUMsTUFBTSw2QkFBNkIsR0FBRyxTQUFTLENBQUM7QUFFdkQsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsTUFBTSxDQUFDO0FBRTlDLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFZO0lBQ3hDLEdBQUcsY0FBYztJQUNqQixJQUFJLEVBQUUsNkJBQTZCO0lBQ25DLFdBQVcsRUFBRSxDQUFDO0NBQ2pCLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBRyxFQUFFLENBQUM7QUFFN0MsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUc7SUFDL0IsS0FBSyxFQUFFO1FBQ0gsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLEVBQUUsU0FBUztRQUM3QixDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsRUFBRSxTQUFTO1FBQzlCLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU07S0FDL0I7Q0FDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT3B0aW9ucyB9IGZyb20gJ3JvdWdoanMvYmluL2NvcmUnO1xuaW1wb3J0IHsgREVGQVVMVF9TVFlMRVMgfSBmcm9tICcuLi9jb25zdGFudHMvZGVmYXVsdCc7XG5pbXBvcnQgeyBFZGdlRGlyZWN0aW9uIH0gZnJvbSAnLi90eXBlcyc7XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0VER0VfU1RZTEVTOiBPcHRpb25zID0ge1xuICAgIC4uLkRFRkFVTFRfU1RZTEVTLFxuICAgIHN0cm9rZTogJyNkZGQnXG59O1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9OT0RFX1NJWkUgPSAzMDtcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfQUNUSVZFX05PREVfU0laRV9NVUxUSVBMSUVSID0gMS4yO1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9BQ1RJVkVfV0FWRV9OT0RFX1NJWkVfTVVMVElQTElFUiA9IDEuNTtcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfTk9ERV9MQUJFTF9NQVJHSU5fVE9QID0gNDtcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfTk9ERV9MQUJFTF9GT05UX1NJWkUgPSAxMjtcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfTk9ERV9MQUJFTF9XSURUSCA9IDE1MDtcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfTk9ERV9MQUJFTF9IRUlHSFQgPSAyMjtcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfTk9ERV9MQUJFTF9TVFlMRSA9IGB1c2VyLXNlbGVjdDpub25lO21heC13aWR0aDoke0RFRkFVTFRfTk9ERV9MQUJFTF9XSURUSH1weDt0ZXh0LWFsaWduOmNlbnRlcjtsaW5lLWhlaWdodDoke0RFRkFVTFRfTk9ERV9MQUJFTF9IRUlHSFR9cHg7Zm9udC1zaXplOiR7REVGQVVMVF9OT0RFX0xBQkVMX0ZPTlRfU0laRX1weDt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7YDtcblxuZXhwb3J0IGNvbnN0IE5PREVfTEFCRUxfQ0xBU1NfTkFNRSA9ICdmb3JjZS1hdGxhcy1ub2RlLWxhYmVsJztcblxuZXhwb3J0IGNvbnN0IFNFQ09ORF9ERVBUSF9OT0RFX0FMUEhBID0gMC41O1xuXG5leHBvcnQgY29uc3QgU0VDT05EX0RFUFRIX0xJTkVfQUxQSEEgPSAwLjU7XG5cbmV4cG9ydCBjb25zdCBBQ1RJVkVfQkFDS0dST1VORF9OT0RFX0FMUEhBID0gMC4xO1xuXG5leHBvcnQgY29uc3QgTk9ERV9JQ09OX0NMQVNTX05BTUUgPSAnZm9yY2UtYXRsYXMtbm9kZS1pY29uJztcblxuZXhwb3J0IGNvbnN0IEFDVElWRV9OT0RFX0lDT05fQ0xBU1NfTkFNRSA9ICdmb3JjZS1hdGxhcy1ub2RlLWljb24tYWN0aXZlJztcblxuZXhwb3J0IGNvbnN0IE5PREVfSUNPTl9GT05UX1NJWkUgPSAxNjtcblxuZXhwb3J0IGNvbnN0IEFDVElWRV9OT0RFX0lDT05fRk9OVF9TSVpFID0gMTg7XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX05PREVfQkFDS0dST1VORF9DT0xPUiA9ICcjOWM5Y2ZiJztcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfTk9ERV9JQ09OX0NPTE9SID0gJyNmZmYnO1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9OT0RFX1NUWUxFUzogT3B0aW9ucyA9IHtcbiAgICAuLi5ERUZBVUxUX1NUWUxFUyxcbiAgICBmaWxsOiBERUZBVUxUX05PREVfQkFDS0dST1VORF9DT0xPUixcbiAgICBzdHJva2VXaWR0aDogMFxufTtcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfTk9ERV9TQ0FMSU5HX1JBVElPID0gMjA7XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0xJTkVfU1RZTEVTID0ge1xuICAgIGNvbG9yOiB7XG4gICAgICAgIFtFZGdlRGlyZWN0aW9uLklOXTogJyM3M0Q4OTcnLFxuICAgICAgICBbRWRnZURpcmVjdGlvbi5PVVRdOiAnIzY2OThGRicsXG4gICAgICAgIFtFZGdlRGlyZWN0aW9uLk5PTkVdOiBgI2RkZGBcbiAgICB9XG59O1xuIl19
@@ -13,7 +13,7 @@ export class ForceAtlasEdgeGenerator extends Generator {
13
13
  }
14
14
  draw(element, data) {
15
15
  const edgeG = createG();
16
- const edgeElement = drawEdge(data.startPoint, data.endPoint, data.direction, data.isSourceActive && data.isTargetActive);
16
+ const edgeElement = drawEdge(data.startPoint, data.endPoint, data.direction, data.isSourceActive && data.isTargetActive, data.isTargetSelf);
17
17
  edgeG.append(edgeElement.g);
18
18
  if (data.direction !== EdgeDirection.NONE) {
19
19
  const particle = drawParticle(this.board, data.startPoint, data.direction);
@@ -27,4 +27,4 @@ export class ForceAtlasEdgeGenerator extends Generator {
27
27
  this.particleAnimation?.stop();
28
28
  }
29
29
  }
30
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRnZS5nZW5lcmF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9ncmFwaC12aXovc3JjL2ZvcmNlLWF0bGFzL2dlbmVyYXRvcnMvZWRnZS5nZW5lcmF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFjLE9BQU8sRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNsRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTFDLE9BQU8sRUFBRSxhQUFhLEVBQXFCLE1BQU0sVUFBVSxDQUFDO0FBQzVELE9BQU8sRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV4RCxNQUFNLE9BQU8sdUJBQXdCLFNBQVEsU0FBbUQ7YUFDckYsUUFBRyxHQUFHLGtCQUFrQixDQUFDO0lBRWhDLFlBQVksS0FBaUI7UUFDekIsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pCLENBQUM7SUFFRCxPQUFPLENBQUMsT0FBOEI7UUFDbEMsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVELElBQUksQ0FBQyxPQUE4QixFQUFFLElBQXVCO1FBQ3hELE1BQU0sS0FBSyxHQUFHLE9BQU8sRUFBRSxDQUFDO1FBQ3hCLE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsY0FBYyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUN6SCxLQUFLLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1QixJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssYUFBYSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3hDLE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzNFLFdBQVcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQy9CLElBQUksQ0FBQyxpQkFBaUIsR0FBRyx1QkFBdUIsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ2pGLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRUQsT0FBTztRQUNILEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNoQixJQUFJLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDbkMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBsYWl0Qm9hcmQsIGNyZWF0ZUcgfSBmcm9tICdAcGxhaXQvY29yZSc7XG5pbXBvcnQgeyBHZW5lcmF0b3IgfSBmcm9tICdAcGxhaXQvY29tbW9uJztcbmltcG9ydCB7IEZvcmNlQXRsYXNFZGdlRWxlbWVudCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgRWRnZURpcmVjdGlvbiwgRWRnZUdlbmVyYXRvckRhdGEgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBkcmF3RWRnZSwgZHJhd1BhcnRpY2xlIH0gZnJvbSAnLi4vdXRpbHMvZHJhdyc7XG5pbXBvcnQgeyBwbGF5RWRnZVBhcnRpY2xlQW5pbWF0ZSB9IGZyb20gJy4uL3V0aWxzL2VkZ2UnO1xuXG5leHBvcnQgY2xhc3MgRm9yY2VBdGxhc0VkZ2VHZW5lcmF0b3IgZXh0ZW5kcyBHZW5lcmF0b3I8Rm9yY2VBdGxhc0VkZ2VFbGVtZW50LCBFZGdlR2VuZXJhdG9yRGF0YT4ge1xuICAgIHN0YXRpYyBrZXkgPSAnZm9yY2UtYXRsYXMtZWRnZSc7XG4gICAgcGFydGljbGVBbmltYXRpb24/OiB7IHN0b3A6ICgpID0+IHZvaWQ7IHN0YXJ0OiAoKSA9PiB2b2lkIH07XG4gICAgY29uc3RydWN0b3IoYm9hcmQ6IFBsYWl0Qm9hcmQpIHtcbiAgICAgICAgc3VwZXIoYm9hcmQpO1xuICAgIH1cblxuICAgIGNhbkRyYXcoZWxlbWVudDogRm9yY2VBdGxhc0VkZ2VFbGVtZW50KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGRyYXcoZWxlbWVudDogRm9yY2VBdGxhc0VkZ2VFbGVtZW50LCBkYXRhOiBFZGdlR2VuZXJhdG9yRGF0YSkge1xuICAgICAgICBjb25zdCBlZGdlRyA9IGNyZWF0ZUcoKTtcbiAgICAgICAgY29uc3QgZWRnZUVsZW1lbnQgPSBkcmF3RWRnZShkYXRhLnN0YXJ0UG9pbnQsIGRhdGEuZW5kUG9pbnQsIGRhdGEuZGlyZWN0aW9uLCBkYXRhLmlzU291cmNlQWN0aXZlICYmIGRhdGEuaXNUYXJnZXRBY3RpdmUpO1xuICAgICAgICBlZGdlRy5hcHBlbmQoZWRnZUVsZW1lbnQuZyk7XG4gICAgICAgIGlmIChkYXRhLmRpcmVjdGlvbiAhPT0gRWRnZURpcmVjdGlvbi5OT05FKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJ0aWNsZSA9IGRyYXdQYXJ0aWNsZSh0aGlzLmJvYXJkLCBkYXRhLnN0YXJ0UG9pbnQsIGRhdGEuZGlyZWN0aW9uKTtcbiAgICAgICAgICAgIGVkZ2VFbGVtZW50LmcuYXBwZW5kKHBhcnRpY2xlKTtcbiAgICAgICAgICAgIHRoaXMucGFydGljbGVBbmltYXRpb24gPSBwbGF5RWRnZVBhcnRpY2xlQW5pbWF0ZShlZGdlRWxlbWVudC5wYXRoLCBwYXJ0aWNsZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVkZ2VHO1xuICAgIH1cblxuICAgIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHN1cGVyLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5wYXJ0aWNsZUFuaW1hdGlvbj8uc3RvcCgpO1xuICAgIH1cbn1cbiJdfQ==
30
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRnZS5nZW5lcmF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9ncmFwaC12aXovc3JjL2ZvcmNlLWF0bGFzL2dlbmVyYXRvcnMvZWRnZS5nZW5lcmF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFjLE9BQU8sRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNsRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTFDLE9BQU8sRUFBRSxhQUFhLEVBQXFCLE1BQU0sVUFBVSxDQUFDO0FBQzVELE9BQU8sRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV4RCxNQUFNLE9BQU8sdUJBQXdCLFNBQVEsU0FBbUQ7YUFDckYsUUFBRyxHQUFHLGtCQUFrQixDQUFDO0lBRWhDLFlBQVksS0FBaUI7UUFDekIsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pCLENBQUM7SUFFRCxPQUFPLENBQUMsT0FBOEI7UUFDbEMsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVELElBQUksQ0FBQyxPQUE4QixFQUFFLElBQXVCO1FBQ3hELE1BQU0sS0FBSyxHQUFHLE9BQU8sRUFBRSxDQUFDO1FBQ3hCLE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FDeEIsSUFBSSxDQUFDLFVBQVUsRUFDZixJQUFJLENBQUMsUUFBUSxFQUNiLElBQUksQ0FBQyxTQUFTLEVBQ2QsSUFBSSxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUMxQyxJQUFJLENBQUMsWUFBWSxDQUNwQixDQUFDO1FBQ0YsS0FBSyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUIsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN4QyxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUMzRSxXQUFXLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMvQixJQUFJLENBQUMsaUJBQWlCLEdBQUcsdUJBQXVCLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNqRixDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUVELE9BQU87UUFDSCxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDaEIsSUFBSSxDQUFDLGlCQUFpQixFQUFFLElBQUksRUFBRSxDQUFDO0lBQ25DLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQbGFpdEJvYXJkLCBjcmVhdGVHIH0gZnJvbSAnQHBsYWl0L2NvcmUnO1xuaW1wb3J0IHsgR2VuZXJhdG9yIH0gZnJvbSAnQHBsYWl0L2NvbW1vbic7XG5pbXBvcnQgeyBGb3JjZUF0bGFzRWRnZUVsZW1lbnQgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEVkZ2VEaXJlY3Rpb24sIEVkZ2VHZW5lcmF0b3JEYXRhIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgZHJhd0VkZ2UsIGRyYXdQYXJ0aWNsZSB9IGZyb20gJy4uL3V0aWxzL2RyYXcnO1xuaW1wb3J0IHsgcGxheUVkZ2VQYXJ0aWNsZUFuaW1hdGUgfSBmcm9tICcuLi91dGlscy9lZGdlJztcblxuZXhwb3J0IGNsYXNzIEZvcmNlQXRsYXNFZGdlR2VuZXJhdG9yIGV4dGVuZHMgR2VuZXJhdG9yPEZvcmNlQXRsYXNFZGdlRWxlbWVudCwgRWRnZUdlbmVyYXRvckRhdGE+IHtcbiAgICBzdGF0aWMga2V5ID0gJ2ZvcmNlLWF0bGFzLWVkZ2UnO1xuICAgIHBhcnRpY2xlQW5pbWF0aW9uPzogeyBzdG9wOiAoKSA9PiB2b2lkOyBzdGFydDogKCkgPT4gdm9pZCB9O1xuICAgIGNvbnN0cnVjdG9yKGJvYXJkOiBQbGFpdEJvYXJkKSB7XG4gICAgICAgIHN1cGVyKGJvYXJkKTtcbiAgICB9XG5cbiAgICBjYW5EcmF3KGVsZW1lbnQ6IEZvcmNlQXRsYXNFZGdlRWxlbWVudCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBkcmF3KGVsZW1lbnQ6IEZvcmNlQXRsYXNFZGdlRWxlbWVudCwgZGF0YTogRWRnZUdlbmVyYXRvckRhdGEpIHtcbiAgICAgICAgY29uc3QgZWRnZUcgPSBjcmVhdGVHKCk7XG4gICAgICAgIGNvbnN0IGVkZ2VFbGVtZW50ID0gZHJhd0VkZ2UoXG4gICAgICAgICAgICBkYXRhLnN0YXJ0UG9pbnQsXG4gICAgICAgICAgICBkYXRhLmVuZFBvaW50LFxuICAgICAgICAgICAgZGF0YS5kaXJlY3Rpb24sXG4gICAgICAgICAgICBkYXRhLmlzU291cmNlQWN0aXZlICYmIGRhdGEuaXNUYXJnZXRBY3RpdmUsXG4gICAgICAgICAgICBkYXRhLmlzVGFyZ2V0U2VsZlxuICAgICAgICApO1xuICAgICAgICBlZGdlRy5hcHBlbmQoZWRnZUVsZW1lbnQuZyk7XG4gICAgICAgIGlmIChkYXRhLmRpcmVjdGlvbiAhPT0gRWRnZURpcmVjdGlvbi5OT05FKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJ0aWNsZSA9IGRyYXdQYXJ0aWNsZSh0aGlzLmJvYXJkLCBkYXRhLnN0YXJ0UG9pbnQsIGRhdGEuZGlyZWN0aW9uKTtcbiAgICAgICAgICAgIGVkZ2VFbGVtZW50LmcuYXBwZW5kKHBhcnRpY2xlKTtcbiAgICAgICAgICAgIHRoaXMucGFydGljbGVBbmltYXRpb24gPSBwbGF5RWRnZVBhcnRpY2xlQW5pbWF0ZShlZGdlRWxlbWVudC5wYXRoLCBwYXJ0aWNsZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVkZ2VHO1xuICAgIH1cblxuICAgIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHN1cGVyLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5wYXJ0aWNsZUFuaW1hdGlvbj8uc3RvcCgpO1xuICAgIH1cbn1cbiJdfQ==
@@ -4,4 +4,4 @@ export var EdgeDirection;
4
4
  EdgeDirection[EdgeDirection["OUT"] = 1] = "OUT";
5
5
  EdgeDirection[EdgeDirection["NONE"] = 2] = "NONE";
6
6
  })(EdgeDirection || (EdgeDirection = {}));
7
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9ncmFwaC12aXovc3JjL2ZvcmNlLWF0bGFzL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE1BQU0sQ0FBTixJQUFZLGFBSVg7QUFKRCxXQUFZLGFBQWE7SUFDckIsNkNBQUUsQ0FBQTtJQUNGLCtDQUFHLENBQUE7SUFDSCxpREFBSSxDQUFBO0FBQ1IsQ0FBQyxFQUpXLGFBQWEsS0FBYixhQUFhLFFBSXhCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgR2VuZXJhdG9yRXh0cmFEYXRhIH0gZnJvbSAnQHBsYWl0L2NvbW1vbic7XG5pbXBvcnQgeyBQb2ludCB9IGZyb20gJ0BwbGFpdC9jb3JlJztcblxuZXhwb3J0IGVudW0gRWRnZURpcmVjdGlvbiB7XG4gICAgSU4sXG4gICAgT1VULFxuICAgIE5PTkVcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOb2RlU3R5bGVzIHtcbiAgICBzdHJva2U/OiBzdHJpbmc7XG4gICAgc3Ryb2tlV2lkdGg/OiBudW1iZXI7XG4gICAgZmlsbD86IHN0cmluZztcbiAgICBmaWxsU3R5bGU/OiBzdHJpbmc7XG4gICAgYWN0aXZlU3Ryb2tlPzogc3RyaW5nO1xuICAgIGFjdGl2ZUZpbGw/OiBzdHJpbmc7XG4gICAgYm9yZGVyUmFkaXVzPzogbnVtYmVyO1xuICAgIGhvdmVyU3Ryb2tlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVkZ2VHZW5lcmF0b3JEYXRhIGV4dGVuZHMgR2VuZXJhdG9yRXh0cmFEYXRhIHtcbiAgICBzdGFydFBvaW50OiBQb2ludDtcbiAgICBlbmRQb2ludDogUG9pbnQ7XG4gICAgaXNTb3VyY2VBY3RpdmU6IGJvb2xlYW47XG4gICAgaXNUYXJnZXRBY3RpdmU6IGJvb2xlYW47XG4gICAgZGlyZWN0aW9uOiBFZGdlRGlyZWN0aW9uO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5vZGVHZW5lcmF0b3JEYXRhIGV4dGVuZHMgR2VuZXJhdG9yRXh0cmFEYXRhIHtcbiAgICBpc0FjdGl2ZTogYm9vbGVhbjtcbiAgICBpc0ZpcnN0RGVwdGg6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTm9kZUljb25JdGVtIHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgZm9udFNpemU/OiBudW1iZXI7XG4gICAgY29sb3I/OiBzdHJpbmc7XG59XG4iXX0=
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9ncmFwaC12aXovc3JjL2ZvcmNlLWF0bGFzL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE1BQU0sQ0FBTixJQUFZLGFBSVg7QUFKRCxXQUFZLGFBQWE7SUFDckIsNkNBQUUsQ0FBQTtJQUNGLCtDQUFHLENBQUE7SUFDSCxpREFBSSxDQUFBO0FBQ1IsQ0FBQyxFQUpXLGFBQWEsS0FBYixhQUFhLFFBSXhCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgR2VuZXJhdG9yRXh0cmFEYXRhIH0gZnJvbSAnQHBsYWl0L2NvbW1vbic7XG5pbXBvcnQgeyBQb2ludCB9IGZyb20gJ0BwbGFpdC9jb3JlJztcblxuZXhwb3J0IGVudW0gRWRnZURpcmVjdGlvbiB7XG4gICAgSU4sXG4gICAgT1VULFxuICAgIE5PTkVcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOb2RlU3R5bGVzIHtcbiAgICBzdHJva2U/OiBzdHJpbmc7XG4gICAgc3Ryb2tlV2lkdGg/OiBudW1iZXI7XG4gICAgZmlsbD86IHN0cmluZztcbiAgICBmaWxsU3R5bGU/OiBzdHJpbmc7XG4gICAgYWN0aXZlU3Ryb2tlPzogc3RyaW5nO1xuICAgIGFjdGl2ZUZpbGw/OiBzdHJpbmc7XG4gICAgYm9yZGVyUmFkaXVzPzogbnVtYmVyO1xuICAgIGhvdmVyU3Ryb2tlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVkZ2VHZW5lcmF0b3JEYXRhIGV4dGVuZHMgR2VuZXJhdG9yRXh0cmFEYXRhIHtcbiAgICBzdGFydFBvaW50OiBQb2ludDtcbiAgICBlbmRQb2ludDogUG9pbnQ7XG4gICAgaXNTb3VyY2VBY3RpdmU6IGJvb2xlYW47XG4gICAgaXNUYXJnZXRBY3RpdmU6IGJvb2xlYW47XG4gICAgZGlyZWN0aW9uOiBFZGdlRGlyZWN0aW9uO1xuICAgIGlzVGFyZ2V0U2VsZj86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTm9kZUdlbmVyYXRvckRhdGEgZXh0ZW5kcyBHZW5lcmF0b3JFeHRyYURhdGEge1xuICAgIGlzQWN0aXZlOiBib29sZWFuO1xuICAgIGlzRmlyc3REZXB0aDogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOb2RlSWNvbkl0ZW0ge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBmb250U2l6ZT86IG51bWJlcjtcbiAgICBjb2xvcj86IHN0cmluZztcbn1cbiJdfQ==
@@ -1,7 +1,7 @@
1
1
  import { EdgeDirection } from '../types';
2
- import { NS, PlaitBoard, createG, createPath, drawCircle, normalizePoint } from '@plait/core';
2
+ import { PlaitBoard, createForeignObject, createG, createPath, drawCircle, normalizePoint } from '@plait/core';
3
3
  import getArrow from '../../perfect-arrows/get-arrow';
4
- import { ACTIVE_BACKGROUND_NODE_ALPHA, DEFAULT_ACTIVE_NODE_SIZE_MULTIPLIER, DEFAULT_ACTIVE_WAVE_NODE_SIZE_MULTIPLIER, DEFAULT_LINE_STYLES, DEFAULT_NODE_LABEL_FONT_SIZE, DEFAULT_NODE_LABEL_MARGIN_TOP, DEFAULT_NODE_SIZE, DEFAULT_NODE_STYLES, SECOND_DEPTH_NODE_ALPHA } from '../constants';
4
+ import { ACTIVE_BACKGROUND_NODE_ALPHA, DEFAULT_ACTIVE_NODE_SIZE_MULTIPLIER, DEFAULT_ACTIVE_WAVE_NODE_SIZE_MULTIPLIER, DEFAULT_LINE_STYLES, DEFAULT_NODE_LABEL_HEIGHT, DEFAULT_NODE_LABEL_STYLE, DEFAULT_NODE_LABEL_WIDTH, DEFAULT_NODE_SIZE, DEFAULT_NODE_STYLES, NODE_LABEL_CLASS_NAME, SECOND_DEPTH_NODE_ALPHA } from '../constants';
5
5
  import { DEFAULT_STYLES } from '../../constants/default';
6
6
  export function drawNode(board, node, point, options) {
7
7
  const roughSVG = PlaitBoard.getRoughSVG(board);
@@ -18,40 +18,55 @@ export function drawNode(board, node, point, options) {
18
18
  if (options.iconG) {
19
19
  nodeG.append(options.iconG);
20
20
  }
21
- const text = document.createElementNS(NS, 'text');
22
- text.textContent = node.label || '';
23
- text.setAttribute('text-anchor', `middle`);
24
- text.setAttribute('dominant-baseline', `hanging`);
25
- text.setAttribute('x', `${x}`);
26
- text.setAttribute('font-size', `${DEFAULT_NODE_LABEL_FONT_SIZE}px`);
27
- text.setAttribute('style', `user-select: none;`);
21
+ const labelWidth = node.styles?.labelWidth ?? DEFAULT_NODE_LABEL_WIDTH;
22
+ const labelHeight = node.styles?.labelHeight ?? DEFAULT_NODE_LABEL_HEIGHT;
23
+ const textForeignObject = createForeignObject(x - labelWidth / 2, y, labelWidth, labelHeight);
24
+ const textContainer = document.createElement('div');
25
+ textContainer.classList.add(NODE_LABEL_CLASS_NAME);
26
+ textContainer.setAttribute('style', DEFAULT_NODE_LABEL_STYLE);
27
+ const text = document.createElement('span');
28
+ text.innerText = node.label;
29
+ textContainer.append(text);
30
+ textForeignObject.append(textContainer);
28
31
  if (options.isActive) {
29
32
  const waveDiameter = diameter * DEFAULT_ACTIVE_WAVE_NODE_SIZE_MULTIPLIER;
30
33
  const waveCircle = drawCircle(roughSVG, [x, y], waveDiameter, nodeStyles);
31
34
  waveCircle.setAttribute('opacity', ACTIVE_BACKGROUND_NODE_ALPHA.toString());
32
35
  nodeG.append(waveCircle);
33
- text.setAttribute('y', `${y + waveDiameter / 2 + DEFAULT_NODE_LABEL_MARGIN_TOP}`);
36
+ textForeignObject.setAttribute('y', `${y + waveDiameter / 2}`);
34
37
  }
35
38
  else {
36
39
  if (!options.isFirstDepth) {
37
40
  nodeG.setAttribute('opacity', SECOND_DEPTH_NODE_ALPHA.toString());
38
41
  }
39
- text.setAttribute('y', `${y + diameter / 2 + DEFAULT_NODE_LABEL_MARGIN_TOP}`);
42
+ textForeignObject.setAttribute('y', `${y + diameter / 2}`);
40
43
  }
41
- nodeG.append(text);
44
+ nodeG.append(textForeignObject);
42
45
  return nodeG;
43
46
  }
44
- export function drawEdge(startPoint, endPoint, direction, isMutual) {
47
+ export function drawEdge(startPoint, endPoint, direction, isMutual, isTargetSelf) {
48
+ const nodeRadius = DEFAULT_NODE_SIZE / 2;
45
49
  const arrow = getArrow(startPoint[0], startPoint[1], endPoint[0], endPoint[1], {
46
50
  stretch: 0.4,
47
51
  flip: direction === EdgeDirection.NONE ? false : isMutual,
48
- padEnd: DEFAULT_NODE_SIZE / 2,
49
- padStart: DEFAULT_NODE_SIZE / 2
52
+ padEnd: nodeRadius,
53
+ padStart: nodeRadius
50
54
  });
51
55
  const [sx, sy, cx, cy, ex, ey, ae, as, ec] = arrow;
52
56
  const g = createG();
53
57
  const path = createPath();
54
- path.setAttribute('d', `M${sx},${sy} Q${cx},${cy} ${ex},${ey}`);
58
+ if (!isTargetSelf) {
59
+ path.setAttribute('d', `M${sx},${sy} Q${cx},${cy} ${ex},${ey}`);
60
+ }
61
+ else {
62
+ const angle = 55;
63
+ const angleRad = (angle * Math.PI) / 180;
64
+ const x = nodeRadius * Math.cos(angleRad);
65
+ const y = nodeRadius * Math.sin(angleRad);
66
+ path.setAttribute('d', `M -${x},-${y}
67
+ C -45,-85, 45 -85
68
+ ${x},-${y}`);
69
+ }
55
70
  path.setAttribute('fill', 'none');
56
71
  path.setAttribute('stroke', DEFAULT_LINE_STYLES.color[direction]);
57
72
  g.append(path);
@@ -70,4 +85,4 @@ export function drawParticle(board, startPoint, direction) {
70
85
  pointG.setAttribute('transform', `translate(${startPoint[0]}, ${startPoint[1]})`);
71
86
  return pointG;
72
87
  }
73
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhdy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2dyYXBoLXZpei9zcmMvZm9yY2UtYXRsYXMvdXRpbHMvZHJhdy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFjLE1BQU0sVUFBVSxDQUFDO0FBQ3JELE9BQU8sRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUE4QixPQUFPLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDMUgsT0FBTyxRQUFRLE1BQU0sZ0NBQWdDLENBQUM7QUFDdEQsT0FBTyxFQUNILDRCQUE0QixFQUM1QixtQ0FBbUMsRUFDbkMsd0NBQXdDLEVBQ3hDLG1CQUFtQixFQUNuQiw0QkFBNEIsRUFDNUIsNkJBQTZCLEVBQzdCLGlCQUFpQixFQUNqQixtQkFBbUIsRUFDbkIsdUJBQXVCLEVBQzFCLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUd6RCxNQUFNLFVBQVUsUUFBUSxDQUNwQixLQUFpQixFQUNqQixJQUEyQixFQUMzQixLQUFZLEVBQ1osT0FBMEU7SUFFMUUsTUFBTSxRQUFRLEdBQUcsVUFBVSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvQyxNQUFNLFVBQVUsR0FBZTtRQUMzQixHQUFHLG1CQUFtQjtRQUN0QixHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUM7S0FDekIsQ0FBQztJQUNGLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3JDLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLElBQUksaUJBQWlCLENBQUM7SUFDOUMsSUFBSSxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDbkIsUUFBUSxHQUFHLFFBQVEsR0FB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dHlwZXMnO1xuaW1wb3J0IHsgTlMsIFBsYWl0Qm9hcmQsIFBvaW50LCBjcmVhdGVGb3JlaWduT2JqZWN0LCBjcmVhdGVHLCBjcmVhdGVQYXRoLCBkcmF3Q2lyY2xlLCBub3JtYWxpemVQb2ludCB9IGZyb20gJ0BwbGFpdC9jb3JlJztcbmltcG9ydCBnZXRBcnJvdyBmcm9tICcuLi8uLi9wZXJmZWN0LWFycm93cy9nZXQtYXJyb3cnO1xuaW1wb3J0IHtcbiAgICBBQ1RJVkVfQkFDS0dST1VORF9OT0RFX0FMUEhBLFxuICAgIERFRkFVTFRfQUNUSVZFX05PREVfU0laRV9NVUxUSVBMSUVSLFxuICAgIERFRkFVTFRfQUNUSVZFX1dBVkVfTk9ERV9TSVpFX01VTFRJUExJRVIsXG4gICAgREVGQVVMVF9MSU5FX1NUWUxFUyxcbiAgICBERUZBVUxUX05PREVfTEFCRUxfRk9OVF9TSVpFLFxuICAgIERFRkFVTFRfTk9ERV9MQUJFTF9NQVJHSU5fVE9QLFxuICAgIERFRkFVTFRfTk9ERV9TSVpFLFxuICAgIERFRkFVTFRfTk9ERV9TVFlMRVMsXG4gICAgU0VDT05EX0RFUFRIX05PREVfQUxQSEFcbn0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IERFRkFVTFRfU1RZTEVTIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzL2RlZmF1bHQnO1xuaW1wb3J0IHsgRm9yY2VBdGxhc05vZGVFbGVtZW50IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBkcmF3Tm9kZShcbiAgICBib2FyZDogUGxhaXRCb2FyZCxcbiAgICBub2RlOiBGb3JjZUF0bGFzTm9kZUVsZW1lbnQsXG4gICAgcG9pbnQ6IFBvaW50LFxuICAgIG9wdGlvbnM6IHsgaWNvbkc/OiBTVkdHRWxlbWVudDsgaXNBY3RpdmU6IGJvb2xlYW47IGlzRmlyc3REZXB0aDogYm9vbGVhbiB9XG4pIHtcbiAgICBjb25zdCByb3VnaFNWRyA9IFBsYWl0Qm9hcmQuZ2V0Um91Z2hTVkcoYm9hcmQpO1xuICAgIGNvbnN0IG5vZGVTdHlsZXM6IE5vZGVTdHlsZXMgPSB7XG4gICAgICAgIC4uLkRFRkFVTFRfTk9ERV9TVFlMRVMsXG4gICAgICAgIC4uLihub2RlLnN0eWxlcyB8fCB7fSlcbiAgICB9O1xuICAgIGxldCB7IHgsIHkgfSA9IG5vcm1hbGl6ZVBvaW50KHBvaW50KTtcbiAgICBsZXQgZGlhbWV0ZXIgPSBub2RlLnNpemUgPz8gREVGQVVMVF9OT0RFX1NJWkU7XG4gICAgaWYgKG9wdGlvbnMuaXNBY3RpdmUpIHtcbiAgICAgICAgZGlhbWV0ZXIgPSBkaWFtZXRlciAqIERFRkFVTFRfQUNUSVZFX05PREVfU0laRV9NVUxUSVBMSUVSO1xuICAgIH1cbiAgICBjb25zdCBub2RlRyA9IGRyYXdDaXJjbGUocm91Z2hTVkcsIFt4LCB5XSwgZGlhbWV0ZXIsIG5vZGVTdHlsZXMpO1xuICAgIGlmIChvcHRpb25zLmljb25HKSB7XG4gICAgICAgIG5vZGVHLmFwcGVuZChvcHRpb25zLmljb25HKTtcbiAgICB9XG4gICAgY29uc3QgdGV4dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhOUywgJ3RleHQnKTtcbiAgICB0ZXh0LnRleHRDb250ZW50ID0gbm9kZS5sYWJlbCB8fCAnJztcbiAgICB0ZXh0LnNldEF0dHJpYnV0ZSgndGV4dC1hbmNob3InLCBgbWlkZGxlYCk7XG4gICAgdGV4dC5zZXRBdHRyaWJ1dGUoJ2RvbWluYW50LWJhc2VsaW5lJywgYGhhbmdpbmdgKTtcbiAgICB0ZXh0LnNldEF0dHJpYnV0ZSgneCcsIGAke3h9YCk7XG4gICAgdGV4dC5zZXRBdHRyaWJ1dGUoJ2ZvbnQtc2l6ZScsIGAke0RFRkFVTFRfTk9ERV9MQUJFTF9GT05UX1NJWkV9cHhgKTtcbiAgICB0ZXh0LnNldEF0dHJpYnV0ZSgnc3R5bGUnLCBgdXNlci1zZWxlY3Q6IG5vbmU7YCk7XG4gICAgaWYgKG9wdGlvbnMuaXNBY3RpdmUpIHtcbiAgICAgICAgY29uc3Qgd2F2ZURpYW1ldGVyID0gZGlhbWV0ZXIgKiBERUZBVUxUX0FDVElWRV9XQVZFX05PREVfU0laRV9NVUxUSVBMSUVSO1xuICAgICAgICBjb25zdCB3YXZlQ2lyY2xlID0gZHJhd0NpcmNsZShyb3VnaFNWRywgW3gsIHldLCB3YXZlRGlhbWV0ZXIsIG5vZGVTdHlsZXMpO1xuICAgICAgICB3YXZlQ2lyY2xlLnNldEF0dHJpYnV0ZSgnb3BhY2l0eScsIEFDVElWRV9CQUNLR1JPVU5EX05PREVfQUxQSEEudG9TdHJpbmcoKSk7XG4gICAgICAgIG5vZGVHLmFwcGVuZCh3YXZlQ2lyY2xlKTtcbiAgICAgICAgdGV4dC5zZXRBdHRyaWJ1dGUoJ3knLCBgJHt5ICsgd2F2ZURpYW1ldGVyIC8gMiArIERFRkFVTFRfTk9ERV9MQUJFTF9NQVJHSU5fVE9QfWApO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICghb3B0aW9ucy5pc0ZpcnN0RGVwdGgpIHtcbiAgICAgICAgICAgIG5vZGVHLnNldEF0dHJpYnV0ZSgnb3BhY2l0eScsIFNFQ09ORF9ERVBUSF9OT0RFX0FMUEhBLnRvU3RyaW5nKCkpO1xuICAgICAgICB9XG4gICAgICAgIHRleHQuc2V0QXR0cmlidXRlKCd5JywgYCR7eSArIGRpYW1ldGVyIC8gMiArIERFRkFVTFRfTk9ERV9MQUJFTF9NQVJHSU5fVE9QfWApO1xuICAgIH1cbiAgICBub2RlRy5hcHBlbmQodGV4dCk7XG4gICAgcmV0dXJuIG5vZGVHO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZHJhd0VkZ2Uoc3RhcnRQb2ludDogUG9pbnQsIGVuZFBvaW50OiBQb2ludCwgZGlyZWN0aW9uOiBFZGdlRGlyZWN0aW9uLCBpc011dHVhbDogYm9vbGVhbikge1xuICAgIGNvbnN0IGFycm93ID0gZ2V0QXJyb3coc3RhcnRQb2ludFswXSwgc3RhcnRQb2ludFsxXSwgZW5kUG9pbnRbMF0sIGVuZFBvaW50WzFdLCB7XG4gICAgICAgIHN0cmV0Y2g6IDAuNCxcbiAgICAgICAgZmxpcDogZGlyZWN0aW9uID09PSBFZGdlRGlyZWN0aW9uLk5PTkUgPyBmYWxzZSA6IGlzTXV0dWFsLFxuICAgICAgICBwYWRFbmQ6IERFRkFVTFRfTk9ERV9TSVpFIC8gMixcbiAgICAgICAgcGFkU3RhcnQ6IERFRkFVTFRfTk9ERV9TSVpFIC8gMlxuICAgIH0pO1xuICAgIGNvbnN0IFtzeCwgc3ksIGN4LCBjeSwgZXgsIGV5LCBhZSwgYXMsIGVjXSA9IGFycm93O1xuICAgIGNvbnN0IGcgPSBjcmVhdGVHKCk7XG4gICAgY29uc3QgcGF0aCA9IGNyZWF0ZVBhdGgoKTtcbiAgICBwYXRoLnNldEF0dHJpYnV0ZSgnZCcsIGBNJHtzeH0sJHtzeX0gUSR7Y3h9LCR7Y3l9ICR7ZXh9LCR7ZXl9YCk7XG4gICAgcGF0aC5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCAnbm9uZScpO1xuICAgIHBhdGguc2V0QXR0cmlidXRlKCdzdHJva2UnLCBERUZBVUxUX0xJTkVfU1RZTEVTLmNvbG9yW2RpcmVjdGlvbl0pO1xuICAgIGcuYXBwZW5kKHBhdGgpO1xuICAgIHJldHVybiB7XG4gICAgICAgIGcsXG4gICAgICAgIHBhdGhcbiAgICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZHJhd1BhcnRpY2xlKGJvYXJkOiBQbGFpdEJvYXJkLCBzdGFydFBvaW50OiBQb2ludCwgZGlyZWN0aW9uOiBFZGdlRGlyZWN0aW9uKSB7XG4gICAgY29uc3Qgcm91Z2hTVkcgPSBQbGFpdEJvYXJkLmdldFJvdWdoU1ZHKGJvYXJkKTtcbiAgICBjb25zdCBwb2ludEcgPSBkcmF3Q2lyY2xlKHJvdWdoU1ZHLCBbMCwgMF0sIDUsIHtcbiAgICAgICAgLi4uREVGQVVMVF9TVFlMRVMsXG4gICAgICAgIHN0cm9rZVdpZHRoOiAwLFxuICAgICAgICBmaWxsOiBERUZBVUxUX0xJTkVfU1RZTEVTLmNvbG9yW2RpcmVjdGlvbl1cbiAgICB9KTtcbiAgICBwb2ludEcuc2V0QXR0cmlidXRlKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKCR7c3RhcnRQb2ludFswXX0sICR7c3RhcnRQb2ludFsxXX0pYCk7XG4gICAgcmV0dXJuIHBvaW50Rztcbn1cbiJdfQ==
88
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhdy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2dyYXBoLXZpei9zcmMvZm9yY2UtYXRsYXMvdXRpbHMvZHJhdy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFjLE1BQU0sVUFBVSxDQUFDO0FBQ3JELE9BQU8sRUFBRSxVQUFVLEVBQVMsbUJBQW1CLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsY0FBYyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3RILE9BQU8sUUFBUSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3RELE9BQU8sRUFDSCw0QkFBNEIsRUFDNUIsbUNBQW1DLEVBQ25DLHdDQUF3QyxFQUN4QyxtQkFBbUIsRUFDbkIseUJBQXlCLEVBQ3pCLHdCQUF3QixFQUN4Qix3QkFBd0IsRUFDeEIsaUJBQWlCLEVBQ2pCLG1CQUFtQixFQUNuQixxQkFBcUIsRUFDckIsdUJBQXVCLEVBQzFCLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUd6RCxNQUFNLFVBQVUsUUFBUSxDQUNwQixLQUFpQixFQUNqQixJQUEyQixFQUMzQixLQUFZLEVBQ1osT0FBMEU7SUFFMUUsTUFBTSxRQUFRLEdBQUcsVUFBVSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvQyxNQUFNLFVBQVUsR0FBZTtRQUMzQixHQUFHLG1CQUFtQjtRQUN0QixHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUM7S0FDekIsQ0FBQztJQUNGLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3JDLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLElBQUksaUJBQWlCLENBQUM7SUFDOUMsSUFBSSxPQUFPLENBQUMsUUFBUSxFQUFFLENB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UyxDQUFDLENBQUMsQ0FBQztJQUNsRSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2YsT0FBTztRQUNILENBQUM7UUFDRCxJQUFJO0tBQ1AsQ0FBQztBQUNOLENBQUM7QUFFRCxNQUFNLFVBQVUsWUFBWSxDQUFDLEtBQWlCLEVBQUUsVUFBaUIsRUFBRSxTQUF3QjtJQUN2RixNQUFNLFFBQVEsR0FBRyxVQUFVLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9DLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO1FBQzNDLEdBQUcsY0FBYztRQUNqQixXQUFXLEVBQUUsQ0FBQztRQUNkLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDO0tBQzdDLENBQUMsQ0FBQztJQUNILE1BQU0sQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLGFBQWEsVUFBVSxDQUFDLENBQUMsQ0FBQyxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbEYsT0FBTyxNQUFNLENBQUM7QUFDbEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVkZ2VEaXJlY3Rpb24sIE5vZGVTdHlsZXMgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBQbGFpdEJvYXJkLCBQb2ludCwgY3JlYXRlRm9yZWlnbk9iamVjdCwgY3JlYXRlRywgY3JlYXRlUGF0aCwgZHJhd0NpcmNsZSwgbm9ybWFsaXplUG9pbnQgfSBmcm9tICdAcGxhaXQvY29yZSc7XG5pbXBvcnQgZ2V0QXJyb3cgZnJvbSAnLi4vLi4vcGVyZmVjdC1hcnJvd3MvZ2V0LWFycm93JztcbmltcG9ydCB7XG4gICAgQUNUSVZFX0JBQ0tHUk9VTkRfTk9ERV9BTFBIQSxcbiAgICBERUZBVUxUX0FDVElWRV9OT0RFX1NJWkVfTVVMVElQTElFUixcbiAgICBERUZBVUxUX0FDVElWRV9XQVZFX05PREVfU0laRV9NVUxUSVBMSUVSLFxuICAgIERFRkFVTFRfTElORV9TVFlMRVMsXG4gICAgREVGQVVMVF9OT0RFX0xBQkVMX0hFSUdIVCxcbiAgICBERUZBVUxUX05PREVfTEFCRUxfU1RZTEUsXG4gICAgREVGQVVMVF9OT0RFX0xBQkVMX1dJRFRILFxuICAgIERFRkFVTFRfTk9ERV9TSVpFLFxuICAgIERFRkFVTFRfTk9ERV9TVFlMRVMsXG4gICAgTk9ERV9MQUJFTF9DTEFTU19OQU1FLFxuICAgIFNFQ09ORF9ERVBUSF9OT0RFX0FMUEhBXG59IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBERUZBVUxUX1NUWUxFUyB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy9kZWZhdWx0JztcbmltcG9ydCB7IEZvcmNlQXRsYXNOb2RlRWxlbWVudCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gZHJhd05vZGUoXG4gICAgYm9hcmQ6IFBsYWl0Qm9hcmQsXG4gICAgbm9kZTogRm9yY2VBdGxhc05vZGVFbGVtZW50LFxuICAgIHBvaW50OiBQb2ludCxcbiAgICBvcHRpb25zOiB7IGljb25HPzogU1ZHR0VsZW1lbnQ7IGlzQWN0aXZlOiBib29sZWFuOyBpc0ZpcnN0RGVwdGg6IGJvb2xlYW4gfVxuKSB7XG4gICAgY29uc3Qgcm91Z2hTVkcgPSBQbGFpdEJvYXJkLmdldFJvdWdoU1ZHKGJvYXJkKTtcbiAgICBjb25zdCBub2RlU3R5bGVzOiBOb2RlU3R5bGVzID0ge1xuICAgICAgICAuLi5ERUZBVUxUX05PREVfU1RZTEVTLFxuICAgICAgICAuLi4obm9kZS5zdHlsZXMgfHwge30pXG4gICAgfTtcbiAgICBsZXQgeyB4LCB5IH0gPSBub3JtYWxpemVQb2ludChwb2ludCk7XG4gICAgbGV0IGRpYW1ldGVyID0gbm9kZS5zaXplID8/IERFRkFVTFRfTk9ERV9TSVpFO1xuICAgIGlmIChvcHRpb25zLmlzQWN0aXZlKSB7XG4gICAgICAgIGRpYW1ldGVyID0gZGlhbWV0ZXIgKiBERUZBVUxUX0FDVElWRV9OT0RFX1NJWkVfTVVMVElQTElFUjtcbiAgICB9XG4gICAgY29uc3Qgbm9kZUcgPSBkcmF3Q2lyY2xlKHJvdWdoU1ZHLCBbeCwgeV0sIGRpYW1ldGVyLCBub2RlU3R5bGVzKTtcbiAgICBpZiAob3B0aW9ucy5pY29uRykge1xuICAgICAgICBub2RlRy5hcHBlbmQob3B0aW9ucy5pY29uRyk7XG4gICAgfVxuICAgIGNvbnN0IGxhYmVsV2lkdGggPSBub2RlLnN0eWxlcz8ubGFiZWxXaWR0aCA/PyBERUZBVUxUX05PREVfTEFCRUxfV0lEVEg7XG4gICAgY29uc3QgbGFiZWxIZWlnaHQgPSBub2RlLnN0eWxlcz8ubGFiZWxIZWlnaHQgPz8gREVGQVVMVF9OT0RFX0xBQkVMX0hFSUdIVDtcbiAgICBjb25zdCB0ZXh0Rm9yZWlnbk9iamVjdCA9IGNyZWF0ZUZvcmVpZ25PYmplY3QoeCAtIGxhYmVsV2lkdGggLyAyLCB5LCBsYWJlbFdpZHRoLCBsYWJlbEhlaWdodCk7XG4gICAgY29uc3QgdGV4dENvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRleHRDb250YWluZXIuY2xhc3NMaXN0LmFkZChOT0RFX0xBQkVMX0NMQVNTX05BTUUpO1xuICAgIHRleHRDb250YWluZXIuc2V0QXR0cmlidXRlKCdzdHlsZScsIERFRkFVTFRfTk9ERV9MQUJFTF9TVFlMRSk7XG4gICAgY29uc3QgdGV4dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICB0ZXh0LmlubmVyVGV4dCA9IG5vZGUubGFiZWw7XG4gICAgdGV4dENvbnRhaW5lci5hcHBlbmQodGV4dCk7XG4gICAgdGV4dEZvcmVpZ25PYmplY3QuYXBwZW5kKHRleHRDb250YWluZXIpO1xuICAgIGlmIChvcHRpb25zLmlzQWN0aXZlKSB7XG4gICAgICAgIGNvbnN0IHdhdmVEaWFtZXRlciA9IGRpYW1ldGVyICogREVGQVVMVF9BQ1RJVkVfV0FWRV9OT0RFX1NJWkVfTVVMVElQTElFUjtcbiAgICAgICAgY29uc3Qgd2F2ZUNpcmNsZSA9IGRyYXdDaXJjbGUocm91Z2hTVkcsIFt4LCB5XSwgd2F2ZURpYW1ldGVyLCBub2RlU3R5bGVzKTtcbiAgICAgICAgd2F2ZUNpcmNsZS5zZXRBdHRyaWJ1dGUoJ29wYWNpdHknLCBBQ1RJVkVfQkFDS0dST1VORF9OT0RFX0FMUEhBLnRvU3RyaW5nKCkpO1xuICAgICAgICBub2RlRy5hcHBlbmQod2F2ZUNpcmNsZSk7XG4gICAgICAgIHRleHRGb3JlaWduT2JqZWN0LnNldEF0dHJpYnV0ZSgneScsIGAke3kgKyB3YXZlRGlhbWV0ZXIgLyAyfWApO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICghb3B0aW9ucy5pc0ZpcnN0RGVwdGgpIHtcbiAgICAgICAgICAgIG5vZGVHLnNldEF0dHJpYnV0ZSgnb3BhY2l0eScsIFNFQ09ORF9ERVBUSF9OT0RFX0FMUEhBLnRvU3RyaW5nKCkpO1xuICAgICAgICB9XG4gICAgICAgIHRleHRGb3JlaWduT2JqZWN0LnNldEF0dHJpYnV0ZSgneScsIGAke3kgKyBkaWFtZXRlciAvIDJ9YCk7XG4gICAgfVxuICAgIG5vZGVHLmFwcGVuZCh0ZXh0Rm9yZWlnbk9iamVjdCk7XG4gICAgcmV0dXJuIG5vZGVHO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZHJhd0VkZ2Uoc3RhcnRQb2ludDogUG9pbnQsIGVuZFBvaW50OiBQb2ludCwgZGlyZWN0aW9uOiBFZGdlRGlyZWN0aW9uLCBpc011dHVhbDogYm9vbGVhbiwgaXNUYXJnZXRTZWxmPzogYm9vbGVhbikge1xuICAgIGNvbnN0IG5vZGVSYWRpdXMgPSBERUZBVUxUX05PREVfU0laRSAvIDI7XG4gICAgY29uc3QgYXJyb3cgPSBnZXRBcnJvdyhzdGFydFBvaW50WzBdLCBzdGFydFBvaW50WzFdLCBlbmRQb2ludFswXSwgZW5kUG9pbnRbMV0sIHtcbiAgICAgICAgc3RyZXRjaDogMC40LFxuICAgICAgICBmbGlwOiBkaXJlY3Rpb24gPT09IEVkZ2VEaXJlY3Rpb24uTk9ORSA/IGZhbHNlIDogaXNNdXR1YWwsXG4gICAgICAgIHBhZEVuZDogbm9kZVJhZGl1cyxcbiAgICAgICAgcGFkU3RhcnQ6IG5vZGVSYWRpdXNcbiAgICB9KTtcbiAgICBjb25zdCBbc3gsIHN5LCBjeCwgY3ksIGV4LCBleSwgYWUsIGFzLCBlY10gPSBhcnJvdztcbiAgICBjb25zdCBnID0gY3JlYXRlRygpO1xuICAgIGNvbnN0IHBhdGggPSBjcmVhdGVQYXRoKCk7XG4gICAgaWYgKCFpc1RhcmdldFNlbGYpIHtcbiAgICAgICAgcGF0aC5zZXRBdHRyaWJ1dGUoJ2QnLCBgTSR7c3h9LCR7c3l9IFEke2N4fSwke2N5fSAke2V4fSwke2V5fWApO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGFuZ2xlID0gNTU7XG4gICAgICAgIGNvbnN0IGFuZ2xlUmFkID0gKGFuZ2xlICogTWF0aC5QSSkgLyAxODA7XG4gICAgICAgIGNvbnN0IHggPSBub2RlUmFkaXVzICogTWF0aC5jb3MoYW5nbGVSYWQpO1xuICAgICAgICBjb25zdCB5ID0gbm9kZVJhZGl1cyAqIE1hdGguc2luKGFuZ2xlUmFkKTtcbiAgICAgICAgcGF0aC5zZXRBdHRyaWJ1dGUoXG4gICAgICAgICAgICAnZCcsXG4gICAgICAgICAgICBgTSAtJHt4fSwtJHt5fVxuICAgICAgICAgICAgQyAtNDUsLTg1LCA0NSAtODVcbiAgICAgICAgICAgICR7eH0sLSR7eX1gXG4gICAgICAgICk7XG4gICAgfVxuICAgIHBhdGguc2V0QXR0cmlidXRlKCdmaWxsJywgJ25vbmUnKTtcbiAgICBwYXRoLnNldEF0dHJpYnV0ZSgnc3Ryb2tlJywgREVGQVVMVF9MSU5FX1NUWUxFUy5jb2xvcltkaXJlY3Rpb25dKTtcbiAgICBnLmFwcGVuZChwYXRoKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBnLFxuICAgICAgICBwYXRoXG4gICAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRyYXdQYXJ0aWNsZShib2FyZDogUGxhaXRCb2FyZCwgc3RhcnRQb2ludDogUG9pbnQsIGRpcmVjdGlvbjogRWRnZURpcmVjdGlvbikge1xuICAgIGNvbnN0IHJvdWdoU1ZHID0gUGxhaXRCb2FyZC5nZXRSb3VnaFNWRyhib2FyZCk7XG4gICAgY29uc3QgcG9pbnRHID0gZHJhd0NpcmNsZShyb3VnaFNWRywgWzAsIDBdLCA1LCB7XG4gICAgICAgIC4uLkRFRkFVTFRfU1RZTEVTLFxuICAgICAgICBzdHJva2VXaWR0aDogMCxcbiAgICAgICAgZmlsbDogREVGQVVMVF9MSU5FX1NUWUxFUy5jb2xvcltkaXJlY3Rpb25dXG4gICAgfSk7XG4gICAgcG9pbnRHLnNldEF0dHJpYnV0ZSgndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgke3N0YXJ0UG9pbnRbMF19LCAke3N0YXJ0UG9pbnRbMV19KWApO1xuICAgIHJldHVybiBwb2ludEc7XG59XG4iXX0=
@@ -49,7 +49,8 @@ export function getEdgeGeneratorData(edge, board) {
49
49
  endPoint,
50
50
  direction,
51
51
  isSourceActive,
52
- isTargetActive
52
+ isTargetActive,
53
+ isTargetSelf: sourceNode.id === targetNode.id
53
54
  };
54
55
  }
55
56
  export function playEdgeParticleAnimate(path, pointG) {
@@ -69,4 +70,4 @@ export function playEdgeParticleAnimate(path, pointG) {
69
70
  }
70
71
  };
71
72
  }
72
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2dyYXBoLXZpei9zcmMvZm9yY2UtYXRsYXMvdXRpbHMvZWRnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDdkYsT0FBTyxFQUF5QixpQkFBaUIsRUFBeUIsTUFBTSxrQkFBa0IsQ0FBQztBQUNuRyxPQUFPLEVBQUUsYUFBYSxFQUFxQixNQUFNLFVBQVUsQ0FBQztBQUM1RCxPQUFPLEVBQXlCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDdkUsT0FBTyxFQUFFLGVBQWUsRUFBRSxXQUFXLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFFdEQsTUFBTSxVQUFVLFFBQVEsQ0FBQyxpQkFBb0MsRUFBRSxXQUFzRDtJQUNqSCxPQUFPLGlCQUFpQixDQUFDLFFBQVEsRUFBRSxNQUFNLENBQ3JDLENBQUMsQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FDdkQsQ0FBQztBQUNqQyxDQUFDO0FBRUQsTUFBTSxVQUFVLFdBQVcsQ0FBQyxFQUFVLEVBQUUsaUJBQW9DO0lBQ3hFLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNoRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDUixNQUFNLElBQUksS0FBSyxDQUFDLG9CQUFvQixDQUFDLENB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R0FBRyxFQUFFO1FBQ0QsSUFBSSxHQUFHLHVCQUF1QixDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNqRCxDQUFDLENBQ0osQ0FBQztJQUNGLE9BQU87UUFDSCxJQUFJLEVBQUUsR0FBRyxFQUFFO1lBQ1AsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2hCLENBQUM7UUFDRCxLQUFLLEVBQUUsR0FBRyxFQUFFO1lBQ1IsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2pCLENBQUM7S0FDSixDQUFDO0FBQ04sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBsYWl0Qm9hcmQsIFBsYWl0RWxlbWVudCwgUGxhaXROb2RlLCBnZXRTZWxlY3RlZEVsZW1lbnRzIH0gZnJvbSAnQHBsYWl0L2NvcmUnO1xuaW1wb3J0IHsgRm9yY2VBdGxhc0VkZ2VFbGVtZW50LCBGb3JjZUF0bGFzRWxlbWVudCwgRm9yY2VBdGxhc05vZGVFbGVtZW50IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBFZGdlRGlyZWN0aW9uLCBFZGdlR2VuZXJhdG9yRGF0YSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IFBsYWl0Q29tbW9uRWxlbWVudFJlZiwgYW5pbWF0ZSwgbGluZWFyIH0gZnJvbSAnQHBsYWl0L2NvbW1vbic7XG5pbXBvcnQgeyBGb3JjZUF0bGFzRWRnZUdlbmVyYXRvciB9IGZyb20gJy4uL2dlbmVyYXRvcnMvZWRnZS5nZW5lcmF0b3InO1xuaW1wb3J0IHsgZ2V0SXNOb2RlQWN0aXZlLCBnZXROb2RlQnlJZCB9IGZyb20gJy4vbm9kZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFZGdlcyhmb3JjZUF0bGFzRWxlbWVudDogRm9yY2VBdGxhc0VsZW1lbnQsIGFuZENhbGxCYWNrPzogKGVkZ2U6IEZvcmNlQXRsYXNFZGdlRWxlbWVudCkgPT4gYm9vbGVhbikge1xuICAgIHJldHVybiBmb3JjZUF0bGFzRWxlbWVudC5jaGlsZHJlbj8uZmlsdGVyKFxuICAgICAgICBmID0+IEZvcmNlQXRsYXNFbGVtZW50LmlzRm9yY2VBdGxhc0VkZ2VFbGVtZW50KGYpICYmIChhbmRDYWxsQmFjaz8uKGYpID8/IHRydWUpXG4gICAgKSBhcyBGb3JjZUF0bGFzRWRnZUVsZW1lbnRbXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEVkZ2VCeUlkKGlkOiBzdHJpbmcsIGZvcmNlQXRsYXNFbGVtZW50OiBGb3JjZUF0bGFzRWxlbWVudCkge1xuICAgIGNvbnN0IGVkZ2UgPSBnZXRFZGdlcyhmb3JjZUF0bGFzRWxlbWVudCwgZSA9PiBlLmlkID09PSBpZCk/LlswXTtcbiAgICBpZiAoIWVkZ2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW4gbm90IGZpbmQgZWRnZS4nKTtcbiAgICB9XG4gICAgcmV0dXJuIGVkZ2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFZGdlc0luU291cmNlT3JUYXJnZXQoaWQ6IHN0cmluZywgZm9yY2VBdGxhc0VsZW1lbnQ6IEZvcmNlQXRsYXNFbGVtZW50KSB7XG4gICAgY29uc3QgZWRnZXMgPSBnZXRFZGdlcyhmb3JjZUF0bGFzRWxlbWVudCwgZWRnZSA9PiBlZGdlLnNvdXJjZSA9PT0gaWQgfHwgZWRnZS50YXJnZXQgPT09IGlkKTtcbiAgICByZXR1cm4gZWRnZXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFZGdlR2VuZXJhdG9yKGVkZ2U6IEZvcmNlQXRsYXNFZGdlRWxlbWVudCkge1xuICAgIGNvbnN0IGVkZ2VSZWYgPSBQbGFpdEVsZW1lbnQuZ2V0RWxlbWVudFJlZjxQbGFpdENvbW1vbkVsZW1lbnRSZWY+KGVkZ2UpO1xuICAgIHJldHVybiBlZGdlUmVmLmdldEdlbmVyYXRvcjxGb3JjZUF0bGFzRWRnZUdlbmVyYXRvcj4oRm9yY2VBdGxhc0VkZ2VHZW5lcmF0b3Iua2V5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEVkZ2VEaXJlY3Rpb24oaXNTb3VyY2VBY3RpdmU6IGJvb2xlYW4sIGlzVGFyZ2V0QWN0aXZlOiBib29sZWFuKSB7XG4gICAgaWYgKGlzU291cmNlQWN0aXZlKSB7XG4gICAgICAgIHJldHVybiBFZGdlRGlyZWN0aW9uLk9VVDtcbiAgICB9IGVsc2UgaWYgKGlzVGFyZ2V0QWN0aXZlKSB7XG4gICAgICAgIHJldHVybiBFZGdlRGlyZWN0aW9uLklOO1xuICAgIH1cbiAgICByZXR1cm4gRWRnZURpcmVjdGlvbi5OT05FO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RWRnZUdlbmVyYXRvckRhdGEoZWRnZTogRm9yY2VBdGxhc0VkZ2VFbGVtZW50LCBib2FyZDogUGxhaXRCb2FyZCk6IEVkZ2VHZW5lcmF0b3JEYXRhIHtcbiAgICBjb25zdCBmb3JjZUF0bGFzRWxlbWVudCA9IFBsYWl0Tm9kZS5wYXJlbnQoYm9hcmQsIFBsYWl0Qm9hcmQuZmluZFBhdGgoYm9hcmQsIGVkZ2UpKSBhcyBGb3JjZUF0bGFzRWxlbWVudDtcbiAgICBjb25zdCBzb3VyY2VOb2RlID0gZ2V0Tm9kZUJ5SWQoZWRnZS5zb3VyY2UsIGZvcmNlQXRsYXNFbGVtZW50KTtcbiAgICBjb25zdCB0YXJnZXROb2RlID0gZ2V0Tm9kZUJ5SWQoZWRnZS50YXJnZXQsIGZvcmNlQXRsYXNFbGVtZW50KTtcbiAgICBpZiAoIXNvdXJjZU5vZGU/LnBvaW50cyB8fCAhdGFyZ2V0Tm9kZT8ucG9pbnRzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlNvdXJjZSBvciB0YXJnZXQgbm9kZSBkb2Vzbid0IGhhdmUgcG9pbnRzXCIpO1xuICAgIH1cbiAgICBjb25zdCBzdGFydFBvaW50ID0gc291cmNlTm9kZS5wb2ludHNbMF07XG4gICAgY29uc3QgZW5kUG9pbnQgPSB0YXJnZXROb2RlLnBvaW50c1swXTtcbiAgICBjb25zdCBzZWxlY3RFbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoYm9hcmQpIGFzIEZvcmNlQXRsYXNOb2RlRWxlbWVudFtdO1xuICAgIGNvbnN0IGlzU291cmNlQWN0aXZlID0gZ2V0SXNOb2RlQWN0aXZlKHNvdXJjZU5vZGUuaWQsIHNlbGVjdEVsZW1lbnRzKTtcbiAgICBjb25zdCBpc1RhcmdldEFjdGl2ZSA9IGdldElzTm9kZUFjdGl2ZSh0YXJnZXROb2RlLmlkLCBzZWxlY3RFbGVtZW50cyk7XG4gICAgY29uc3QgZGlyZWN0aW9uID0gZ2V0RWRnZURpcmVjdGlvbihpc1NvdXJjZUFjdGl2ZSwgaXNUYXJnZXRBY3RpdmUpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHN0YXJ0UG9pbnQsXG4gICAgICAgIGVuZFBvaW50LFxuICAgICAgICBkaXJlY3Rpb24sXG4gICAgICAgIGlzU291cmNlQWN0aXZlLFxuICAgICAgICBpc1RhcmdldEFjdGl2ZVxuICAgIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwbGF5RWRnZVBhcnRpY2xlQW5pbWF0ZShwYXRoOiBTVkdQYXRoRWxlbWVudCwgcG9pbnRHOiBTVkdHRWxlbWVudCkge1xuICAgIGNvbnN0IHBhdGhMZW5ndGggPSBwYXRoLmdldFRvdGFsTGVuZ3RoKCk7XG4gICAgbGV0IGFuaW0gPSBhbmltYXRlKFxuICAgICAgICAodDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwb2ludCA9IHBhdGguZ2V0UG9pbnRBdExlbmd0aCh0ICogcGF0aExlbmd0aCk7XG4gICAgICAgICAgICBwb2ludEcuc2V0QXR0cmlidXRlKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKCR7cG9pbnQueH0sICR7cG9pbnQueX0pYCk7XG4gICAgICAgIH0sXG4gICAgICAgIDEwMDAsXG4gICAgICAgIGxpbmVhcixcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgYW5pbSA9IHBsYXlFZGdlUGFydGljbGVBbmltYXRlKHBhdGgsIHBvaW50Ryk7XG4gICAgICAgIH1cbiAgICApO1xuICAgIHJldHVybiB7XG4gICAgICAgIHN0b3A6ICgpID0+IHtcbiAgICAgICAgICAgIGFuaW0uc3RvcCgpO1xuICAgICAgICB9LFxuICAgICAgICBzdGFydDogKCkgPT4ge1xuICAgICAgICAgICAgYW5pbS5zdGFydCgpO1xuICAgICAgICB9XG4gICAgfTtcbn1cbiJdfQ==
73
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2dyYXBoLXZpei9zcmMvZm9yY2UtYXRsYXMvdXRpbHMvZWRnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDdkYsT0FBTyxFQUF5QixpQkFBaUIsRUFBeUIsTUFBTSxrQkFBa0IsQ0FBQztBQUNuRyxPQUFPLEVBQUUsYUFBYSxFQUFxQixNQUFNLFVBQVUsQ0FBQztBQUM1RCxPQUFPLEVBQXlCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDdkUsT0FBTyxFQUFFLGVBQWUsRUFBRSxXQUFXLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFFdEQsTUFBTSxVQUFVLFFBQVEsQ0FBQyxpQkFBb0MsRUFBRSxXQUFzRDtJQUNqSCxPQUFPLGlCQUFpQixDQUFDLFFBQVEsRUFBRSxNQUFNLENBQ3JDLENBQUMsQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FDdkQsQ0FBQztBQUNqQyxDQUFDO0FBRUQsTUFBTSxVQUFVLFdBQVcsQ0FBQyxFQUFVLEVBQUUsaUJBQW9DO0lBQ3hFLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNoRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDUixNQUFNLElBQUksS0FBSyxDQUFDLG9CQUFvQixDQUFDLENB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QUFHLENBQUMsQ0FBQztJQUMxRSxDQUFDLEVBQ0QsSUFBSSxFQUNKLE1BQU0sRUFDTixHQUFHLEVBQUU7UUFDRCxJQUFJLEdBQUcsdUJBQXVCLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ2pELENBQUMsQ0FDSixDQUFDO0lBQ0YsT0FBTztRQUNILElBQUksRUFBRSxHQUFHLEVBQUU7WUFDUCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDaEIsQ0FBQztRQUNELEtBQUssRUFBRSxHQUFHLEVBQUU7WUFDUixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDakIsQ0FBQztLQUNKLENBQUM7QUFDTixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGxhaXRCb2FyZCwgUGxhaXRFbGVtZW50LCBQbGFpdE5vZGUsIGdldFNlbGVjdGVkRWxlbWVudHMgfSBmcm9tICdAcGxhaXQvY29yZSc7XG5pbXBvcnQgeyBGb3JjZUF0bGFzRWRnZUVsZW1lbnQsIEZvcmNlQXRsYXNFbGVtZW50LCBGb3JjZUF0bGFzTm9kZUVsZW1lbnQgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEVkZ2VEaXJlY3Rpb24sIEVkZ2VHZW5lcmF0b3JEYXRhIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgUGxhaXRDb21tb25FbGVtZW50UmVmLCBhbmltYXRlLCBsaW5lYXIgfSBmcm9tICdAcGxhaXQvY29tbW9uJztcbmltcG9ydCB7IEZvcmNlQXRsYXNFZGdlR2VuZXJhdG9yIH0gZnJvbSAnLi4vZ2VuZXJhdG9ycy9lZGdlLmdlbmVyYXRvcic7XG5pbXBvcnQgeyBnZXRJc05vZGVBY3RpdmUsIGdldE5vZGVCeUlkIH0gZnJvbSAnLi9ub2RlJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEVkZ2VzKGZvcmNlQXRsYXNFbGVtZW50OiBGb3JjZUF0bGFzRWxlbWVudCwgYW5kQ2FsbEJhY2s/OiAoZWRnZTogRm9yY2VBdGxhc0VkZ2VFbGVtZW50KSA9PiBib29sZWFuKSB7XG4gICAgcmV0dXJuIGZvcmNlQXRsYXNFbGVtZW50LmNoaWxkcmVuPy5maWx0ZXIoXG4gICAgICAgIGYgPT4gRm9yY2VBdGxhc0VsZW1lbnQuaXNGb3JjZUF0bGFzRWRnZUVsZW1lbnQoZikgJiYgKGFuZENhbGxCYWNrPy4oZikgPz8gdHJ1ZSlcbiAgICApIGFzIEZvcmNlQXRsYXNFZGdlRWxlbWVudFtdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RWRnZUJ5SWQoaWQ6IHN0cmluZywgZm9yY2VBdGxhc0VsZW1lbnQ6IEZvcmNlQXRsYXNFbGVtZW50KSB7XG4gICAgY29uc3QgZWRnZSA9IGdldEVkZ2VzKGZvcmNlQXRsYXNFbGVtZW50LCBlID0+IGUuaWQgPT09IGlkKT8uWzBdO1xuICAgIGlmICghZWRnZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhbiBub3QgZmluZCBlZGdlLicpO1xuICAgIH1cbiAgICByZXR1cm4gZWRnZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEVkZ2VzSW5Tb3VyY2VPclRhcmdldChpZDogc3RyaW5nLCBmb3JjZUF0bGFzRWxlbWVudDogRm9yY2VBdGxhc0VsZW1lbnQpIHtcbiAgICBjb25zdCBlZGdlcyA9IGdldEVkZ2VzKGZvcmNlQXRsYXNFbGVtZW50LCBlZGdlID0+IGVkZ2Uuc291cmNlID09PSBpZCB8fCBlZGdlLnRhcmdldCA9PT0gaWQpO1xuICAgIHJldHVybiBlZGdlcztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEVkZ2VHZW5lcmF0b3IoZWRnZTogRm9yY2VBdGxhc0VkZ2VFbGVtZW50KSB7XG4gICAgY29uc3QgZWRnZVJlZiA9IFBsYWl0RWxlbWVudC5nZXRFbGVtZW50UmVmPFBsYWl0Q29tbW9uRWxlbWVudFJlZj4oZWRnZSk7XG4gICAgcmV0dXJuIGVkZ2VSZWYuZ2V0R2VuZXJhdG9yPEZvcmNlQXRsYXNFZGdlR2VuZXJhdG9yPihGb3JjZUF0bGFzRWRnZUdlbmVyYXRvci5rZXkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RWRnZURpcmVjdGlvbihpc1NvdXJjZUFjdGl2ZTogYm9vbGVhbiwgaXNUYXJnZXRBY3RpdmU6IGJvb2xlYW4pIHtcbiAgICBpZiAoaXNTb3VyY2VBY3RpdmUpIHtcbiAgICAgICAgcmV0dXJuIEVkZ2VEaXJlY3Rpb24uT1VUO1xuICAgIH0gZWxzZSBpZiAoaXNUYXJnZXRBY3RpdmUpIHtcbiAgICAgICAgcmV0dXJuIEVkZ2VEaXJlY3Rpb24uSU47XG4gICAgfVxuICAgIHJldHVybiBFZGdlRGlyZWN0aW9uLk5PTkU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFZGdlR2VuZXJhdG9yRGF0YShlZGdlOiBGb3JjZUF0bGFzRWRnZUVsZW1lbnQsIGJvYXJkOiBQbGFpdEJvYXJkKTogRWRnZUdlbmVyYXRvckRhdGEge1xuICAgIGNvbnN0IGZvcmNlQXRsYXNFbGVtZW50ID0gUGxhaXROb2RlLnBhcmVudChib2FyZCwgUGxhaXRCb2FyZC5maW5kUGF0aChib2FyZCwgZWRnZSkpIGFzIEZvcmNlQXRsYXNFbGVtZW50O1xuICAgIGNvbnN0IHNvdXJjZU5vZGUgPSBnZXROb2RlQnlJZChlZGdlLnNvdXJjZSwgZm9yY2VBdGxhc0VsZW1lbnQpO1xuICAgIGNvbnN0IHRhcmdldE5vZGUgPSBnZXROb2RlQnlJZChlZGdlLnRhcmdldCwgZm9yY2VBdGxhc0VsZW1lbnQpO1xuICAgIGlmICghc291cmNlTm9kZT8ucG9pbnRzIHx8ICF0YXJnZXROb2RlPy5wb2ludHMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU291cmNlIG9yIHRhcmdldCBub2RlIGRvZXNuJ3QgaGF2ZSBwb2ludHNcIik7XG4gICAgfVxuICAgIGNvbnN0IHN0YXJ0UG9pbnQgPSBzb3VyY2VOb2RlLnBvaW50c1swXTtcbiAgICBjb25zdCBlbmRQb2ludCA9IHRhcmdldE5vZGUucG9pbnRzWzBdO1xuICAgIGNvbnN0IHNlbGVjdEVsZW1lbnRzID0gZ2V0U2VsZWN0ZWRFbGVtZW50cyhib2FyZCkgYXMgRm9yY2VBdGxhc05vZGVFbGVtZW50W107XG4gICAgY29uc3QgaXNTb3VyY2VBY3RpdmUgPSBnZXRJc05vZGVBY3RpdmUoc291cmNlTm9kZS5pZCwgc2VsZWN0RWxlbWVudHMpO1xuICAgIGNvbnN0IGlzVGFyZ2V0QWN0aXZlID0gZ2V0SXNOb2RlQWN0aXZlKHRhcmdldE5vZGUuaWQsIHNlbGVjdEVsZW1lbnRzKTtcbiAgICBjb25zdCBkaXJlY3Rpb24gPSBnZXRFZGdlRGlyZWN0aW9uKGlzU291cmNlQWN0aXZlLCBpc1RhcmdldEFjdGl2ZSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBzdGFydFBvaW50LFxuICAgICAgICBlbmRQb2ludCxcbiAgICAgICAgZGlyZWN0aW9uLFxuICAgICAgICBpc1NvdXJjZUFjdGl2ZSxcbiAgICAgICAgaXNUYXJnZXRBY3RpdmUsXG4gICAgICAgIGlzVGFyZ2V0U2VsZjogc291cmNlTm9kZS5pZCA9PT0gdGFyZ2V0Tm9kZS5pZFxuICAgIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwbGF5RWRnZVBhcnRpY2xlQW5pbWF0ZShwYXRoOiBTVkdQYXRoRWxlbWVudCwgcG9pbnRHOiBTVkdHRWxlbWVudCkge1xuICAgIGNvbnN0IHBhdGhMZW5ndGggPSBwYXRoLmdldFRvdGFsTGVuZ3RoKCk7XG4gICAgbGV0IGFuaW0gPSBhbmltYXRlKFxuICAgICAgICAodDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwb2ludCA9IHBhdGguZ2V0UG9pbnRBdExlbmd0aCh0ICogcGF0aExlbmd0aCk7XG4gICAgICAgICAgICBwb2ludEcuc2V0QXR0cmlidXRlKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKCR7cG9pbnQueH0sICR7cG9pbnQueX0pYCk7XG4gICAgICAgIH0sXG4gICAgICAgIDEwMDAsXG4gICAgICAgIGxpbmVhcixcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgYW5pbSA9IHBsYXlFZGdlUGFydGljbGVBbmltYXRlKHBhdGgsIHBvaW50Ryk7XG4gICAgICAgIH1cbiAgICApO1xuICAgIHJldHVybiB7XG4gICAgICAgIHN0b3A6ICgpID0+IHtcbiAgICAgICAgICAgIGFuaW0uc3RvcCgpO1xuICAgICAgICB9LFxuICAgICAgICBzdGFydDogKCkgPT4ge1xuICAgICAgICAgICAgYW5pbS5zdGFydCgpO1xuICAgICAgICB9XG4gICAgfTtcbn1cbiJdfQ==
@@ -52,4 +52,4 @@ export function getNodeIcon(node) {
52
52
  color: (iconItem && iconItem.color) || DEFAULT_NODE_ICON_COLOR
53
53
  };
54
54
  }
55
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2dyYXBoLXZpei9zcmMvZm9yY2UtYXRsYXMvdXRpbHMvbm9kZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFTLGVBQWUsRUFBRSxjQUFjLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDbkYsT0FBTyxFQUFFLGlCQUFpQixFQUF5QixNQUFNLGtCQUFrQixDQUFDO0FBQzVFLE9BQU8sRUFBRSxRQUFRLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFFNUQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDdkUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLG1CQUFtQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRTVFLE1BQU0sVUFBVSxRQUFRLENBQUMsaUJBQW9DLEVBQUUsT0FBa0Q7SUFDN0csT0FBTyxpQkFBaUIsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUNyQyxDQUFDLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQ25ELENBQUM7QUFDakMsQ0FBQztBQUVELE1BQU0sVUFBVSxXQUFXLENBQUMsRUFBVSxFQUFFLGlCQUFvQztJQUN4RSxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ1IsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNoQixDQUFDO0FBRUQs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QUM7QUFDTixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGxhaXRFbGVtZW50LCBQb2ludCwgUmVjdGFuZ2xlQ2xpZW50LCBub3JtYWxpemVQb2ludCB9IGZyb20gJ0BwbGFpdC9jb3JlJztcbmltcG9ydCB7IEZvcmNlQXRsYXNFbGVtZW50LCBGb3JjZUF0bGFzTm9kZUVsZW1lbnQgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IGdldEVkZ2VzLCBnZXRFZGdlc0luU291cmNlT3JUYXJnZXQgfSBmcm9tICcuL2VkZ2UnO1xuaW1wb3J0IHsgUGxhaXRDb21tb25FbGVtZW50UmVmIH0gZnJvbSAnQHBsYWl0L2NvbW1vbic7XG5pbXBvcnQgeyBGb3JjZUF0bGFzTm9kZUdlbmVyYXRvciB9IGZyb20gJy4uL2dlbmVyYXRvcnMvbm9kZS5nZW5lcmF0b3InO1xuaW1wb3J0IHsgREVGQVVMVF9OT0RFX0lDT05fQ09MT1IsIE5PREVfSUNPTl9GT05UX1NJWkUgfSBmcm9tICcuLi9jb25zdGFudHMnO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Tm9kZXMoZm9yY2VBdGxhc0VsZW1lbnQ6IEZvcmNlQXRsYXNFbGVtZW50LCBhbmRCYWNrPzogKGVkZ2U6IEZvcmNlQXRsYXNOb2RlRWxlbWVudCkgPT4gYm9vbGVhbikge1xuICAgIHJldHVybiBmb3JjZUF0bGFzRWxlbWVudC5jaGlsZHJlbj8uZmlsdGVyKFxuICAgICAgICBmID0+IEZvcmNlQXRsYXNFbGVtZW50LmlzRm9yY2VBdGxhc05vZGVFbGVtZW50KGYpICYmIChhbmRCYWNrPy4oZikgPz8gdHJ1ZSlcbiAgICApIGFzIEZvcmNlQXRsYXNOb2RlRWxlbWVudFtdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Tm9kZUJ5SWQoaWQ6IHN0cmluZywgZm9yY2VBdGxhc0VsZW1lbnQ6IEZvcmNlQXRsYXNFbGVtZW50KSB7XG4gICAgY29uc3Qgbm9kZSA9IGdldE5vZGVzKGZvcmNlQXRsYXNFbGVtZW50LCBub2RlID0+IG5vZGUuaWQgPT09IGlkKT8uWzBdO1xuICAgIGlmICghbm9kZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhbiBub3QgZmluZCBub2RlLicpO1xuICAgIH1cbiAgICByZXR1cm4gbm9kZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldElzTm9kZUFjdGl2ZShpZDogc3RyaW5nLCBzZWxlY3RFbGVtZW50czogRm9yY2VBdGxhc05vZGVFbGVtZW50W10pIHtcbiAgICByZXR1cm4gc2VsZWN0RWxlbWVudHMuc29tZShub2RlID0+IG5vZGUuaWQgPT09IGlkKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzSGl0Tm9kZShub2RlOiBGb3JjZUF0bGFzTm9kZUVsZW1lbnQsIHBvaW50OiBbUG9pbnQsIFBvaW50XSkge1xuICAgIGNvbnN0IHsgeCwgeSB9ID0gbm9ybWFsaXplUG9pbnQobm9kZS5wb2ludHMhWzBdKTtcbiAgICBjb25zdCBzaXplID0gbm9kZS5zaXplITtcbiAgICBjb25zdCBoaXRGbG93Tm9kZSA9IFJlY3RhbmdsZUNsaWVudC5pc0hpdChSZWN0YW5nbGVDbGllbnQuZ2V0UmVjdGFuZ2xlQnlQb2ludHMocG9pbnQpLCB7XG4gICAgICAgIHg6IHggLSBzaXplIC8gMixcbiAgICAgICAgeTogeSAtIHNpemUgLyAyLFxuICAgICAgICB3aWR0aDogc2l6ZSxcbiAgICAgICAgaGVpZ2h0OiBzaXplXG4gICAgfSk7XG4gICAgcmV0dXJuIGhpdEZsb3dOb2RlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QXNzb2NpYXRlZE5vZGVzQnlJZChpZDogc3RyaW5nLCBmb3JjZUF0bGFzRWxlbWVudDogRm9yY2VBdGxhc0VsZW1lbnQpIHtcbiAgICBjb25zdCBlZGdlcyA9IGdldEVkZ2VzSW5Tb3VyY2VPclRhcmdldChpZCwgZm9yY2VBdGxhc0VsZW1lbnQpO1xuICAgIGNvbnN0IG5vZGVzOiBGb3JjZUF0bGFzTm9kZUVsZW1lbnRbXSA9IFtdO1xuICAgIGVkZ2VzLmZvckVhY2goZWRnZSA9PiB7XG4gICAgICAgIG5vZGVzLnB1c2goZ2V0Tm9kZUJ5SWQoZWRnZS5zb3VyY2UsIGZvcmNlQXRsYXNFbGVtZW50KSk7XG4gICAgICAgIG5vZGVzLnB1c2goZ2V0Tm9kZUJ5SWQoZWRnZS50YXJnZXQsIGZvcmNlQXRsYXNFbGVtZW50KSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIG5vZGVzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Tm9kZUdlbmVyYXRvcihub2RlOiBGb3JjZUF0bGFzTm9kZUVsZW1lbnQpIHtcbiAgICBjb25zdCBlZGdlUmVmID0gUGxhaXRFbGVtZW50LmdldEVsZW1lbnRSZWY8UGxhaXRDb21tb25FbGVtZW50UmVmPihub2RlKTtcbiAgICByZXR1cm4gZWRnZVJlZi5nZXRHZW5lcmF0b3I8Rm9yY2VBdGxhc05vZGVHZW5lcmF0b3I+KEZvcmNlQXRsYXNOb2RlR2VuZXJhdG9yLmtleSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0ZpcnN0RGVwdGhOb2RlKGN1cnJlbnROb2RlSWQ6IHN0cmluZywgYWN0aXZlTm9kZUlkOiBzdHJpbmcsIGZvcmNlQXRsYXNFbGVtZW50OiBGb3JjZUF0bGFzRWxlbWVudCkge1xuICAgIGNvbnN0IGVkZ2VzID0gZ2V0RWRnZXMoZm9yY2VBdGxhc0VsZW1lbnQpO1xuICAgIHJldHVybiBlZGdlcy5zb21lKFxuICAgICAgICBzID0+IChzLnNvdXJjZSA9PT0gYWN0aXZlTm9kZUlkICYmIHMudGFyZ2V0ID09PSBjdXJyZW50Tm9kZUlkKSB8fCAocy50YXJnZXQgPT09IGFjdGl2ZU5vZGVJZCAmJiBzLnNvdXJjZSA9PT0gY3VycmVudE5vZGVJZClcbiAgICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Tm9kZUljb24obm9kZTogRm9yY2VBdGxhc05vZGVFbGVtZW50KSB7XG4gICAgY29uc3QgaWNvbkl0ZW0gPSB0eXBlb2Ygbm9kZS5pY29uID09PSAnb2JqZWN0JyAmJiBub2RlLmljb24ubmFtZSA/IG5vZGUuaWNvbiA6IG51bGw7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogaWNvbkl0ZW0gPyBpY29uSXRlbS5uYW1lIDogKG5vZGUuaWNvbiBhcyBzdHJpbmcpLFxuICAgICAgICBmb250U2l6ZTogKGljb25JdGVtICYmIGljb25JdGVtLmZvbnRTaXplKSB8fCBOT0RFX0lDT05fRk9OVF9TSVpFLFxuICAgICAgICBjb2xvcjogKGljb25JdGVtICYmIGljb25JdGVtLmNvbG9yKSB8fCBERUZBVUxUX05PREVfSUNPTl9DT0xPUlxuICAgIH07XG59XG4iXX0=
55
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2dyYXBoLXZpei9zcmMvZm9yY2UtYXRsYXMvdXRpbHMvbm9kZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUgsWUFBWSxFQUVaLGVBQWUsRUFNZixjQUFjLEVBQ2pCLE1BQU0sYUFBYSxDQUFDO0FBQ3JCLE9BQU8sRUFBRSxpQkFBaUIsRUFBeUIsTUFBTSxrQkFBa0IsQ0FBQztBQUM1RSxPQUFPLEVBQUUsUUFBUSxFQUFFLHdCQUF3QixFQUFFLE1BQU0sUUFBUSxDQUFDO0FBRTVELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUU1RSxNQUFNLFVBQVUsUUFBUSxDQUFDLGlCQUFvQyxFQUFFLE9BQWtEO0lBQzdHLE9BQU8saUJBQWlCLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FDckMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUNuRCxDQUFDO0FBQ2pDLENBQUM7QUFFRCxNQUFNLFVBQVUsV0FBVyxDQUFDLEVBQVUsRUFBRSxpQkFBb0M7SUFDeEUsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3RFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNSLE1BQU0sSUFBSSxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDaEIsQ0FBQztBQUVE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QUFDO0FBQ04sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgUGxhaXRCb2FyZCxcbiAgICBQbGFpdEVsZW1lbnQsXG4gICAgUG9pbnQsXG4gICAgUmVjdGFuZ2xlQ2xpZW50LFxuICAgIFRyYW5zZm9ybXMsXG4gICAgY2xlYXJWaWV3cG9ydE9yaWdpbmF0aW9uLFxuICAgIGdldFJlYWxTY3JvbGxCYXJXaWR0aCxcbiAgICBnZXRTZWxlY3RlZEVsZW1lbnRzLFxuICAgIGdldFZpZXdCb3hDZW50ZXJQb2ludCxcbiAgICBub3JtYWxpemVQb2ludFxufSBmcm9tICdAcGxhaXQvY29yZSc7XG5pbXBvcnQgeyBGb3JjZUF0bGFzRWxlbWVudCwgRm9yY2VBdGxhc05vZGVFbGVtZW50IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBnZXRFZGdlcywgZ2V0RWRnZXNJblNvdXJjZU9yVGFyZ2V0IH0gZnJvbSAnLi9lZGdlJztcbmltcG9ydCB7IGFuaW1hdGUsIGxpbmVhciwgUGxhaXRDb21tb25FbGVtZW50UmVmIH0gZnJvbSAnQHBsYWl0L2NvbW1vbic7XG5pbXBvcnQgeyBGb3JjZUF0bGFzTm9kZUdlbmVyYXRvciB9IGZyb20gJy4uL2dlbmVyYXRvcnMvbm9kZS5nZW5lcmF0b3InO1xuaW1wb3J0IHsgREVGQVVMVF9OT0RFX0lDT05fQ09MT1IsIE5PREVfSUNPTl9GT05UX1NJWkUgfSBmcm9tICcuLi9jb25zdGFudHMnO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Tm9kZXMoZm9yY2VBdGxhc0VsZW1lbnQ6IEZvcmNlQXRsYXNFbGVtZW50LCBhbmRCYWNrPzogKGVkZ2U6IEZvcmNlQXRsYXNOb2RlRWxlbWVudCkgPT4gYm9vbGVhbikge1xuICAgIHJldHVybiBmb3JjZUF0bGFzRWxlbWVudC5jaGlsZHJlbj8uZmlsdGVyKFxuICAgICAgICBmID0+IEZvcmNlQXRsYXNFbGVtZW50LmlzRm9yY2VBdGxhc05vZGVFbGVtZW50KGYpICYmIChhbmRCYWNrPy4oZikgPz8gdHJ1ZSlcbiAgICApIGFzIEZvcmNlQXRsYXNOb2RlRWxlbWVudFtdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Tm9kZUJ5SWQoaWQ6IHN0cmluZywgZm9yY2VBdGxhc0VsZW1lbnQ6IEZvcmNlQXRsYXNFbGVtZW50KSB7XG4gICAgY29uc3Qgbm9kZSA9IGdldE5vZGVzKGZvcmNlQXRsYXNFbGVtZW50LCBub2RlID0+IG5vZGUuaWQgPT09IGlkKT8uWzBdO1xuICAgIGlmICghbm9kZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhbiBub3QgZmluZCBub2RlLicpO1xuICAgIH1cbiAgICByZXR1cm4gbm9kZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldElzTm9kZUFjdGl2ZShpZDogc3RyaW5nLCBzZWxlY3RFbGVtZW50czogRm9yY2VBdGxhc05vZGVFbGVtZW50W10pIHtcbiAgICByZXR1cm4gc2VsZWN0RWxlbWVudHMuc29tZShub2RlID0+IG5vZGUuaWQgPT09IGlkKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzSGl0Tm9kZShub2RlOiBGb3JjZUF0bGFzTm9kZUVsZW1lbnQsIHBvaW50OiBbUG9pbnQsIFBvaW50XSkge1xuICAgIGNvbnN0IHsgeCwgeSB9ID0gbm9ybWFsaXplUG9pbnQobm9kZS5wb2ludHMhWzBdKTtcbiAgICBjb25zdCBzaXplID0gbm9kZS5zaXplITtcbiAgICBjb25zdCBoaXRGbG93Tm9kZSA9IFJlY3RhbmdsZUNsaWVudC5pc0hpdChSZWN0YW5nbGVDbGllbnQuZ2V0UmVjdGFuZ2xlQnlQb2ludHMocG9pbnQpLCB7XG4gICAgICAgIHg6IHggLSBzaXplIC8gMixcbiAgICAgICAgeTogeSAtIHNpemUgLyAyLFxuICAgICAgICB3aWR0aDogc2l6ZSxcbiAgICAgICAgaGVpZ2h0OiBzaXplXG4gICAgfSk7XG4gICAgcmV0dXJuIGhpdEZsb3dOb2RlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QXNzb2NpYXRlZE5vZGVzQnlJZChpZDogc3RyaW5nLCBmb3JjZUF0bGFzRWxlbWVudDogRm9yY2VBdGxhc0VsZW1lbnQpIHtcbiAgICBjb25zdCBlZGdlcyA9IGdldEVkZ2VzSW5Tb3VyY2VPclRhcmdldChpZCwgZm9yY2VBdGxhc0VsZW1lbnQpO1xuICAgIGNvbnN0IG5vZGVzOiBGb3JjZUF0bGFzTm9kZUVsZW1lbnRbXSA9IFtdO1xuICAgIGVkZ2VzLmZvckVhY2goZWRnZSA9PiB7XG4gICAgICAgIG5vZGVzLnB1c2goZ2V0Tm9kZUJ5SWQoZWRnZS5zb3VyY2UsIGZvcmNlQXRsYXNFbGVtZW50KSk7XG4gICAgICAgIG5vZGVzLnB1c2goZ2V0Tm9kZUJ5SWQoZWRnZS50YXJnZXQsIGZvcmNlQXRsYXNFbGVtZW50KSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIG5vZGVzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Tm9kZUdlbmVyYXRvcihub2RlOiBGb3JjZUF0bGFzTm9kZUVsZW1lbnQpIHtcbiAgICBjb25zdCBlZGdlUmVmID0gUGxhaXRFbGVtZW50LmdldEVsZW1lbnRSZWY8UGxhaXRDb21tb25FbGVtZW50UmVmPihub2RlKTtcbiAgICByZXR1cm4gZWRnZVJlZi5nZXRHZW5lcmF0b3I8Rm9yY2VBdGxhc05vZGVHZW5lcmF0b3I+KEZvcmNlQXRsYXNOb2RlR2VuZXJhdG9yLmtleSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0ZpcnN0RGVwdGhOb2RlKGN1cnJlbnROb2RlSWQ6IHN0cmluZywgYWN0aXZlTm9kZUlkOiBzdHJpbmcsIGZvcmNlQXRsYXNFbGVtZW50OiBGb3JjZUF0bGFzRWxlbWVudCkge1xuICAgIGNvbnN0IGVkZ2VzID0gZ2V0RWRnZXMoZm9yY2VBdGxhc0VsZW1lbnQpO1xuICAgIHJldHVybiBlZGdlcy5zb21lKFxuICAgICAgICBzID0+IChzLnNvdXJjZSA9PT0gYWN0aXZlTm9kZUlkICYmIHMudGFyZ2V0ID09PSBjdXJyZW50Tm9kZUlkKSB8fCAocy50YXJnZXQgPT09IGFjdGl2ZU5vZGVJZCAmJiBzLnNvdXJjZSA9PT0gY3VycmVudE5vZGVJZClcbiAgICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Tm9kZUljb24obm9kZTogRm9yY2VBdGxhc05vZGVFbGVtZW50KSB7XG4gICAgY29uc3QgaWNvbkl0ZW0gPSB0eXBlb2Ygbm9kZS5pY29uID09PSAnb2JqZWN0JyAmJiBub2RlLmljb24ubmFtZSA/IG5vZGUuaWNvbiA6IG51bGw7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogaWNvbkl0ZW0gPyBpY29uSXRlbS5uYW1lIDogKG5vZGUuaWNvbiBhcyBzdHJpbmcpLFxuICAgICAgICBmb250U2l6ZTogKGljb25JdGVtICYmIGljb25JdGVtLmZvbnRTaXplKSB8fCBOT0RFX0lDT05fRk9OVF9TSVpFLFxuICAgICAgICBjb2xvcjogKGljb25JdGVtICYmIGljb25JdGVtLmNvbG9yKSB8fCBERUZBVUxUX05PREVfSUNPTl9DT0xPUlxuICAgIH07XG59XG4iXX0=
@@ -1,4 +1,4 @@
1
- import { RectangleClient, setSelectionOptions } from '@plait/core';
1
+ import { isHitElement, PlaitBoard, PlaitPluginKey, PlaitPointerType, RectangleClient, setSelectionOptions, toHostPoint, toViewBoxPoint } from '@plait/core';
2
2
  import { ForceAtlasFlavour } from './force-atlas.flavour';
3
3
  import { ForceAtlasNodeFlavour } from './node.flavour';
4
4
  import { ForceAtlasEdgeFlavour } from './edge.flavour';
@@ -59,13 +59,14 @@ export const withForceAtlas = (board) => {
59
59
  board.isInsidePoint = (element, point) => {
60
60
  return isInsidePoint(element, point);
61
61
  };
62
- board.isMovable = element => {
63
- if (ForceAtlasElement.isForceAtlasNodeElement(element)) {
64
- return true;
62
+ setSelectionOptions(board, { isMultipleSelection: false, isPreventClearSelection: true });
63
+ board.setPluginOptions(PlaitPluginKey.withHand, {
64
+ isHandMode: (board, event) => {
65
+ const point = toViewBoxPoint(board, toHostPoint(board, event.x, event.y));
66
+ const isHitTarget = isHitElement(board, point);
67
+ return PlaitBoard.isPointer(board, PlaitPointerType.selection) && !isHitTarget;
65
68
  }
66
- return isMovable(element);
67
- };
68
- setSelectionOptions(board, { isMultipleSelection: false });
69
+ });
69
70
  return withNodeIcon(board);
70
71
  };
71
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aC1mb3JjZS1hdGxhcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL2dyYXBoLXZpei9zcmMvZm9yY2UtYXRsYXMvd2l0aC1mb3JjZS1hdGxhcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBT0gsZUFBZSxFQUdmLG1CQUFtQixFQUN0QixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN6QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFaEQsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLENBQUMsS0FBaUIsRUFBRSxFQUFFO0lBQ2hELE1BQU0sRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsR0FBRyxLQUFLLENBQUM7SUFFMUgsS0FBSyxDQUFDLFdBQVcsR0FBRyxDQUFDLE9BQWtDLEVBQUUsRUFBRTtRQUN2RCxJQUFJLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNsRCxPQUFPLGlCQUFpQixDQUFDO1FBQzdCLENBQUM7YUFBTSxJQUFJLGlCQUFpQixDQUFDLHVCQUF1QixDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ3BFLE9BQU8scUJBQXFCLENBQUM7UUFDakMsQ0FBQzthQUFNLElBQUksaUJBQWlC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ZW50LFxuICAgIFBsYWl0T3B0aW9uc0JvYXJkLFxuICAgIFBsYWl0UGx1Z2luRWxlbWVudENvbnRleHQsXG4gICAgUGxhaXRQbHVnaW5LZXksXG4gICAgUG9pbnQsXG4gICAgUmVjdGFuZ2xlQ2xpZW50LFxuICAgIFNlbGVjdGlvbixcbiAgICBXaXRoU2VsZWN0aW9uUGx1Z2luT3B0aW9ucyxcbiAgICBzZXRTZWxlY3Rpb25PcHRpb25zXG59IGZyb20gJ0BwbGFpdC9jb3JlJztcbmltcG9ydCB7IEZvcmNlQXRsYXNGbGF2b3VyIH0gZnJvbSAnLi9mb3JjZS1hdGxhcy5mbGF2b3VyJztcbmltcG9ydCB7IEZvcmNlQXRsYXNOb2RlRmxhdm91ciB9IGZyb20gJy4vbm9kZS5mbGF2b3VyJztcbmltcG9ydCB7IEZvcmNlQXRsYXNFZGdlRmxhdm91ciB9IGZyb20gJy4vZWRnZS5mbGF2b3VyJztcbmltcG9ydCB7IEZvcmNlQXRsYXNFbGVtZW50IH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBpc0hpdE5vZGUgfSBmcm9tICcuL3V0aWxzL25vZGUnO1xuaW1wb3J0IHsgd2l0aE5vZGVJY29uIH0gZnJvbSAnLi93aXRoLW5vZGUtaWNvbic7XG5cbmV4cG9ydCBjb25zdCB3aXRoRm9yY2VBdGxhcyA9IChib2FyZDogUGxhaXRCb2FyZCkgPT4ge1xuICAgIGNvbnN0IHsgZHJhd0VsZW1lbnQsIGdldFJlY3RhbmdsZSwgaXNSZWN0YW5nbGVIaXQsIGlzSGl0LCBpc0luc2lkZVBvaW50LCBpc01vdmFibGUsIGlzQWxpZ24sIGdldFJlbGF0ZWRGcmFnbWVudCB9ID0gYm9hcmQ7XG5cbiAgICBib2FyZC5kcmF3RWxlbWVudCA9IChjb250ZXh0OiBQbGFpdFBsdWdpbkVsZW1lbnRDb250ZXh0KSA9PiB7XG4gICAgICAgIGlmIChGb3JjZUF0bGFzRWxlbWVudC5pc0ZvcmNlQXRsYXMoY29udGV4dC5lbGVtZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuIEZvcmNlQXRsYXNGbGF2b3VyO1xuICAgICAgICB9IGVsc2UgaWYgKEZvcmNlQXRsYXNFbGVtZW50LmlzRm9yY2VBdGxhc05vZGVFbGVtZW50KGNvbnRleHQuZWxlbWVudCkpIHtcbiAgICAgICAgICAgIHJldHVybiBGb3JjZUF0bGFzTm9kZUZsYXZvdXI7XG4gICAgICAgIH0gZWxzZSBpZiAoRm9yY2VBdGxhc0VsZW1lbnQuaXNGb3JjZUF0bGFzRWRnZUVsZW1lbnQoY29udGV4dC5lbGVtZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuIEZvcmNlQXRsYXNFZGdlRmxhdm91cjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZHJhd0VsZW1lbnQoY29udGV4dCk7XG4gICAgfTtcblxuICAgIGJvYXJkLmdldFJlY3RhbmdsZSA9IChlbGVtZW50OiBQbGFpdEVsZW1lbnQpID0+IHtcbiAgICAgICAgaWYgKGVsZW1lbnQudHlwZSA9PT0gJ2ZvcmNlLWF0bGFzJykge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB3aWR0aDogMCxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IDAsXG4gICAgICAgICAgICAgICAgeDogMCxcbiAgICAgICAgICAgICAgICB5OiAwXG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2UgaWYgKEZvcmNlQXRsYXNFbGVtZW50LmlzRm9yY2VBdGxhc05vZGVFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgICAgICAgICByZXR1cm4gUmVjdGFuZ2xlQ2xpZW50LmdldFJlY3RhbmdsZUJ5UG9pbnRzKGVsZW1lbnQucG9pbnRzIHx8IFtdKTtcbiAgICAgICAgfSBlbHNlIGlmIChGb3JjZUF0bGFzRWxlbWVudC5pc0ZvcmNlQXRsYXNFZGdlRWxlbWVudChlbGVtZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB3aWR0aDogMCxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IDAsXG4gICAgICAgICAgICAgICAgeDogMCxcbiAgICAgICAgICAgICAgICB5OiAwXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBnZXRSZWN0YW5nbGUoZWxlbWVudCk7XG4gICAgfTtcblxuICAgIGJvYXJkLmlzUmVjdGFuZ2xlSGl0ID0gKGVsZW1lbnQ6IFBsYWl0RWxlbWVudCwgc2VsZWN0aW9uOiBTZWxlY3Rpb24pID0+IHtcbiAgICAgICAgcmV0dXJuIGlzUmVjdGFuZ2xlSGl0KGVsZW1lbnQsIHNlbGVjdGlvbik7XG4gICAgfTtcbiAgICBib2FyZC5pc1JlY3RhbmdsZUhpdCA9IChlbGVtZW50LCByYW5nZSkgPT4ge1xuICAgICAgICBpZiAoRm9yY2VBdGxhc0VsZW1lbnQuaXNGb3JjZUF0bGFzTm9kZUVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICAgICAgICAgIHJldHVybiBpc0hpdE5vZGUoZWxlbWVudCwgW3JhbmdlLmFuY2hvciwgcmFuZ2UuZm9jdXNdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXNSZWN0YW5nbGVIaXQoZWxlbWVudCwgcmFuZ2UpO1xuICAgIH07XG5cbiAgICBib2FyZC5pc0hpdCA9IChlbGVtZW50LCBwb2ludCkgPT4ge1xuICAgICAgICBpZiAoRm9yY2VBdGxhc0VsZW1lbnQuaXNGb3JjZUF0bGFzTm9kZUVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICAgICAgICAgIHJldHVybiBpc0hpdE5vZGUoZWxlbWVudCwgW3BvaW50LCBwb2ludF0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc0hpdChlbGVtZW50LCBwb2ludCk7XG4gICAgfTtcblxuICAgIGJvYXJkLmlzSW5zaWRlUG9pbnQgPSAoZWxlbWVudDogUGxhaXRFbGVtZW50LCBwb2ludDogUG9pbnQpID0+IHtcbiAgICAgICAgcmV0dXJuIGlzSW5zaWRlUG9pbnQoZWxlbWVudCwgcG9pbnQpO1xuICAgIH07XG5cbiAgICBib2FyZC5pc01vdmFibGUgPSBlbGVtZW50ID0+IHtcbiAgICAgICAgaWYgKEZvcmNlQXRsYXNFbGVtZW50LmlzRm9yY2VBdGxhc05vZGVFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXNNb3ZhYmxlKGVsZW1lbnQpO1xuICAgIH07XG5cbiAgICBzZXRTZWxlY3Rpb25PcHRpb25zKGJvYXJkLCB7IGlzTXVsdGlwbGVTZWxlY3Rpb246IGZhbHNlIH0pO1xuXG4gICAgcmV0dXJuIHdpdGhOb2RlSWNvbihib2FyZCk7XG59O1xuIl19
72
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aC1mb3JjZS1hdGxhcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL2dyYXBoLXZpei9zcmMvZm9yY2UtYXRsYXMvd2l0aC1mb3JjZS1hdGxhcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsWUFBWSxFQUNaLFVBQVUsRUFJVixjQUFjLEVBQ2QsZ0JBQWdCLEVBRWhCLGVBQWUsRUFFZixtQkFBbUIsRUFDbkIsV0FBVyxFQUNYLGNBQWMsRUFFakIsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2xELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDekMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRWhELE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxDQUFDLEtBQWlCLEVBQUUsRUFBRTtJQUNoRCxNQUFNLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLEdBQUcsS0FBSyxDQUFDO0lBRTFILEtBQUssQ0FBQyxXQUFXLEdBQUcsQ0FBQyxPQUFrQyxFQUFFLEVBQUU7UUFDdkQsSUFBSSxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDbEQsT0FBTyxpQkFBaUIsQ0FBQztRQUM3QixDQUFDO2FBQU0sSUFBSSxpQkFBaUIsQ0FBQyx1QkFBdUIsQ0FBQyxPQUFPLENBQUMsT0FBTyxD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QUM7WUFDMUUsTUFBTSxXQUFXLEdBQUcsWUFBWSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztZQUMvQyxPQUFPLFVBQVUsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQ25GLENBQUM7S0FDSixDQUFDLENBQUM7SUFFSCxPQUFPLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUMvQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIGlzSGl0RWxlbWVudCxcbiAgICBQbGFpdEJvYXJkLFxuICAgIFBsYWl0RWxlbWVudCxcbiAgICBQbGFpdE9wdGlvbnNCb2FyZCxcbiAgICBQbGFpdFBsdWdpbkVsZW1lbnRDb250ZXh0LFxuICAgIFBsYWl0UGx1Z2luS2V5LFxuICAgIFBsYWl0UG9pbnRlclR5cGUsXG4gICAgUG9pbnQsXG4gICAgUmVjdGFuZ2xlQ2xpZW50LFxuICAgIFNlbGVjdGlvbixcbiAgICBzZXRTZWxlY3Rpb25PcHRpb25zLFxuICAgIHRvSG9zdFBvaW50LFxuICAgIHRvVmlld0JveFBvaW50LFxuICAgIFdpdGhIYW5kUGx1Z2luT3B0aW9uc1xufSBmcm9tICdAcGxhaXQvY29yZSc7XG5pbXBvcnQgeyBGb3JjZUF0bGFzRmxhdm91ciB9IGZyb20gJy4vZm9yY2UtYXRsYXMuZmxhdm91cic7XG5pbXBvcnQgeyBGb3JjZUF0bGFzTm9kZUZsYXZvdXIgfSBmcm9tICcuL25vZGUuZmxhdm91cic7XG5pbXBvcnQgeyBGb3JjZUF0bGFzRWRnZUZsYXZvdXIgfSBmcm9tICcuL2VkZ2UuZmxhdm91cic7XG5pbXBvcnQgeyBGb3JjZUF0bGFzRWxlbWVudCB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgaXNIaXROb2RlIH0gZnJvbSAnLi91dGlscy9ub2RlJztcbmltcG9ydCB7IHdpdGhOb2RlSWNvbiB9IGZyb20gJy4vd2l0aC1ub2RlLWljb24nO1xuXG5leHBvcnQgY29uc3Qgd2l0aEZvcmNlQXRsYXMgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQpID0+IHtcbiAgICBjb25zdCB7IGRyYXdFbGVtZW50LCBnZXRSZWN0YW5nbGUsIGlzUmVjdGFuZ2xlSGl0LCBpc0hpdCwgaXNJbnNpZGVQb2ludCwgaXNNb3ZhYmxlLCBpc0FsaWduLCBnZXRSZWxhdGVkRnJhZ21lbnQgfSA9IGJvYXJkO1xuXG4gICAgYm9hcmQuZHJhd0VsZW1lbnQgPSAoY29udGV4dDogUGxhaXRQbHVnaW5FbGVtZW50Q29udGV4dCkgPT4ge1xuICAgICAgICBpZiAoRm9yY2VBdGxhc0VsZW1lbnQuaXNGb3JjZUF0bGFzKGNvbnRleHQuZWxlbWVudCkpIHtcbiAgICAgICAgICAgIHJldHVybiBGb3JjZUF0bGFzRmxhdm91cjtcbiAgICAgICAgfSBlbHNlIGlmIChGb3JjZUF0bGFzRWxlbWVudC5pc0ZvcmNlQXRsYXNOb2RlRWxlbWVudChjb250ZXh0LmVsZW1lbnQpKSB7XG4gICAgICAgICAgICByZXR1cm4gRm9yY2VBdGxhc05vZGVGbGF2b3VyO1xuICAgICAgICB9IGVsc2UgaWYgKEZvcmNlQXRsYXNFbGVtZW50LmlzRm9yY2VBdGxhc0VkZ2VFbGVtZW50KGNvbnRleHQuZWxlbWVudCkpIHtcbiAgICAgICAgICAgIHJldHVybiBGb3JjZUF0bGFzRWRnZUZsYXZvdXI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRyYXdFbGVtZW50KGNvbnRleHQpO1xuICAgIH07XG5cbiAgICBib2FyZC5nZXRSZWN0YW5nbGUgPSAoZWxlbWVudDogUGxhaXRFbGVtZW50KSA9PiB7XG4gICAgICAgIGlmIChlbGVtZW50LnR5cGUgPT09ICdmb3JjZS1hdGxhcycpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgd2lkdGg6IDAsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiAwLFxuICAgICAgICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgICAgICAgeTogMFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIGlmIChGb3JjZUF0bGFzRWxlbWVudC5pc0ZvcmNlQXRsYXNOb2RlRWxlbWVudChlbGVtZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuIFJlY3RhbmdsZUNsaWVudC5nZXRSZWN0YW5nbGVCeVBvaW50cyhlbGVtZW50LnBvaW50cyB8fCBbXSk7XG4gICAgICAgIH0gZWxzZSBpZiAoRm9yY2VBdGxhc0VsZW1lbnQuaXNGb3JjZUF0bGFzRWRnZUVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgd2lkdGg6IDAsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiAwLFxuICAgICAgICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgICAgICAgeTogMFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZ2V0UmVjdGFuZ2xlKGVsZW1lbnQpO1xuICAgIH07XG5cbiAgICBib2FyZC5pc1JlY3RhbmdsZUhpdCA9IChlbGVtZW50OiBQbGFpdEVsZW1lbnQsIHNlbGVjdGlvbjogU2VsZWN0aW9uKSA9PiB7XG4gICAgICAgIHJldHVybiBpc1JlY3RhbmdsZUhpdChlbGVtZW50LCBzZWxlY3Rpb24pO1xuICAgIH07XG4gICAgYm9hcmQuaXNSZWN0YW5nbGVIaXQgPSAoZWxlbWVudCwgcmFuZ2UpID0+IHtcbiAgICAgICAgaWYgKEZvcmNlQXRsYXNFbGVtZW50LmlzRm9yY2VBdGxhc05vZGVFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgICAgICAgICByZXR1cm4gaXNIaXROb2RlKGVsZW1lbnQsIFtyYW5nZS5hbmNob3IsIHJhbmdlLmZvY3VzXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzUmVjdGFuZ2xlSGl0KGVsZW1lbnQsIHJhbmdlKTtcbiAgICB9O1xuXG4gICAgYm9hcmQuaXNIaXQgPSAoZWxlbWVudCwgcG9pbnQpID0+IHtcbiAgICAgICAgaWYgKEZvcmNlQXRsYXNFbGVtZW50LmlzRm9yY2VBdGxhc05vZGVFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgICAgICAgICByZXR1cm4gaXNIaXROb2RlKGVsZW1lbnQsIFtwb2ludCwgcG9pbnRdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXNIaXQoZWxlbWVudCwgcG9pbnQpO1xuICAgIH07XG5cbiAgICBib2FyZC5pc0luc2lkZVBvaW50ID0gKGVsZW1lbnQ6IFBsYWl0RWxlbWVudCwgcG9pbnQ6IFBvaW50KSA9PiB7XG4gICAgICAgIHJldHVybiBpc0luc2lkZVBvaW50KGVsZW1lbnQsIHBvaW50KTtcbiAgICB9O1xuXG4gICAgc2V0U2VsZWN0aW9uT3B0aW9ucyhib2FyZCwgeyBpc011bHRpcGxlU2VsZWN0aW9uOiBmYWxzZSwgaXNQcmV2ZW50Q2xlYXJTZWxlY3Rpb246IHRydWUgfSk7XG5cbiAgICAoYm9hcmQgYXMgUGxhaXRPcHRpb25zQm9hcmQpLnNldFBsdWdpbk9wdGlvbnM8V2l0aEhhbmRQbHVnaW5PcHRpb25zPihQbGFpdFBsdWdpbktleS53aXRoSGFuZCwge1xuICAgICAgICBpc0hhbmRNb2RlOiAoYm9hcmQsIGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwb2ludCA9IHRvVmlld0JveFBvaW50KGJvYXJkLCB0b0hvc3RQb2ludChib2FyZCwgZXZlbnQueCwgZXZlbnQueSkpO1xuICAgICAgICAgICAgY29uc3QgaXNIaXRUYXJnZXQgPSBpc0hpdEVsZW1lbnQoYm9hcmQsIHBvaW50KTtcbiAgICAgICAgICAgIHJldHVybiBQbGFpdEJvYXJkLmlzUG9pbnRlcihib2FyZCwgUGxhaXRQb2ludGVyVHlwZS5zZWxlY3Rpb24pICYmICFpc0hpdFRhcmdldDtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHdpdGhOb2RlSWNvbihib2FyZCk7XG59O1xuIl19
@@ -1,4 +1,4 @@
1
- import { cacheSelectedElements, PlaitBoard, normalizePoint, drawCircle, NS, createG, createPath, PlaitElement, PlaitNode, getSelectedElements, RectangleClient, createForeignObject, setSelectionOptions } from '@plait/core';
1
+ import { cacheSelectedElements, PlaitBoard, normalizePoint, drawCircle, createForeignObject, createG, createPath, PlaitElement, PlaitNode, getSelectedElements, RectangleClient, setSelectionOptions, PlaitPluginKey, toViewBoxPoint, toHostPoint, isHitElement, PlaitPointerType } from '@plait/core';
2
2
  import { CommonElementFlavour, Generator, animate, linear } from '@plait/common';
3
3
  import Graph from 'graphology';
4
4
  import circular from 'graphology-layout/circular';
@@ -25,6 +25,10 @@ const DEFAULT_ACTIVE_NODE_SIZE_MULTIPLIER = 1.2;
25
25
  const DEFAULT_ACTIVE_WAVE_NODE_SIZE_MULTIPLIER = 1.5;
26
26
  const DEFAULT_NODE_LABEL_MARGIN_TOP = 4;
27
27
  const DEFAULT_NODE_LABEL_FONT_SIZE = 12;
28
+ const DEFAULT_NODE_LABEL_WIDTH = 150;
29
+ const DEFAULT_NODE_LABEL_HEIGHT = 22;
30
+ const DEFAULT_NODE_LABEL_STYLE = `user-select:none;max-width:${DEFAULT_NODE_LABEL_WIDTH}px;text-align:center;line-height:${DEFAULT_NODE_LABEL_HEIGHT}px;font-size:${DEFAULT_NODE_LABEL_FONT_SIZE}px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;`;
31
+ const NODE_LABEL_CLASS_NAME = 'force-atlas-node-label';
28
32
  const SECOND_DEPTH_NODE_ALPHA = 0.5;
29
33
  const SECOND_DEPTH_LINE_ALPHA = 0.5;
30
34
  const ACTIVE_BACKGROUND_NODE_ALPHA = 0.1;
@@ -322,40 +326,55 @@ function drawNode(board, node, point, options) {
322
326
  if (options.iconG) {
323
327
  nodeG.append(options.iconG);
324
328
  }
325
- const text = document.createElementNS(NS, 'text');
326
- text.textContent = node.label || '';
327
- text.setAttribute('text-anchor', `middle`);
328
- text.setAttribute('dominant-baseline', `hanging`);
329
- text.setAttribute('x', `${x}`);
330
- text.setAttribute('font-size', `${DEFAULT_NODE_LABEL_FONT_SIZE}px`);
331
- text.setAttribute('style', `user-select: none;`);
329
+ const labelWidth = node.styles?.labelWidth ?? DEFAULT_NODE_LABEL_WIDTH;
330
+ const labelHeight = node.styles?.labelHeight ?? DEFAULT_NODE_LABEL_HEIGHT;
331
+ const textForeignObject = createForeignObject(x - labelWidth / 2, y, labelWidth, labelHeight);
332
+ const textContainer = document.createElement('div');
333
+ textContainer.classList.add(NODE_LABEL_CLASS_NAME);
334
+ textContainer.setAttribute('style', DEFAULT_NODE_LABEL_STYLE);
335
+ const text = document.createElement('span');
336
+ text.innerText = node.label;
337
+ textContainer.append(text);
338
+ textForeignObject.append(textContainer);
332
339
  if (options.isActive) {
333
340
  const waveDiameter = diameter * DEFAULT_ACTIVE_WAVE_NODE_SIZE_MULTIPLIER;
334
341
  const waveCircle = drawCircle(roughSVG, [x, y], waveDiameter, nodeStyles);
335
342
  waveCircle.setAttribute('opacity', ACTIVE_BACKGROUND_NODE_ALPHA.toString());
336
343
  nodeG.append(waveCircle);
337
- text.setAttribute('y', `${y + waveDiameter / 2 + DEFAULT_NODE_LABEL_MARGIN_TOP}`);
344
+ textForeignObject.setAttribute('y', `${y + waveDiameter / 2}`);
338
345
  }
339
346
  else {
340
347
  if (!options.isFirstDepth) {
341
348
  nodeG.setAttribute('opacity', SECOND_DEPTH_NODE_ALPHA.toString());
342
349
  }
343
- text.setAttribute('y', `${y + diameter / 2 + DEFAULT_NODE_LABEL_MARGIN_TOP}`);
350
+ textForeignObject.setAttribute('y', `${y + diameter / 2}`);
344
351
  }
345
- nodeG.append(text);
352
+ nodeG.append(textForeignObject);
346
353
  return nodeG;
347
354
  }
348
- function drawEdge(startPoint, endPoint, direction, isMutual) {
355
+ function drawEdge(startPoint, endPoint, direction, isMutual, isTargetSelf) {
356
+ const nodeRadius = DEFAULT_NODE_SIZE / 2;
349
357
  const arrow = getArrow(startPoint[0], startPoint[1], endPoint[0], endPoint[1], {
350
358
  stretch: 0.4,
351
359
  flip: direction === EdgeDirection.NONE ? false : isMutual,
352
- padEnd: DEFAULT_NODE_SIZE / 2,
353
- padStart: DEFAULT_NODE_SIZE / 2
360
+ padEnd: nodeRadius,
361
+ padStart: nodeRadius
354
362
  });
355
363
  const [sx, sy, cx, cy, ex, ey, ae, as, ec] = arrow;
356
364
  const g = createG();
357
365
  const path = createPath();
358
- path.setAttribute('d', `M${sx},${sy} Q${cx},${cy} ${ex},${ey}`);
366
+ if (!isTargetSelf) {
367
+ path.setAttribute('d', `M${sx},${sy} Q${cx},${cy} ${ex},${ey}`);
368
+ }
369
+ else {
370
+ const angle = 55;
371
+ const angleRad = (angle * Math.PI) / 180;
372
+ const x = nodeRadius * Math.cos(angleRad);
373
+ const y = nodeRadius * Math.sin(angleRad);
374
+ path.setAttribute('d', `M -${x},-${y}
375
+ C -45,-85, 45 -85
376
+ ${x},-${y}`);
377
+ }
359
378
  path.setAttribute('fill', 'none');
360
379
  path.setAttribute('stroke', DEFAULT_LINE_STYLES.color[direction]);
361
380
  g.append(path);
@@ -385,7 +404,7 @@ class ForceAtlasEdgeGenerator extends Generator {
385
404
  }
386
405
  draw(element, data) {
387
406
  const edgeG = createG();
388
- const edgeElement = drawEdge(data.startPoint, data.endPoint, data.direction, data.isSourceActive && data.isTargetActive);
407
+ const edgeElement = drawEdge(data.startPoint, data.endPoint, data.direction, data.isSourceActive && data.isTargetActive, data.isTargetSelf);
389
408
  edgeG.append(edgeElement.g);
390
409
  if (data.direction !== EdgeDirection.NONE) {
391
410
  const particle = drawParticle(this.board, data.startPoint, data.direction);
@@ -445,7 +464,8 @@ function getEdgeGeneratorData(edge, board) {
445
464
  endPoint,
446
465
  direction,
447
466
  isSourceActive,
448
- isTargetActive
467
+ isTargetActive,
468
+ isTargetSelf: sourceNode.id === targetNode.id
449
469
  };
450
470
  }
451
471
  function playEdgeParticleAnimate(path, pointG) {
@@ -688,13 +708,14 @@ const withForceAtlas = (board) => {
688
708
  board.isInsidePoint = (element, point) => {
689
709
  return isInsidePoint(element, point);
690
710
  };
691
- board.isMovable = element => {
692
- if (ForceAtlasElement.isForceAtlasNodeElement(element)) {
693
- return true;
711
+ setSelectionOptions(board, { isMultipleSelection: false, isPreventClearSelection: true });
712
+ board.setPluginOptions(PlaitPluginKey.withHand, {
713
+ isHandMode: (board, event) => {
714
+ const point = toViewBoxPoint(board, toHostPoint(board, event.x, event.y));
715
+ const isHitTarget = isHitElement(board, point);
716
+ return PlaitBoard.isPointer(board, PlaitPointerType.selection) && !isHitTarget;
694
717
  }
695
- return isMovable(element);
696
- };
697
- setSelectionOptions(board, { isMultipleSelection: false });
718
+ });
698
719
  return withNodeIcon(board);
699
720
  };
700
721
 
@@ -720,5 +741,5 @@ class ForceAtlasNodeIconBaseComponent {
720
741
  * Generated bundle index. Do not edit.
721
742
  */
722
743
 
723
- export { ACTIVE_BACKGROUND_NODE_ALPHA, ACTIVE_NODE_ICON_CLASS_NAME, ACTIVE_NODE_ICON_FONT_SIZE, DEFAULT_ACTIVE_NODE_SIZE_MULTIPLIER, DEFAULT_ACTIVE_WAVE_NODE_SIZE_MULTIPLIER, DEFAULT_EDGE_STYLES, DEFAULT_LINE_STYLES, DEFAULT_NODE_BACKGROUND_COLOR, DEFAULT_NODE_ICON_COLOR, DEFAULT_NODE_LABEL_FONT_SIZE, DEFAULT_NODE_LABEL_MARGIN_TOP, DEFAULT_NODE_SCALING_RATIO, DEFAULT_NODE_SIZE, DEFAULT_NODE_STYLES, EdgeDirection, ForceAtlasElement, ForceAtlasNodeIconBaseComponent, NODE_ICON_CLASS_NAME, NODE_ICON_FONT_SIZE, SECOND_DEPTH_LINE_ALPHA, SECOND_DEPTH_NODE_ALPHA, withForceAtlas, withNodeIcon };
744
+ export { ACTIVE_BACKGROUND_NODE_ALPHA, ACTIVE_NODE_ICON_CLASS_NAME, ACTIVE_NODE_ICON_FONT_SIZE, DEFAULT_ACTIVE_NODE_SIZE_MULTIPLIER, DEFAULT_ACTIVE_WAVE_NODE_SIZE_MULTIPLIER, DEFAULT_EDGE_STYLES, DEFAULT_LINE_STYLES, DEFAULT_NODE_BACKGROUND_COLOR, DEFAULT_NODE_ICON_COLOR, DEFAULT_NODE_LABEL_FONT_SIZE, DEFAULT_NODE_LABEL_HEIGHT, DEFAULT_NODE_LABEL_MARGIN_TOP, DEFAULT_NODE_LABEL_STYLE, DEFAULT_NODE_LABEL_WIDTH, DEFAULT_NODE_SCALING_RATIO, DEFAULT_NODE_SIZE, DEFAULT_NODE_STYLES, EdgeDirection, ForceAtlasElement, ForceAtlasNodeIconBaseComponent, NODE_ICON_CLASS_NAME, NODE_ICON_FONT_SIZE, NODE_LABEL_CLASS_NAME, SECOND_DEPTH_LINE_ALPHA, SECOND_DEPTH_NODE_ALPHA, withForceAtlas, withNodeIcon };
724
745
  //# sourceMappingURL=plait-graph-viz.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"plait-graph-viz.mjs","sources":["../../../packages/graph-viz/src/constants/default.ts","../../../packages/graph-viz/src/force-atlas/types.ts","../../../packages/graph-viz/src/force-atlas/constants.ts","../../../packages/graph-viz/src/interfaces/element.ts","../../../packages/graph-viz/src/force-atlas/force-atlas.flavour.ts","../../../packages/graph-viz/src/perfect-arrows/utils.ts","../../../packages/graph-viz/src/perfect-arrows/get-arrow.ts","../../../packages/graph-viz/src/force-atlas/utils/draw.ts","../../../packages/graph-viz/src/force-atlas/generators/edge.generator.ts","../../../packages/graph-viz/src/force-atlas/utils/edge.ts","../../../packages/graph-viz/src/force-atlas/utils/node.ts","../../../packages/graph-viz/src/force-atlas/generators/node.generator.ts","../../../packages/graph-viz/src/force-atlas/node.flavour.ts","../../../packages/graph-viz/src/force-atlas/edge.flavour.ts","../../../packages/graph-viz/src/force-atlas/with-node-icon.ts","../../../packages/graph-viz/src/force-atlas/with-force-atlas.ts","../../../packages/graph-viz/src/force-atlas/core/node-icon-base.component.ts","../../../packages/graph-viz/src/public-api.ts","../../../packages/graph-viz/src/plait-graph-viz.ts"],"sourcesContent":["import { Options } from 'roughjs/bin/core';\n\nexport const DEFAULT_STYLES: Options = {\n fillStyle: 'solid',\n strokeWidth: 1\n};\n","import { GeneratorExtraData } from '@plait/common';\nimport { Point } from '@plait/core';\n\nexport enum EdgeDirection {\n IN,\n OUT,\n NONE\n}\n\nexport interface NodeStyles {\n stroke?: string;\n strokeWidth?: number;\n fill?: string;\n fillStyle?: string;\n activeStroke?: string;\n activeFill?: string;\n borderRadius?: number;\n hoverStroke?: string;\n}\n\nexport interface EdgeGeneratorData extends GeneratorExtraData {\n startPoint: Point;\n endPoint: Point;\n isSourceActive: boolean;\n isTargetActive: boolean;\n direction: EdgeDirection;\n}\n\nexport interface NodeGeneratorData extends GeneratorExtraData {\n isActive: boolean;\n isFirstDepth: boolean;\n}\n\nexport interface NodeIconItem {\n name: string;\n fontSize?: number;\n color?: string;\n}\n","import { Options } from 'roughjs/bin/core';\nimport { DEFAULT_STYLES } from '../constants/default';\nimport { EdgeDirection } from './types';\n\nexport const DEFAULT_EDGE_STYLES: Options = {\n ...DEFAULT_STYLES,\n stroke: '#ddd'\n};\n\nexport const DEFAULT_NODE_SIZE = 30;\n\nexport const DEFAULT_ACTIVE_NODE_SIZE_MULTIPLIER = 1.2;\n\nexport const DEFAULT_ACTIVE_WAVE_NODE_SIZE_MULTIPLIER = 1.5;\n\nexport const DEFAULT_NODE_LABEL_MARGIN_TOP = 4;\n\nexport const DEFAULT_NODE_LABEL_FONT_SIZE = 12;\n\nexport const SECOND_DEPTH_NODE_ALPHA = 0.5;\n\nexport const SECOND_DEPTH_LINE_ALPHA = 0.5;\n\nexport const ACTIVE_BACKGROUND_NODE_ALPHA = 0.1;\n\nexport const NODE_ICON_CLASS_NAME = 'force-atlas-node-icon';\n\nexport const ACTIVE_NODE_ICON_CLASS_NAME = 'force-atlas-node-icon-active';\n\nexport const NODE_ICON_FONT_SIZE = 16;\n\nexport const ACTIVE_NODE_ICON_FONT_SIZE = 18;\n\nexport const DEFAULT_NODE_BACKGROUND_COLOR = '#9c9cfb';\n\nexport const DEFAULT_NODE_ICON_COLOR = '#fff';\n\nexport const DEFAULT_NODE_STYLES: Options = {\n ...DEFAULT_STYLES,\n fill: DEFAULT_NODE_BACKGROUND_COLOR,\n strokeWidth: 0\n};\n\nexport const DEFAULT_NODE_SCALING_RATIO = 20;\n\nexport const DEFAULT_LINE_STYLES = {\n color: {\n [EdgeDirection.IN]: '#73D897',\n [EdgeDirection.OUT]: '#6698FF',\n [EdgeDirection.NONE]: `#ddd`\n }\n};\n","import { PlaitElement } from '@plait/core';\nimport { NodeIconItem } from '../force-atlas/types';\nexport interface ForceAtlasNodeElement extends PlaitElement {\n label: string;\n icon: string | NodeIconItem;\n size?: number;\n isActive?: boolean;\n}\n\nexport interface ForceAtlasEdgeElement extends PlaitElement {\n source: string;\n target: string;\n}\n\nexport interface ForceAtlasElement extends PlaitElement {\n children: (ForceAtlasNodeElement | ForceAtlasEdgeElement)[];\n}\n\nexport const ForceAtlasElement = {\n isForceAtlas: (value: any) => {\n return value?.type === 'force-atlas';\n },\n isForceAtlasNodeElement: (value: any): value is ForceAtlasNodeElement => {\n return value && value.label && value.icon;\n },\n isForceAtlasEdgeElement: (value: any): value is ForceAtlasEdgeElement => {\n return value && value.source && value.target;\n }\n};\n","import { CommonElementFlavour } from '@plait/common';\nimport { OnContextChanged, PlaitBoard, PlaitPluginElementContext, cacheSelectedElements } from '@plait/core';\nimport Graph from 'graphology';\nimport circular from 'graphology-layout/circular';\nimport forceAtlas2 from 'graphology-layout-forceatlas2';\nimport { ForceAtlasElement, ForceAtlasNodeElement } from '../interfaces';\nimport { DEFAULT_NODE_SCALING_RATIO, DEFAULT_NODE_SIZE } from './constants';\n\nexport class ForceAtlasFlavour extends CommonElementFlavour<ForceAtlasElement, PlaitBoard>\n implements OnContextChanged<ForceAtlasElement, PlaitBoard> {\n graph!: Graph<ForceAtlasNodeElement>;\n\n constructor() {\n super();\n }\n\n initializeGraph() {\n this.graph = new Graph<ForceAtlasNodeElement>();\n this.element.children?.forEach(child => {\n if (ForceAtlasElement.isForceAtlasNodeElement(child)) {\n if (typeof child?.size === 'undefined') {\n child.size = DEFAULT_NODE_SIZE;\n }\n if (child.isActive) {\n cacheSelectedElements(this.board, [child]);\n }\n this.graph.addNode(child.id, child);\n } else if (ForceAtlasElement.isForceAtlasEdgeElement(child)) {\n this.graph.addEdge(child.source, child.target);\n }\n });\n circular.assign(this.graph);\n const settings = forceAtlas2.inferSettings(this.graph);\n settings.strongGravityMode = false;\n settings.linLogMode = true;\n settings.gravity = 2;\n settings.adjustSizes = true;\n settings.scalingRatio = DEFAULT_NODE_SCALING_RATIO;\n const positions = forceAtlas2(this.graph, { iterations: 1000, settings });\n this.element.children?.forEach(child => {\n if (ForceAtlasElement.isForceAtlasNodeElement(child)) {\n const pos = positions[child.id];\n child.points = [[pos.x, pos.y]];\n }\n });\n }\n\n initialize(): void {\n super.initialize();\n this.initializeGraph();\n }\n\n onContextChanged(\n value: PlaitPluginElementContext<ForceAtlasElement, PlaitBoard>,\n previous: PlaitPluginElementContext<ForceAtlasElement, PlaitBoard>\n ) {}\n\n updateText(previousElement: ForceAtlasElement, currentElement: ForceAtlasElement) {}\n\n destroy(): void {\n super.destroy();\n }\n}\n","// Credits to perfect-arrows\n// https://github.com/steveruizok/perfect-arrows/blob/master/src/lib/utils.ts\n\nconst PI = Math.PI;\n\n/**\n * Modulate a value between two ranges.\n * @param value\n * @param rangeA from [low, high]\n * @param rangeB to [low, high]\n * @param clamp\n */\nexport function modulate(value: number, rangeA: number[], rangeB: number[], clamp = false) {\n const [fromLow, fromHigh] = rangeA;\n const [toLow, toHigh] = rangeB;\n const result = toLow + ((value - fromLow) / (fromHigh - fromLow)) * (toHigh - toLow);\n if (clamp === true) {\n if (toLow < toHigh) {\n if (result < toLow) {\n return toLow;\n }\n if (result > toHigh) {\n return toHigh;\n }\n } else {\n if (result > toLow) {\n return toLow;\n }\n if (result < toHigh) {\n return toHigh;\n }\n }\n }\n return result;\n}\n\n/**\n * Rotate a point around a center.\n * @param x The x-axis coordinate of the point.\n * @param y The y-axis coordinate of the point.\n * @param cx The x-axis coordinate of the point to rotate round.\n * @param cy The y-axis coordinate of the point to rotate round.\n * @param angle The distance (in radians) to rotate.\n */\nexport function rotatePoint(x: number, y: number, cx: number, cy: number, angle: number) {\n const s = Math.sin(angle);\n const c = Math.cos(angle);\n\n const px = x - cx;\n const py = y - cy;\n\n const nx = px * c - py * s;\n const ny = px * s + py * c;\n\n return [nx + cx, ny + cy];\n}\n\n/**\n * Get the distance between two points.\n * @param x0 The x-axis coordinate of the first point.\n * @param y0 The y-axis coordinate of the first point.\n * @param x1 The x-axis coordinate of the second point.\n * @param y1 The y-axis coordinate of the second point.\n */\nexport function getDistance(x0: number, y0: number, x1: number, y1: number) {\n return Math.hypot(y1 - y0, x1 - x0);\n}\n\n/**\n * Get an angle (radians) between two points.\n * @param x0 The x-axis coordinate of the first point.\n * @param y0 The y-axis coordinate of the first point.\n * @param x1 The x-axis coordinate of the second point.\n * @param y1 The y-axis coordinate of the second point.\n */\nexport function getAngle(x0: number, y0: number, x1: number, y1: number) {\n return Math.atan2(y1 - y0, x1 - x0);\n}\n\n/**\n * Move a point in an angle by a distance.\n * @param x0\n * @param y0\n * @param a angle (radians)\n * @param d distance\n */\nexport function projectPoint(x0: number, y0: number, a: number, d: number) {\n return [Math.cos(a) * d + x0, Math.sin(a) * d + y0];\n}\n\n/**\n * Get a point between two points.\n * @param x0 The x-axis coordinate of the first point.\n * @param y0 The y-axis coordinate of the first point.\n * @param x1 The x-axis coordinate of the second point.\n * @param y1 The y-axis coordinate of the second point.\n * @param d Normalized\n */\nexport function getPointBetween(x0: number, y0: number, x1: number, y1: number, d = 0.5) {\n return [x0 + (x1 - x0) * d, y0 + (y1 - y0) * d];\n}\n\n/**\n * Get the sector of an angle (e.g. quadrant, octant)\n * @param a The angle to check.\n * @param s The number of sectors to check.\n */\nexport function getSector(a: number, s = 8) {\n return Math.floor(s * (0.5 + ((a / (PI * 2)) % s)));\n}\n\n/**\n * Get a normal value representing how close two points are from being at a 45 degree angle.\n * @param x0 The x-axis coordinate of the first point.\n * @param y0 The y-axis coordinate of the first point.\n * @param x1 The x-axis coordinate of the second point.\n * @param y1 The y-axis coordinate of the second point.\n */\nexport function getAngliness(x0: number, y0: number, x1: number, y1: number) {\n return Math.abs((x1 - x0) / 2 / ((y1 - y0) / 2));\n}\n","// Credits to perfect-arrows\n// https://github.com/steveruizok/perfect-arrows/blob/master/src/lib/getArrow.ts\n\nimport { getAngle, getDistance, getAngliness, projectPoint, getPointBetween, getSector, rotatePoint, modulate } from './utils';\n\nexport type ArrowOptions = {\n bow?: number;\n stretchMin?: number;\n stretchMax?: number;\n stretch?: number;\n padStart?: number;\n padEnd?: number;\n flip?: boolean;\n straights?: boolean;\n};\n\n/**\n * getArrow\n * Get the points for a linking line between two points.\n * @description Draw an arrow between two points.\n * @param x0 The x position of the \"from\" point.\n * @param y0 The y position of the \"from\" point.\n * @param x1 The x position of the \"to\" point.\n * @param y1 The y position of the \"to\" point.\n * @param options Additional options for computing the line.\n * @returns [sx, sy, cx, cy, e1, e2, ae, as, ac]\n * @example\n * const arrow = getArrow(0, 0, 100, 200, {\n bow: 0\n stretch: .5\n stretchMin: 0\n stretchMax: 420\n padStart: 0\n padEnd: 0\n flip: false\n straights: true\n * })\n * \n * const [\n * startX, startY, \n * controlX, controlY, \n * endX, endY, \n * endAngle, \n * startAngle,\n * controlAngle\n * ] = arrow\n */\nexport default function getArrow(x0: number, y0: number, x1: number, y1: number, options: ArrowOptions = {} as ArrowOptions): number[] {\n const { bow = 0, stretch = 0.5, stretchMin = 0, stretchMax = 420, padStart = 0, padEnd = 0, flip = false, straights = true } = options;\n\n const angle = getAngle(x0, y0, x1, y1);\n const dist = getDistance(x0, y0, x1, y1);\n const angliness = getAngliness(x0, y0, x1, y1);\n\n // Step 0 ⤜⤏ Should the arrow be straight?\n\n if (\n dist < (padStart + padEnd) * 2 || // Too short\n (bow === 0 && stretch === 0) || // No bow, no stretch\n (straights && [0, 1, Infinity].includes(angliness)) // 45 degree angle\n ) {\n // ⤜⤏ Arrow is straight! Just pad start and end points.\n\n // Padding distances\n const ps = Math.max(0, Math.min(dist - padStart, padStart));\n const pe = Math.max(0, Math.min(dist - ps, padEnd));\n\n // Move start point toward end point\n let [px0, py0] = projectPoint(x0, y0, angle, ps);\n\n // Move end point toward start point\n let [px1, py1] = projectPoint(x1, y1, angle + Math.PI, pe);\n\n // Get midpoint between new points\n const [mx, my] = getPointBetween(px0, py0, px1, py1, 0.5);\n\n return [px0, py0, mx, my, px1, py1, angle, angle, angle];\n }\n\n // ⤜⤏ Arrow is an arc!\n\n // Is the arc clockwise or counterclockwise?\n let rot = (getSector(angle) % 2 === 0 ? 1 : -1) * (flip ? -1 : 1);\n\n // Calculate how much the line should \"bow\" away from center\n const arc = bow + modulate(dist, [stretchMin, stretchMax], [1, 0], true) * stretch;\n\n // Step 1 ⤜⤏ Find padded points.\n\n // Get midpoint.\n const [mx, my] = getPointBetween(x0, y0, x1, y1, 0.5);\n\n // Get control point.\n let [cx, cy] = getPointBetween(x0, y0, x1, y1, 0.5 - arc);\n\n // Rotate control point (clockwise or counterclockwise).\n [cx, cy] = rotatePoint(cx, cy, mx, my, (Math.PI / 2) * rot);\n\n // Get padded start point.\n const a0 = getAngle(x0, y0, cx, cy);\n const [px0, py0] = projectPoint(x0, y0, a0, padStart);\n\n // Get padded end point.\n const a1 = getAngle(x1, y1, cx, cy);\n const [px1, py1] = projectPoint(x1, y1, a1, padEnd);\n\n // Step 2 ⤜⤏ Find start and end angles.\n\n // Start angle\n const as = getAngle(cx, cy, x0, y0);\n\n // End angle\n const ae = getAngle(cx, cy, x1, y1);\n\n // Step 3 ⤜⤏ Find control point for padded points.\n\n // Get midpoint between padded start / end points.\n const [mx1, my1] = getPointBetween(px0, py0, px1, py1, 0.5);\n\n // Get control point for padded start / end points.\n let [cx1, cy1] = getPointBetween(px0, py0, px1, py1, 0.5 - arc);\n\n // Rotate control point (clockwise or counterclockwise).\n [cx1, cy1] = rotatePoint(cx1, cy1, mx1, my1, (Math.PI / 2) * rot);\n\n // Finally, average the two control points.\n let [cx2, cy2] = getPointBetween(cx, cy, cx1, cy1, 0.5);\n\n return [px0, py0, cx2, cy2, px1, py1, ae, as, angle];\n}\n","import { EdgeDirection, NodeStyles } from '../types';\nimport { NS, PlaitBoard, Point, createForeignObject, createG, createPath, drawCircle, normalizePoint } from '@plait/core';\nimport getArrow from '../../perfect-arrows/get-arrow';\nimport {\n ACTIVE_BACKGROUND_NODE_ALPHA,\n DEFAULT_ACTIVE_NODE_SIZE_MULTIPLIER,\n DEFAULT_ACTIVE_WAVE_NODE_SIZE_MULTIPLIER,\n DEFAULT_LINE_STYLES,\n DEFAULT_NODE_LABEL_FONT_SIZE,\n DEFAULT_NODE_LABEL_MARGIN_TOP,\n DEFAULT_NODE_SIZE,\n DEFAULT_NODE_STYLES,\n SECOND_DEPTH_NODE_ALPHA\n} from '../constants';\nimport { DEFAULT_STYLES } from '../../constants/default';\nimport { ForceAtlasNodeElement } from '../../interfaces';\n\nexport function drawNode(\n board: PlaitBoard,\n node: ForceAtlasNodeElement,\n point: Point,\n options: { iconG?: SVGGElement; isActive: boolean; isFirstDepth: boolean }\n) {\n const roughSVG = PlaitBoard.getRoughSVG(board);\n const nodeStyles: NodeStyles = {\n ...DEFAULT_NODE_STYLES,\n ...(node.styles || {})\n };\n let { x, y } = normalizePoint(point);\n let diameter = node.size ?? DEFAULT_NODE_SIZE;\n if (options.isActive) {\n diameter = diameter * DEFAULT_ACTIVE_NODE_SIZE_MULTIPLIER;\n }\n const nodeG = drawCircle(roughSVG, [x, y], diameter, nodeStyles);\n if (options.iconG) {\n nodeG.append(options.iconG);\n }\n const text = document.createElementNS(NS, 'text');\n text.textContent = node.label || '';\n text.setAttribute('text-anchor', `middle`);\n text.setAttribute('dominant-baseline', `hanging`);\n text.setAttribute('x', `${x}`);\n text.setAttribute('font-size', `${DEFAULT_NODE_LABEL_FONT_SIZE}px`);\n text.setAttribute('style', `user-select: none;`);\n if (options.isActive) {\n const waveDiameter = diameter * DEFAULT_ACTIVE_WAVE_NODE_SIZE_MULTIPLIER;\n const waveCircle = drawCircle(roughSVG, [x, y], waveDiameter, nodeStyles);\n waveCircle.setAttribute('opacity', ACTIVE_BACKGROUND_NODE_ALPHA.toString());\n nodeG.append(waveCircle);\n text.setAttribute('y', `${y + waveDiameter / 2 + DEFAULT_NODE_LABEL_MARGIN_TOP}`);\n } else {\n if (!options.isFirstDepth) {\n nodeG.setAttribute('opacity', SECOND_DEPTH_NODE_ALPHA.toString());\n }\n text.setAttribute('y', `${y + diameter / 2 + DEFAULT_NODE_LABEL_MARGIN_TOP}`);\n }\n nodeG.append(text);\n return nodeG;\n}\n\nexport function drawEdge(startPoint: Point, endPoint: Point, direction: EdgeDirection, isMutual: boolean) {\n const arrow = getArrow(startPoint[0], startPoint[1], endPoint[0], endPoint[1], {\n stretch: 0.4,\n flip: direction === EdgeDirection.NONE ? false : isMutual,\n padEnd: DEFAULT_NODE_SIZE / 2,\n padStart: DEFAULT_NODE_SIZE / 2\n });\n const [sx, sy, cx, cy, ex, ey, ae, as, ec] = arrow;\n const g = createG();\n const path = createPath();\n path.setAttribute('d', `M${sx},${sy} Q${cx},${cy} ${ex},${ey}`);\n path.setAttribute('fill', 'none');\n path.setAttribute('stroke', DEFAULT_LINE_STYLES.color[direction]);\n g.append(path);\n return {\n g,\n path\n };\n}\n\nexport function drawParticle(board: PlaitBoard, startPoint: Point, direction: EdgeDirection) {\n const roughSVG = PlaitBoard.getRoughSVG(board);\n const pointG = drawCircle(roughSVG, [0, 0], 5, {\n ...DEFAULT_STYLES,\n strokeWidth: 0,\n fill: DEFAULT_LINE_STYLES.color[direction]\n });\n pointG.setAttribute('transform', `translate(${startPoint[0]}, ${startPoint[1]})`);\n return pointG;\n}\n","import { PlaitBoard, createG } from '@plait/core';\nimport { Generator } from '@plait/common';\nimport { ForceAtlasEdgeElement } from '../../interfaces';\nimport { EdgeDirection, EdgeGeneratorData } from '../types';\nimport { drawEdge, drawParticle } from '../utils/draw';\nimport { playEdgeParticleAnimate } from '../utils/edge';\n\nexport class ForceAtlasEdgeGenerator extends Generator<ForceAtlasEdgeElement, EdgeGeneratorData> {\n static key = 'force-atlas-edge';\n particleAnimation?: { stop: () => void; start: () => void };\n constructor(board: PlaitBoard) {\n super(board);\n }\n\n canDraw(element: ForceAtlasEdgeElement): boolean {\n return true;\n }\n\n draw(element: ForceAtlasEdgeElement, data: EdgeGeneratorData) {\n const edgeG = createG();\n const edgeElement = drawEdge(data.startPoint, data.endPoint, data.direction, data.isSourceActive && data.isTargetActive);\n edgeG.append(edgeElement.g);\n if (data.direction !== EdgeDirection.NONE) {\n const particle = drawParticle(this.board, data.startPoint, data.direction);\n edgeElement.g.append(particle);\n this.particleAnimation = playEdgeParticleAnimate(edgeElement.path, particle);\n }\n return edgeG;\n }\n\n destroy(): void {\n super.destroy();\n this.particleAnimation?.stop();\n }\n}\n","import { PlaitBoard, PlaitElement, PlaitNode, getSelectedElements } from '@plait/core';\nimport { ForceAtlasEdgeElement, ForceAtlasElement, ForceAtlasNodeElement } from '../../interfaces';\nimport { EdgeDirection, EdgeGeneratorData } from '../types';\nimport { PlaitCommonElementRef, animate, linear } from '@plait/common';\nimport { ForceAtlasEdgeGenerator } from '../generators/edge.generator';\nimport { getIsNodeActive, getNodeById } from './node';\n\nexport function getEdges(forceAtlasElement: ForceAtlasElement, andCallBack?: (edge: ForceAtlasEdgeElement) => boolean) {\n return forceAtlasElement.children?.filter(\n f => ForceAtlasElement.isForceAtlasEdgeElement(f) && (andCallBack?.(f) ?? true)\n ) as ForceAtlasEdgeElement[];\n}\n\nexport function getEdgeById(id: string, forceAtlasElement: ForceAtlasElement) {\n const edge = getEdges(forceAtlasElement, e => e.id === id)?.[0];\n if (!edge) {\n throw new Error('can not find edge.');\n }\n return edge;\n}\n\nexport function getEdgesInSourceOrTarget(id: string, forceAtlasElement: ForceAtlasElement) {\n const edges = getEdges(forceAtlasElement, edge => edge.source === id || edge.target === id);\n return edges;\n}\n\nexport function getEdgeGenerator(edge: ForceAtlasEdgeElement) {\n const edgeRef = PlaitElement.getElementRef<PlaitCommonElementRef>(edge);\n return edgeRef.getGenerator<ForceAtlasEdgeGenerator>(ForceAtlasEdgeGenerator.key);\n}\n\nexport function getEdgeDirection(isSourceActive: boolean, isTargetActive: boolean) {\n if (isSourceActive) {\n return EdgeDirection.OUT;\n } else if (isTargetActive) {\n return EdgeDirection.IN;\n }\n return EdgeDirection.NONE;\n}\n\nexport function getEdgeGeneratorData(edge: ForceAtlasEdgeElement, board: PlaitBoard): EdgeGeneratorData {\n const forceAtlasElement = PlaitNode.parent(board, PlaitBoard.findPath(board, edge)) as ForceAtlasElement;\n const sourceNode = getNodeById(edge.source, forceAtlasElement);\n const targetNode = getNodeById(edge.target, forceAtlasElement);\n if (!sourceNode?.points || !targetNode?.points) {\n throw new Error(\"Source or target node doesn't have points\");\n }\n const startPoint = sourceNode.points[0];\n const endPoint = targetNode.points[0];\n const selectElements = getSelectedElements(board) as ForceAtlasNodeElement[];\n const isSourceActive = getIsNodeActive(sourceNode.id, selectElements);\n const isTargetActive = getIsNodeActive(targetNode.id, selectElements);\n const direction = getEdgeDirection(isSourceActive, isTargetActive);\n return {\n startPoint,\n endPoint,\n direction,\n isSourceActive,\n isTargetActive\n };\n}\n\nexport function playEdgeParticleAnimate(path: SVGPathElement, pointG: SVGGElement) {\n const pathLength = path.getTotalLength();\n let anim = animate(\n (t: number) => {\n const point = path.getPointAtLength(t * pathLength);\n pointG.setAttribute('transform', `translate(${point.x}, ${point.y})`);\n },\n 1000,\n linear,\n () => {\n anim = playEdgeParticleAnimate(path, pointG);\n }\n );\n return {\n stop: () => {\n anim.stop();\n },\n start: () => {\n anim.start();\n }\n };\n}\n","import { PlaitElement, Point, RectangleClient, normalizePoint } from '@plait/core';\nimport { ForceAtlasElement, ForceAtlasNodeElement } from '../../interfaces';\nimport { getEdges, getEdgesInSourceOrTarget } from './edge';\nimport { PlaitCommonElementRef } from '@plait/common';\nimport { ForceAtlasNodeGenerator } from '../generators/node.generator';\nimport { DEFAULT_NODE_ICON_COLOR, NODE_ICON_FONT_SIZE } from '../constants';\n\nexport function getNodes(forceAtlasElement: ForceAtlasElement, andBack?: (edge: ForceAtlasNodeElement) => boolean) {\n return forceAtlasElement.children?.filter(\n f => ForceAtlasElement.isForceAtlasNodeElement(f) && (andBack?.(f) ?? true)\n ) as ForceAtlasNodeElement[];\n}\n\nexport function getNodeById(id: string, forceAtlasElement: ForceAtlasElement) {\n const node = getNodes(forceAtlasElement, node => node.id === id)?.[0];\n if (!node) {\n throw new Error('can not find node.');\n }\n return node;\n}\n\nexport function getIsNodeActive(id: string, selectElements: ForceAtlasNodeElement[]) {\n return selectElements.some(node => node.id === id);\n}\n\nexport function isHitNode(node: ForceAtlasNodeElement, point: [Point, Point]) {\n const { x, y } = normalizePoint(node.points![0]);\n const size = node.size!;\n const hitFlowNode = RectangleClient.isHit(RectangleClient.getRectangleByPoints(point), {\n x: x - size / 2,\n y: y - size / 2,\n width: size,\n height: size\n });\n return hitFlowNode;\n}\n\nexport function getAssociatedNodesById(id: string, forceAtlasElement: ForceAtlasElement) {\n const edges = getEdgesInSourceOrTarget(id, forceAtlasElement);\n const nodes: ForceAtlasNodeElement[] = [];\n edges.forEach(edge => {\n nodes.push(getNodeById(edge.source, forceAtlasElement));\n nodes.push(getNodeById(edge.target, forceAtlasElement));\n });\n return nodes;\n}\n\nexport function getNodeGenerator(node: ForceAtlasNodeElement) {\n const edgeRef = PlaitElement.getElementRef<PlaitCommonElementRef>(node);\n return edgeRef.getGenerator<ForceAtlasNodeGenerator>(ForceAtlasNodeGenerator.key);\n}\n\nexport function isFirstDepthNode(currentNodeId: string, activeNodeId: string, forceAtlasElement: ForceAtlasElement) {\n const edges = getEdges(forceAtlasElement);\n return edges.some(\n s => (s.source === activeNodeId && s.target === currentNodeId) || (s.target === activeNodeId && s.source === currentNodeId)\n );\n}\n\nexport function getNodeIcon(node: ForceAtlasNodeElement) {\n const iconItem = typeof node.icon === 'object' && node.icon.name ? node.icon : null;\n return {\n name: iconItem ? iconItem.name : (node.icon as string),\n fontSize: (iconItem && iconItem.fontSize) || NODE_ICON_FONT_SIZE,\n color: (iconItem && iconItem.color) || DEFAULT_NODE_ICON_COLOR\n };\n}\n","import { PlaitBoard, createForeignObject, createG, normalizePoint } from '@plait/core';\nimport { Generator, RenderComponentRef } from '@plait/common';\nimport { ForceAtlasNodeElement } from '../../interfaces';\nimport { drawNode } from '../utils/draw';\nimport { NodeGeneratorData } from '../types';\nimport { ForceAtlasNodeIconBoard, NodeIconProps } from '../with-node-icon';\nimport { ACTIVE_NODE_ICON_CLASS_NAME, ACTIVE_NODE_ICON_FONT_SIZE, NODE_ICON_CLASS_NAME } from '../constants';\nimport { getNodeIcon } from '../utils/node';\n\nexport class ForceAtlasNodeGenerator extends Generator<ForceAtlasNodeElement, NodeGeneratorData> {\n static key = 'force-atlas-node';\n\n constructor(board: PlaitBoard) {\n super(board);\n }\n\n canDraw(element: ForceAtlasNodeElement): boolean {\n return true;\n }\n\n draw(element: ForceAtlasNodeElement, data: NodeGeneratorData) {\n const iconRef = this.drawIcon(element, data);\n return drawNode(this.board, element, element?.points?.[0] || [0, 0], { ...data, iconG: iconRef.iconG });\n }\n\n drawIcon(element: ForceAtlasNodeElement, data: NodeGeneratorData) {\n const iconG = createG();\n let { x, y } = normalizePoint(element.points?.[0] || [0, 0]);\n const size = element.size!;\n const foreignObject = createForeignObject(x - size / 2, y - size / 2, size, size);\n iconG.append(foreignObject);\n const container = document.createElement('div');\n container.classList.add(NODE_ICON_CLASS_NAME);\n if (data.isActive) {\n container.classList.add(ACTIVE_NODE_ICON_CLASS_NAME);\n }\n foreignObject.append(container);\n const nodeIcon = getNodeIcon(element);\n const props: NodeIconProps = {\n iconItem: {\n name: nodeIcon.name,\n fontSize: data.isActive ? ACTIVE_NODE_ICON_FONT_SIZE : nodeIcon.fontSize,\n color: nodeIcon.color\n },\n board: this.board,\n element: element\n };\n const ref = ((this.board as unknown) as ForceAtlasNodeIconBoard).renderNodeIcon(container, props);\n return { ref, iconG };\n }\n}\n","import { CommonElementFlavour } from '@plait/common';\nimport {\n OnContextChanged,\n PlaitBoard,\n PlaitNode,\n PlaitPluginElementContext,\n cacheSelectedElements,\n getSelectedElements\n} from '@plait/core';\nimport Graph from 'graphology';\nimport { ForceAtlasElement, ForceAtlasNodeElement } from '../interfaces';\nimport { ForceAtlasNodeGenerator } from './generators/node.generator';\nimport { getEdgeGenerator, getEdgeGeneratorData, getEdgesInSourceOrTarget } from './utils/edge';\nimport { getAssociatedNodesById, getNodeGenerator, isFirstDepthNode } from './utils/node';\n\nexport class ForceAtlasNodeFlavour extends CommonElementFlavour<ForceAtlasNodeElement, PlaitBoard>\n implements OnContextChanged<ForceAtlasNodeElement, PlaitBoard> {\n graph!: Graph<Node>;\n nodeGenerator!: ForceAtlasNodeGenerator;\n\n constructor() {\n super();\n }\n\n initializeGenerator() {\n this.nodeGenerator = new ForceAtlasNodeGenerator(this.board);\n this.getRef().addGenerator(ForceAtlasNodeGenerator.key, this.nodeGenerator);\n }\n\n initialize(): void {\n super.initialize();\n this.initializeGenerator();\n const parent = PlaitNode.parent(this.board, PlaitBoard.findPath(this.board, this.element)) as ForceAtlasElement;\n const selectElements = getSelectedElements(this.board);\n const activeNodeId = selectElements[0]?.id;\n const isActive = activeNodeId === this.element.id;\n this.nodeGenerator.processDrawing(this.element, isActive ? PlaitBoard.getElementActiveHost(this.board) : this.getElementG(), {\n isActive,\n isFirstDepth: isFirstDepthNode(this.element.id, activeNodeId, parent)\n });\n }\n\n onContextChanged(\n value: PlaitPluginElementContext<ForceAtlasNodeElement, PlaitBoard>,\n previous: PlaitPluginElementContext<ForceAtlasNodeElement, PlaitBoard>\n ) {\n if (value !== previous && value.selected !== previous.selected) {\n const parent = value.parent as any;\n if (value.selected) {\n cacheSelectedElements(this.board, [value.element]);\n }\n const selectElements = getSelectedElements(this.board);\n const associatedNodes = getAssociatedNodesById(value.element.id, parent);\n associatedNodes.forEach(node => {\n const nodeGenerator = getNodeGenerator(node);\n nodeGenerator.destroy();\n nodeGenerator.processDrawing(node, this.getElementG(), {\n isActive: selectElements?.[0]?.id === node.id,\n isFirstDepth: selectElements.length > 0 && isFirstDepthNode(node.id, selectElements[0].id, parent)\n });\n });\n\n const associatedEdges = getEdgesInSourceOrTarget(value.element.id, parent);\n associatedEdges.forEach(edge => {\n const edgeGenerator = getEdgeGenerator(edge);\n edgeGenerator.destroy();\n edgeGenerator.processDrawing(edge, PlaitBoard.getElementLowerHost(this.board), getEdgeGeneratorData(edge, this.board));\n });\n }\n }\n\n updateText(previousElement: ForceAtlasNodeElement, currentElement: ForceAtlasNodeElement) {}\n\n destroy(): void {\n super.destroy();\n }\n}\n","import { CommonElementFlavour } from '@plait/common';\nimport { OnContextChanged, PlaitBoard, PlaitPluginElementContext } from '@plait/core';\nimport Graph from 'graphology';\nimport { ForceAtlasEdgeElement } from '../interfaces';\nimport { ForceAtlasEdgeGenerator } from './generators/edge.generator';\nimport { getEdgeGeneratorData } from './utils/edge';\n\nexport class ForceAtlasEdgeFlavour extends CommonElementFlavour<ForceAtlasEdgeElement, PlaitBoard>\n implements OnContextChanged<ForceAtlasEdgeElement, PlaitBoard> {\n graph!: Graph<Node>;\n edgeGenerator!: ForceAtlasEdgeGenerator;\n\n constructor() {\n super();\n }\n\n initializeGenerator() {\n this.edgeGenerator = new ForceAtlasEdgeGenerator(this.board);\n this.getRef().addGenerator(ForceAtlasEdgeGenerator.key, this.edgeGenerator);\n }\n\n initialize(): void {\n super.initialize();\n this.initializeGenerator();\n this.edgeGenerator.processDrawing(\n this.element,\n PlaitBoard.getElementLowerHost(this.board),\n getEdgeGeneratorData(this.element, this.board)\n );\n }\n\n onContextChanged(\n value: PlaitPluginElementContext<ForceAtlasEdgeElement, PlaitBoard>,\n previous: PlaitPluginElementContext<ForceAtlasEdgeElement, PlaitBoard>\n ) {}\n\n updateText(previousElement: ForceAtlasEdgeElement, currentElement: ForceAtlasEdgeElement) {}\n\n destroy(): void {\n super.destroy();\n this.edgeGenerator.destroy();\n }\n}\n","import { PlaitBoard } from '@plait/core';\nimport { ForceAtlasNodeElement } from '../interfaces/element';\nimport { RenderComponentRef } from '@plait/common';\nimport { NodeIconItem } from './types';\n\nexport interface ForceAtlasNodeIconBoard {\n renderNodeIcon: (container: Element | DocumentFragment, props: NodeIconProps) => RenderComponentRef<NodeIconProps>;\n}\n\nexport const withNodeIcon = <T extends PlaitBoard = PlaitBoard>(board: T) => {\n const newBoard = board as T & ForceAtlasNodeIconBoard;\n\n newBoard.renderNodeIcon = (container: Element | DocumentFragment, props: NodeIconProps) => {\n throw new Error('No implementation for renderLabeIcon method.');\n };\n return newBoard;\n};\n\nexport interface NodeIconProps {\n board: PlaitBoard;\n iconItem: NodeIconItem;\n element: ForceAtlasNodeElement;\n}\n","import {\n PlaitBoard,\n PlaitElement,\n PlaitOptionsBoard,\n PlaitPluginElementContext,\n PlaitPluginKey,\n Point,\n RectangleClient,\n Selection,\n WithSelectionPluginOptions,\n setSelectionOptions\n} from '@plait/core';\nimport { ForceAtlasFlavour } from './force-atlas.flavour';\nimport { ForceAtlasNodeFlavour } from './node.flavour';\nimport { ForceAtlasEdgeFlavour } from './edge.flavour';\nimport { ForceAtlasElement } from '../interfaces';\nimport { isHitNode } from './utils/node';\nimport { withNodeIcon } from './with-node-icon';\n\nexport const withForceAtlas = (board: PlaitBoard) => {\n const { drawElement, getRectangle, isRectangleHit, isHit, isInsidePoint, isMovable, isAlign, getRelatedFragment } = board;\n\n board.drawElement = (context: PlaitPluginElementContext) => {\n if (ForceAtlasElement.isForceAtlas(context.element)) {\n return ForceAtlasFlavour;\n } else if (ForceAtlasElement.isForceAtlasNodeElement(context.element)) {\n return ForceAtlasNodeFlavour;\n } else if (ForceAtlasElement.isForceAtlasEdgeElement(context.element)) {\n return ForceAtlasEdgeFlavour;\n }\n return drawElement(context);\n };\n\n board.getRectangle = (element: PlaitElement) => {\n if (element.type === 'force-atlas') {\n return {\n width: 0,\n height: 0,\n x: 0,\n y: 0\n };\n } else if (ForceAtlasElement.isForceAtlasNodeElement(element)) {\n return RectangleClient.getRectangleByPoints(element.points || []);\n } else if (ForceAtlasElement.isForceAtlasEdgeElement(element)) {\n return {\n width: 0,\n height: 0,\n x: 0,\n y: 0\n };\n }\n return getRectangle(element);\n };\n\n board.isRectangleHit = (element: PlaitElement, selection: Selection) => {\n return isRectangleHit(element, selection);\n };\n board.isRectangleHit = (element, range) => {\n if (ForceAtlasElement.isForceAtlasNodeElement(element)) {\n return isHitNode(element, [range.anchor, range.focus]);\n }\n return isRectangleHit(element, range);\n };\n\n board.isHit = (element, point) => {\n if (ForceAtlasElement.isForceAtlasNodeElement(element)) {\n return isHitNode(element, [point, point]);\n }\n return isHit(element, point);\n };\n\n board.isInsidePoint = (element: PlaitElement, point: Point) => {\n return isInsidePoint(element, point);\n };\n\n board.isMovable = element => {\n if (ForceAtlasElement.isForceAtlasNodeElement(element)) {\n return true;\n }\n return isMovable(element);\n };\n\n setSelectionOptions(board, { isMultipleSelection: false });\n\n return withNodeIcon(board);\n};\n","import { PlaitBoard } from '@plait/core';\nimport { ForceAtlasNodeElement } from '../../interfaces/element';\nimport { DEFAULT_NODE_ICON_COLOR, NODE_ICON_CLASS_NAME, NODE_ICON_FONT_SIZE } from '../constants';\nimport { NodeIconItem } from '../types';\n\nexport abstract class ForceAtlasNodeIconBaseComponent {\n iconItem!: NodeIconItem;\n\n board!: PlaitBoard;\n\n element!: ForceAtlasNodeElement;\n\n abstract nativeElement(): HTMLElement;\n\n initialize() {\n if (!this.iconItem.fontSize) {\n this.iconItem.fontSize = NODE_ICON_FONT_SIZE;\n }\n if (!this.iconItem.color) {\n this.iconItem.color = DEFAULT_NODE_ICON_COLOR;\n }\n this.nativeElement().style.fontSize = `${this.iconItem.fontSize}px`;\n this.nativeElement().style.color = `${this.iconItem.color}`;\n this.nativeElement().classList.add(NODE_ICON_CLASS_NAME);\n }\n}\n","/*\n * Public API Surface of utils\n */\n\nexport * from './force-atlas/constants';\nexport * from './force-atlas/types';\nexport * from './force-atlas/with-force-atlas';\nexport * from './force-atlas/with-node-icon';\nexport * from './interfaces/index';\nexport * from './force-atlas/core/node-icon-base.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plait-graph-viz.mjs","sources":["../../../packages/graph-viz/src/constants/default.ts","../../../packages/graph-viz/src/force-atlas/types.ts","../../../packages/graph-viz/src/force-atlas/constants.ts","../../../packages/graph-viz/src/interfaces/element.ts","../../../packages/graph-viz/src/force-atlas/force-atlas.flavour.ts","../../../packages/graph-viz/src/perfect-arrows/utils.ts","../../../packages/graph-viz/src/perfect-arrows/get-arrow.ts","../../../packages/graph-viz/src/force-atlas/utils/draw.ts","../../../packages/graph-viz/src/force-atlas/generators/edge.generator.ts","../../../packages/graph-viz/src/force-atlas/utils/edge.ts","../../../packages/graph-viz/src/force-atlas/utils/node.ts","../../../packages/graph-viz/src/force-atlas/generators/node.generator.ts","../../../packages/graph-viz/src/force-atlas/node.flavour.ts","../../../packages/graph-viz/src/force-atlas/edge.flavour.ts","../../../packages/graph-viz/src/force-atlas/with-node-icon.ts","../../../packages/graph-viz/src/force-atlas/with-force-atlas.ts","../../../packages/graph-viz/src/force-atlas/core/node-icon-base.component.ts","../../../packages/graph-viz/src/public-api.ts","../../../packages/graph-viz/src/plait-graph-viz.ts"],"sourcesContent":["import { Options } from 'roughjs/bin/core';\n\nexport const DEFAULT_STYLES: Options = {\n fillStyle: 'solid',\n strokeWidth: 1\n};\n","import { GeneratorExtraData } from '@plait/common';\nimport { Point } from '@plait/core';\n\nexport enum EdgeDirection {\n IN,\n OUT,\n NONE\n}\n\nexport interface NodeStyles {\n stroke?: string;\n strokeWidth?: number;\n fill?: string;\n fillStyle?: string;\n activeStroke?: string;\n activeFill?: string;\n borderRadius?: number;\n hoverStroke?: string;\n}\n\nexport interface EdgeGeneratorData extends GeneratorExtraData {\n startPoint: Point;\n endPoint: Point;\n isSourceActive: boolean;\n isTargetActive: boolean;\n direction: EdgeDirection;\n isTargetSelf?: boolean;\n}\n\nexport interface NodeGeneratorData extends GeneratorExtraData {\n isActive: boolean;\n isFirstDepth: boolean;\n}\n\nexport interface NodeIconItem {\n name: string;\n fontSize?: number;\n color?: string;\n}\n","import { Options } from 'roughjs/bin/core';\nimport { DEFAULT_STYLES } from '../constants/default';\nimport { EdgeDirection } from './types';\n\nexport const DEFAULT_EDGE_STYLES: Options = {\n ...DEFAULT_STYLES,\n stroke: '#ddd'\n};\n\nexport const DEFAULT_NODE_SIZE = 30;\n\nexport const DEFAULT_ACTIVE_NODE_SIZE_MULTIPLIER = 1.2;\n\nexport const DEFAULT_ACTIVE_WAVE_NODE_SIZE_MULTIPLIER = 1.5;\n\nexport const DEFAULT_NODE_LABEL_MARGIN_TOP = 4;\n\nexport const DEFAULT_NODE_LABEL_FONT_SIZE = 12;\n\nexport const DEFAULT_NODE_LABEL_WIDTH = 150;\n\nexport const DEFAULT_NODE_LABEL_HEIGHT = 22;\n\nexport const DEFAULT_NODE_LABEL_STYLE = `user-select:none;max-width:${DEFAULT_NODE_LABEL_WIDTH}px;text-align:center;line-height:${DEFAULT_NODE_LABEL_HEIGHT}px;font-size:${DEFAULT_NODE_LABEL_FONT_SIZE}px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;`;\n\nexport const NODE_LABEL_CLASS_NAME = 'force-atlas-node-label';\n\nexport const SECOND_DEPTH_NODE_ALPHA = 0.5;\n\nexport const SECOND_DEPTH_LINE_ALPHA = 0.5;\n\nexport const ACTIVE_BACKGROUND_NODE_ALPHA = 0.1;\n\nexport const NODE_ICON_CLASS_NAME = 'force-atlas-node-icon';\n\nexport const ACTIVE_NODE_ICON_CLASS_NAME = 'force-atlas-node-icon-active';\n\nexport const NODE_ICON_FONT_SIZE = 16;\n\nexport const ACTIVE_NODE_ICON_FONT_SIZE = 18;\n\nexport const DEFAULT_NODE_BACKGROUND_COLOR = '#9c9cfb';\n\nexport const DEFAULT_NODE_ICON_COLOR = '#fff';\n\nexport const DEFAULT_NODE_STYLES: Options = {\n ...DEFAULT_STYLES,\n fill: DEFAULT_NODE_BACKGROUND_COLOR,\n strokeWidth: 0\n};\n\nexport const DEFAULT_NODE_SCALING_RATIO = 20;\n\nexport const DEFAULT_LINE_STYLES = {\n color: {\n [EdgeDirection.IN]: '#73D897',\n [EdgeDirection.OUT]: '#6698FF',\n [EdgeDirection.NONE]: `#ddd`\n }\n};\n","import { PlaitElement } from '@plait/core';\nimport { NodeIconItem } from '../force-atlas/types';\nexport interface ForceAtlasNodeElement extends PlaitElement {\n label: string;\n icon: string | NodeIconItem;\n size?: number;\n isActive?: boolean;\n}\n\nexport interface ForceAtlasEdgeElement extends PlaitElement {\n source: string;\n target: string;\n}\n\nexport interface ForceAtlasElement extends PlaitElement {\n children: (ForceAtlasNodeElement | ForceAtlasEdgeElement)[];\n}\n\nexport const ForceAtlasElement = {\n isForceAtlas: (value: any) => {\n return value?.type === 'force-atlas';\n },\n isForceAtlasNodeElement: (value: any): value is ForceAtlasNodeElement => {\n return value && value.label && value.icon;\n },\n isForceAtlasEdgeElement: (value: any): value is ForceAtlasEdgeElement => {\n return value && value.source && value.target;\n }\n};\n","import { CommonElementFlavour } from '@plait/common';\nimport { OnContextChanged, PlaitBoard, PlaitPluginElementContext, cacheSelectedElements } from '@plait/core';\nimport Graph from 'graphology';\nimport circular from 'graphology-layout/circular';\nimport forceAtlas2 from 'graphology-layout-forceatlas2';\nimport { ForceAtlasElement, ForceAtlasNodeElement } from '../interfaces';\nimport { DEFAULT_NODE_SCALING_RATIO, DEFAULT_NODE_SIZE } from './constants';\n\nexport class ForceAtlasFlavour extends CommonElementFlavour<ForceAtlasElement, PlaitBoard>\n implements OnContextChanged<ForceAtlasElement, PlaitBoard> {\n graph!: Graph<ForceAtlasNodeElement>;\n\n constructor() {\n super();\n }\n\n initializeGraph() {\n this.graph = new Graph<ForceAtlasNodeElement>();\n this.element.children?.forEach(child => {\n if (ForceAtlasElement.isForceAtlasNodeElement(child)) {\n if (typeof child?.size === 'undefined') {\n child.size = DEFAULT_NODE_SIZE;\n }\n if (child.isActive) {\n cacheSelectedElements(this.board, [child]);\n }\n this.graph.addNode(child.id, child);\n } else if (ForceAtlasElement.isForceAtlasEdgeElement(child)) {\n this.graph.addEdge(child.source, child.target);\n }\n });\n circular.assign(this.graph);\n const settings = forceAtlas2.inferSettings(this.graph);\n settings.strongGravityMode = false;\n settings.linLogMode = true;\n settings.gravity = 2;\n settings.adjustSizes = true;\n settings.scalingRatio = DEFAULT_NODE_SCALING_RATIO;\n const positions = forceAtlas2(this.graph, { iterations: 1000, settings });\n this.element.children?.forEach(child => {\n if (ForceAtlasElement.isForceAtlasNodeElement(child)) {\n const pos = positions[child.id];\n child.points = [[pos.x, pos.y]];\n }\n });\n }\n\n initialize(): void {\n super.initialize();\n this.initializeGraph();\n }\n\n onContextChanged(\n value: PlaitPluginElementContext<ForceAtlasElement, PlaitBoard>,\n previous: PlaitPluginElementContext<ForceAtlasElement, PlaitBoard>\n ) {}\n\n updateText(previousElement: ForceAtlasElement, currentElement: ForceAtlasElement) {}\n\n destroy(): void {\n super.destroy();\n }\n}\n","// Credits to perfect-arrows\n// https://github.com/steveruizok/perfect-arrows/blob/master/src/lib/utils.ts\n\nconst PI = Math.PI;\n\n/**\n * Modulate a value between two ranges.\n * @param value\n * @param rangeA from [low, high]\n * @param rangeB to [low, high]\n * @param clamp\n */\nexport function modulate(value: number, rangeA: number[], rangeB: number[], clamp = false) {\n const [fromLow, fromHigh] = rangeA;\n const [toLow, toHigh] = rangeB;\n const result = toLow + ((value - fromLow) / (fromHigh - fromLow)) * (toHigh - toLow);\n if (clamp === true) {\n if (toLow < toHigh) {\n if (result < toLow) {\n return toLow;\n }\n if (result > toHigh) {\n return toHigh;\n }\n } else {\n if (result > toLow) {\n return toLow;\n }\n if (result < toHigh) {\n return toHigh;\n }\n }\n }\n return result;\n}\n\n/**\n * Rotate a point around a center.\n * @param x The x-axis coordinate of the point.\n * @param y The y-axis coordinate of the point.\n * @param cx The x-axis coordinate of the point to rotate round.\n * @param cy The y-axis coordinate of the point to rotate round.\n * @param angle The distance (in radians) to rotate.\n */\nexport function rotatePoint(x: number, y: number, cx: number, cy: number, angle: number) {\n const s = Math.sin(angle);\n const c = Math.cos(angle);\n\n const px = x - cx;\n const py = y - cy;\n\n const nx = px * c - py * s;\n const ny = px * s + py * c;\n\n return [nx + cx, ny + cy];\n}\n\n/**\n * Get the distance between two points.\n * @param x0 The x-axis coordinate of the first point.\n * @param y0 The y-axis coordinate of the first point.\n * @param x1 The x-axis coordinate of the second point.\n * @param y1 The y-axis coordinate of the second point.\n */\nexport function getDistance(x0: number, y0: number, x1: number, y1: number) {\n return Math.hypot(y1 - y0, x1 - x0);\n}\n\n/**\n * Get an angle (radians) between two points.\n * @param x0 The x-axis coordinate of the first point.\n * @param y0 The y-axis coordinate of the first point.\n * @param x1 The x-axis coordinate of the second point.\n * @param y1 The y-axis coordinate of the second point.\n */\nexport function getAngle(x0: number, y0: number, x1: number, y1: number) {\n return Math.atan2(y1 - y0, x1 - x0);\n}\n\n/**\n * Move a point in an angle by a distance.\n * @param x0\n * @param y0\n * @param a angle (radians)\n * @param d distance\n */\nexport function projectPoint(x0: number, y0: number, a: number, d: number) {\n return [Math.cos(a) * d + x0, Math.sin(a) * d + y0];\n}\n\n/**\n * Get a point between two points.\n * @param x0 The x-axis coordinate of the first point.\n * @param y0 The y-axis coordinate of the first point.\n * @param x1 The x-axis coordinate of the second point.\n * @param y1 The y-axis coordinate of the second point.\n * @param d Normalized\n */\nexport function getPointBetween(x0: number, y0: number, x1: number, y1: number, d = 0.5) {\n return [x0 + (x1 - x0) * d, y0 + (y1 - y0) * d];\n}\n\n/**\n * Get the sector of an angle (e.g. quadrant, octant)\n * @param a The angle to check.\n * @param s The number of sectors to check.\n */\nexport function getSector(a: number, s = 8) {\n return Math.floor(s * (0.5 + ((a / (PI * 2)) % s)));\n}\n\n/**\n * Get a normal value representing how close two points are from being at a 45 degree angle.\n * @param x0 The x-axis coordinate of the first point.\n * @param y0 The y-axis coordinate of the first point.\n * @param x1 The x-axis coordinate of the second point.\n * @param y1 The y-axis coordinate of the second point.\n */\nexport function getAngliness(x0: number, y0: number, x1: number, y1: number) {\n return Math.abs((x1 - x0) / 2 / ((y1 - y0) / 2));\n}\n","// Credits to perfect-arrows\n// https://github.com/steveruizok/perfect-arrows/blob/master/src/lib/getArrow.ts\n\nimport { getAngle, getDistance, getAngliness, projectPoint, getPointBetween, getSector, rotatePoint, modulate } from './utils';\n\nexport type ArrowOptions = {\n bow?: number;\n stretchMin?: number;\n stretchMax?: number;\n stretch?: number;\n padStart?: number;\n padEnd?: number;\n flip?: boolean;\n straights?: boolean;\n};\n\n/**\n * getArrow\n * Get the points for a linking line between two points.\n * @description Draw an arrow between two points.\n * @param x0 The x position of the \"from\" point.\n * @param y0 The y position of the \"from\" point.\n * @param x1 The x position of the \"to\" point.\n * @param y1 The y position of the \"to\" point.\n * @param options Additional options for computing the line.\n * @returns [sx, sy, cx, cy, e1, e2, ae, as, ac]\n * @example\n * const arrow = getArrow(0, 0, 100, 200, {\n bow: 0\n stretch: .5\n stretchMin: 0\n stretchMax: 420\n padStart: 0\n padEnd: 0\n flip: false\n straights: true\n * })\n * \n * const [\n * startX, startY, \n * controlX, controlY, \n * endX, endY, \n * endAngle, \n * startAngle,\n * controlAngle\n * ] = arrow\n */\nexport default function getArrow(x0: number, y0: number, x1: number, y1: number, options: ArrowOptions = {} as ArrowOptions): number[] {\n const { bow = 0, stretch = 0.5, stretchMin = 0, stretchMax = 420, padStart = 0, padEnd = 0, flip = false, straights = true } = options;\n\n const angle = getAngle(x0, y0, x1, y1);\n const dist = getDistance(x0, y0, x1, y1);\n const angliness = getAngliness(x0, y0, x1, y1);\n\n // Step 0 ⤜⤏ Should the arrow be straight?\n\n if (\n dist < (padStart + padEnd) * 2 || // Too short\n (bow === 0 && stretch === 0) || // No bow, no stretch\n (straights && [0, 1, Infinity].includes(angliness)) // 45 degree angle\n ) {\n // ⤜⤏ Arrow is straight! Just pad start and end points.\n\n // Padding distances\n const ps = Math.max(0, Math.min(dist - padStart, padStart));\n const pe = Math.max(0, Math.min(dist - ps, padEnd));\n\n // Move start point toward end point\n let [px0, py0] = projectPoint(x0, y0, angle, ps);\n\n // Move end point toward start point\n let [px1, py1] = projectPoint(x1, y1, angle + Math.PI, pe);\n\n // Get midpoint between new points\n const [mx, my] = getPointBetween(px0, py0, px1, py1, 0.5);\n\n return [px0, py0, mx, my, px1, py1, angle, angle, angle];\n }\n\n // ⤜⤏ Arrow is an arc!\n\n // Is the arc clockwise or counterclockwise?\n let rot = (getSector(angle) % 2 === 0 ? 1 : -1) * (flip ? -1 : 1);\n\n // Calculate how much the line should \"bow\" away from center\n const arc = bow + modulate(dist, [stretchMin, stretchMax], [1, 0], true) * stretch;\n\n // Step 1 ⤜⤏ Find padded points.\n\n // Get midpoint.\n const [mx, my] = getPointBetween(x0, y0, x1, y1, 0.5);\n\n // Get control point.\n let [cx, cy] = getPointBetween(x0, y0, x1, y1, 0.5 - arc);\n\n // Rotate control point (clockwise or counterclockwise).\n [cx, cy] = rotatePoint(cx, cy, mx, my, (Math.PI / 2) * rot);\n\n // Get padded start point.\n const a0 = getAngle(x0, y0, cx, cy);\n const [px0, py0] = projectPoint(x0, y0, a0, padStart);\n\n // Get padded end point.\n const a1 = getAngle(x1, y1, cx, cy);\n const [px1, py1] = projectPoint(x1, y1, a1, padEnd);\n\n // Step 2 ⤜⤏ Find start and end angles.\n\n // Start angle\n const as = getAngle(cx, cy, x0, y0);\n\n // End angle\n const ae = getAngle(cx, cy, x1, y1);\n\n // Step 3 ⤜⤏ Find control point for padded points.\n\n // Get midpoint between padded start / end points.\n const [mx1, my1] = getPointBetween(px0, py0, px1, py1, 0.5);\n\n // Get control point for padded start / end points.\n let [cx1, cy1] = getPointBetween(px0, py0, px1, py1, 0.5 - arc);\n\n // Rotate control point (clockwise or counterclockwise).\n [cx1, cy1] = rotatePoint(cx1, cy1, mx1, my1, (Math.PI / 2) * rot);\n\n // Finally, average the two control points.\n let [cx2, cy2] = getPointBetween(cx, cy, cx1, cy1, 0.5);\n\n return [px0, py0, cx2, cy2, px1, py1, ae, as, angle];\n}\n","import { EdgeDirection, NodeStyles } from '../types';\nimport { PlaitBoard, Point, createForeignObject, createG, createPath, drawCircle, normalizePoint } from '@plait/core';\nimport getArrow from '../../perfect-arrows/get-arrow';\nimport {\n ACTIVE_BACKGROUND_NODE_ALPHA,\n DEFAULT_ACTIVE_NODE_SIZE_MULTIPLIER,\n DEFAULT_ACTIVE_WAVE_NODE_SIZE_MULTIPLIER,\n DEFAULT_LINE_STYLES,\n DEFAULT_NODE_LABEL_HEIGHT,\n DEFAULT_NODE_LABEL_STYLE,\n DEFAULT_NODE_LABEL_WIDTH,\n DEFAULT_NODE_SIZE,\n DEFAULT_NODE_STYLES,\n NODE_LABEL_CLASS_NAME,\n SECOND_DEPTH_NODE_ALPHA\n} from '../constants';\nimport { DEFAULT_STYLES } from '../../constants/default';\nimport { ForceAtlasNodeElement } from '../../interfaces';\n\nexport function drawNode(\n board: PlaitBoard,\n node: ForceAtlasNodeElement,\n point: Point,\n options: { iconG?: SVGGElement; isActive: boolean; isFirstDepth: boolean }\n) {\n const roughSVG = PlaitBoard.getRoughSVG(board);\n const nodeStyles: NodeStyles = {\n ...DEFAULT_NODE_STYLES,\n ...(node.styles || {})\n };\n let { x, y } = normalizePoint(point);\n let diameter = node.size ?? DEFAULT_NODE_SIZE;\n if (options.isActive) {\n diameter = diameter * DEFAULT_ACTIVE_NODE_SIZE_MULTIPLIER;\n }\n const nodeG = drawCircle(roughSVG, [x, y], diameter, nodeStyles);\n if (options.iconG) {\n nodeG.append(options.iconG);\n }\n const labelWidth = node.styles?.labelWidth ?? DEFAULT_NODE_LABEL_WIDTH;\n const labelHeight = node.styles?.labelHeight ?? DEFAULT_NODE_LABEL_HEIGHT;\n const textForeignObject = createForeignObject(x - labelWidth / 2, y, labelWidth, labelHeight);\n const textContainer = document.createElement('div');\n textContainer.classList.add(NODE_LABEL_CLASS_NAME);\n textContainer.setAttribute('style', DEFAULT_NODE_LABEL_STYLE);\n const text = document.createElement('span');\n text.innerText = node.label;\n textContainer.append(text);\n textForeignObject.append(textContainer);\n if (options.isActive) {\n const waveDiameter = diameter * DEFAULT_ACTIVE_WAVE_NODE_SIZE_MULTIPLIER;\n const waveCircle = drawCircle(roughSVG, [x, y], waveDiameter, nodeStyles);\n waveCircle.setAttribute('opacity', ACTIVE_BACKGROUND_NODE_ALPHA.toString());\n nodeG.append(waveCircle);\n textForeignObject.setAttribute('y', `${y + waveDiameter / 2}`);\n } else {\n if (!options.isFirstDepth) {\n nodeG.setAttribute('opacity', SECOND_DEPTH_NODE_ALPHA.toString());\n }\n textForeignObject.setAttribute('y', `${y + diameter / 2}`);\n }\n nodeG.append(textForeignObject);\n return nodeG;\n}\n\nexport function drawEdge(startPoint: Point, endPoint: Point, direction: EdgeDirection, isMutual: boolean, isTargetSelf?: boolean) {\n const nodeRadius = DEFAULT_NODE_SIZE / 2;\n const arrow = getArrow(startPoint[0], startPoint[1], endPoint[0], endPoint[1], {\n stretch: 0.4,\n flip: direction === EdgeDirection.NONE ? false : isMutual,\n padEnd: nodeRadius,\n padStart: nodeRadius\n });\n const [sx, sy, cx, cy, ex, ey, ae, as, ec] = arrow;\n const g = createG();\n const path = createPath();\n if (!isTargetSelf) {\n path.setAttribute('d', `M${sx},${sy} Q${cx},${cy} ${ex},${ey}`);\n } else {\n const angle = 55;\n const angleRad = (angle * Math.PI) / 180;\n const x = nodeRadius * Math.cos(angleRad);\n const y = nodeRadius * Math.sin(angleRad);\n path.setAttribute(\n 'd',\n `M -${x},-${y}\n C -45,-85, 45 -85\n ${x},-${y}`\n );\n }\n path.setAttribute('fill', 'none');\n path.setAttribute('stroke', DEFAULT_LINE_STYLES.color[direction]);\n g.append(path);\n return {\n g,\n path\n };\n}\n\nexport function drawParticle(board: PlaitBoard, startPoint: Point, direction: EdgeDirection) {\n const roughSVG = PlaitBoard.getRoughSVG(board);\n const pointG = drawCircle(roughSVG, [0, 0], 5, {\n ...DEFAULT_STYLES,\n strokeWidth: 0,\n fill: DEFAULT_LINE_STYLES.color[direction]\n });\n pointG.setAttribute('transform', `translate(${startPoint[0]}, ${startPoint[1]})`);\n return pointG;\n}\n","import { PlaitBoard, createG } from '@plait/core';\nimport { Generator } from '@plait/common';\nimport { ForceAtlasEdgeElement } from '../../interfaces';\nimport { EdgeDirection, EdgeGeneratorData } from '../types';\nimport { drawEdge, drawParticle } from '../utils/draw';\nimport { playEdgeParticleAnimate } from '../utils/edge';\n\nexport class ForceAtlasEdgeGenerator extends Generator<ForceAtlasEdgeElement, EdgeGeneratorData> {\n static key = 'force-atlas-edge';\n particleAnimation?: { stop: () => void; start: () => void };\n constructor(board: PlaitBoard) {\n super(board);\n }\n\n canDraw(element: ForceAtlasEdgeElement): boolean {\n return true;\n }\n\n draw(element: ForceAtlasEdgeElement, data: EdgeGeneratorData) {\n const edgeG = createG();\n const edgeElement = drawEdge(\n data.startPoint,\n data.endPoint,\n data.direction,\n data.isSourceActive && data.isTargetActive,\n data.isTargetSelf\n );\n edgeG.append(edgeElement.g);\n if (data.direction !== EdgeDirection.NONE) {\n const particle = drawParticle(this.board, data.startPoint, data.direction);\n edgeElement.g.append(particle);\n this.particleAnimation = playEdgeParticleAnimate(edgeElement.path, particle);\n }\n return edgeG;\n }\n\n destroy(): void {\n super.destroy();\n this.particleAnimation?.stop();\n }\n}\n","import { PlaitBoard, PlaitElement, PlaitNode, getSelectedElements } from '@plait/core';\nimport { ForceAtlasEdgeElement, ForceAtlasElement, ForceAtlasNodeElement } from '../../interfaces';\nimport { EdgeDirection, EdgeGeneratorData } from '../types';\nimport { PlaitCommonElementRef, animate, linear } from '@plait/common';\nimport { ForceAtlasEdgeGenerator } from '../generators/edge.generator';\nimport { getIsNodeActive, getNodeById } from './node';\n\nexport function getEdges(forceAtlasElement: ForceAtlasElement, andCallBack?: (edge: ForceAtlasEdgeElement) => boolean) {\n return forceAtlasElement.children?.filter(\n f => ForceAtlasElement.isForceAtlasEdgeElement(f) && (andCallBack?.(f) ?? true)\n ) as ForceAtlasEdgeElement[];\n}\n\nexport function getEdgeById(id: string, forceAtlasElement: ForceAtlasElement) {\n const edge = getEdges(forceAtlasElement, e => e.id === id)?.[0];\n if (!edge) {\n throw new Error('can not find edge.');\n }\n return edge;\n}\n\nexport function getEdgesInSourceOrTarget(id: string, forceAtlasElement: ForceAtlasElement) {\n const edges = getEdges(forceAtlasElement, edge => edge.source === id || edge.target === id);\n return edges;\n}\n\nexport function getEdgeGenerator(edge: ForceAtlasEdgeElement) {\n const edgeRef = PlaitElement.getElementRef<PlaitCommonElementRef>(edge);\n return edgeRef.getGenerator<ForceAtlasEdgeGenerator>(ForceAtlasEdgeGenerator.key);\n}\n\nexport function getEdgeDirection(isSourceActive: boolean, isTargetActive: boolean) {\n if (isSourceActive) {\n return EdgeDirection.OUT;\n } else if (isTargetActive) {\n return EdgeDirection.IN;\n }\n return EdgeDirection.NONE;\n}\n\nexport function getEdgeGeneratorData(edge: ForceAtlasEdgeElement, board: PlaitBoard): EdgeGeneratorData {\n const forceAtlasElement = PlaitNode.parent(board, PlaitBoard.findPath(board, edge)) as ForceAtlasElement;\n const sourceNode = getNodeById(edge.source, forceAtlasElement);\n const targetNode = getNodeById(edge.target, forceAtlasElement);\n if (!sourceNode?.points || !targetNode?.points) {\n throw new Error(\"Source or target node doesn't have points\");\n }\n const startPoint = sourceNode.points[0];\n const endPoint = targetNode.points[0];\n const selectElements = getSelectedElements(board) as ForceAtlasNodeElement[];\n const isSourceActive = getIsNodeActive(sourceNode.id, selectElements);\n const isTargetActive = getIsNodeActive(targetNode.id, selectElements);\n const direction = getEdgeDirection(isSourceActive, isTargetActive);\n\n return {\n startPoint,\n endPoint,\n direction,\n isSourceActive,\n isTargetActive,\n isTargetSelf: sourceNode.id === targetNode.id\n };\n}\n\nexport function playEdgeParticleAnimate(path: SVGPathElement, pointG: SVGGElement) {\n const pathLength = path.getTotalLength();\n let anim = animate(\n (t: number) => {\n const point = path.getPointAtLength(t * pathLength);\n pointG.setAttribute('transform', `translate(${point.x}, ${point.y})`);\n },\n 1000,\n linear,\n () => {\n anim = playEdgeParticleAnimate(path, pointG);\n }\n );\n return {\n stop: () => {\n anim.stop();\n },\n start: () => {\n anim.start();\n }\n };\n}\n","import {\n PlaitBoard,\n PlaitElement,\n Point,\n RectangleClient,\n Transforms,\n clearViewportOrigination,\n getRealScrollBarWidth,\n getSelectedElements,\n getViewBoxCenterPoint,\n normalizePoint\n} from '@plait/core';\nimport { ForceAtlasElement, ForceAtlasNodeElement } from '../../interfaces';\nimport { getEdges, getEdgesInSourceOrTarget } from './edge';\nimport { animate, linear, PlaitCommonElementRef } from '@plait/common';\nimport { ForceAtlasNodeGenerator } from '../generators/node.generator';\nimport { DEFAULT_NODE_ICON_COLOR, NODE_ICON_FONT_SIZE } from '../constants';\n\nexport function getNodes(forceAtlasElement: ForceAtlasElement, andBack?: (edge: ForceAtlasNodeElement) => boolean) {\n return forceAtlasElement.children?.filter(\n f => ForceAtlasElement.isForceAtlasNodeElement(f) && (andBack?.(f) ?? true)\n ) as ForceAtlasNodeElement[];\n}\n\nexport function getNodeById(id: string, forceAtlasElement: ForceAtlasElement) {\n const node = getNodes(forceAtlasElement, node => node.id === id)?.[0];\n if (!node) {\n throw new Error('can not find node.');\n }\n return node;\n}\n\nexport function getIsNodeActive(id: string, selectElements: ForceAtlasNodeElement[]) {\n return selectElements.some(node => node.id === id);\n}\n\nexport function isHitNode(node: ForceAtlasNodeElement, point: [Point, Point]) {\n const { x, y } = normalizePoint(node.points![0]);\n const size = node.size!;\n const hitFlowNode = RectangleClient.isHit(RectangleClient.getRectangleByPoints(point), {\n x: x - size / 2,\n y: y - size / 2,\n width: size,\n height: size\n });\n return hitFlowNode;\n}\n\nexport function getAssociatedNodesById(id: string, forceAtlasElement: ForceAtlasElement) {\n const edges = getEdgesInSourceOrTarget(id, forceAtlasElement);\n const nodes: ForceAtlasNodeElement[] = [];\n edges.forEach(edge => {\n nodes.push(getNodeById(edge.source, forceAtlasElement));\n nodes.push(getNodeById(edge.target, forceAtlasElement));\n });\n return nodes;\n}\n\nexport function getNodeGenerator(node: ForceAtlasNodeElement) {\n const edgeRef = PlaitElement.getElementRef<PlaitCommonElementRef>(node);\n return edgeRef.getGenerator<ForceAtlasNodeGenerator>(ForceAtlasNodeGenerator.key);\n}\n\nexport function isFirstDepthNode(currentNodeId: string, activeNodeId: string, forceAtlasElement: ForceAtlasElement) {\n const edges = getEdges(forceAtlasElement);\n return edges.some(\n s => (s.source === activeNodeId && s.target === currentNodeId) || (s.target === activeNodeId && s.source === currentNodeId)\n );\n}\n\nexport function getNodeIcon(node: ForceAtlasNodeElement) {\n const iconItem = typeof node.icon === 'object' && node.icon.name ? node.icon : null;\n return {\n name: iconItem ? iconItem.name : (node.icon as string),\n fontSize: (iconItem && iconItem.fontSize) || NODE_ICON_FONT_SIZE,\n color: (iconItem && iconItem.color) || DEFAULT_NODE_ICON_COLOR\n };\n}\n","import { PlaitBoard, createForeignObject, createG, normalizePoint } from '@plait/core';\nimport { Generator, RenderComponentRef } from '@plait/common';\nimport { ForceAtlasNodeElement } from '../../interfaces';\nimport { drawNode } from '../utils/draw';\nimport { NodeGeneratorData } from '../types';\nimport { ForceAtlasNodeIconBoard, NodeIconProps } from '../with-node-icon';\nimport { ACTIVE_NODE_ICON_CLASS_NAME, ACTIVE_NODE_ICON_FONT_SIZE, NODE_ICON_CLASS_NAME } from '../constants';\nimport { getNodeIcon } from '../utils/node';\n\nexport class ForceAtlasNodeGenerator extends Generator<ForceAtlasNodeElement, NodeGeneratorData> {\n static key = 'force-atlas-node';\n\n constructor(board: PlaitBoard) {\n super(board);\n }\n\n canDraw(element: ForceAtlasNodeElement): boolean {\n return true;\n }\n\n draw(element: ForceAtlasNodeElement, data: NodeGeneratorData) {\n const iconRef = this.drawIcon(element, data);\n return drawNode(this.board, element, element?.points?.[0] || [0, 0], { ...data, iconG: iconRef.iconG });\n }\n\n drawIcon(element: ForceAtlasNodeElement, data: NodeGeneratorData) {\n const iconG = createG();\n let { x, y } = normalizePoint(element.points?.[0] || [0, 0]);\n const size = element.size!;\n const foreignObject = createForeignObject(x - size / 2, y - size / 2, size, size);\n iconG.append(foreignObject);\n const container = document.createElement('div');\n container.classList.add(NODE_ICON_CLASS_NAME);\n if (data.isActive) {\n container.classList.add(ACTIVE_NODE_ICON_CLASS_NAME);\n }\n foreignObject.append(container);\n const nodeIcon = getNodeIcon(element);\n const props: NodeIconProps = {\n iconItem: {\n name: nodeIcon.name,\n fontSize: data.isActive ? ACTIVE_NODE_ICON_FONT_SIZE : nodeIcon.fontSize,\n color: nodeIcon.color\n },\n board: this.board,\n element: element\n };\n const ref = ((this.board as unknown) as ForceAtlasNodeIconBoard).renderNodeIcon(container, props);\n return { ref, iconG };\n }\n}\n","import { CommonElementFlavour } from '@plait/common';\nimport {\n OnContextChanged,\n PlaitBoard,\n PlaitNode,\n PlaitPluginElementContext,\n cacheSelectedElements,\n getSelectedElements\n} from '@plait/core';\nimport Graph from 'graphology';\nimport { ForceAtlasElement, ForceAtlasNodeElement } from '../interfaces';\nimport { ForceAtlasNodeGenerator } from './generators/node.generator';\nimport { getEdgeGenerator, getEdgeGeneratorData, getEdgesInSourceOrTarget } from './utils/edge';\nimport { getAssociatedNodesById, getNodeGenerator, isFirstDepthNode } from './utils/node';\n\nexport class ForceAtlasNodeFlavour extends CommonElementFlavour<ForceAtlasNodeElement, PlaitBoard>\n implements OnContextChanged<ForceAtlasNodeElement, PlaitBoard> {\n graph!: Graph<Node>;\n nodeGenerator!: ForceAtlasNodeGenerator;\n\n constructor() {\n super();\n }\n\n initializeGenerator() {\n this.nodeGenerator = new ForceAtlasNodeGenerator(this.board);\n this.getRef().addGenerator(ForceAtlasNodeGenerator.key, this.nodeGenerator);\n }\n\n initialize(): void {\n super.initialize();\n this.initializeGenerator();\n const parent = PlaitNode.parent(this.board, PlaitBoard.findPath(this.board, this.element)) as ForceAtlasElement;\n const selectElements = getSelectedElements(this.board);\n const activeNodeId = selectElements[0]?.id;\n const isActive = activeNodeId === this.element.id;\n this.nodeGenerator.processDrawing(this.element, isActive ? PlaitBoard.getElementActiveHost(this.board) : this.getElementG(), {\n isActive,\n isFirstDepth: isFirstDepthNode(this.element.id, activeNodeId, parent)\n });\n }\n\n onContextChanged(\n value: PlaitPluginElementContext<ForceAtlasNodeElement, PlaitBoard>,\n previous: PlaitPluginElementContext<ForceAtlasNodeElement, PlaitBoard>\n ) {\n if (value !== previous && value.selected !== previous.selected) {\n const parent = value.parent as any;\n if (value.selected) {\n cacheSelectedElements(this.board, [value.element]);\n }\n const selectElements = getSelectedElements(this.board);\n const associatedNodes = getAssociatedNodesById(value.element.id, parent);\n associatedNodes.forEach(node => {\n const nodeGenerator = getNodeGenerator(node);\n nodeGenerator.destroy();\n nodeGenerator.processDrawing(node, this.getElementG(), {\n isActive: selectElements?.[0]?.id === node.id,\n isFirstDepth: selectElements.length > 0 && isFirstDepthNode(node.id, selectElements[0].id, parent)\n });\n });\n\n const associatedEdges = getEdgesInSourceOrTarget(value.element.id, parent);\n associatedEdges.forEach(edge => {\n const edgeGenerator = getEdgeGenerator(edge);\n edgeGenerator.destroy();\n edgeGenerator.processDrawing(edge, PlaitBoard.getElementLowerHost(this.board), getEdgeGeneratorData(edge, this.board));\n });\n }\n }\n\n updateText(previousElement: ForceAtlasNodeElement, currentElement: ForceAtlasNodeElement) {}\n\n destroy(): void {\n super.destroy();\n }\n}\n","import { CommonElementFlavour } from '@plait/common';\nimport { OnContextChanged, PlaitBoard, PlaitPluginElementContext } from '@plait/core';\nimport Graph from 'graphology';\nimport { ForceAtlasEdgeElement } from '../interfaces';\nimport { ForceAtlasEdgeGenerator } from './generators/edge.generator';\nimport { getEdgeGeneratorData } from './utils/edge';\n\nexport class ForceAtlasEdgeFlavour extends CommonElementFlavour<ForceAtlasEdgeElement, PlaitBoard>\n implements OnContextChanged<ForceAtlasEdgeElement, PlaitBoard> {\n graph!: Graph<Node>;\n edgeGenerator!: ForceAtlasEdgeGenerator;\n\n constructor() {\n super();\n }\n\n initializeGenerator() {\n this.edgeGenerator = new ForceAtlasEdgeGenerator(this.board);\n this.getRef().addGenerator(ForceAtlasEdgeGenerator.key, this.edgeGenerator);\n }\n\n initialize(): void {\n super.initialize();\n this.initializeGenerator();\n this.edgeGenerator.processDrawing(\n this.element,\n PlaitBoard.getElementLowerHost(this.board),\n getEdgeGeneratorData(this.element, this.board)\n );\n }\n\n onContextChanged(\n value: PlaitPluginElementContext<ForceAtlasEdgeElement, PlaitBoard>,\n previous: PlaitPluginElementContext<ForceAtlasEdgeElement, PlaitBoard>\n ) {}\n\n updateText(previousElement: ForceAtlasEdgeElement, currentElement: ForceAtlasEdgeElement) {}\n\n destroy(): void {\n super.destroy();\n this.edgeGenerator.destroy();\n }\n}\n","import { PlaitBoard } from '@plait/core';\nimport { ForceAtlasNodeElement } from '../interfaces/element';\nimport { RenderComponentRef } from '@plait/common';\nimport { NodeIconItem } from './types';\n\nexport interface ForceAtlasNodeIconBoard {\n renderNodeIcon: (container: Element | DocumentFragment, props: NodeIconProps) => RenderComponentRef<NodeIconProps>;\n}\n\nexport const withNodeIcon = <T extends PlaitBoard = PlaitBoard>(board: T) => {\n const newBoard = board as T & ForceAtlasNodeIconBoard;\n\n newBoard.renderNodeIcon = (container: Element | DocumentFragment, props: NodeIconProps) => {\n throw new Error('No implementation for renderLabeIcon method.');\n };\n return newBoard;\n};\n\nexport interface NodeIconProps {\n board: PlaitBoard;\n iconItem: NodeIconItem;\n element: ForceAtlasNodeElement;\n}\n","import {\n isHitElement,\n PlaitBoard,\n PlaitElement,\n PlaitOptionsBoard,\n PlaitPluginElementContext,\n PlaitPluginKey,\n PlaitPointerType,\n Point,\n RectangleClient,\n Selection,\n setSelectionOptions,\n toHostPoint,\n toViewBoxPoint,\n WithHandPluginOptions\n} from '@plait/core';\nimport { ForceAtlasFlavour } from './force-atlas.flavour';\nimport { ForceAtlasNodeFlavour } from './node.flavour';\nimport { ForceAtlasEdgeFlavour } from './edge.flavour';\nimport { ForceAtlasElement } from '../interfaces';\nimport { isHitNode } from './utils/node';\nimport { withNodeIcon } from './with-node-icon';\n\nexport const withForceAtlas = (board: PlaitBoard) => {\n const { drawElement, getRectangle, isRectangleHit, isHit, isInsidePoint, isMovable, isAlign, getRelatedFragment } = board;\n\n board.drawElement = (context: PlaitPluginElementContext) => {\n if (ForceAtlasElement.isForceAtlas(context.element)) {\n return ForceAtlasFlavour;\n } else if (ForceAtlasElement.isForceAtlasNodeElement(context.element)) {\n return ForceAtlasNodeFlavour;\n } else if (ForceAtlasElement.isForceAtlasEdgeElement(context.element)) {\n return ForceAtlasEdgeFlavour;\n }\n return drawElement(context);\n };\n\n board.getRectangle = (element: PlaitElement) => {\n if (element.type === 'force-atlas') {\n return {\n width: 0,\n height: 0,\n x: 0,\n y: 0\n };\n } else if (ForceAtlasElement.isForceAtlasNodeElement(element)) {\n return RectangleClient.getRectangleByPoints(element.points || []);\n } else if (ForceAtlasElement.isForceAtlasEdgeElement(element)) {\n return {\n width: 0,\n height: 0,\n x: 0,\n y: 0\n };\n }\n return getRectangle(element);\n };\n\n board.isRectangleHit = (element: PlaitElement, selection: Selection) => {\n return isRectangleHit(element, selection);\n };\n board.isRectangleHit = (element, range) => {\n if (ForceAtlasElement.isForceAtlasNodeElement(element)) {\n return isHitNode(element, [range.anchor, range.focus]);\n }\n return isRectangleHit(element, range);\n };\n\n board.isHit = (element, point) => {\n if (ForceAtlasElement.isForceAtlasNodeElement(element)) {\n return isHitNode(element, [point, point]);\n }\n return isHit(element, point);\n };\n\n board.isInsidePoint = (element: PlaitElement, point: Point) => {\n return isInsidePoint(element, point);\n };\n\n setSelectionOptions(board, { isMultipleSelection: false, isPreventClearSelection: true });\n\n (board as PlaitOptionsBoard).setPluginOptions<WithHandPluginOptions>(PlaitPluginKey.withHand, {\n isHandMode: (board, event) => {\n const point = toViewBoxPoint(board, toHostPoint(board, event.x, event.y));\n const isHitTarget = isHitElement(board, point);\n return PlaitBoard.isPointer(board, PlaitPointerType.selection) && !isHitTarget;\n }\n });\n\n return withNodeIcon(board);\n};\n","import { PlaitBoard } from '@plait/core';\nimport { ForceAtlasNodeElement } from '../../interfaces/element';\nimport { DEFAULT_NODE_ICON_COLOR, NODE_ICON_CLASS_NAME, NODE_ICON_FONT_SIZE } from '../constants';\nimport { NodeIconItem } from '../types';\n\nexport abstract class ForceAtlasNodeIconBaseComponent {\n iconItem!: NodeIconItem;\n\n board!: PlaitBoard;\n\n element!: ForceAtlasNodeElement;\n\n abstract nativeElement(): HTMLElement;\n\n initialize() {\n if (!this.iconItem.fontSize) {\n this.iconItem.fontSize = NODE_ICON_FONT_SIZE;\n }\n if (!this.iconItem.color) {\n this.iconItem.color = DEFAULT_NODE_ICON_COLOR;\n }\n this.nativeElement().style.fontSize = `${this.iconItem.fontSize}px`;\n this.nativeElement().style.color = `${this.iconItem.color}`;\n this.nativeElement().classList.add(NODE_ICON_CLASS_NAME);\n }\n}\n","/*\n * Public API Surface of utils\n */\n\nexport * from './force-atlas/constants';\nexport * from './force-atlas/types';\nexport * from './force-atlas/with-force-atlas';\nexport * from './force-atlas/with-node-icon';\nexport * from './interfaces/index';\nexport * from './force-atlas/core/node-icon-base.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -5,6 +5,10 @@ export declare const DEFAULT_ACTIVE_NODE_SIZE_MULTIPLIER = 1.2;
5
5
  export declare const DEFAULT_ACTIVE_WAVE_NODE_SIZE_MULTIPLIER = 1.5;
6
6
  export declare const DEFAULT_NODE_LABEL_MARGIN_TOP = 4;
7
7
  export declare const DEFAULT_NODE_LABEL_FONT_SIZE = 12;
8
+ export declare const DEFAULT_NODE_LABEL_WIDTH = 150;
9
+ export declare const DEFAULT_NODE_LABEL_HEIGHT = 22;
10
+ export declare const DEFAULT_NODE_LABEL_STYLE = "user-select:none;max-width:150px;text-align:center;line-height:22px;font-size:12px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;";
11
+ export declare const NODE_LABEL_CLASS_NAME = "force-atlas-node-label";
8
12
  export declare const SECOND_DEPTH_NODE_ALPHA = 0.5;
9
13
  export declare const SECOND_DEPTH_LINE_ALPHA = 0.5;
10
14
  export declare const ACTIVE_BACKGROUND_NODE_ALPHA = 0.1;
@@ -21,6 +21,7 @@ export interface EdgeGeneratorData extends GeneratorExtraData {
21
21
  isSourceActive: boolean;
22
22
  isTargetActive: boolean;
23
23
  direction: EdgeDirection;
24
+ isTargetSelf?: boolean;
24
25
  }
25
26
  export interface NodeGeneratorData extends GeneratorExtraData {
26
27
  isActive: boolean;
@@ -6,7 +6,7 @@ export declare function drawNode(board: PlaitBoard, node: ForceAtlasNodeElement,
6
6
  isActive: boolean;
7
7
  isFirstDepth: boolean;
8
8
  }): SVGGElement;
9
- export declare function drawEdge(startPoint: Point, endPoint: Point, direction: EdgeDirection, isMutual: boolean): {
9
+ export declare function drawEdge(startPoint: Point, endPoint: Point, direction: EdgeDirection, isMutual: boolean, isTargetSelf?: boolean): {
10
10
  g: SVGGElement;
11
11
  path: SVGPathElement;
12
12
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@plait/graph-viz",
3
- "version": "0.62.0",
3
+ "version": "0.63.0",
4
4
  "peerDependencies": {
5
5
  "graphology": "^0.25.4",
6
6
  "graphology-layout": "^0.6.1",