@plait/graph-viz 0.63.0 → 0.64.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,7 +9,7 @@ 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;
12
+ export const DEFAULT_NODE_LABEL_WIDTH = 72;
13
13
  export const DEFAULT_NODE_LABEL_HEIGHT = 22;
14
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
15
  export const NODE_LABEL_CLASS_NAME = 'force-atlas-node-label';
@@ -32,7 +32,9 @@ export const DEFAULT_LINE_STYLES = {
32
32
  color: {
33
33
  [EdgeDirection.IN]: '#73D897',
34
34
  [EdgeDirection.OUT]: '#6698FF',
35
- [EdgeDirection.NONE]: `#ddd`
36
- }
35
+ [EdgeDirection.NONE]: `#eee`
36
+ },
37
+ opacity: 0.4
37
38
  };
38
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvZ3JhcGgtdml6L3NyYy9mb3JjZS1hdGxhcy9jb25zdGFudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFeEMsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQVk7SUFDeEMsR0FBRyxjQUFjO0lBQ2pCLE1BQU0sRUFBRSxNQUFNO0NBQ2pCLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxFQUFFLENBQUM7QUFFcEMsTUFBTSxDQUFDLE1BQU0sbUNBQW1DLEdBQUcsR0FBRyxDQUFDO0FBRXZELE1BQU0sQ0FBQyxNQUFNLHdDQUF3QyxHQUFHLEdBQUcsQ0FBQztBQUU1RCxNQUFNLENBQUMsTUFBTSw2QkFBNkIsR0FBRyxDQUFDLENBQUM7QUFFL0MsTUFBTSxDQUFDLE1BQU0sNEJBQTRCLEdBQUcsRUFBRSxDQUFDO0FBRS9DLE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLEdBQUcsQ0FBQztBQUU1QyxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBRyxFQUFFLENBQUM7QUFFNUMsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQUcsOEJBQThCLHdCQUF3QixvQ0FBb0MseUJBQXlCLGdCQUFnQiw0QkFBNEIsK0RBQStELENBQUM7QUFFdlEsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsd0JBQXdCLENBQUM7QUFFOUQsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsR0FBRyxDQUFDO0FBRTNDLE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLEdBQUcsQ0FBQztBQUUzQyxNQUFNLENBQUMsTUFBTSw0QkFBNEIsR0FBRyxHQUFHLENBQUM7QUFFaEQsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsdUJBQXVCLENBQUM7QUFFNUQsTUFBTSxDQUFDLE1BQU0sMkJBQTJCLEdBQUcsOEJBQThCLENBQUM7QUFFMUUsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsRUFBRSxDQUFDO0FBRXRDLE1BQU0sQ0FBQyxNQUFNLDBCQUEwQixHQUFHLEVBQUUsQ0FBQztBQUU3QyxNQUFNLENBQUMsTUFBTSw2QkFBNkIsR0FBRyxTQUFTLENBQUM7QUFFdkQsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsTUFBTSxDQUFDO0FBRTlDLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFZO0lBQ3hDLEdBQUcsY0FBYztJQUNqQixJQUFJLEVBQUUsNkJBQTZCO0lBQ25DLFdBQVcsRUFBRSxDQUFDO0NBQ2pCLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBRyxFQUFFLENBQUM7QUFFN0MsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUc7SUFDL0IsS0FBSyxFQUFFO1FBQ0gsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLEVBQUUsU0FBUztRQUM3QixDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsRUFBRSxTQUFTO1FBQzlCLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU07S0FDL0I7Q0FDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT3B0aW9ucyB9IGZyb20gJ3JvdWdoanMvYmluL2NvcmUnO1xuaW1wb3J0IHsgREVGQVVMVF9TVFlMRVMgfSBmcm9tICcuLi9jb25zdGFudHMvZGVmYXVsdCc7XG5pbXBvcnQgeyBFZGdlRGlyZWN0aW9uIH0gZnJvbSAnLi90eXBlcyc7XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0VER0VfU1RZTEVTOiBPcHRpb25zID0ge1xuICAgIC4uLkRFRkFVTFRfU1RZTEVTLFxuICAgIHN0cm9rZTogJyNkZGQnXG59O1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9OT0RFX1NJWkUgPSAzMDtcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfQUNUSVZFX05PREVfU0laRV9NVUxUSVBMSUVSID0gMS4yO1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9BQ1RJVkVfV0FWRV9OT0RFX1NJWkVfTVVMVElQTElFUiA9IDEuNTtcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfTk9ERV9MQUJFTF9NQVJHSU5fVE9QID0gNDtcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfTk9ERV9MQUJFTF9GT05UX1NJWkUgPSAxMjtcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfTk9ERV9MQUJFTF9XSURUSCA9IDE1MDtcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfTk9ERV9MQUJFTF9IRUlHSFQgPSAyMjtcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfTk9ERV9MQUJFTF9TVFlMRSA9IGB1c2VyLXNlbGVjdDpub25lO21heC13aWR0aDoke0RFRkFVTFRfTk9ERV9MQUJFTF9XSURUSH1weDt0ZXh0LWFsaWduOmNlbnRlcjtsaW5lLWhlaWdodDoke0RFRkFVTFRfTk9ERV9MQUJFTF9IRUlHSFR9cHg7Zm9udC1zaXplOiR7REVGQVVMVF9OT0RFX0xBQkVMX0ZPTlRfU0laRX1weDt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7YDtcblxuZXhwb3J0IGNvbnN0IE5PREVfTEFCRUxfQ0xBU1NfTkFNRSA9ICdmb3JjZS1hdGxhcy1ub2RlLWxhYmVsJztcblxuZXhwb3J0IGNvbnN0IFNFQ09ORF9ERVBUSF9OT0RFX0FMUEhBID0gMC41O1xuXG5leHBvcnQgY29uc3QgU0VDT05EX0RFUFRIX0xJTkVfQUxQSEEgPSAwLjU7XG5cbmV4cG9ydCBjb25zdCBBQ1RJVkVfQkFDS0dST1VORF9OT0RFX0FMUEhBID0gMC4xO1xuXG5leHBvcnQgY29uc3QgTk9ERV9JQ09OX0NMQVNTX05BTUUgPSAnZm9yY2UtYXRsYXMtbm9kZS1pY29uJztcblxuZXhwb3J0IGNvbnN0IEFDVElWRV9OT0RFX0lDT05fQ0xBU1NfTkFNRSA9ICdmb3JjZS1hdGxhcy1ub2RlLWljb24tYWN0aXZlJztcblxuZXhwb3J0IGNvbnN0IE5PREVfSUNPTl9GT05UX1NJWkUgPSAxNjtcblxuZXhwb3J0IGNvbnN0IEFDVElWRV9OT0RFX0lDT05fRk9OVF9TSVpFID0gMTg7XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX05PREVfQkFDS0dST1VORF9DT0xPUiA9ICcjOWM5Y2ZiJztcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfTk9ERV9JQ09OX0NPTE9SID0gJyNmZmYnO1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9OT0RFX1NUWUxFUzogT3B0aW9ucyA9IHtcbiAgICAuLi5ERUZBVUxUX1NUWUxFUyxcbiAgICBmaWxsOiBERUZBVUxUX05PREVfQkFDS0dST1VORF9DT0xPUixcbiAgICBzdHJva2VXaWR0aDogMFxufTtcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfTk9ERV9TQ0FMSU5HX1JBVElPID0gMjA7XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0xJTkVfU1RZTEVTID0ge1xuICAgIGNvbG9yOiB7XG4gICAgICAgIFtFZGdlRGlyZWN0aW9uLklOXTogJyM3M0Q4OTcnLFxuICAgICAgICBbRWRnZURpcmVjdGlvbi5PVVRdOiAnIzY2OThGRicsXG4gICAgICAgIFtFZGdlRGlyZWN0aW9uLk5PTkVdOiBgI2RkZGBcbiAgICB9XG59O1xuIl19
39
+ export const DEFAULT_EDGE_PARTICLE_SIZE = 4;
40
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvZ3JhcGgtdml6L3NyYy9mb3JjZS1hdGxhcy9jb25zdGFudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFeEMsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQVk7SUFDeEMsR0FBRyxjQUFjO0lBQ2pCLE1BQU0sRUFBRSxNQUFNO0NBQ2pCLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxFQUFFLENBQUM7QUFFcEMsTUFBTSxDQUFDLE1BQU0sbUNBQW1DLEdBQUcsR0FBRyxDQUFDO0FBRXZELE1BQU0sQ0FBQyxNQUFNLHdDQUF3QyxHQUFHLEdBQUcsQ0FBQztBQUU1RCxNQUFNLENBQUMsTUFBTSw2QkFBNkIsR0FBRyxDQUFDLENBQUM7QUFFL0MsTUFBTSxDQUFDLE1BQU0sNEJBQTRCLEdBQUcsRUFBRSxDQUFDO0FBRS9DLE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLEVBQUUsQ0FBQztBQUUzQyxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBRyxFQUFFLENBQUM7QUFFNUMsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQUcsOEJBQThCLHdCQUF3QixvQ0FBb0MseUJBQXlCLGdCQUFnQiw0QkFBNEIsK0RBQStELENBQUM7QUFFdlEsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsd0JBQXdCLENBQUM7QUFFOUQsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsR0FBRyxDQUFDO0FBRTNDLE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLEdBQUcsQ0FBQztBQUUzQyxNQUFNLENBQUMsTUFBTSw0QkFBNEIsR0FBRyxHQUFHLENBQUM7QUFFaEQsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsdUJBQXVCLENBQUM7QUFFNUQsTUFBTSxDQUFDLE1BQU0sMkJBQTJCLEdBQUcsOEJBQThCLENBQUM7QUFFMUUsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsRUFBRSxDQUFDO0FBRXRDLE1BQU0sQ0FBQyxNQUFNLDBCQUEwQixHQUFHLEVBQUUsQ0FBQztBQUU3QyxNQUFNLENBQUMsTUFBTSw2QkFBNkIsR0FBRyxTQUFTLENBQUM7QUFFdkQsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsTUFBTSxDQUFDO0FBRTlDLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFZO0lBQ3hDLEdBQUcsY0FBYztJQUNqQixJQUFJLEVBQUUsNkJBQTZCO0lBQ25DLFdBQVcsRUFBRSxDQUFDO0NBQ2pCLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBRyxFQUFFLENBQUM7QUFFN0MsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUc7SUFDL0IsS0FBSyxFQUFFO1FBQ0gsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLEVBQUUsU0FBUztRQUM3QixDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsRUFBRSxTQUFTO1FBQzlCLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU07S0FDL0I7SUFDRCxPQUFPLEVBQUUsR0FBRztDQUNmLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBRyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPcHRpb25zIH0gZnJvbSAncm91Z2hqcy9iaW4vY29yZSc7XG5pbXBvcnQgeyBERUZBVUxUX1NUWUxFUyB9IGZyb20gJy4uL2NvbnN0YW50cy9kZWZhdWx0JztcbmltcG9ydCB7IEVkZ2VEaXJlY3Rpb24gfSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfRURHRV9TVFlMRVM6IE9wdGlvbnMgPSB7XG4gICAgLi4uREVGQVVMVF9TVFlMRVMsXG4gICAgc3Ryb2tlOiAnI2RkZCdcbn07XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX05PREVfU0laRSA9IDMwO1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9BQ1RJVkVfTk9ERV9TSVpFX01VTFRJUExJRVIgPSAxLjI7XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0FDVElWRV9XQVZFX05PREVfU0laRV9NVUxUSVBMSUVSID0gMS41O1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9OT0RFX0xBQkVMX01BUkdJTl9UT1AgPSA0O1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9OT0RFX0xBQkVMX0ZPTlRfU0laRSA9IDEyO1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9OT0RFX0xBQkVMX1dJRFRIID0gNzI7XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX05PREVfTEFCRUxfSEVJR0hUID0gMjI7XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX05PREVfTEFCRUxfU1RZTEUgPSBgdXNlci1zZWxlY3Q6bm9uZTttYXgtd2lkdGg6JHtERUZBVUxUX05PREVfTEFCRUxfV0lEVEh9cHg7dGV4dC1hbGlnbjpjZW50ZXI7bGluZS1oZWlnaHQ6JHtERUZBVUxUX05PREVfTEFCRUxfSEVJR0hUfXB4O2ZvbnQtc2l6ZToke0RFRkFVTFRfTk9ERV9MQUJFTF9GT05UX1NJWkV9cHg7d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2A7XG5cbmV4cG9ydCBjb25zdCBOT0RFX0xBQkVMX0NMQVNTX05BTUUgPSAnZm9yY2UtYXRsYXMtbm9kZS1sYWJlbCc7XG5cbmV4cG9ydCBjb25zdCBTRUNPTkRfREVQVEhfTk9ERV9BTFBIQSA9IDAuNTtcblxuZXhwb3J0IGNvbnN0IFNFQ09ORF9ERVBUSF9MSU5FX0FMUEhBID0gMC41O1xuXG5leHBvcnQgY29uc3QgQUNUSVZFX0JBQ0tHUk9VTkRfTk9ERV9BTFBIQSA9IDAuMTtcblxuZXhwb3J0IGNvbnN0IE5PREVfSUNPTl9DTEFTU19OQU1FID0gJ2ZvcmNlLWF0bGFzLW5vZGUtaWNvbic7XG5cbmV4cG9ydCBjb25zdCBBQ1RJVkVfTk9ERV9JQ09OX0NMQVNTX05BTUUgPSAnZm9yY2UtYXRsYXMtbm9kZS1pY29uLWFjdGl2ZSc7XG5cbmV4cG9ydCBjb25zdCBOT0RFX0lDT05fRk9OVF9TSVpFID0gMTY7XG5cbmV4cG9ydCBjb25zdCBBQ1RJVkVfTk9ERV9JQ09OX0ZPTlRfU0laRSA9IDE4O1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9OT0RFX0JBQ0tHUk9VTkRfQ09MT1IgPSAnIzljOWNmYic7XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX05PREVfSUNPTl9DT0xPUiA9ICcjZmZmJztcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfTk9ERV9TVFlMRVM6IE9wdGlvbnMgPSB7XG4gICAgLi4uREVGQVVMVF9TVFlMRVMsXG4gICAgZmlsbDogREVGQVVMVF9OT0RFX0JBQ0tHUk9VTkRfQ09MT1IsXG4gICAgc3Ryb2tlV2lkdGg6IDBcbn07XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX05PREVfU0NBTElOR19SQVRJTyA9IDIwO1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9MSU5FX1NUWUxFUyA9IHtcbiAgICBjb2xvcjoge1xuICAgICAgICBbRWRnZURpcmVjdGlvbi5JTl06ICcjNzNEODk3JyxcbiAgICAgICAgW0VkZ2VEaXJlY3Rpb24uT1VUXTogJyM2Njk4RkYnLFxuICAgICAgICBbRWRnZURpcmVjdGlvbi5OT05FXTogYCNlZWVgXG4gICAgfSxcbiAgICBvcGFjaXR5OiAwLjRcbn07XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0VER0VfUEFSVElDTEVfU0laRSA9IDQ7XG4iXX0=
@@ -2,7 +2,8 @@ import { CommonElementFlavour } from '@plait/common';
2
2
  import { PlaitBoard, PlaitNode, cacheSelectedElements, getSelectedElements } from '@plait/core';
3
3
  import { ForceAtlasNodeGenerator } from './generators/node.generator';
4
4
  import { getEdgeGenerator, getEdgeGeneratorData, getEdgesInSourceOrTarget } from './utils/edge';
5
- import { getAssociatedNodesById, getNodeGenerator, isFirstDepthNode } from './utils/node';
5
+ import { getNodeGenerator, getNodes, isFirstDepthNode } from './utils/node';
6
+ import { SECOND_DEPTH_NODE_ALPHA } from './constants';
6
7
  export class ForceAtlasNodeFlavour extends CommonElementFlavour {
7
8
  constructor() {
8
9
  super();
@@ -20,7 +21,7 @@ export class ForceAtlasNodeFlavour extends CommonElementFlavour {
20
21
  const isActive = activeNodeId === this.element.id;
21
22
  this.nodeGenerator.processDrawing(this.element, isActive ? PlaitBoard.getElementActiveHost(this.board) : this.getElementG(), {
22
23
  isActive,
23
- isFirstDepth: isFirstDepthNode(this.element.id, activeNodeId, parent)
24
+ opacity: isFirstDepthNode(this.element.id, activeNodeId, parent) ? 1 : SECOND_DEPTH_NODE_ALPHA
24
25
  });
25
26
  }
26
27
  onContextChanged(value, previous) {
@@ -30,13 +31,14 @@ export class ForceAtlasNodeFlavour extends CommonElementFlavour {
30
31
  cacheSelectedElements(this.board, [value.element]);
31
32
  }
32
33
  const selectElements = getSelectedElements(this.board);
33
- const associatedNodes = getAssociatedNodesById(value.element.id, parent);
34
- associatedNodes.forEach(node => {
34
+ const nodes = getNodes(parent);
35
+ nodes.forEach(node => {
35
36
  const nodeGenerator = getNodeGenerator(node);
36
37
  nodeGenerator.destroy();
38
+ const isFirstDepth = selectElements.length > 0 && isFirstDepthNode(node.id, selectElements[0].id, parent);
37
39
  nodeGenerator.processDrawing(node, this.getElementG(), {
38
40
  isActive: selectElements?.[0]?.id === node.id,
39
- isFirstDepth: selectElements.length > 0 && isFirstDepthNode(node.id, selectElements[0].id, parent)
41
+ opacity: selectElements.length === 0 ? 1 : isFirstDepth ? 1 : SECOND_DEPTH_NODE_ALPHA
40
42
  });
41
43
  });
42
44
  const associatedEdges = getEdgesInSourceOrTarget(value.element.id, parent);
@@ -52,4 +54,4 @@ export class ForceAtlasNodeFlavour extends CommonElementFlavour {
52
54
  super.destroy();
53
55
  }
54
56
  }
55
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS5mbGF2b3VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvZ3JhcGgtdml6L3NyYy9mb3JjZS1hdGxhcy9ub2RlLmZsYXZvdXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JELE9BQU8sRUFFSCxVQUFVLEVBQ1YsU0FBUyxFQUVULHFCQUFxQixFQUNyQixtQkFBbUIsRUFDdEIsTUFBTSxhQUFhLENBQUM7QUFHckIsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDdEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLG9CQUFvQixFQUFFLHdCQUF3QixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ2hHLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUUxRixNQUFNLE9BQU8scUJBQXNCLFNBQVEsb0JBQXVEO0lBSzlGO1FBQ0ksS0FBSyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRUQsbUJBQW1CO1FBQ2YsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLHVCQUF1QixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3RCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsWUFBWSxDQUFDLHVCQUF1QixDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDaEYsQ0FBQztJQUVELFVBQVU7UUFDTixLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDM0IsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQXNC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dXIgfSBmcm9tICdAcGxhaXQvY29tbW9uJztcbmltcG9ydCB7XG4gICAgT25Db250ZXh0Q2hhbmdlZCxcbiAgICBQbGFpdEJvYXJkLFxuICAgIFBsYWl0Tm9kZSxcbiAgICBQbGFpdFBsdWdpbkVsZW1lbnRDb250ZXh0LFxuICAgIGNhY2hlU2VsZWN0ZWRFbGVtZW50cyxcbiAgICBnZXRTZWxlY3RlZEVsZW1lbnRzXG59IGZyb20gJ0BwbGFpdC9jb3JlJztcbmltcG9ydCBHcmFwaCBmcm9tICdncmFwaG9sb2d5JztcbmltcG9ydCB7IEZvcmNlQXRsYXNFbGVtZW50LCBGb3JjZUF0bGFzTm9kZUVsZW1lbnQgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEZvcmNlQXRsYXNOb2RlR2VuZXJhdG9yIH0gZnJvbSAnLi9nZW5lcmF0b3JzL25vZGUuZ2VuZXJhdG9yJztcbmltcG9ydCB7IGdldEVkZ2VHZW5lcmF0b3IsIGdldEVkZ2VHZW5lcmF0b3JEYXRhLCBnZXRFZGdlc0luU291cmNlT3JUYXJnZXQgfSBmcm9tICcuL3V0aWxzL2VkZ2UnO1xuaW1wb3J0IHsgZ2V0QXNzb2NpYXRlZE5vZGVzQnlJZCwgZ2V0Tm9kZUdlbmVyYXRvciwgaXNGaXJzdERlcHRoTm9kZSB9IGZyb20gJy4vdXRpbHMvbm9kZSc7XG5cbmV4cG9ydCBjbGFzcyBGb3JjZUF0bGFzTm9kZUZsYXZvdXIgZXh0ZW5kcyBDb21tb25FbGVtZW50Rmxhdm91cjxGb3JjZUF0bGFzTm9kZUVsZW1lbnQsIFBsYWl0Qm9hcmQ+XG4gICAgaW1wbGVtZW50cyBPbkNvbnRleHRDaGFuZ2VkPEZvcmNlQXRsYXNOb2RlRWxlbWVudCwgUGxhaXRCb2FyZD4ge1xuICAgIGdyYXBoITogR3JhcGg8Tm9kZT47XG4gICAgbm9kZUdlbmVyYXRvciE6IEZvcmNlQXRsYXNOb2RlR2VuZXJhdG9yO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuXG4gICAgaW5pdGlhbGl6ZUdlbmVyYXRvcigpIHtcbiAgICAgICAgdGhpcy5ub2RlR2VuZXJhdG9yID0gbmV3IEZvcmNlQXRsYXNOb2RlR2VuZXJhdG9yKHRoaXMuYm9hcmQpO1xuICAgICAgICB0aGlzLmdldFJlZigpLmFkZEdlbmVyYXRvcihGb3JjZUF0bGFzTm9kZUdlbmVyYXRvci5rZXksIHRoaXMubm9kZUdlbmVyYXRvcik7XG4gICAgfVxuXG4gICAgaW5pdGlhbGl6ZSgpOiB2b2lkIHtcbiAgICAgICAgc3VwZXIuaW5pdGlhbGl6ZSgpO1xuICAgICAgICB0aGlzLmluaXRpYWxpemVHZW5lcmF0b3IoKTtcbiAgICAgICAgY29uc3QgcGFyZW50ID0gUGxhaXROb2RlLnBhcmVudCh0aGlzLmJvYXJkLCBQbGFpdEJvYXJkLmZpbmRQYXRoKHRoaXMuYm9hcmQsIHRoaXMuZWxlbWVudCkpIGFzIEZvcmNlQXRsYXNFbGVtZW50O1xuICAgICAgICBjb25zdCBzZWxlY3RFbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHModGhpcy5ib2FyZCk7XG4gICAgICAgIGNvbnN0IGFjdGl2ZU5vZGVJZCA9IHNlbGVjdEVsZW1lbnRzWzBdPy5pZDtcbiAgICAgICAgY29uc3QgaXNBY3RpdmUgPSBhY3RpdmVOb2RlSWQgPT09IHRoaXMuZWxlbWVudC5pZDtcbiAgICAgICAgdGhpcy5ub2RlR2VuZXJhdG9yLnByb2Nlc3NEcmF3aW5nKHRoaXMuZWxlbWVudCwgaXNBY3RpdmUgPyBQbGFpdEJvYXJkLmdldEVsZW1lbnRBY3RpdmVIb3N0KHRoaXMuYm9hcmQpIDogdGhpcy5nZXRFbGVtZW50RygpLCB7XG4gICAgICAgICAgICBpc0FjdGl2ZSxcbiAgICAgICAgICAgIGlzRmlyc3REZXB0aDogaXNGaXJzdERlcHRoTm9kZSh0aGlzLmVsZW1lbnQuaWQsIGFjdGl2ZU5vZGVJZCwgcGFyZW50KVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBvbkNvbnRleHRDaGFuZ2VkKFxuICAgICAgICB2YWx1ZTogUGxhaXRQbHVnaW5FbGVtZW50Q29udGV4dDxGb3JjZUF0bGFzTm9kZUVsZW1lbnQsIFBsYWl0Qm9hcmQ+LFxuICAgICAgICBwcmV2aW91czogUGxhaXRQbHVnaW5FbGVtZW50Q29udGV4dDxGb3JjZUF0bGFzTm9kZUVsZW1lbnQsIFBsYWl0Qm9hcmQ+XG4gICAgKSB7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gcHJldmlvdXMgJiYgdmFsdWUuc2VsZWN0ZWQgIT09IHByZXZpb3VzLnNlbGVjdGVkKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnQgPSB2YWx1ZS5wYXJlbnQgYXMgYW55O1xuICAgICAgICAgICAgaWYgKHZhbHVlLnNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgY2FjaGVTZWxlY3RlZEVsZW1lbnRzKHRoaXMuYm9hcmQsIFt2YWx1ZS5lbGVtZW50XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RFbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHModGhpcy5ib2FyZCk7XG4gICAgICAgICAgICBjb25zdCBhc3NvY2lhdGVkTm9kZXMgPSBnZXRBc3NvY2lhdGVkTm9kZXNCeUlkKHZhbHVlLmVsZW1lbnQuaWQsIHBhcmVudCk7XG4gICAgICAgICAgICBhc3NvY2lhdGVkTm9kZXMuZm9yRWFjaChub2RlID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBub2RlR2VuZXJhdG9yID0gZ2V0Tm9kZUdlbmVyYXRvcihub2RlKTtcbiAgICAgICAgICAgICAgICBub2RlR2VuZXJhdG9yLmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICBub2RlR2VuZXJhdG9yLnByb2Nlc3NEcmF3aW5nKG5vZGUsIHRoaXMuZ2V0RWxlbWVudEcoKSwge1xuICAgICAgICAgICAgICAgICAgICBpc0FjdGl2ZTogc2VsZWN0RWxlbWVudHM/LlswXT8uaWQgPT09IG5vZGUuaWQsXG4gICAgICAgICAgICAgICAgICAgIGlzRmlyc3REZXB0aDogc2VsZWN0RWxlbWVudHMubGVuZ3RoID4gMCAmJiBpc0ZpcnN0RGVwdGhOb2RlKG5vZGUuaWQsIHNlbGVjdEVsZW1lbnRzWzBdLmlkLCBwYXJlbnQpXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgY29uc3QgYXNzb2NpYXRlZEVkZ2VzID0gZ2V0RWRnZXNJblNvdXJjZU9yVGFyZ2V0KHZhbHVlLmVsZW1lbnQuaWQsIHBhcmVudCk7XG4gICAgICAgICAgICBhc3NvY2lhdGVkRWRnZXMuZm9yRWFjaChlZGdlID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBlZGdlR2VuZXJhdG9yID0gZ2V0RWRnZUdlbmVyYXRvcihlZGdlKTtcbiAgICAgICAgICAgICAgICBlZGdlR2VuZXJhdG9yLmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICBlZGdlR2VuZXJhdG9yLnByb2Nlc3NEcmF3aW5nKGVkZ2UsIFBsYWl0Qm9hcmQuZ2V0RWxlbWVudExvd2VySG9zdCh0aGlzLmJvYXJkKSwgZ2V0RWRnZUdlbmVyYXRvckRhdGEoZWRnZSwgdGhpcy5ib2FyZCkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGVUZXh0KHByZXZpb3VzRWxlbWVudDogRm9yY2VBdGxhc05vZGVFbGVtZW50LCBjdXJyZW50RWxlbWVudDogRm9yY2VBdGxhc05vZGVFbGVtZW50KSB7fVxuXG4gICAgZGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgc3VwZXIuZGVzdHJveSgpO1xuICAgIH1cbn1cbiJdfQ==
57
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS5mbGF2b3VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvZ3JhcGgtdml6L3NyYy9mb3JjZS1hdGxhcy9ub2RlLmZsYXZvdXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JELE9BQU8sRUFFSCxVQUFVLEVBQ1YsU0FBUyxFQUVULHFCQUFxQixFQUNyQixtQkFBbUIsRUFDdEIsTUFBTSxhQUFhLENBQUM7QUFHckIsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDdEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLG9CQUFvQixFQUFFLHdCQUF3QixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ2hHLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxRQUFRLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDNUUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRXRELE1BQU0sT0FBTyxxQkFBc0IsU0FBUSxvQkFBdUQ7SUFLOUY7UUFDSSxLQUFLLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRCxtQkFBbUI7UUFDZixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksdUJBQXVCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxZQUFZLENBQUMsdUJBQXVCLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNoRixDQUFDO0lBRUQsVUFBVTtRQUNOLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNuQixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUMzQixNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBc0IsQ0FBQztRQUNoSCxNQUFNLGNBQWMsR0FBRyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkQsTUFBTSxZQUFZLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUMzQyxNQUFNLFFBQVEsR0FBRyxZQUFZLEtBQUssSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDbEQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRTtZQUN6SCxRQUFRO1lBQ1IsT0FBTyxFQUFFLGdCQUFnQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyx1QkFBdUI7U0FDakcsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELGdCQUFnQixDQUNaLEtBQW1FLEVBQ25FLFFBQXNFO1FBRXRFLElBQUksS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsUUFBUSxLQUFLLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUM3RCxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBYSxDQUFDO1lBQ25DLElBQUksS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNqQixxQkFBcUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDdkQsQ0FBQztZQUNELE1BQU0sY0FBYyxHQUFHLG1CQUFtQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN2RCxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDL0IsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDakIsTUFBTSxhQUFhLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzdDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDeEIsTUFBTSxZQUFZLEdBQUcsY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUMxRyxhQUFhLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUU7b0JBQ25ELFFBQVEsRUFBRSxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEtBQUssSUFBSSxDQUFDLEVBQUU7b0JBQzdDLE9BQU8sRUFBRSxjQUFjLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsdUJBQXVCO2lCQUN4RixDQUFDLENBQUM7WUFDUCxDQUFDLENBQUMsQ0FBQztZQUVILE1BQU0sZUFBZSxHQUFHLHdCQUF3QixDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQzNFLGVBQWUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQzNCLE1BQU0sYUFBYSxHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUM3QyxhQUFhLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ3hCLGFBQWEsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsb0JBQW9CLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQzNILENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQztJQUNMLENBQUM7SUFFRCxVQUFVLENBQUMsZUFBc0MsRUFBRSxjQUFxQyxJQUFHLENBQUM7SUFFNUYsT0FBTztRQUNILEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNwQixDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25FbGVtZW50Rmxhdm91ciB9IGZyb20gJ0BwbGFpdC9jb21tb24nO1xuaW1wb3J0IHtcbiAgICBPbkNvbnRleHRDaGFuZ2VkLFxuICAgIFBsYWl0Qm9hcmQsXG4gICAgUGxhaXROb2RlLFxuICAgIFBsYWl0UGx1Z2luRWxlbWVudENvbnRleHQsXG4gICAgY2FjaGVTZWxlY3RlZEVsZW1lbnRzLFxuICAgIGdldFNlbGVjdGVkRWxlbWVudHNcbn0gZnJvbSAnQHBsYWl0L2NvcmUnO1xuaW1wb3J0IEdyYXBoIGZyb20gJ2dyYXBob2xvZ3knO1xuaW1wb3J0IHsgRm9yY2VBdGxhc0VsZW1lbnQsIEZvcmNlQXRsYXNOb2RlRWxlbWVudCB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgRm9yY2VBdGxhc05vZGVHZW5lcmF0b3IgfSBmcm9tICcuL2dlbmVyYXRvcnMvbm9kZS5nZW5lcmF0b3InO1xuaW1wb3J0IHsgZ2V0RWRnZUdlbmVyYXRvciwgZ2V0RWRnZUdlbmVyYXRvckRhdGEsIGdldEVkZ2VzSW5Tb3VyY2VPclRhcmdldCB9IGZyb20gJy4vdXRpbHMvZWRnZSc7XG5pbXBvcnQgeyBnZXROb2RlR2VuZXJhdG9yLCBnZXROb2RlcywgaXNGaXJzdERlcHRoTm9kZSB9IGZyb20gJy4vdXRpbHMvbm9kZSc7XG5pbXBvcnQgeyBTRUNPTkRfREVQVEhfTk9ERV9BTFBIQSB9IGZyb20gJy4vY29uc3RhbnRzJztcblxuZXhwb3J0IGNsYXNzIEZvcmNlQXRsYXNOb2RlRmxhdm91ciBleHRlbmRzIENvbW1vbkVsZW1lbnRGbGF2b3VyPEZvcmNlQXRsYXNOb2RlRWxlbWVudCwgUGxhaXRCb2FyZD5cbiAgICBpbXBsZW1lbnRzIE9uQ29udGV4dENoYW5nZWQ8Rm9yY2VBdGxhc05vZGVFbGVtZW50LCBQbGFpdEJvYXJkPiB7XG4gICAgZ3JhcGghOiBHcmFwaDxOb2RlPjtcbiAgICBub2RlR2VuZXJhdG9yITogRm9yY2VBdGxhc05vZGVHZW5lcmF0b3I7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICBpbml0aWFsaXplR2VuZXJhdG9yKCkge1xuICAgICAgICB0aGlzLm5vZGVHZW5lcmF0b3IgPSBuZXcgRm9yY2VBdGxhc05vZGVHZW5lcmF0b3IodGhpcy5ib2FyZCk7XG4gICAgICAgIHRoaXMuZ2V0UmVmKCkuYWRkR2VuZXJhdG9yKEZvcmNlQXRsYXNOb2RlR2VuZXJhdG9yLmtleSwgdGhpcy5ub2RlR2VuZXJhdG9yKTtcbiAgICB9XG5cbiAgICBpbml0aWFsaXplKCk6IHZvaWQge1xuICAgICAgICBzdXBlci5pbml0aWFsaXplKCk7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZUdlbmVyYXRvcigpO1xuICAgICAgICBjb25zdCBwYXJlbnQgPSBQbGFpdE5vZGUucGFyZW50KHRoaXMuYm9hcmQsIFBsYWl0Qm9hcmQuZmluZFBhdGgodGhpcy5ib2FyZCwgdGhpcy5lbGVtZW50KSkgYXMgRm9yY2VBdGxhc0VsZW1lbnQ7XG4gICAgICAgIGNvbnN0IHNlbGVjdEVsZW1lbnRzID0gZ2V0U2VsZWN0ZWRFbGVtZW50cyh0aGlzLmJvYXJkKTtcbiAgICAgICAgY29uc3QgYWN0aXZlTm9kZUlkID0gc2VsZWN0RWxlbWVudHNbMF0/LmlkO1xuICAgICAgICBjb25zdCBpc0FjdGl2ZSA9IGFjdGl2ZU5vZGVJZCA9PT0gdGhpcy5lbGVtZW50LmlkO1xuICAgICAgICB0aGlzLm5vZGVHZW5lcmF0b3IucHJvY2Vzc0RyYXdpbmcodGhpcy5lbGVtZW50LCBpc0FjdGl2ZSA/IFBsYWl0Qm9hcmQuZ2V0RWxlbWVudEFjdGl2ZUhvc3QodGhpcy5ib2FyZCkgOiB0aGlzLmdldEVsZW1lbnRHKCksIHtcbiAgICAgICAgICAgIGlzQWN0aXZlLFxuICAgICAgICAgICAgb3BhY2l0eTogaXNGaXJzdERlcHRoTm9kZSh0aGlzLmVsZW1lbnQuaWQsIGFjdGl2ZU5vZGVJZCwgcGFyZW50KSA/IDEgOiBTRUNPTkRfREVQVEhfTk9ERV9BTFBIQVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBvbkNvbnRleHRDaGFuZ2VkKFxuICAgICAgICB2YWx1ZTogUGxhaXRQbHVnaW5FbGVtZW50Q29udGV4dDxGb3JjZUF0bGFzTm9kZUVsZW1lbnQsIFBsYWl0Qm9hcmQ+LFxuICAgICAgICBwcmV2aW91czogUGxhaXRQbHVnaW5FbGVtZW50Q29udGV4dDxGb3JjZUF0bGFzTm9kZUVsZW1lbnQsIFBsYWl0Qm9hcmQ+XG4gICAgKSB7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gcHJldmlvdXMgJiYgdmFsdWUuc2VsZWN0ZWQgIT09IHByZXZpb3VzLnNlbGVjdGVkKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnQgPSB2YWx1ZS5wYXJlbnQgYXMgYW55O1xuICAgICAgICAgICAgaWYgKHZhbHVlLnNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgY2FjaGVTZWxlY3RlZEVsZW1lbnRzKHRoaXMuYm9hcmQsIFt2YWx1ZS5lbGVtZW50XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RFbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHModGhpcy5ib2FyZCk7XG4gICAgICAgICAgICBjb25zdCBub2RlcyA9IGdldE5vZGVzKHBhcmVudCk7XG4gICAgICAgICAgICBub2Rlcy5mb3JFYWNoKG5vZGUgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVHZW5lcmF0b3IgPSBnZXROb2RlR2VuZXJhdG9yKG5vZGUpO1xuICAgICAgICAgICAgICAgIG5vZGVHZW5lcmF0b3IuZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzRmlyc3REZXB0aCA9IHNlbGVjdEVsZW1lbnRzLmxlbmd0aCA+IDAgJiYgaXNGaXJzdERlcHRoTm9kZShub2RlLmlkLCBzZWxlY3RFbGVtZW50c1swXS5pZCwgcGFyZW50KTtcbiAgICAgICAgICAgICAgICBub2RlR2VuZXJhdG9yLnByb2Nlc3NEcmF3aW5nKG5vZGUsIHRoaXMuZ2V0RWxlbWVudEcoKSwge1xuICAgICAgICAgICAgICAgICAgICBpc0FjdGl2ZTogc2VsZWN0RWxlbWVudHM/LlswXT8uaWQgPT09IG5vZGUuaWQsXG4gICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6IHNlbGVjdEVsZW1lbnRzLmxlbmd0aCA9PT0gMCA/IDEgOiBpc0ZpcnN0RGVwdGggPyAxIDogU0VDT05EX0RFUFRIX05PREVfQUxQSEFcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBjb25zdCBhc3NvY2lhdGVkRWRnZXMgPSBnZXRFZGdlc0luU291cmNlT3JUYXJnZXQodmFsdWUuZWxlbWVudC5pZCwgcGFyZW50KTtcbiAgICAgICAgICAgIGFzc29jaWF0ZWRFZGdlcy5mb3JFYWNoKGVkZ2UgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVkZ2VHZW5lcmF0b3IgPSBnZXRFZGdlR2VuZXJhdG9yKGVkZ2UpO1xuICAgICAgICAgICAgICAgIGVkZ2VHZW5lcmF0b3IuZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgIGVkZ2VHZW5lcmF0b3IucHJvY2Vzc0RyYXdpbmcoZWRnZSwgUGxhaXRCb2FyZC5nZXRFbGVtZW50TG93ZXJIb3N0KHRoaXMuYm9hcmQpLCBnZXRFZGdlR2VuZXJhdG9yRGF0YShlZGdlLCB0aGlzLmJvYXJkKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHVwZGF0ZVRleHQocHJldmlvdXNFbGVtZW50OiBGb3JjZUF0bGFzTm9kZUVsZW1lbnQsIGN1cnJlbnRFbGVtZW50OiBGb3JjZUF0bGFzTm9kZUVsZW1lbnQpIHt9XG5cbiAgICBkZXN0cm95KCk6IHZvaWQge1xuICAgICAgICBzdXBlci5kZXN0cm95KCk7XG4gICAgfVxufVxuIl19
@@ -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/OiBzdHJpbmc7XG4gICAgYm9yZGVyUmFkaXVzPzogbnVtYmVyO1xuICAgIGhvdmVyU3Ryb2tlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVkZ2VHZW5lcmF0b3JEYXRhIGV4dGVuZHMgR2VuZXJhdG9yRXh0cmFEYXRhIHtcbiAgICBzdGFydFBvaW50OiBQb2ludDtcbiAgICBlbmRQb2ludDogUG9pbnQ7XG4gICAgaXNTb3VyY2VBY3RpdmU6IGJvb2xlYW47XG4gICAgaXNUYXJnZXRBY3RpdmU6IGJvb2xlYW47XG4gICAgZGlyZWN0aW9uOiBFZGdlRGlyZWN0aW9uO1xuICAgIGlzVGFyZ2V0U2VsZj86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTm9kZUdlbmVyYXRvckRhdGEgZXh0ZW5kcyBHZW5lcmF0b3JFeHRyYURhdGEge1xuICAgIGlzQWN0aXZlOiBib29sZWFuO1xuICAgIGlzRmlyc3REZXB0aDogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOb2RlSWNvbkl0ZW0ge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBmb250U2l6ZT86IG51bWJlcjtcbiAgICBjb2xvcj86IHN0cmluZztcbn1cbiJdfQ==
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9ncmFwaC12aXovc3JjL2ZvcmNlLWF0bGFzL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE1BQU0sQ0FBTixJQUFZLGFBSVg7QUFKRCxXQUFZLGFBQWE7SUFDckIsNkNBQUUsQ0FBQTtJQUNGLCtDQUFHLENBQUE7SUFDSCxpREFBSSxDQUFBO0FBQ1IsQ0FBQyxFQUpXLGFBQWEsS0FBYixhQUFhLFFBSXhCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgR2VuZXJhdG9yRXh0cmFEYXRhIH0gZnJvbSAnQHBsYWl0L2NvbW1vbic7XG5pbXBvcnQgeyBQb2ludCB9IGZyb20gJ0BwbGFpdC9jb3JlJztcblxuZXhwb3J0IGVudW0gRWRnZURpcmVjdGlvbiB7XG4gICAgSU4sXG4gICAgT1VULFxuICAgIE5PTkVcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOb2RlU3R5bGVzIHtcbiAgICBzdHJva2U/OiBzdHJpbmc7XG4gICAgc3Ryb2tlV2lkdGg/OiBudW1iZXI7XG4gICAgZmlsbD86IHN0cmluZztcbiAgICBmaWxsU3R5bGU/OiBzdHJpbmc7XG4gICAgYWN0aXZlU3Ryb2tlPzogc3RyaW5nO1xuICAgIGFjdGl2ZUZpbGw/OiBzdHJpbmc7XG4gICAgYm9yZGVyUmFkaXVzPzogbnVtYmVyO1xuICAgIGhvdmVyU3Ryb2tlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVkZ2VHZW5lcmF0b3JEYXRhIGV4dGVuZHMgR2VuZXJhdG9yRXh0cmFEYXRhIHtcbiAgICBzdGFydFBvaW50OiBQb2ludDtcbiAgICBlbmRQb2ludDogUG9pbnQ7XG4gICAgaXNTb3VyY2VBY3RpdmU6IGJvb2xlYW47XG4gICAgaXNUYXJnZXRBY3RpdmU6IGJvb2xlYW47XG4gICAgZGlyZWN0aW9uOiBFZGdlRGlyZWN0aW9uO1xuICAgIGlzVGFyZ2V0U2VsZj86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTm9kZUdlbmVyYXRvckRhdGEgZXh0ZW5kcyBHZW5lcmF0b3JFeHRyYURhdGEge1xuICAgIGlzQWN0aXZlOiBib29sZWFuO1xuICAgIG9wYWNpdHk6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOb2RlSWNvbkl0ZW0ge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBmb250U2l6ZT86IG51bWJlcjtcbiAgICBjb2xvcj86IHN0cmluZztcbn1cbiJdfQ==
@@ -1,7 +1,7 @@
1
1
  import { EdgeDirection } from '../types';
2
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_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';
4
+ import { ACTIVE_BACKGROUND_NODE_ALPHA, DEFAULT_ACTIVE_NODE_SIZE_MULTIPLIER, DEFAULT_ACTIVE_WAVE_NODE_SIZE_MULTIPLIER, DEFAULT_EDGE_PARTICLE_SIZE, 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 } 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);
@@ -15,9 +15,6 @@ export function drawNode(board, node, point, options) {
15
15
  diameter = diameter * DEFAULT_ACTIVE_NODE_SIZE_MULTIPLIER;
16
16
  }
17
17
  const nodeG = drawCircle(roughSVG, [x, y], diameter, nodeStyles);
18
- if (options.iconG) {
19
- nodeG.append(options.iconG);
20
- }
21
18
  const labelWidth = node.styles?.labelWidth ?? DEFAULT_NODE_LABEL_WIDTH;
22
19
  const labelHeight = node.styles?.labelHeight ?? DEFAULT_NODE_LABEL_HEIGHT;
23
20
  const textForeignObject = createForeignObject(x - labelWidth / 2, y, labelWidth, labelHeight);
@@ -36,10 +33,11 @@ export function drawNode(board, node, point, options) {
36
33
  textForeignObject.setAttribute('y', `${y + waveDiameter / 2}`);
37
34
  }
38
35
  else {
39
- if (!options.isFirstDepth) {
40
- nodeG.setAttribute('opacity', SECOND_DEPTH_NODE_ALPHA.toString());
41
- }
42
36
  textForeignObject.setAttribute('y', `${y + diameter / 2}`);
37
+ nodeG.setAttribute('opacity', (options.opacity ?? 1).toString());
38
+ }
39
+ if (options.iconG) {
40
+ nodeG.append(options.iconG);
43
41
  }
44
42
  nodeG.append(textForeignObject);
45
43
  return nodeG;
@@ -59,16 +57,21 @@ export function drawEdge(startPoint, endPoint, direction, isMutual, isTargetSelf
59
57
  path.setAttribute('d', `M${sx},${sy} Q${cx},${cy} ${ex},${ey}`);
60
58
  }
61
59
  else {
60
+ const x = startPoint[0];
61
+ const y = startPoint[1];
62
+ const besselX = 40;
63
+ const besselY = 75;
62
64
  const angle = 55;
63
65
  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}`);
66
+ const offsetX = nodeRadius * Math.cos(angleRad);
67
+ const offsetY = nodeRadius * Math.sin(angleRad);
68
+ path.setAttribute('d', `M ${x - offsetX},${y - offsetY}
69
+ C ${x - besselX},${y - besselY}, ${x + besselX} ${y - besselY}
70
+ ${x + offsetX},${y - offsetY}`);
69
71
  }
70
72
  path.setAttribute('fill', 'none');
71
73
  path.setAttribute('stroke', DEFAULT_LINE_STYLES.color[direction]);
74
+ path.setAttribute('opacity', DEFAULT_LINE_STYLES.opacity.toString());
72
75
  g.append(path);
73
76
  return {
74
77
  g,
@@ -77,7 +80,7 @@ export function drawEdge(startPoint, endPoint, direction, isMutual, isTargetSelf
77
80
  }
78
81
  export function drawParticle(board, startPoint, direction) {
79
82
  const roughSVG = PlaitBoard.getRoughSVG(board);
80
- const pointG = drawCircle(roughSVG, [0, 0], 5, {
83
+ const pointG = drawCircle(roughSVG, [0, 0], DEFAULT_EDGE_PARTICLE_SIZE, {
81
84
  ...DEFAULT_STYLES,
82
85
  strokeWidth: 0,
83
86
  fill: DEFAULT_LINE_STYLES.color[direction]
@@ -85,4 +88,4 @@ export function drawParticle(board, startPoint, direction) {
85
88
  pointG.setAttribute('transform', `translate(${startPoint[0]}, ${startPoint[1]})`);
86
89
  return pointG;
87
90
  }
88
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhdy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2dyYXBoLXZpei9zcmMvZm9yY2UtYXRsYXMvdXRpbHMvZHJhdy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFjLE1BQU0sVUFBVSxDQUFDO0FBQ3JELE9BQU8sRUFBRSxVQUFVLEVBQVMsbUJBQW1CLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsY0FBYyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3RILE9BQU8sUUFBUSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3RELE9BQU8sRUFDSCw0QkFBNEIsRUFDNUIsbUNBQW1DLEVBQ25DLHdDQUF3QyxFQUN4QyxtQkFBbUIsRUFDbkIseUJBQXlCLEVBQ3pCLHdCQUF3QixFQUN4Qix3QkFBd0IsRUFDeEIsaUJBQWlCLEVBQ2pCLG1CQUFtQixFQUNuQixxQkFBcUIsRUFDckIsdUJBQXVCLEVBQzFCLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUd6RCxNQUFNLFVBQVUsUUFBUSxDQUNwQixLQUFpQixFQUNqQixJQUEyQixFQUMzQixLQUFZLEVBQ1osT0FBMEU7SUFFMUUsTUFBTSxRQUFRLEdBQUcsVUFBVSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvQyxNQUFNLFVBQVUsR0FBZTtRQUMzQixHQUFHLG1CQUFtQjtRQUN0QixHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUM7S0FDekIsQ0FBQztJQUNGLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3JDLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLElBQUksaUJBQWlCLENBQUM7SUFDOUMsSUFBSSxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDbkIsUUFBUSxHQUFHLFFBQVEsR0FBRyxtQ0FBbUMsQ0FBQztJQUM5RCxDQUFDO0lBQ0QsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDakUsSUFBSSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDaEIsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUNELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsVUFBVSxJQUFJLHdCQUF3QixDQUFDO0lBQ3ZFLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsV0FBVyxJQUFJLHlCQUF5QixDQUFDO0lBQzFFLE1BQU0saUJBQWlCLEdBQUcsbUJBQW1CLENBQUMsQ0FBQyxHQUFHLFVBQVUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUM5RixNQUFNLGFBQWEsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3BELGFBQWEsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDLENBQUM7SUFDbkQsYUFBYSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsd0JBQXdCLENBQUMsQ0FBQztJQUM5RCxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzVDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztJQUM1QixhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzNCLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUN4QyxJQUFJLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNuQixNQUFNLFlBQVksR0FBRyxRQUFRLEdBQUcsd0NBQXdDLENBQUM7UUFDekUsTUFBTSxVQUFVLEdBQUcsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxZQUFZLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDMUUsVUFBVSxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsNEJBQTRCLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUM1RSxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3pCLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsWUFBWSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDbkUsQ0FBQztTQUFNLENBQUM7UUFDSixJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3hCLEtBQUssQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLHVCQUF1QixDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDdEUsQ0FBQztRQUNELGlCQUFpQixDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsUUFBUSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUNELEtBQUssQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUNoQyxPQUFPLEtBQUssQ0FBQztBQUNqQixDQUFDO0FBRUQsTUFBTSxVQUFVLFFBQVEsQ0FBQyxVQUFpQixFQUFFLFFBQWUsRUFBRSxTQUF3QixFQUFFLFFBQWlCLEVBQUUsWUFBc0I7SUFDNUgsTUFBTSxVQUFVLEdBQUcsaUJBQWlCLEdBQUcsQ0FBQyxDQUFDO0lBQ3pDLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUU7UUFDM0UsT0FBTyxFQUFFLEdBQUc7UUFDWixJQUFJLEVBQUUsU0FBUyxLQUFLLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsUUFBUTtRQUN6RCxNQUFNLEVBQUUsVUFBVTtRQUNsQixRQUFRLEVBQUUsVUFBVTtLQUN2QixDQUFDLENBQUM7SUFDSCxNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDbkQsTUFBTSxDQUFDLEdBQUcsT0FBTyxFQUFFLENBQUM7SUFDcEIsTUFBTSxJQUFJLEdBQUcsVUFBVSxFQUFFLENBQUM7SUFDMUIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ2hCLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3BFLENBQUM7U0FBTSxDQUFDO1FBQ0osTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ2pCLE1BQU0sUUFBUSxHQUFHLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDekMsTUFBTSxDQUFDLEdBQUcsVUFBVSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDMUMsTUFBTSxDQUFDLEdBQUcsVUFBVSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLFlBQVksQ0FDYixHQUFHLEVBQ0gsTUFBTSxDQUFDLEtBQUssQ0FBQzs7Y0FFWCxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQ2QsQ0FBQztJQUNOLENBQUM7SUFDRCxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNsQyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUNsRSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2YsT0FBTztRQUNILENBQUM7UUFDRCxJQUFJO0tBQ1AsQ0FBQztBQUNOLENBQUM7QUFFRCxNQUFNLFVBQVUsWUFBWSxDQUFDLEtBQWlCLEVBQUUsVUFBaUIsRUFBRSxTQUF3QjtJQUN2RixNQUFNLFFBQVEsR0FBRyxVQUFVLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9DLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO1FBQzNDLEdBQUcsY0FBYztRQUNqQixXQUFXLEVBQUUsQ0FBQztRQUNkLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDO0tBQzdDLENBQUMsQ0FBQztJQUNILE1BQU0sQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLGFBQWEsVUFBVSxDQUFDLENBQUMsQ0FBQyxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbEYsT0FBTyxNQUFNLENBQUM7QUFDbEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVkZ2VEaXJlY3Rpb24sIE5vZGVTdHlsZXMgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBQbGFpdEJvYXJkLCBQb2ludCwgY3JlYXRlRm9yZWlnbk9iamVjdCwgY3JlYXRlRywgY3JlYXRlUGF0aCwgZHJhd0NpcmNsZSwgbm9ybWFsaXplUG9pbnQgfSBmcm9tICdAcGxhaXQvY29yZSc7XG5pbXBvcnQgZ2V0QXJyb3cgZnJvbSAnLi4vLi4vcGVyZmVjdC1hcnJvd3MvZ2V0LWFycm93JztcbmltcG9ydCB7XG4gICAgQUNUSVZFX0JBQ0tHUk9VTkRfTk9ERV9BTFBIQSxcbiAgICBERUZBVUxUX0FDVElWRV9OT0RFX1NJWkVfTVVMVElQTElFUixcbiAgICBERUZBVUxUX0FDVElWRV9XQVZFX05PREVfU0laRV9NVUxUSVBMSUVSLFxuICAgIERFRkFVTFRfTElORV9TVFlMRVMsXG4gICAgREVGQVVMVF9OT0RFX0xBQkVMX0hFSUdIVCxcbiAgICBERUZBVUxUX05PREVfTEFCRUxfU1RZTEUsXG4gICAgREVGQVVMVF9OT0RFX0xBQkVMX1dJRFRILFxuICAgIERFRkFVTFRfTk9ERV9TSVpFLFxuICAgIERFRkFVTFRfTk9ERV9TVFlMRVMsXG4gICAgTk9ERV9MQUJFTF9DTEFTU19OQU1FLFxuICAgIFNFQ09ORF9ERVBUSF9OT0RFX0FMUEhBXG59IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBERUZBVUxUX1NUWUxFUyB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy9kZWZhdWx0JztcbmltcG9ydCB7IEZvcmNlQXRsYXNOb2RlRWxlbWVudCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gZHJhd05vZGUoXG4gICAgYm9hcmQ6IFBsYWl0Qm9hcmQsXG4gICAgbm9kZTogRm9yY2VBdGxhc05vZGVFbGVtZW50LFxuICAgIHBvaW50OiBQb2ludCxcbiAgICBvcHRpb25zOiB7IGljb25HPzogU1ZHR0VsZW1lbnQ7IGlzQWN0aXZlOiBib29sZWFuOyBpc0ZpcnN0RGVwdGg6IGJvb2xlYW4gfVxuKSB7XG4gICAgY29uc3Qgcm91Z2hTVkcgPSBQbGFpdEJvYXJkLmdldFJvdWdoU1ZHKGJvYXJkKTtcbiAgICBjb25zdCBub2RlU3R5bGVzOiBOb2RlU3R5bGVzID0ge1xuICAgICAgICAuLi5ERUZBVUxUX05PREVfU1RZTEVTLFxuICAgICAgICAuLi4obm9kZS5zdHlsZXMgfHwge30pXG4gICAgfTtcbiAgICBsZXQgeyB4LCB5IH0gPSBub3JtYWxpemVQb2ludChwb2ludCk7XG4gICAgbGV0IGRpYW1ldGVyID0gbm9kZS5zaXplID8/IERFRkFVTFRfTk9ERV9TSVpFO1xuICAgIGlmIChvcHRpb25zLmlzQWN0aXZlKSB7XG4gICAgICAgIGRpYW1ldGVyID0gZGlhbWV0ZXIgKiBERUZBVUxUX0FDVElWRV9OT0RFX1NJWkVfTVVMVElQTElFUjtcbiAgICB9XG4gICAgY29uc3Qgbm9kZUcgPSBkcmF3Q2lyY2xlKHJvdWdoU1ZHLCBbeCwgeV0sIGRpYW1ldGVyLCBub2RlU3R5bGVzKTtcbiAgICBpZiAob3B0aW9ucy5pY29uRykge1xuICAgICAgICBub2RlRy5hcHBlbmQob3B0aW9ucy5pY29uRyk7XG4gICAgfVxuICAgIGNvbnN0IGxhYmVsV2lkdGggPSBub2RlLnN0eWxlcz8ubGFiZWxXaWR0aCA/PyBERUZBVUxUX05PREVfTEFCRUxfV0lEVEg7XG4gICAgY29uc3QgbGFiZWxIZWlnaHQgPSBub2RlLnN0eWxlcz8ubGFiZWxIZWlnaHQgPz8gREVGQVVMVF9OT0RFX0xBQkVMX0hFSUdIVDtcbiAgICBjb25zdCB0ZXh0Rm9yZWlnbk9iamVjdCA9IGNyZWF0ZUZvcmVpZ25PYmplY3QoeCAtIGxhYmVsV2lkdGggLyAyLCB5LCBsYWJlbFdpZHRoLCBsYWJlbEhlaWdodCk7XG4gICAgY29uc3QgdGV4dENvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRleHRDb250YWluZXIuY2xhc3NMaXN0LmFkZChOT0RFX0xBQkVMX0NMQVNTX05BTUUpO1xuICAgIHRleHRDb250YWluZXIuc2V0QXR0cmlidXRlKCdzdHlsZScsIERFRkFVTFRfTk9ERV9MQUJFTF9TVFlMRSk7XG4gICAgY29uc3QgdGV4dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICB0ZXh0LmlubmVyVGV4dCA9IG5vZGUubGFiZWw7XG4gICAgdGV4dENvbnRhaW5lci5hcHBlbmQodGV4dCk7XG4gICAgdGV4dEZvcmVpZ25PYmplY3QuYXBwZW5kKHRleHRDb250YWluZXIpO1xuICAgIGlmIChvcHRpb25zLmlzQWN0aXZlKSB7XG4gICAgICAgIGNvbnN0IHdhdmVEaWFtZXRlciA9IGRpYW1ldGVyICogREVGQVVMVF9BQ1RJVkVfV0FWRV9OT0RFX1NJWkVfTVVMVElQTElFUjtcbiAgICAgICAgY29uc3Qgd2F2ZUNpcmNsZSA9IGRyYXdDaXJjbGUocm91Z2hTVkcsIFt4LCB5XSwgd2F2ZURpYW1ldGVyLCBub2RlU3R5bGVzKTtcbiAgICAgICAgd2F2ZUNpcmNsZS5zZXRBdHRyaWJ1dGUoJ29wYWNpdHknLCBBQ1RJVkVfQkFDS0dST1VORF9OT0RFX0FMUEhBLnRvU3RyaW5nKCkpO1xuICAgICAgICBub2RlRy5hcHBlbmQod2F2ZUNpcmNsZSk7XG4gICAgICAgIHRleHRGb3JlaWduT2JqZWN0LnNldEF0dHJpYnV0ZSgneScsIGAke3kgKyB3YXZlRGlhbWV0ZXIgLyAyfWApO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICghb3B0aW9ucy5pc0ZpcnN0RGVwdGgpIHtcbiAgICAgICAgICAgIG5vZGVHLnNldEF0dHJpYnV0ZSgnb3BhY2l0eScsIFNFQ09ORF9ERVBUSF9OT0RFX0FMUEhBLnRvU3RyaW5nKCkpO1xuICAgICAgICB9XG4gICAgICAgIHRleHRGb3JlaWduT2JqZWN0LnNldEF0dHJpYnV0ZSgneScsIGAke3kgKyBkaWFtZXRlciAvIDJ9YCk7XG4gICAgfVxuICAgIG5vZGVHLmFwcGVuZCh0ZXh0Rm9yZWlnbk9iamVjdCk7XG4gICAgcmV0dXJuIG5vZGVHO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZHJhd0VkZ2Uoc3RhcnRQb2ludDogUG9pbnQsIGVuZFBvaW50OiBQb2ludCwgZGlyZWN0aW9uOiBFZGdlRGlyZWN0aW9uLCBpc011dHVhbDogYm9vbGVhbiwgaXNUYXJnZXRTZWxmPzogYm9vbGVhbikge1xuICAgIGNvbnN0IG5vZGVSYWRpdXMgPSBERUZBVUxUX05PREVfU0laRSAvIDI7XG4gICAgY29uc3QgYXJyb3cgPSBnZXRBcnJvdyhzdGFydFBvaW50WzBdLCBzdGFydFBvaW50WzFdLCBlbmRQb2ludFswXSwgZW5kUG9pbnRbMV0sIHtcbiAgICAgICAgc3RyZXRjaDogMC40LFxuICAgICAgICBmbGlwOiBkaXJlY3Rpb24gPT09IEVkZ2VEaXJlY3Rpb24uTk9ORSA/IGZhbHNlIDogaXNNdXR1YWwsXG4gICAgICAgIHBhZEVuZDogbm9kZVJhZGl1cyxcbiAgICAgICAgcGFkU3RhcnQ6IG5vZGVSYWRpdXNcbiAgICB9KTtcbiAgICBjb25zdCBbc3gsIHN5LCBjeCwgY3ksIGV4LCBleSwgYWUsIGFzLCBlY10gPSBhcnJvdztcbiAgICBjb25zdCBnID0gY3JlYXRlRygpO1xuICAgIGNvbnN0IHBhdGggPSBjcmVhdGVQYXRoKCk7XG4gICAgaWYgKCFpc1RhcmdldFNlbGYpIHtcbiAgICAgICAgcGF0aC5zZXRBdHRyaWJ1dGUoJ2QnLCBgTSR7c3h9LCR7c3l9IFEke2N4fSwke2N5fSAke2V4fSwke2V5fWApO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGFuZ2xlID0gNTU7XG4gICAgICAgIGNvbnN0IGFuZ2xlUmFkID0gKGFuZ2xlICogTWF0aC5QSSkgLyAxODA7XG4gICAgICAgIGNvbnN0IHggPSBub2RlUmFkaXVzICogTWF0aC5jb3MoYW5nbGVSYWQpO1xuICAgICAgICBjb25zdCB5ID0gbm9kZVJhZGl1cyAqIE1hdGguc2luKGFuZ2xlUmFkKTtcbiAgICAgICAgcGF0aC5zZXRBdHRyaWJ1dGUoXG4gICAgICAgICAgICAnZCcsXG4gICAgICAgICAgICBgTSAtJHt4fSwtJHt5fVxuICAgICAgICAgICAgQyAtNDUsLTg1LCA0NSAtODVcbiAgICAgICAgICAgICR7eH0sLSR7eX1gXG4gICAgICAgICk7XG4gICAgfVxuICAgIHBhdGguc2V0QXR0cmlidXRlKCdmaWxsJywgJ25vbmUnKTtcbiAgICBwYXRoLnNldEF0dHJpYnV0ZSgnc3Ryb2tlJywgREVGQVVMVF9MSU5FX1NUWUxFUy5jb2xvcltkaXJlY3Rpb25dKTtcbiAgICBnLmFwcGVuZChwYXRoKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBnLFxuICAgICAgICBwYXRoXG4gICAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRyYXdQYXJ0aWNsZShib2FyZDogUGxhaXRCb2FyZCwgc3RhcnRQb2ludDogUG9pbnQsIGRpcmVjdGlvbjogRWRnZURpcmVjdGlvbikge1xuICAgIGNvbnN0IHJvdWdoU1ZHID0gUGxhaXRCb2FyZC5nZXRSb3VnaFNWRyhib2FyZCk7XG4gICAgY29uc3QgcG9pbnRHID0gZHJhd0NpcmNsZShyb3VnaFNWRywgWzAsIDBdLCA1LCB7XG4gICAgICAgIC4uLkRFRkFVTFRfU1RZTEVTLFxuICAgICAgICBzdHJva2VXaWR0aDogMCxcbiAgICAgICAgZmlsbDogREVGQVVMVF9MSU5FX1NUWUxFUy5jb2xvcltkaXJlY3Rpb25dXG4gICAgfSk7XG4gICAgcG9pbnRHLnNldEF0dHJpYnV0ZSgndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgke3N0YXJ0UG9pbnRbMF19LCAke3N0YXJ0UG9pbnRbMV19KWApO1xuICAgIHJldHVybiBwb2ludEc7XG59XG4iXX0=
91
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhdy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2dyYXBoLXZpei9zcmMvZm9yY2UtYXRsYXMvdXRpbHMvZHJhdy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFjLE1BQU0sVUFBVSxDQUFDO0FBQ3JELE9BQU8sRUFBRSxVQUFVLEVBQVMsbUJBQW1CLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsY0FBYyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3RILE9BQU8sUUFBUSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3RELE9BQU8sRUFDSCw0QkFBNEIsRUFDNUIsbUNBQW1DLEVBQ25DLHdDQUF3QyxFQUN4QywwQkFBMEIsRUFDMUIsbUJBQW1CLEVBQ25CLHlCQUF5QixFQUN6Qix3QkFBd0IsRUFDeEIsd0JBQXdCLEVBQ3hCLGlCQUFpQixFQUNqQixtQkFBbUIsRUFDbkIscUJBQXFCLEVBRXhCLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUd6RCxNQUFNLFVBQVUsUUFBUSxDQUNwQixLQUFpQixFQUNqQixJQUEyQixFQUMzQixLQUFZLEVBQ1osT0FBcUU7SUFFckUsTUFBTSxRQUFRLEdBQUcsVUFBVSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvQyxNQUFNLFVBQVUsR0FBZTtRQUMzQixHQUFHLG1CQUFtQjtRQUN0QixHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUM7S0FDekIsQ0FBQztJQUNGLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3JDLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLElBQUksaUJBQWlCLENBQUM7SUFDOUMsSUFBSSxPQUFPLENBQUMsUUFBUSxFQUFFLENB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ZWN0aW9uLCBOb2RlU3R5bGVzIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgUGxhaXRCb2FyZCwgUG9pbnQsIGNyZWF0ZUZvcmVpZ25PYmplY3QsIGNyZWF0ZUcsIGNyZWF0ZVBhdGgsIGRyYXdDaXJjbGUsIG5vcm1hbGl6ZVBvaW50IH0gZnJvbSAnQHBsYWl0L2NvcmUnO1xuaW1wb3J0IGdldEFycm93IGZyb20gJy4uLy4uL3BlcmZlY3QtYXJyb3dzL2dldC1hcnJvdyc7XG5pbXBvcnQge1xuICAgIEFDVElWRV9CQUNLR1JPVU5EX05PREVfQUxQSEEsXG4gICAgREVGQVVMVF9BQ1RJVkVfTk9ERV9TSVpFX01VTFRJUExJRVIsXG4gICAgREVGQVVMVF9BQ1RJVkVfV0FWRV9OT0RFX1NJWkVfTVVMVElQTElFUixcbiAgICBERUZBVUxUX0VER0VfUEFSVElDTEVfU0laRSxcbiAgICBERUZBVUxUX0xJTkVfU1RZTEVTLFxuICAgIERFRkFVTFRfTk9ERV9MQUJFTF9IRUlHSFQsXG4gICAgREVGQVVMVF9OT0RFX0xBQkVMX1NUWUxFLFxuICAgIERFRkFVTFRfTk9ERV9MQUJFTF9XSURUSCxcbiAgICBERUZBVUxUX05PREVfU0laRSxcbiAgICBERUZBVUxUX05PREVfU1RZTEVTLFxuICAgIE5PREVfTEFCRUxfQ0xBU1NfTkFNRSxcbiAgICBTRUNPTkRfREVQVEhfTk9ERV9BTFBIQVxufSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgREVGQVVMVF9TVFlMRVMgfSBmcm9tICcuLi8uLi9jb25zdGFudHMvZGVmYXVsdCc7XG5pbXBvcnQgeyBGb3JjZUF0bGFzTm9kZUVsZW1lbnQgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGRyYXdOb2RlKFxuICAgIGJvYXJkOiBQbGFpdEJvYXJkLFxuICAgIG5vZGU6IEZvcmNlQXRsYXNOb2RlRWxlbWVudCxcbiAgICBwb2ludDogUG9pbnQsXG4gICAgb3B0aW9uczogeyBpY29uRz86IFNWR0dFbGVtZW50OyBpc0FjdGl2ZTogYm9vbGVhbjsgb3BhY2l0eT86IG51bWJlciB9XG4pIHtcbiAgICBjb25zdCByb3VnaFNWRyA9IFBsYWl0Qm9hcmQuZ2V0Um91Z2hTVkcoYm9hcmQpO1xuICAgIGNvbnN0IG5vZGVTdHlsZXM6IE5vZGVTdHlsZXMgPSB7XG4gICAgICAgIC4uLkRFRkFVTFRfTk9ERV9TVFlMRVMsXG4gICAgICAgIC4uLihub2RlLnN0eWxlcyB8fCB7fSlcbiAgICB9O1xuICAgIGxldCB7IHgsIHkgfSA9IG5vcm1hbGl6ZVBvaW50KHBvaW50KTtcbiAgICBsZXQgZGlhbWV0ZXIgPSBub2RlLnNpemUgPz8gREVGQVVMVF9OT0RFX1NJWkU7XG4gICAgaWYgKG9wdGlvbnMuaXNBY3RpdmUpIHtcbiAgICAgICAgZGlhbWV0ZXIgPSBkaWFtZXRlciAqIERFRkFVTFRfQUNUSVZFX05PREVfU0laRV9NVUxUSVBMSUVSO1xuICAgIH1cbiAgICBjb25zdCBub2RlRyA9IGRyYXdDaXJjbGUocm91Z2hTVkcsIFt4LCB5XSwgZGlhbWV0ZXIsIG5vZGVTdHlsZXMpO1xuICAgIGNvbnN0IGxhYmVsV2lkdGggPSBub2RlLnN0eWxlcz8ubGFiZWxXaWR0aCA/PyBERUZBVUxUX05PREVfTEFCRUxfV0lEVEg7XG4gICAgY29uc3QgbGFiZWxIZWlnaHQgPSBub2RlLnN0eWxlcz8ubGFiZWxIZWlnaHQgPz8gREVGQVVMVF9OT0RFX0xBQkVMX0hFSUdIVDtcbiAgICBjb25zdCB0ZXh0Rm9yZWlnbk9iamVjdCA9IGNyZWF0ZUZvcmVpZ25PYmplY3QoeCAtIGxhYmVsV2lkdGggLyAyLCB5LCBsYWJlbFdpZHRoLCBsYWJlbEhlaWdodCk7XG4gICAgY29uc3QgdGV4dENvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRleHRDb250YWluZXIuY2xhc3NMaXN0LmFkZChOT0RFX0xBQkVMX0NMQVNTX05BTUUpO1xuICAgIHRleHRDb250YWluZXIuc2V0QXR0cmlidXRlKCdzdHlsZScsIERFRkFVTFRfTk9ERV9MQUJFTF9TVFlMRSk7XG4gICAgY29uc3QgdGV4dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICB0ZXh0LmlubmVyVGV4dCA9IG5vZGUubGFiZWw7XG4gICAgdGV4dENvbnRhaW5lci5hcHBlbmQodGV4dCk7XG4gICAgdGV4dEZvcmVpZ25PYmplY3QuYXBwZW5kKHRleHRDb250YWluZXIpO1xuICAgIGlmIChvcHRpb25zLmlzQWN0aXZlKSB7XG4gICAgICAgIGNvbnN0IHdhdmVEaWFtZXRlciA9IGRpYW1ldGVyICogREVGQVVMVF9BQ1RJVkVfV0FWRV9OT0RFX1NJWkVfTVVMVElQTElFUjtcbiAgICAgICAgY29uc3Qgd2F2ZUNpcmNsZSA9IGRyYXdDaXJjbGUocm91Z2hTVkcsIFt4LCB5XSwgd2F2ZURpYW1ldGVyLCBub2RlU3R5bGVzKTtcbiAgICAgICAgd2F2ZUNpcmNsZS5zZXRBdHRyaWJ1dGUoJ29wYWNpdHknLCBBQ1RJVkVfQkFDS0dST1VORF9OT0RFX0FMUEhBLnRvU3RyaW5nKCkpO1xuICAgICAgICBub2RlRy5hcHBlbmQod2F2ZUNpcmNsZSk7XG4gICAgICAgIHRleHRGb3JlaWduT2JqZWN0LnNldEF0dHJpYnV0ZSgneScsIGAke3kgKyB3YXZlRGlhbWV0ZXIgLyAyfWApO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRleHRGb3JlaWduT2JqZWN0LnNldEF0dHJpYnV0ZSgneScsIGAke3kgKyBkaWFtZXRlciAvIDJ9YCk7XG4gICAgICAgIG5vZGVHLnNldEF0dHJpYnV0ZSgnb3BhY2l0eScsIChvcHRpb25zLm9wYWNpdHkgPz8gMSkudG9TdHJpbmcoKSk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmljb25HKSB7XG4gICAgICAgIG5vZGVHLmFwcGVuZChvcHRpb25zLmljb25HKTtcbiAgICB9XG4gICAgbm9kZUcuYXBwZW5kKHRleHRGb3JlaWduT2JqZWN0KTtcbiAgICByZXR1cm4gbm9kZUc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkcmF3RWRnZShzdGFydFBvaW50OiBQb2ludCwgZW5kUG9pbnQ6IFBvaW50LCBkaXJlY3Rpb246IEVkZ2VEaXJlY3Rpb24sIGlzTXV0dWFsOiBib29sZWFuLCBpc1RhcmdldFNlbGY/OiBib29sZWFuKSB7XG4gICAgY29uc3Qgbm9kZVJhZGl1cyA9IERFRkFVTFRfTk9ERV9TSVpFIC8gMjtcbiAgICBjb25zdCBhcnJvdyA9IGdldEFycm93KHN0YXJ0UG9pbnRbMF0sIHN0YXJ0UG9pbnRbMV0sIGVuZFBvaW50WzBdLCBlbmRQb2ludFsxXSwge1xuICAgICAgICBzdHJldGNoOiAwLjQsXG4gICAgICAgIGZsaXA6IGRpcmVjdGlvbiA9PT0gRWRnZURpcmVjdGlvbi5OT05FID8gZmFsc2UgOiBpc011dHVhbCxcbiAgICAgICAgcGFkRW5kOiBub2RlUmFkaXVzLFxuICAgICAgICBwYWRTdGFydDogbm9kZVJhZGl1c1xuICAgIH0pO1xuICAgIGNvbnN0IFtzeCwgc3ksIGN4LCBjeSwgZXgsIGV5LCBhZSwgYXMsIGVjXSA9IGFycm93O1xuICAgIGNvbnN0IGcgPSBjcmVhdGVHKCk7XG4gICAgY29uc3QgcGF0aCA9IGNyZWF0ZVBhdGgoKTtcbiAgICBpZiAoIWlzVGFyZ2V0U2VsZikge1xuICAgICAgICBwYXRoLnNldEF0dHJpYnV0ZSgnZCcsIGBNJHtzeH0sJHtzeX0gUSR7Y3h9LCR7Y3l9ICR7ZXh9LCR7ZXl9YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgeCA9IHN0YXJ0UG9pbnRbMF07XG4gICAgICAgIGNvbnN0IHkgPSBzdGFydFBvaW50WzFdO1xuICAgICAgICBjb25zdCBiZXNzZWxYID0gNDA7XG4gICAgICAgIGNvbnN0IGJlc3NlbFkgPSA3NTtcbiAgICAgICAgY29uc3QgYW5nbGUgPSA1NTtcbiAgICAgICAgY29uc3QgYW5nbGVSYWQgPSAoYW5nbGUgKiBNYXRoLlBJKSAvIDE4MDtcbiAgICAgICAgY29uc3Qgb2Zmc2V0WCA9IG5vZGVSYWRpdXMgKiBNYXRoLmNvcyhhbmdsZVJhZCk7XG4gICAgICAgIGNvbnN0IG9mZnNldFkgPSBub2RlUmFkaXVzICogTWF0aC5zaW4oYW5nbGVSYWQpO1xuICAgICAgICBwYXRoLnNldEF0dHJpYnV0ZShcbiAgICAgICAgICAgICdkJyxcbiAgICAgICAgICAgIGBNICR7eCAtIG9mZnNldFh9LCR7eSAtIG9mZnNldFl9XG4gICAgICAgICAgICBDICR7eCAtIGJlc3NlbFh9LCR7eSAtIGJlc3NlbFl9LCAke3ggKyBiZXNzZWxYfSAke3kgLSBiZXNzZWxZfVxuICAgICAgICAgICAgJHt4ICsgb2Zmc2V0WH0sJHt5IC0gb2Zmc2V0WX1gXG4gICAgICAgICk7XG4gICAgfVxuICAgIHBhdGguc2V0QXR0cmlidXRlKCdmaWxsJywgJ25vbmUnKTtcbiAgICBwYXRoLnNldEF0dHJpYnV0ZSgnc3Ryb2tlJywgREVGQVVMVF9MSU5FX1NUWUxFUy5jb2xvcltkaXJlY3Rpb25dKTtcbiAgICBwYXRoLnNldEF0dHJpYnV0ZSgnb3BhY2l0eScsIERFRkFVTFRfTElORV9TVFlMRVMub3BhY2l0eS50b1N0cmluZygpKTtcbiAgICBnLmFwcGVuZChwYXRoKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBnLFxuICAgICAgICBwYXRoXG4gICAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRyYXdQYXJ0aWNsZShib2FyZDogUGxhaXRCb2FyZCwgc3RhcnRQb2ludDogUG9pbnQsIGRpcmVjdGlvbjogRWRnZURpcmVjdGlvbikge1xuICAgIGNvbnN0IHJvdWdoU1ZHID0gUGxhaXRCb2FyZC5nZXRSb3VnaFNWRyhib2FyZCk7XG4gICAgY29uc3QgcG9pbnRHID0gZHJhd0NpcmNsZShyb3VnaFNWRywgWzAsIDBdLCBERUZBVUxUX0VER0VfUEFSVElDTEVfU0laRSwge1xuICAgICAgICAuLi5ERUZBVUxUX1NUWUxFUyxcbiAgICAgICAgc3Ryb2tlV2lkdGg6IDAsXG4gICAgICAgIGZpbGw6IERFRkFVTFRfTElORV9TVFlMRVMuY29sb3JbZGlyZWN0aW9uXVxuICAgIH0pO1xuICAgIHBvaW50Ry5zZXRBdHRyaWJ1dGUoJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUoJHtzdGFydFBvaW50WzBdfSwgJHtzdGFydFBvaW50WzFdfSlgKTtcbiAgICByZXR1cm4gcG9pbnRHO1xufVxuIl19
@@ -25,7 +25,7 @@ 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;
28
+ const DEFAULT_NODE_LABEL_WIDTH = 72;
29
29
  const DEFAULT_NODE_LABEL_HEIGHT = 22;
30
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
31
  const NODE_LABEL_CLASS_NAME = 'force-atlas-node-label';
@@ -48,9 +48,11 @@ const DEFAULT_LINE_STYLES = {
48
48
  color: {
49
49
  [EdgeDirection.IN]: '#73D897',
50
50
  [EdgeDirection.OUT]: '#6698FF',
51
- [EdgeDirection.NONE]: `#ddd`
52
- }
51
+ [EdgeDirection.NONE]: `#eee`
52
+ },
53
+ opacity: 0.4
53
54
  };
55
+ const DEFAULT_EDGE_PARTICLE_SIZE = 4;
54
56
 
55
57
  const ForceAtlasElement = {
56
58
  isForceAtlas: (value) => {
@@ -323,9 +325,6 @@ function drawNode(board, node, point, options) {
323
325
  diameter = diameter * DEFAULT_ACTIVE_NODE_SIZE_MULTIPLIER;
324
326
  }
325
327
  const nodeG = drawCircle(roughSVG, [x, y], diameter, nodeStyles);
326
- if (options.iconG) {
327
- nodeG.append(options.iconG);
328
- }
329
328
  const labelWidth = node.styles?.labelWidth ?? DEFAULT_NODE_LABEL_WIDTH;
330
329
  const labelHeight = node.styles?.labelHeight ?? DEFAULT_NODE_LABEL_HEIGHT;
331
330
  const textForeignObject = createForeignObject(x - labelWidth / 2, y, labelWidth, labelHeight);
@@ -344,10 +343,11 @@ function drawNode(board, node, point, options) {
344
343
  textForeignObject.setAttribute('y', `${y + waveDiameter / 2}`);
345
344
  }
346
345
  else {
347
- if (!options.isFirstDepth) {
348
- nodeG.setAttribute('opacity', SECOND_DEPTH_NODE_ALPHA.toString());
349
- }
350
346
  textForeignObject.setAttribute('y', `${y + diameter / 2}`);
347
+ nodeG.setAttribute('opacity', (options.opacity ?? 1).toString());
348
+ }
349
+ if (options.iconG) {
350
+ nodeG.append(options.iconG);
351
351
  }
352
352
  nodeG.append(textForeignObject);
353
353
  return nodeG;
@@ -367,16 +367,21 @@ function drawEdge(startPoint, endPoint, direction, isMutual, isTargetSelf) {
367
367
  path.setAttribute('d', `M${sx},${sy} Q${cx},${cy} ${ex},${ey}`);
368
368
  }
369
369
  else {
370
+ const x = startPoint[0];
371
+ const y = startPoint[1];
372
+ const besselX = 40;
373
+ const besselY = 75;
370
374
  const angle = 55;
371
375
  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}`);
376
+ const offsetX = nodeRadius * Math.cos(angleRad);
377
+ const offsetY = nodeRadius * Math.sin(angleRad);
378
+ path.setAttribute('d', `M ${x - offsetX},${y - offsetY}
379
+ C ${x - besselX},${y - besselY}, ${x + besselX} ${y - besselY}
380
+ ${x + offsetX},${y - offsetY}`);
377
381
  }
378
382
  path.setAttribute('fill', 'none');
379
383
  path.setAttribute('stroke', DEFAULT_LINE_STYLES.color[direction]);
384
+ path.setAttribute('opacity', DEFAULT_LINE_STYLES.opacity.toString());
380
385
  g.append(path);
381
386
  return {
382
387
  g,
@@ -385,7 +390,7 @@ function drawEdge(startPoint, endPoint, direction, isMutual, isTargetSelf) {
385
390
  }
386
391
  function drawParticle(board, startPoint, direction) {
387
392
  const roughSVG = PlaitBoard.getRoughSVG(board);
388
- const pointG = drawCircle(roughSVG, [0, 0], 5, {
393
+ const pointG = drawCircle(roughSVG, [0, 0], DEFAULT_EDGE_PARTICLE_SIZE, {
389
394
  ...DEFAULT_STYLES,
390
395
  strokeWidth: 0,
391
396
  fill: DEFAULT_LINE_STYLES.color[direction]
@@ -592,7 +597,7 @@ class ForceAtlasNodeFlavour extends CommonElementFlavour {
592
597
  const isActive = activeNodeId === this.element.id;
593
598
  this.nodeGenerator.processDrawing(this.element, isActive ? PlaitBoard.getElementActiveHost(this.board) : this.getElementG(), {
594
599
  isActive,
595
- isFirstDepth: isFirstDepthNode(this.element.id, activeNodeId, parent)
600
+ opacity: isFirstDepthNode(this.element.id, activeNodeId, parent) ? 1 : SECOND_DEPTH_NODE_ALPHA
596
601
  });
597
602
  }
598
603
  onContextChanged(value, previous) {
@@ -602,13 +607,14 @@ class ForceAtlasNodeFlavour extends CommonElementFlavour {
602
607
  cacheSelectedElements(this.board, [value.element]);
603
608
  }
604
609
  const selectElements = getSelectedElements(this.board);
605
- const associatedNodes = getAssociatedNodesById(value.element.id, parent);
606
- associatedNodes.forEach(node => {
610
+ const nodes = getNodes(parent);
611
+ nodes.forEach(node => {
607
612
  const nodeGenerator = getNodeGenerator(node);
608
613
  nodeGenerator.destroy();
614
+ const isFirstDepth = selectElements.length > 0 && isFirstDepthNode(node.id, selectElements[0].id, parent);
609
615
  nodeGenerator.processDrawing(node, this.getElementG(), {
610
616
  isActive: selectElements?.[0]?.id === node.id,
611
- isFirstDepth: selectElements.length > 0 && isFirstDepthNode(node.id, selectElements[0].id, parent)
617
+ opacity: selectElements.length === 0 ? 1 : isFirstDepth ? 1 : SECOND_DEPTH_NODE_ALPHA
612
618
  });
613
619
  });
614
620
  const associatedEdges = getEdgesInSourceOrTarget(value.element.id, parent);
@@ -741,5 +747,5 @@ class ForceAtlasNodeIconBaseComponent {
741
747
  * Generated bundle index. Do not edit.
742
748
  */
743
749
 
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 };
750
+ 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_PARTICLE_SIZE, 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 };
745
751
  //# 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 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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"}
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 opacity: number;\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 = 72;\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]: `#eee`\n },\n opacity: 0.4\n};\n\nexport const DEFAULT_EDGE_PARTICLE_SIZE = 4;\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_EDGE_PARTICLE_SIZE,\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; opacity?: number }\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 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 textForeignObject.setAttribute('y', `${y + diameter / 2}`);\n nodeG.setAttribute('opacity', (options.opacity ?? 1).toString());\n }\n if (options.iconG) {\n nodeG.append(options.iconG);\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 x = startPoint[0];\n const y = startPoint[1];\n const besselX = 40;\n const besselY = 75;\n const angle = 55;\n const angleRad = (angle * Math.PI) / 180;\n const offsetX = nodeRadius * Math.cos(angleRad);\n const offsetY = nodeRadius * Math.sin(angleRad);\n path.setAttribute(\n 'd',\n `M ${x - offsetX},${y - offsetY}\n C ${x - besselX},${y - besselY}, ${x + besselX} ${y - besselY}\n ${x + offsetX},${y - offsetY}`\n );\n }\n path.setAttribute('fill', 'none');\n path.setAttribute('stroke', DEFAULT_LINE_STYLES.color[direction]);\n path.setAttribute('opacity', DEFAULT_LINE_STYLES.opacity.toString());\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], DEFAULT_EDGE_PARTICLE_SIZE, {\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 { getNodeGenerator, getNodes, isFirstDepthNode } from './utils/node';\nimport { SECOND_DEPTH_NODE_ALPHA } from './constants';\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 opacity: isFirstDepthNode(this.element.id, activeNodeId, parent) ? 1 : SECOND_DEPTH_NODE_ALPHA\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 nodes = getNodes(parent);\n nodes.forEach(node => {\n const nodeGenerator = getNodeGenerator(node);\n nodeGenerator.destroy();\n const isFirstDepth = selectElements.length > 0 && isFirstDepthNode(node.id, selectElements[0].id, parent);\n nodeGenerator.processDrawing(node, this.getElementG(), {\n isActive: selectElements?.[0]?.id === node.id,\n opacity: selectElements.length === 0 ? 1 : isFirstDepth ? 1 : SECOND_DEPTH_NODE_ALPHA\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,9 +5,9 @@ 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;
8
+ export declare const DEFAULT_NODE_LABEL_WIDTH = 72;
9
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;";
10
+ export declare const DEFAULT_NODE_LABEL_STYLE = "user-select:none;max-width:72px;text-align:center;line-height:22px;font-size:12px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;";
11
11
  export declare const NODE_LABEL_CLASS_NAME = "force-atlas-node-label";
12
12
  export declare const SECOND_DEPTH_NODE_ALPHA = 0.5;
13
13
  export declare const SECOND_DEPTH_LINE_ALPHA = 0.5;
@@ -26,4 +26,6 @@ export declare const DEFAULT_LINE_STYLES: {
26
26
  1: string;
27
27
  2: string;
28
28
  };
29
+ opacity: number;
29
30
  };
31
+ export declare const DEFAULT_EDGE_PARTICLE_SIZE = 4;
@@ -25,7 +25,7 @@ export interface EdgeGeneratorData extends GeneratorExtraData {
25
25
  }
26
26
  export interface NodeGeneratorData extends GeneratorExtraData {
27
27
  isActive: boolean;
28
- isFirstDepth: boolean;
28
+ opacity: number;
29
29
  }
30
30
  export interface NodeIconItem {
31
31
  name: string;
@@ -4,7 +4,7 @@ import { ForceAtlasNodeElement } from '../../interfaces';
4
4
  export declare function drawNode(board: PlaitBoard, node: ForceAtlasNodeElement, point: Point, options: {
5
5
  iconG?: SVGGElement;
6
6
  isActive: boolean;
7
- isFirstDepth: boolean;
7
+ opacity?: number;
8
8
  }): SVGGElement;
9
9
  export declare function drawEdge(startPoint: Point, endPoint: Point, direction: EdgeDirection, isMutual: boolean, isTargetSelf?: boolean): {
10
10
  g: SVGGElement;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@plait/graph-viz",
3
- "version": "0.63.0",
3
+ "version": "0.64.0",
4
4
  "peerDependencies": {
5
5
  "graphology": "^0.25.4",
6
6
  "graphology-layout": "^0.6.1",