{"_id":"power-link","_rev":"29-d719ff11fbf7fdbee3e0cbb73716f939","name":"power-link","dist-tags":{"latest":"2.1.0"},"versions":{"0.0.4":{"name":"power-link","version":"0.0.4","keywords":["connector","node-link","visual-connector","drag-line","bezier-curve"],"author":{"name":"Lin Ji Man","email":"Temman_lin@qq.com"},"license":"MIT","_id":"power-link@0.0.4","maintainers":[{"name":"james_man","email":"temman_lin@qq.com"}],"homepage":"https://github.com/Tem-man/node-link-utils#readme","bugs":{"url":"https://github.com/Tem-man/node-link-utils/issues"},"dist":{"shasum":"e2038d1775363a8cca21fc6fe612373122b501a8","tarball":"https://registry.npmjs.org/power-link/-/power-link-0.0.4.tgz","fileCount":5,"integrity":"sha512-1vpWmA15vSWpPePKFyZWzM0yi4mXxOHqniVLfYRsBrIxheF5LZotsWcu0y0+Fz0Qi1SsP2Q+uXJs9Mc7s3OQsQ==","signatures":[{"sig":"MEYCIQDdBITCRMfisPgCMY4gQm1//i3H4CipQsmZEpn3rfYS5AIhANAzxUnbb+yVv6+poJHRywH6sc2lillRA/X9YCq4wNXg","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":26662727},"main":"dist/index.js","type":"module","module":"dist/index.js","exports":{".":{"import":"./dist/index.js"}},"gitHead":"b97246f803e9ae0006f3dd86e467aeac854c8487","scripts":{"build":"rollup -c utils/rollup.config.js"},"_npmUser":{"name":"james_man","email":"temman_lin@qq.com"},"repository":{"url":"git+https://github.com/Tem-man/node-link-utils.git","type":"git"},"_npmVersion":"10.9.2","description":"A pure JavaScript visual node connector for creating draggable connections between nodes. Framework-agnostic and easy to use","directories":{},"_nodeVersion":"23.11.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rollup":"^4.23.0","typescript":"~5.9.3","@babel/core":"^7.25.2","@babel/preset-env":"^7.25.3","rollup-plugin-vue":"^6.0.0","@rollup/plugin-babel":"^6.0.4","@rollup/plugin-terser":"^0.4.4","rollup-plugin-postcss":"^4.0.2","@rollup/plugin-commonjs":"^28.0.0","rollup-plugin-typescript2":"^0.36.0","@rollup/plugin-node-resolve":"^15.3.0"},"_npmOperationalInternal":{"tmp":"tmp/power-link_0.0.4_1763784212995_0.8210040501511757","host":"s3://npm-registry-packages-npm-production"}},"0.0.5":{"name":"power-link","version":"0.0.5","keywords":["power-link","connector","node-link","visual-connector","drag-line","bezier-curve"],"author":{"name":"Lin Ji Man","email":"Temman_lin@qq.com"},"license":"MIT","_id":"power-link@0.0.5","maintainers":[{"name":"james_man","email":"temman_lin@qq.com"}],"homepage":"https://github.com/Tem-man/node-link-utils#readme","bugs":{"url":"https://github.com/Tem-man/node-link-utils/issues"},"dist":{"shasum":"0ff14313dfb4ececd7cea241504cb878a93144e8","tarball":"https://registry.npmjs.org/power-link/-/power-link-0.0.5.tgz","fileCount":5,"integrity":"sha512-1zzo4ycDgIyPoaUuE5HRJzgctYV3DPKm5RRvw/TWdPim4eqOFNSKg8bSviRH4wDSi3uRydMA7z90fofQFVpKvQ==","signatures":[{"sig":"MEQCIBjbv8Ld4pVF0tlRJxM6oZBY0G9wZzUmgV/3UIdd2H4yAiBn9Sp/9oqzxLvLLO4iPYftdmhepbglgWh0c1DSBokSEQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":26662397},"main":"dist/index.js","type":"module","module":"dist/index.js","exports":{".":{"import":"./dist/index.js"}},"gitHead":"9ee4d3679086bb443e22faaececb2b64452441ec","scripts":{"build":"rollup -c utils/rollup.config.js"},"_npmUser":{"name":"james_man","email":"temman_lin@qq.com"},"repository":{"url":"git+https://github.com/Tem-man/node-link-utils.git","type":"git"},"_npmVersion":"10.9.2","description":"A pure JavaScript visual node connector for creating draggable connections between nodes. Framework-agnostic and easy to use","directories":{},"_nodeVersion":"23.11.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rollup":"^4.23.0","typescript":"~5.9.3","@babel/core":"^7.25.2","@babel/preset-env":"^7.25.3","rollup-plugin-vue":"^6.0.0","@rollup/plugin-babel":"^6.0.4","@rollup/plugin-terser":"^0.4.4","rollup-plugin-postcss":"^4.0.2","@rollup/plugin-commonjs":"^28.0.0","rollup-plugin-typescript2":"^0.36.0","@rollup/plugin-node-resolve":"^15.3.0"},"_npmOperationalInternal":{"tmp":"tmp/power-link_0.0.5_1763785804572_0.8930274000963248","host":"s3://npm-registry-packages-npm-production"}},"0.0.6":{"name":"power-link","version":"0.0.6","keywords":["power-link","connector","node-link","visual-connector","drag-line","bezier-curve"],"author":{"name":"Lin Ji Man","email":"Temman_lin@qq.com"},"license":"MIT","_id":"power-link@0.0.6","maintainers":[{"name":"james_man","email":"temman_lin@qq.com"}],"homepage":"https://github.com/Tem-man/node-link-utils#readme","bugs":{"url":"https://github.com/Tem-man/node-link-utils/issues"},"dist":{"shasum":"af759b8bcb76e07902966a3a289c95f052b72b9f","tarball":"https://registry.npmjs.org/power-link/-/power-link-0.0.6.tgz","fileCount":3,"integrity":"sha512-lM4sHxdN8xZIC1Td44iLX8HmOACX9SG0qPiMh0YyZU7qoZGaAHrmUj7FsyKtJMc0ffxVyEo6/qWb+navPYl7hw==","signatures":[{"sig":"MEUCIGTadDB6IbdPRLB/XG/LAnp8uOqwey6zrRSAiizVsOFZAiEAyu7NBJA/RSkV/fgrYEz8VkJY8gPBna7ulTOY02PmskM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":36011},"main":"dist/index.js","type":"module","module":"dist/index.js","exports":{".":{"import":"./dist/index.js"}},"gitHead":"9ee4d3679086bb443e22faaececb2b64452441ec","scripts":{"build":"rollup -c utils/rollup.config.js"},"_npmUser":{"name":"james_man","email":"temman_lin@qq.com"},"repository":{"url":"git+https://github.com/Tem-man/node-link-utils.git","type":"git"},"_npmVersion":"10.9.2","description":"A pure JavaScript visual node connector for creating draggable connections between nodes. Framework-agnostic and easy to use","directories":{},"_nodeVersion":"23.11.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rollup":"^4.23.0","typescript":"~5.9.3","@babel/core":"^7.25.2","@babel/preset-env":"^7.25.3","rollup-plugin-vue":"^6.0.0","@rollup/plugin-babel":"^6.0.4","@rollup/plugin-terser":"^0.4.4","rollup-plugin-postcss":"^4.0.2","@rollup/plugin-commonjs":"^28.0.0","rollup-plugin-typescript2":"^0.36.0","@rollup/plugin-node-resolve":"^15.3.0"},"_npmOperationalInternal":{"tmp":"tmp/power-link_0.0.6_1763786449166_0.018093565224061026","host":"s3://npm-registry-packages-npm-production"}},"0.0.7":{"name":"power-link","version":"0.0.7","keywords":["power-link","connector","node-link","visual-connector","drag-line","bezier-curve"],"author":{"name":"Lin Ji Man","email":"Temman_lin@qq.com"},"license":"MIT","_id":"power-link@0.0.7","maintainers":[{"name":"james_man","email":"temman_lin@qq.com"}],"homepage":"https://github.com/Tem-man/node-link-utils#readme","bugs":{"url":"https://github.com/Tem-man/node-link-utils/issues"},"dist":{"shasum":"3fd2914095f4c8d88b69e2c261e5e3a138215c04","tarball":"https://registry.npmjs.org/power-link/-/power-link-0.0.7.tgz","fileCount":3,"integrity":"sha512-jS4Mg58vLVNSnV4d+Z8KNLBRQJY8HCiT6UjLxJArNbR35TODjV2WnctmTzuDMFgG8IvorQHQijwLGbNOjMExGg==","signatures":[{"sig":"MEQCIGopa7imb1DfI+3yVEZ52XadgLO0Fttq3JtXPUqz2Nd/AiAETK2Ury0ELxiI/2heVii4la7A8xZjaaFHEurdpzc+1Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":37960},"main":"dist/index.js","type":"module","module":"dist/index.js","exports":{".":{"import":"./dist/index.js"}},"gitHead":"6d2aed00cb2c423e8ace3eb9692a29ee13c5d416","scripts":{"build":"rollup -c utils/rollup.config.js"},"_npmUser":{"name":"james_man","email":"temman_lin@qq.com"},"repository":{"url":"git+https://github.com/Tem-man/node-link-utils.git","type":"git"},"_npmVersion":"10.9.2","description":"A pure JavaScript visual node connector for creating draggable connections between nodes. Framework-agnostic and easy to use","directories":{},"_nodeVersion":"23.11.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rollup":"^4.23.0","typescript":"~5.9.3","@babel/core":"^7.25.2","@babel/preset-env":"^7.25.3","rollup-plugin-vue":"^6.0.0","@rollup/plugin-babel":"^6.0.4","@rollup/plugin-terser":"^0.4.4","rollup-plugin-postcss":"^4.0.2","@rollup/plugin-commonjs":"^28.0.0","rollup-plugin-typescript2":"^0.36.0","@rollup/plugin-node-resolve":"^15.3.0"},"_npmOperationalInternal":{"tmp":"tmp/power-link_0.0.7_1764386333036_0.6882895892180807","host":"s3://npm-registry-packages-npm-production"}},"0.0.8":{"name":"power-link","version":"0.0.8","keywords":["power-link","connector","node-link","visual-connector","drag-line","bezier-curve"],"author":{"name":"Lin Ji Man","email":"Temman_lin@qq.com"},"license":"MIT","_id":"power-link@0.0.8","maintainers":[{"name":"james_man","email":"temman_lin@qq.com"}],"homepage":"https://github.com/Tem-man/node-link-utils#readme","bugs":{"url":"https://github.com/Tem-man/node-link-utils/issues"},"dist":{"shasum":"d41840bede8c6ac1b47b010e80e4d13a28031e20","tarball":"https://registry.npmjs.org/power-link/-/power-link-0.0.8.tgz","fileCount":3,"integrity":"sha512-IYc/y2FV6tj6ZfMaa+z6fuPogvwAozrF6KLRwvRXhRgWOo4Voh8MkdyIGA94cjzwhnJ+7T9O/inAVIp8utfBcA==","signatures":[{"sig":"MEYCIQCRBZcOy4DgW7kO/FyPWO+0PMt74ZWftbLwiwnAOFUdSwIhAP2E8fiCnYfg9p1E0kiSSdddigehg4O6wFNAnfucsPPm","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":41886},"main":"dist/index.js","type":"module","module":"dist/index.js","exports":{".":{"import":"./dist/index.js"}},"gitHead":"d24486a103c20264aa6d2d3803285dbba989409a","scripts":{"build":"rollup -c utils/rollup.config.js"},"_npmUser":{"name":"james_man","email":"temman_lin@qq.com"},"repository":{"url":"git+https://github.com/Tem-man/node-link-utils.git","type":"git"},"_npmVersion":"10.9.2","description":"A pure JavaScript visual node connector for creating draggable connections between nodes. Framework-agnostic and easy to use","directories":{},"_nodeVersion":"23.11.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rollup":"^4.23.0","typescript":"~5.9.3","@babel/core":"^7.25.2","@babel/preset-env":"^7.25.3","rollup-plugin-vue":"^6.0.0","@rollup/plugin-babel":"^6.0.4","@rollup/plugin-terser":"^0.4.4","rollup-plugin-postcss":"^4.0.2","@rollup/plugin-commonjs":"^28.0.0","rollup-plugin-typescript2":"^0.36.0","@rollup/plugin-node-resolve":"^15.3.0"},"_npmOperationalInternal":{"tmp":"tmp/power-link_0.0.8_1764993614135_0.8041181424163557","host":"s3://npm-registry-packages-npm-production"}},"0.0.9":{"name":"power-link","version":"0.0.9","keywords":["power-link","connector","node-link","visual-connector","drag-line","bezier-curve"],"author":{"name":"Lin Ji Man","email":"Temman_lin@qq.com"},"license":"MIT","_id":"power-link@0.0.9","maintainers":[{"name":"james_man","email":"temman_lin@qq.com"}],"homepage":"https://github.com/Tem-man/node-link-utils#readme","bugs":{"url":"https://github.com/Tem-man/node-link-utils/issues"},"dist":{"shasum":"737e5bff5e797380e55387833edb9a4444494c84","tarball":"https://registry.npmjs.org/power-link/-/power-link-0.0.9.tgz","fileCount":3,"integrity":"sha512-uE+GY4hikAoKqMiEXoyDhCGvVo4m0Y8iFheZ31MmtIQWlHz96/d0DE9vJd7we6K+cRTFwZvVYx2h7IsOenP4pA==","signatures":[{"sig":"MEQCIC2MK6TxoiJLk3mjWXVtMrfZmVDSU1a1MrPrsvggTNeiAiAVJVWcPANOXnPtr6te2ANtL4Byac5RZ+H9pr6VyJz/kw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":42390},"main":"dist/index.js","type":"module","module":"dist/index.js","exports":{".":{"import":"./dist/index.js"}},"gitHead":"37a4d0d957266f3587d2a9953fd0b61c296c973b","scripts":{"build":"rollup -c utils/rollup.config.js"},"_npmUser":{"name":"james_man","email":"temman_lin@qq.com"},"repository":{"url":"git+https://github.com/Tem-man/node-link-utils.git","type":"git"},"_npmVersion":"10.9.2","description":"A pure JavaScript visual node connector for creating draggable connections between nodes. Framework-agnostic and easy to use","directories":{},"_nodeVersion":"23.11.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rollup":"^4.23.0","typescript":"~5.9.3","@babel/core":"^7.25.2","@babel/preset-env":"^7.25.3","rollup-plugin-vue":"^6.0.0","@rollup/plugin-babel":"^6.0.4","@rollup/plugin-terser":"^0.4.4","rollup-plugin-postcss":"^4.0.2","@rollup/plugin-commonjs":"^28.0.0","rollup-plugin-typescript2":"^0.36.0","@rollup/plugin-node-resolve":"^15.3.0"},"_npmOperationalInternal":{"tmp":"tmp/power-link_0.0.9_1766204040631_0.7136379518952669","host":"s3://npm-registry-packages-npm-production"}},"0.1.0":{"name":"power-link","version":"0.1.0","keywords":["power-link","connector","node-link","visual-connector","drag-line","bezier-curve"],"author":{"name":"Lin Ji Man","email":"Temman_lin@qq.com"},"license":"MIT","_id":"power-link@0.1.0","maintainers":[{"name":"james_man","email":"temman_lin@qq.com"}],"homepage":"https://github.com/Tem-man/node-link-utils#readme","bugs":{"url":"https://github.com/Tem-man/node-link-utils/issues"},"dist":{"shasum":"8c0f26f680a587bf3e14cbedc4465518db780fe0","tarball":"https://registry.npmjs.org/power-link/-/power-link-0.1.0.tgz","fileCount":3,"integrity":"sha512-PaRisnYjyQ8WQxBHEbokKxi37eAFK48B9Z+tWDdmQ6f0R8Zcz5PtmlANzMGqJ5TjNPDi2kYd2n7K9b23yn0dmA==","signatures":[{"sig":"MEUCIHdxFrfnwUehP6RvPmSfUrtyq5q0oxxhpH616NoTWe+1AiEAiKUM2iFZ4PSudgA8D9gAkA0pVdT2mDZghuhowerIKdw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":42251},"main":"dist/index.js","type":"module","module":"dist/index.js","exports":{".":{"import":"./dist/index.js"}},"gitHead":"cacd62fdf72197b8bfb4b730008b4bfb8b2dfd25","scripts":{"build":"rollup -c utils/rollup.config.js"},"_npmUser":{"name":"james_man","email":"temman_lin@qq.com"},"repository":{"url":"git+https://github.com/Tem-man/node-link-utils.git","type":"git"},"_npmVersion":"10.9.2","description":"A pure JavaScript visual node connector for creating draggable connections between nodes. Framework-agnostic and easy to use","directories":{},"_nodeVersion":"23.11.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rollup":"^4.23.0","typescript":"~5.9.3","@babel/core":"^7.25.2","@babel/preset-env":"^7.25.3","rollup-plugin-vue":"^6.0.0","@rollup/plugin-babel":"^6.0.4","@rollup/plugin-terser":"^0.4.4","rollup-plugin-postcss":"^4.0.2","@rollup/plugin-commonjs":"^28.0.0","rollup-plugin-typescript2":"^0.36.0","@rollup/plugin-node-resolve":"^15.3.0"},"_npmOperationalInternal":{"tmp":"tmp/power-link_0.1.0_1768748982117_0.5495514728969684","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"power-link","version":"0.1.1","keywords":["power-link","connector","node-link","visual-connector","drag-line","bezier-curve"],"author":{"name":"Lin Ji Man","email":"Temman_lin@qq.com"},"license":"MIT","_id":"power-link@0.1.1","maintainers":[{"name":"james_man","email":"temman_lin@qq.com"}],"homepage":"https://github.com/Tem-man/node-link-utils#readme","bugs":{"url":"https://github.com/Tem-man/node-link-utils/issues"},"dist":{"shasum":"9ccbde9e6b9f6018eeb19249c1e34d1303338172","tarball":"https://registry.npmjs.org/power-link/-/power-link-0.1.1.tgz","fileCount":3,"integrity":"sha512-ZJ7Jg3CSyGFIVy9qGU5VN10p4DyMgjjjGYKlcW10jHgZwjMegZ6YtnO9W2Dm8lvBhZgSo5xf3JNYaQJeISB4JQ==","signatures":[{"sig":"MEQCIH5nsGchHdruRMb/8B9yipR7fN7RaUs3PI7es8PITzTFAiBgdrDaxEg65VurcRx2j7tV9DD8q4z7VO4oOzeBvfczZQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":42290},"main":"dist/index.js","type":"module","module":"dist/index.js","exports":{".":{"import":"./dist/index.js"}},"gitHead":"cacd62fdf72197b8bfb4b730008b4bfb8b2dfd25","scripts":{"build":"rollup -c utils/rollup.config.js"},"_npmUser":{"name":"james_man","email":"temman_lin@qq.com"},"repository":{"url":"git+https://github.com/Tem-man/node-link-utils.git","type":"git"},"_npmVersion":"10.9.2","description":"A pure JavaScript visual node connector for creating draggable connections between nodes. Framework-agnostic and easy to use","directories":{},"_nodeVersion":"23.11.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rollup":"^4.23.0","typescript":"~5.9.3","@babel/core":"^7.25.2","@babel/preset-env":"^7.25.3","rollup-plugin-vue":"^6.0.0","@rollup/plugin-babel":"^6.0.4","@rollup/plugin-terser":"^0.4.4","rollup-plugin-postcss":"^4.0.2","@rollup/plugin-commonjs":"^28.0.0","rollup-plugin-typescript2":"^0.36.0","@rollup/plugin-node-resolve":"^15.3.0"},"_npmOperationalInternal":{"tmp":"tmp/power-link_0.1.1_1768749277279_0.10039534251781279","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"power-link","version":"0.1.2","keywords":["power-link","connector","node-link","visual-connector","drag-line","bezier-curve"],"author":{"name":"Lin Ji Man","email":"Temman_lin@qq.com"},"license":"MIT","_id":"power-link@0.1.2","maintainers":[{"name":"james_man","email":"temman_lin@qq.com"}],"homepage":"https://github.com/Tem-man/node-link-utils#readme","bugs":{"url":"https://github.com/Tem-man/node-link-utils/issues"},"dist":{"shasum":"06d0cb1b529843d20ef0b9d87be0f4758d352a0a","tarball":"https://registry.npmjs.org/power-link/-/power-link-0.1.2.tgz","fileCount":3,"integrity":"sha512-uYcRSgsUN3tC85gbZmljZvtvLnQGWDsL6etQkpYViuv3HJ8ia3MhTpf0LjPhF2rglLfTpz0X7yGbZ/BhWNVptQ==","signatures":[{"sig":"MEYCIQC0s9fihSisGwSDc7fsIGeT6a6LKRZ6KlIflmgdbS2U0QIhAOxRuT0nVDdC7zTN3Y5tIJekJF1x2moi1QjDjkTKA2Oh","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":42291},"main":"dist/index.js","type":"module","module":"dist/index.js","exports":{".":{"import":"./dist/index.js"}},"gitHead":"cacd62fdf72197b8bfb4b730008b4bfb8b2dfd25","scripts":{"build":"rollup -c utils/rollup.config.js"},"_npmUser":{"name":"james_man","email":"temman_lin@qq.com"},"repository":{"url":"git+https://github.com/Tem-man/node-link-utils.git","type":"git"},"_npmVersion":"10.9.2","description":"A pure JavaScript visual node connector for creating draggable connections between nodes. Framework-agnostic and easy to use","directories":{},"_nodeVersion":"23.11.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rollup":"^4.23.0","typescript":"~5.9.3","@babel/core":"^7.25.2","@babel/preset-env":"^7.25.3","rollup-plugin-vue":"^6.0.0","@rollup/plugin-babel":"^6.0.4","@rollup/plugin-terser":"^0.4.4","rollup-plugin-postcss":"^4.0.2","@rollup/plugin-commonjs":"^28.0.0","rollup-plugin-typescript2":"^0.36.0","@rollup/plugin-node-resolve":"^15.3.0"},"_npmOperationalInternal":{"tmp":"tmp/power-link_0.1.2_1768749404989_0.7144199067962378","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"power-link","version":"1.0.0","_id":"power-link@1.0.0","maintainers":[{"name":"james_man","email":"temman_lin@qq.com"}],"dist":{"shasum":"6bd81936886f54e191501a5ad9234df41a67b522","tarball":"https://registry.npmjs.org/power-link/-/power-link-1.0.0.tgz","fileCount":9,"integrity":"sha512-7Sl5Sv950Uc+ohxCybdAzIlR7OeeSqv0y+su8CYHTtfey3i5hx+0N1V9Cw0CSFgkhn3rHdAOY0lEDqnxmoBlEw==","signatures":[{"sig":"MEUCIBPPFJDhJbS/lQp2M+HCYFrLJtOdTsDtFNcIx04/CNAsAiEAybjezfwC62RFslTiAWlCcWxw6c0ZbvlvIIREeyRhyPA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":153951},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"d3f878dd619a767468be035b134dbb91ada5daf9","scripts":{"dev":"tsup --watch","lint":"eslint . --ext ts --report-unused-disable-directives --max-warnings 0","test":"vitest","build":"tsup","clean":"rm -rf dist .turbo node_modules"},"_npmUser":{"name":"james_man","email":"temman_lin@qq.com"},"_npmVersion":"10.9.2","description":"Shared utility functions","directories":{},"_nodeVersion":"23.11.1","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.1","vitest":"^1.2.2","typescript":"^5.3.3","@connector/tsconfig":"workspace:*"},"_npmOperationalInternal":{"tmp":"tmp/power-link_1.0.0_1770455676757_0.9446436017337774","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"power-link","version":"1.0.1","_id":"power-link@1.0.1","maintainers":[{"name":"james_man","email":"temman_lin@qq.com"}],"dist":{"shasum":"5dbbf55eab1001d02196c9a92530f2c6107cd5b7","tarball":"https://registry.npmjs.org/power-link/-/power-link-1.0.1.tgz","fileCount":7,"integrity":"sha512-w8ICD93lku4Fu7UKejITNYL8tym/Nxrsj5KHlytwXaj2lzQfdxRZN8wwqUcd+ksYAHNRAv+4kDbz82Ix4KfErw==","signatures":[{"sig":"MEQCIEEeqfU+9VvvorYvfgnyxdUgx7TBTzh8NuU+IVUH05nYAiACGCOBqqaXc8h/ZrhJ908RCR16r67Ba2uY3juZCl46YA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":152667},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"d3f878dd619a767468be035b134dbb91ada5daf9","scripts":{"dev":"tsup --watch","lint":"eslint . --ext ts --report-unused-disable-directives --max-warnings 0","test":"vitest","build":"tsup","clean":"rm -rf dist .turbo node_modules"},"_npmUser":{"name":"james_man","email":"temman_lin@qq.com"},"_npmVersion":"10.9.2","description":"Shared utility functions","directories":{},"_nodeVersion":"23.11.1","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.1","vitest":"^1.2.2","typescript":"^5.3.3","@connector/tsconfig":"workspace:*"},"_npmOperationalInternal":{"tmp":"tmp/power-link_1.0.1_1770456009774_0.918178255199686","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"power-link","version":"1.0.2","_id":"power-link@1.0.2","maintainers":[{"name":"james_man","email":"temman_lin@qq.com"}],"dist":{"shasum":"30493981957935734cecd653e1d0a78b1230aa36","tarball":"https://registry.npmjs.org/power-link/-/power-link-1.0.2.tgz","fileCount":7,"integrity":"sha512-rmk4ZW3mpp9BQez09irRXlhlU1soruth+wp2lFdhCPLUXNbTg/WCcGn8ztFXsPIEdavDekYLuI+KLT8Vb4QsNw==","signatures":[{"sig":"MEYCIQDT++KIUNtJvZ64jX+gSfnW40P8Ow2hM6gfhIa6SfxIjAIhAJ6Bgh4SKrAKevClcXfOxtPFKHpTv4dXw/Y6Mks3hLqh","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":152604},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"56e39e9980c729d1bccead0d2387dd71e8edf3d8","scripts":{"dev":"tsup --watch","lint":"eslint . --ext ts --report-unused-disable-directives --max-warnings 0","test":"vitest","build":"tsup","clean":"rm -rf dist .turbo node_modules"},"_npmUser":{"name":"james_man","email":"temman_lin@qq.com"},"_npmVersion":"10.9.2","description":"Shared utility functions","directories":{},"_nodeVersion":"23.11.1","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.1","vitest":"^1.2.2","typescript":"^5.3.3","@connector/tsconfig":"workspace:*"},"_npmOperationalInternal":{"tmp":"tmp/power-link_1.0.2_1770457685650_0.34002644616505173","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"power-link","version":"1.0.3","_id":"power-link@1.0.3","maintainers":[{"name":"james_man","email":"temman_lin@qq.com"}],"dist":{"shasum":"55eba3f29f829742cfaf4aec777504d43132986f","tarball":"https://registry.npmjs.org/power-link/-/power-link-1.0.3.tgz","fileCount":7,"integrity":"sha512-bZ9QpXRmHoU8oZLFRqR4E5pWhKGXQhZrCLrwifP4P972TQs5O+fHMnxJ2WpZiu6r8hM0zjiW9PE0qTd1pRNDCg==","signatures":[{"sig":"MEUCIQDjYUvnvl94PFqyhZ7H50Jyw5ySyYWvBT4xHycGySjZRgIgKbnE85eI+qaRlGji7jZwkj1INb1JK5M6If2+ga3N9Ag=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":153535},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"be48dc605b38c68ba3bb2e73e899fe70989a1b75","scripts":{"dev":"tsup --watch","lint":"eslint . --ext ts --report-unused-disable-directives --max-warnings 0","test":"vitest","build":"tsup","clean":"rm -rf dist .turbo node_modules"},"_npmUser":{"name":"james_man","email":"temman_lin@qq.com"},"_npmVersion":"10.9.2","description":"A pure TypeScript visual node connector for creating draggable connections between nodes. Framework-agnostic and easy to use","directories":{},"_nodeVersion":"23.11.1","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.1","vitest":"^1.2.2","typescript":"^5.3.3","@connector/tsconfig":"workspace:*"},"_npmOperationalInternal":{"tmp":"tmp/power-link_1.0.3_1772088220615_0.3335166244037884","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"power-link","version":"1.0.4","author":{"name":"Lin Jiman","email":"temman_lin@qq.com"},"license":"MIT","_id":"power-link@1.0.4","maintainers":[{"name":"james_man","email":"temman_lin@qq.com"}],"homepage":"https://github.com/Tem-man/power-link","bugs":{"url":"https://github.com/Tem-man/power-link/issues"},"dist":{"shasum":"d7218522bea3f3368fbedf2f243fb3fd39f347b7","tarball":"https://registry.npmjs.org/power-link/-/power-link-1.0.4.tgz","fileCount":7,"integrity":"sha512-Io0dU4Aqs+LmOyJR4MorrN50VUH+sev1qNuT1FBwLOCeWUwP/b9Lc0mxiaEyhU2s8dhvIDxsRutIN6ogDcIZLw==","signatures":[{"sig":"MEYCIQCU9IrNcskwZtb+nD1ZwoFEhX7efjTcH0/UGIED1AgQogIhAMeroSC+PS+c8d/uxKvhEYJi0LCnN7DqeC/Ga4hA71WU","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":153759},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"be48dc605b38c68ba3bb2e73e899fe70989a1b75","scripts":{"dev":"tsup --watch","lint":"eslint . --ext ts --report-unused-disable-directives --max-warnings 0","test":"vitest","build":"tsup","clean":"rm -rf dist .turbo node_modules"},"_npmUser":{"name":"james_man","email":"temman_lin@qq.com"},"repository":{"url":"git+https://github.com/Tem-man/power-link.git","type":"git"},"_npmVersion":"10.9.2","description":"A pure TypeScript visual node connector for creating draggable connections between nodes. Framework-agnostic and easy to use","directories":{},"_nodeVersion":"23.11.1","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.1","vitest":"^1.2.2","typescript":"^5.3.3","@connector/tsconfig":"workspace:*"},"_npmOperationalInternal":{"tmp":"tmp/power-link_1.0.4_1772587898463_0.21648625221561035","host":"s3://npm-registry-packages-npm-production"}},"1.0.5":{"name":"power-link","version":"1.0.5","author":{"name":"Lin Jiman","email":"temman_lin@qq.com"},"license":"MIT","_id":"power-link@1.0.5","maintainers":[{"name":"james_man","email":"temman_lin@qq.com"}],"homepage":"https://github.com/Tem-man/power-link","bugs":{"url":"https://github.com/Tem-man/power-link/issues"},"dist":{"shasum":"afaa7323a19340304364cf0867c0e46e487b91c5","tarball":"https://registry.npmjs.org/power-link/-/power-link-1.0.5.tgz","fileCount":7,"integrity":"sha512-RZ9k1goK5VcKdGLqnUnpw9zJbryEksrBpeGPugW3zy0YLZU8bQWVa49KbYFWvAD4Ct+LvNu0EgF8OBIPDFQ6PA==","signatures":[{"sig":"MEQCIGOcvpE1vYFln2hC5q9Pqm8vZlq45hXVWrO2BYV/PCr1AiA4copVHS2xHzGSEPtM0fOKwozGVMe52ptAtyikS4diIg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":153806},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"be48dc605b38c68ba3bb2e73e899fe70989a1b75","scripts":{"dev":"tsup --watch","lint":"eslint . --ext ts --report-unused-disable-directives --max-warnings 0","test":"vitest","build":"tsup","clean":"rm -rf dist .turbo node_modules","publish":"npm publish --access public"},"_npmUser":{"name":"james_man","email":"temman_lin@qq.com"},"repository":{"url":"git+https://github.com/Tem-man/power-link.git","type":"git"},"_npmVersion":"10.9.2","description":"A pure TypeScript visual node connector for creating draggable connections between nodes. Framework-agnostic and easy to use","directories":{},"_nodeVersion":"23.11.1","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.1","vitest":"^1.2.2","typescript":"^5.3.3","@connector/tsconfig":"workspace:*"},"_npmOperationalInternal":{"tmp":"tmp/power-link_1.0.5_1772588018759_0.8524746817653475","host":"s3://npm-registry-packages-npm-production"}},"1.0.6":{"name":"power-link","version":"1.0.6","author":{"name":"Lin Jiman","email":"temman_lin@qq.com"},"license":"MIT","_id":"power-link@1.0.6","maintainers":[{"name":"james_man","email":"temman_lin@qq.com"}],"homepage":"https://github.com/Tem-man/power-link","bugs":{"url":"https://github.com/Tem-man/power-link/issues"},"dist":{"shasum":"6ea90916afb8d1fa8f8d9efddf5a3687934db50a","tarball":"https://registry.npmjs.org/power-link/-/power-link-1.0.6.tgz","fileCount":7,"integrity":"sha512-4Dn4c7nvUkOqW6P1gjd/OcGWjOivzs/wzIFpMnzxpam7dn+HJTttC1e0PhtyTMUkjzvnEhk70ePyVTJ2TYTjFw==","signatures":[{"sig":"MEUCIQCe+NTYEsTjFigwG/uWhPkyAiJFsomp2tti/CMvpHWGDwIgQsZ0GgZKKd40MS14IAAkEwVf1pbL1JrQF+6TgBCoARU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":153806},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"be48dc605b38c68ba3bb2e73e899fe70989a1b75","scripts":{"dev":"tsup --watch","lint":"eslint . --ext ts --report-unused-disable-directives --max-warnings 0","test":"vitest","build":"tsup","clean":"rm -rf dist .turbo node_modules","publish":"npm publish --access public"},"_npmUser":{"name":"james_man","email":"temman_lin@qq.com"},"repository":{"url":"git+https://github.com/Tem-man/power-link.git","type":"git"},"_npmVersion":"10.9.2","description":"A pure TypeScript visual node connector for creating draggable connections between nodes. Framework-agnostic and easy to use","directories":{},"_nodeVersion":"23.11.1","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.1","vitest":"^1.2.2","typescript":"^5.3.3","@connector/tsconfig":"workspace:*"},"_npmOperationalInternal":{"tmp":"tmp/power-link_1.0.6_1772588188688_0.6820368927797493","host":"s3://npm-registry-packages-npm-production"}},"1.0.7":{"name":"power-link","version":"1.0.7","author":{"name":"Lin Jiman","email":"temman_lin@qq.com"},"license":"MIT","_id":"power-link@1.0.7","maintainers":[{"name":"james_man","email":"temman_lin@qq.com"}],"homepage":"https://github.com/Tem-man/power-link","bugs":{"url":"https://github.com/Tem-man/power-link/issues"},"dist":{"shasum":"9e35547dcfc6df823f90b40d3839f878191a0d98","tarball":"https://registry.npmjs.org/power-link/-/power-link-1.0.7.tgz","fileCount":7,"integrity":"sha512-/WZaIQxDTvcyudCT3g/fH9FHcd0GmOTmZqIcNMuZPEcYMJLFKgVYDxQF222H+H+UEplQNTC6mcJ0XugAzHJh0Q==","signatures":[{"sig":"MEQCIDQCUsFuHUJD/QUa7O8U69jKFCI2/2cY5qSJMakDrKCTAiA4SMUg+S2EDkjwfOrm+xQV7kIrDJKCw0n7iVnS025Ftg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":153810},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"be48dc605b38c68ba3bb2e73e899fe70989a1b75","scripts":{"dev":"tsup --watch","lint":"eslint . --ext ts --report-unused-disable-directives --max-warnings 0","test":"vitest","build":"tsup","clean":"rm -rf dist .turbo node_modules","publish":"npm publish --access public"},"_npmUser":{"name":"james_man","email":"temman_lin@qq.com"},"repository":{"url":"git+https://github.com/Tem-man/power-link.git","type":"git"},"_npmVersion":"10.9.2","description":"A pure TypeScript visual node connector for creating draggable connections between nodes. Framework-agnostic and easy to use","directories":{},"_nodeVersion":"23.11.1","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.1","vitest":"^1.2.2","typescript":"^5.3.3","@connector/tsconfig":"workspace:*"},"_npmOperationalInternal":{"tmp":"tmp/power-link_1.0.7_1772588243401_0.32719209909429914","host":"s3://npm-registry-packages-npm-production"}},"1.0.8":{"name":"power-link","version":"1.0.8","author":{"name":"Lin Jiman","email":"temman_lin@qq.com"},"license":"MIT","_id":"power-link@1.0.8","maintainers":[{"name":"james_man","email":"temman_lin@qq.com"}],"homepage":"https://github.com/Tem-man/power-link","bugs":{"url":"https://github.com/Tem-man/power-link/issues"},"dist":{"shasum":"cd94bf1454f16f7a76df6bc1c0bfdd898ce570f8","tarball":"https://registry.npmjs.org/power-link/-/power-link-1.0.8.tgz","fileCount":7,"integrity":"sha512-moN79vi8joWc898x2KIc/7ApD7LIshiOxKIg4PD1XCVtqYYAcezRjn4U4AcYt/9Nomdu+QNjlCtUwoEpnZj1zw==","signatures":[{"sig":"MEUCIQC8MwG4JUoaKGidNGSbRM4yrcL0hcb1uS6D2Pt3E8T1pQIgK+2+yFHXr35HGFp2NgtlTBsdp4LgGSP3V6JXexLk5MQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":153810},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"be48dc605b38c68ba3bb2e73e899fe70989a1b75","scripts":{"dev":"tsup --watch","lint":"eslint . --ext ts --report-unused-disable-directives --max-warnings 0","test":"vitest","build":"tsup","clean":"rm -rf dist .turbo node_modules","publish":"npm publish --access public"},"_npmUser":{"name":"james_man","email":"temman_lin@qq.com"},"repository":{"url":"git+https://github.com/Tem-man/power-link.git","type":"git"},"_npmVersion":"10.9.2","description":"A pure TypeScript visual node connector for creating draggable connections between nodes. Framework-agnostic and easy to use","directories":{},"_nodeVersion":"23.11.1","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.1","vitest":"^1.2.2","typescript":"^5.3.3","@connector/tsconfig":"workspace:*"},"_npmOperationalInternal":{"tmp":"tmp/power-link_1.0.8_1772588303593_0.02354431505586896","host":"s3://npm-registry-packages-npm-production"}},"1.0.9":{"name":"power-link","version":"1.0.9","author":{"name":"Lin Jiman","email":"temman_lin@qq.com"},"license":"MIT","_id":"power-link@1.0.9","maintainers":[{"name":"james_man","email":"temman_lin@qq.com"}],"homepage":"https://github.com/Tem-man/power-link","bugs":{"url":"https://github.com/Tem-man/power-link/issues"},"dist":{"shasum":"93dc86a5e69d28a0e7b8c49c6f3463904b1decca","tarball":"https://registry.npmjs.org/power-link/-/power-link-1.0.9.tgz","fileCount":7,"integrity":"sha512-3ntGY9SxNC3CGW+srk87ENzbOpelJ/XhPtf9ROj25XqR+VU9sZ+nFIn9Z44hPAAuNq6Gh/qmaRn0ngHYN/ke0g==","signatures":[{"sig":"MEQCIAXEq81KmiIgrnH/KO6KG8vvwRdYRAqTSCeoQ31QWSaiAiAtp/GNnKbdl7VXPs+OLcyNuT8H7fJi7QH47+wBfPEDtw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":153810},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"be48dc605b38c68ba3bb2e73e899fe70989a1b75","scripts":{"dev":"tsup --watch","lint":"eslint . --ext ts --report-unused-disable-directives --max-warnings 0","test":"vitest","build":"tsup","clean":"rm -rf dist .turbo node_modules","publish":"npm publish --access public"},"_npmUser":{"name":"james_man","email":"temman_lin@qq.com"},"repository":{"url":"git+https://github.com/Tem-man/power-link.git","type":"git"},"_npmVersion":"10.9.2","description":"A pure TypeScript visual node connector for creating draggable connections between nodes. Framework-agnostic and easy to use","directories":{},"_nodeVersion":"23.11.1","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.1","vitest":"^1.2.2","typescript":"^5.3.3","@connector/tsconfig":"workspace:*"},"_npmOperationalInternal":{"tmp":"tmp/power-link_1.0.9_1772588504553_0.0377658112096233","host":"s3://npm-registry-packages-npm-production"}},"1.0.10":{"name":"power-link","version":"1.0.10","author":{"name":"Lin Jiman","email":"temman_lin@qq.com"},"license":"MIT","_id":"power-link@1.0.10","maintainers":[{"name":"james_man","email":"temman_lin@qq.com"}],"homepage":"https://github.com/Tem-man/power-link","bugs":{"url":"https://github.com/Tem-man/power-link/issues"},"dist":{"shasum":"a337b27ec5e4961c9033fcebf1cebe7992afe0ea","tarball":"https://registry.npmjs.org/power-link/-/power-link-1.0.10.tgz","fileCount":7,"integrity":"sha512-9lnf6FqS2mDTuOt9aIRQtw5FtfJrAzYwFf0DF/C/sYpBOrEo9+YdzjFJlgmhlWH7GhehEJy7fodotpMKZV73+Q==","signatures":[{"sig":"MEUCIQDnfW7H/14g/zsJo4MSbpbhzYtHRYUHNcJzJXE180S7RAIgNP0AmIAFXWU9L0F7ntYdqcQUrrJ0yFpglN+BKLRs9uU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":153811},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"be48dc605b38c68ba3bb2e73e899fe70989a1b75","scripts":{"dev":"tsup --watch","lint":"eslint . --ext ts --report-unused-disable-directives --max-warnings 0","test":"vitest","build":"tsup","clean":"rm -rf dist .turbo node_modules","publish":"npm publish --access public"},"_npmUser":{"name":"james_man","email":"temman_lin@qq.com"},"repository":{"url":"git+https://github.com/Tem-man/power-link.git","type":"git"},"_npmVersion":"10.9.2","description":"A pure TypeScript visual node connector for creating draggable connections between nodes. Framework-agnostic and easy to use","directories":{},"_nodeVersion":"23.11.1","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.1","vitest":"^1.2.2","typescript":"^5.3.3","@connector/tsconfig":"workspace:*"},"_npmOperationalInternal":{"tmp":"tmp/power-link_1.0.10_1772588540509_0.08323582682965469","host":"s3://npm-registry-packages-npm-production"}},"1.0.11":{"name":"power-link","version":"1.0.11","author":{"name":"Lin Jiman","email":"temman_lin@qq.com"},"license":"MIT","_id":"power-link@1.0.11","maintainers":[{"name":"james_man","email":"temman_lin@qq.com"}],"homepage":"https://github.com/Tem-man/power-link","bugs":{"url":"https://github.com/Tem-man/power-link/issues"},"dist":{"shasum":"450ebd97d3da34b322dffd13c230d90094074477","tarball":"https://registry.npmjs.org/power-link/-/power-link-1.0.11.tgz","fileCount":7,"integrity":"sha512-YGpnwvau2WI9cs1lW0dStv8qOdTH3+YCgrMY7FalLOV9CubK9kfyt09nXwHoyKM4Ep2lyhaR9lvpxJATbUH/jA==","signatures":[{"sig":"MEUCIQCXFkPZ3QplRXkDhVg8ZIH6QaqbqIqrs0KnXPf6WDCLxAIgckEPxH2LmcZV1WGsUAp8tG033twSdiX1AEL2MLp36So=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":153811},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"be48dc605b38c68ba3bb2e73e899fe70989a1b75","scripts":{"dev":"tsup --watch","lint":"eslint . --ext ts --report-unused-disable-directives --max-warnings 0","test":"vitest","build":"tsup","clean":"rm -rf dist .turbo node_modules","publish":"npm publish --access public"},"_npmUser":{"name":"james_man","email":"temman_lin@qq.com"},"repository":{"url":"git+https://github.com/Tem-man/power-link.git","type":"git"},"_npmVersion":"10.9.2","description":"A pure TypeScript visual node connector for creating draggable connections between nodes. Framework-agnostic and easy to use","directories":{},"_nodeVersion":"23.11.1","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.1","vitest":"^1.2.2","typescript":"^5.3.3","@connector/tsconfig":"workspace:*"},"_npmOperationalInternal":{"tmp":"tmp/power-link_1.0.11_1772588602015_0.5297218616129089","host":"s3://npm-registry-packages-npm-production"}},"1.0.12":{"name":"power-link","version":"1.0.12","author":{"name":"Lin Jiman","email":"temman_lin@qq.com"},"license":"MIT","_id":"power-link@1.0.12","maintainers":[{"name":"james_man","email":"temman_lin@qq.com"}],"homepage":"https://github.com/Tem-man/power-link","bugs":{"url":"https://github.com/Tem-man/power-link/issues"},"dist":{"shasum":"e9e56d70b60a25b777d260ac6972f4cf2367afbf","tarball":"https://registry.npmjs.org/power-link/-/power-link-1.0.12.tgz","fileCount":7,"integrity":"sha512-iJmezYUph5Ac3B1bui5BJ4kxkymUwtCGCvY6UVgq9BLjJLUHeIsiuTHNo0A/GTfqqN0WE+cJVVVt5Ombdc+Yhg==","signatures":[{"sig":"MEUCIQCFdtBnGBc/7Mqz763mDchfIO+86pUZBDQeHhijMqAUAAIgXvEVQl+XhfkzUTnPnOBbxGerJ5oVWm5F9tbAXVK1Uqo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":153764},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"be48dc605b38c68ba3bb2e73e899fe70989a1b75","scripts":{"dev":"tsup --watch","lint":"eslint . --ext ts --report-unused-disable-directives --max-warnings 0","test":"vitest","build":"tsup","clean":"rm -rf dist .turbo node_modules"},"_npmUser":{"name":"james_man","email":"temman_lin@qq.com"},"repository":{"url":"git+https://github.com/Tem-man/power-link.git","type":"git"},"_npmVersion":"10.9.2","description":"A pure TypeScript visual node connector for creating draggable connections between nodes. Framework-agnostic and easy to use","directories":{},"_nodeVersion":"23.11.1","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.1","vitest":"^1.2.2","typescript":"^5.3.3","@connector/tsconfig":"workspace:*"},"_npmOperationalInternal":{"tmp":"tmp/power-link_1.0.12_1772588651835_0.7257183524901072","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"power-link","version":"2.0.0","author":{"name":"Lin Jiman","email":"temman_lin@qq.com"},"license":"MIT","_id":"power-link@2.0.0","maintainers":[{"name":"james_man","email":"temman_lin@qq.com"}],"homepage":"https://github.com/Tem-man/power-link","bugs":{"url":"https://github.com/Tem-man/power-link/issues"},"dist":{"shasum":"2bd7f5b325b07ca520a0f94139193cd77500ab36","tarball":"https://registry.npmjs.org/power-link/-/power-link-2.0.0.tgz","fileCount":7,"integrity":"sha512-uezt5MWAV6XT5D1oRN6n42S2fnw8rr1hhpfaQzsK8OFkAscEMe/ArQbVjmzijSmUnFVuwOgtqQVxa3tH+3174w==","signatures":[{"sig":"MEUCIQC49Zz7/qC06LPTry35tA9f6jLBP9JKN9d39lfTfses/QIgBnGpjsSa24si4iOgyTuCWe9VJhLX+3HHobyXtRpJYXI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":204459},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"d1a5c734fe39ee2983f79b0a3d5aad2aa8b37b85","scripts":{"dev":"tsup --watch","lint":"eslint . --ext ts --report-unused-disable-directives --max-warnings 0","test":"vitest","build":"tsup","clean":"rm -rf dist .turbo node_modules"},"_npmUser":{"name":"james_man","email":"temman_lin@qq.com"},"repository":{"url":"git+https://github.com/Tem-man/power-link.git","type":"git"},"_npmVersion":"10.9.2","description":"A pure TypeScript visual node connector for creating draggable connections between nodes. Framework-agnostic and easy to use","directories":{},"_nodeVersion":"23.11.1","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.1","vitest":"^1.2.2","typescript":"^5.3.3","@connector/tsconfig":"workspace:*"},"_npmOperationalInternal":{"tmp":"tmp/power-link_2.0.0_1772879540158_0.2782764961450528","host":"s3://npm-registry-packages-npm-production"}},"2.0.1":{"name":"power-link","version":"2.0.1","keywords":["power-link","connector","node-link","visual-connector","drag-line","bezier-curve"],"author":{"name":"Lin Ji Man","email":"Temman_lin@qq.com"},"license":"MIT","_id":"power-link@2.0.1","maintainers":[{"name":"james_man","email":"temman_lin@qq.com"}],"homepage":"https://tem-man.github.io/power-link","bugs":{"url":"https://github.com/Tem-man/power-link/issues"},"dist":{"shasum":"d059fa8d739e7e28dbf208944c370524ad7d8df8","tarball":"https://registry.npmjs.org/power-link/-/power-link-2.0.1.tgz","fileCount":7,"integrity":"sha512-rm7X4MCAdybxtqhVlWrOwjP0jNeDPcJYR8gJdZd+75kRtZ2xHnh3aYctbMWLH9mUlq20vBfh2UpqQHdw02Yqwg==","signatures":[{"sig":"MEUCIDSg1F/ndX/H/Dc4iGU9qnTTnMTXIY/BY0FParsCdNrZAiEAriJVUEPaQ9qvJn5hEce0rNXk/kmQThdwGrcDE7jbb8M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":204681},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"d1a5c734fe39ee2983f79b0a3d5aad2aa8b37b85","scripts":{"dev":"tsup --watch","lint":"eslint . --ext ts --report-unused-disable-directives --max-warnings 0","test":"vitest","build":"tsup","clean":"rm -rf dist .turbo node_modules"},"_npmUser":{"name":"james_man","email":"temman_lin@qq.com"},"repository":{"url":"git+https://github.com/Tem-man/power-link.git","type":"git"},"_npmVersion":"10.9.2","description":"A pure TypeScript visual node connector for creating draggable connections between nodes. Framework-agnostic and easy to use","directories":{},"_nodeVersion":"23.11.1","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.1","vitest":"^1.2.2","typescript":"^5.3.3","@connector/tsconfig":"workspace:*"},"_npmOperationalInternal":{"tmp":"tmp/power-link_2.0.1_1772880111246_0.5833305102639548","host":"s3://npm-registry-packages-npm-production"}},"2.0.2":{"name":"power-link","version":"2.0.2","keywords":["power-link","connector","node-link","visual-connector","drag-line","bezier-curve"],"author":{"name":"Lin Ji Man","email":"Temman_lin@qq.com"},"license":"MIT","_id":"power-link@2.0.2","maintainers":[{"name":"james_man","email":"temman_lin@qq.com"}],"homepage":"https://tem-man.github.io/power-link","bugs":{"url":"https://github.com/Tem-man/power-link/issues"},"dist":{"shasum":"13c29bf8597ff80a477d26004ab685177234cbf4","tarball":"https://registry.npmjs.org/power-link/-/power-link-2.0.2.tgz","fileCount":7,"integrity":"sha512-aZs9aakLOeMmYfpkjzWs8F7+Os8vDggFVCVeWZA5YSPpnoBFmCE8iuuFuarPcPYZY/m5CtmwsSJvfFDIknss5w==","signatures":[{"sig":"MEYCIQDWvFFt7dz7EwHRYX6cVxMVN8lzupDhwi2mENoO/VJ3ewIhANY0mphz4jUmgroPxJT1DPV3p0QmbKBze/fJPlUzvNae","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":206033},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"13f114d818b7c224e60b21104ed594d088f57f6b","scripts":{"dev":"tsup --watch","lint":"eslint . --ext ts --report-unused-disable-directives --max-warnings 0","test":"vitest","build":"tsup","clean":"rm -rf dist .turbo node_modules"},"_npmUser":{"name":"james_man","email":"temman_lin@qq.com"},"repository":{"url":"git+https://github.com/Tem-man/power-link.git","type":"git"},"_npmVersion":"10.9.2","description":"A pure TypeScript visual node connector for creating draggable connections between nodes. Framework-agnostic and easy to use","directories":{},"_nodeVersion":"23.11.1","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.1","vitest":"^1.2.2","typescript":"^5.3.3","@connector/tsconfig":"workspace:*"},"_npmOperationalInternal":{"tmp":"tmp/power-link_2.0.2_1772932546747_0.4860096556825617","host":"s3://npm-registry-packages-npm-production"}},"2.0.3":{"name":"power-link","version":"2.0.3","keywords":["connector","node-link","visual-connector","drag-line","bezier-curve","high-customization","flow-chart"],"author":{"name":"Lin Ji Man","email":"Temman_lin@qq.com"},"license":"MIT","_id":"power-link@2.0.3","maintainers":[{"name":"james_man","email":"temman_lin@qq.com"}],"homepage":"https://tem-man.github.io/power-link","bugs":{"url":"https://github.com/Tem-man/power-link/issues"},"dist":{"shasum":"89181de4186dd9d7d899b5e028934c48cd0cc1f0","tarball":"https://registry.npmjs.org/power-link/-/power-link-2.0.3.tgz","fileCount":7,"integrity":"sha512-6PmRcxkx7ehRPEkFebwmSZhVQZSsEUpEZW2k1I1dDdjcVbRn8xdAcshgB7QW57vWCiHToUpMTefe2euVz8xP/g==","signatures":[{"sig":"MEYCIQCKLhQSCnkbopGHxGVS0GqdXmvc74mz5beP6FDeK7HzdwIhAMSWa1LSiB0+hW3IEpGqRaGFn9piuyl0+AObU6ZhnVTI","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":206468},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"13f114d818b7c224e60b21104ed594d088f57f6b","scripts":{"dev":"tsup --watch","lint":"eslint . --ext ts --report-unused-disable-directives --max-warnings 0","test":"vitest","build":"tsup","clean":"rm -rf dist .turbo node_modules"},"_npmUser":{"name":"james_man","email":"temman_lin@qq.com"},"repository":{"url":"git+https://github.com/Tem-man/power-link.git","type":"git"},"_npmVersion":"10.9.2","description":"A pure TypeScript visual node connector for creating draggable connections between nodes. Framework-agnostic and easy to use","directories":{},"_nodeVersion":"23.11.1","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.1","vitest":"^1.2.2","typescript":"^5.3.3","@connector/tsconfig":"workspace:*"},"_npmOperationalInternal":{"tmp":"tmp/power-link_2.0.3_1772947660878_0.32181396956402697","host":"s3://npm-registry-packages-npm-production"}},"2.0.4":{"name":"power-link","version":"2.0.4","keywords":["connector","node-link","visual-connector","drag-line","bezier-curve","high-customization","flow-chart"],"author":{"name":"Lin Ji Man","email":"Temman_lin@qq.com"},"license":"MIT","_id":"power-link@2.0.4","maintainers":[{"name":"james_man","email":"temman_lin@qq.com"}],"homepage":"https://tem-man.github.io/power-link","bugs":{"url":"https://github.com/Tem-man/power-link/issues"},"dist":{"shasum":"2002ae8fe285a6d8bceca6165dc92e6e30644ac4","tarball":"https://registry.npmjs.org/power-link/-/power-link-2.0.4.tgz","fileCount":7,"integrity":"sha512-pEY9Pf0bgmUyWMo7oIACKoJFnTbHoPqQ5DIup/kipOQdLhme26mhx49/raCffHsQ3T6lObXLGb+/FxUmAfvu5Q==","signatures":[{"sig":"MEYCIQCB1JOLZzBMDhqSjl4aAdzzRt7J7C7RqMhMcBvrnwpISAIhAOP1DdwwcDyYPYH/CdDZUZL97RHWp42jZzhry/X5lcAN","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":206454},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"13f114d818b7c224e60b21104ed594d088f57f6b","scripts":{"dev":"tsup --watch","lint":"eslint . --ext ts --report-unused-disable-directives --max-warnings 0","test":"vitest","build":"tsup","clean":"rm -rf dist .turbo node_modules"},"_npmUser":{"name":"james_man","email":"temman_lin@qq.com"},"repository":{"url":"git+https://github.com/Tem-man/power-link.git","type":"git"},"_npmVersion":"10.9.2","description":"A pure TypeScript visual node connector for creating draggable connections between nodes. Framework-agnostic and easy to use","directories":{},"_nodeVersion":"23.11.1","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.1","vitest":"^1.2.2","typescript":"^5.3.3","@connector/tsconfig":"workspace:*"},"_npmOperationalInternal":{"tmp":"tmp/power-link_2.0.4_1772948191986_0.2614629014340102","host":"s3://npm-registry-packages-npm-production"}},"2.0.5":{"name":"power-link","version":"2.0.5","keywords":["connector","node-link","visual-connector","drag-line","bezier-curve","high-customization","flow-chart"],"author":{"name":"Lin Ji Man","email":"Temman_lin@qq.com"},"license":"MIT","_id":"power-link@2.0.5","maintainers":[{"name":"james_man","email":"temman_lin@qq.com"}],"homepage":"https://tem-man.github.io/power-link","bugs":{"url":"https://github.com/Tem-man/power-link/issues"},"dist":{"shasum":"3a3ac480380c582a45f9db177248377cf7e03fed","tarball":"https://registry.npmjs.org/power-link/-/power-link-2.0.5.tgz","fileCount":7,"integrity":"sha512-hSAE6RNv5vub5ryeCaZJ3GsSg5SubzZbraWfKKEvRiPY3IxRRt/qWg6Ncdke2h90kR2HZwnjny8PTG7ze2xeZw==","signatures":[{"sig":"MEUCICF+eafcBRnZXcZyAABhwBKmWlQfx45r85jO4/aMWE78AiEA59BRAlPrZwpYa6jwCUq8l2D2BB4BbqQW/6d/UELDETs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":206674},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"76a866d557c37863d6af6bc2e85963abad2d1240","scripts":{"dev":"tsup --watch","lint":"eslint . --ext ts --report-unused-disable-directives --max-warnings 0","test":"vitest","build":"tsup","clean":"rm -rf dist .turbo node_modules"},"_npmUser":{"name":"james_man","email":"temman_lin@qq.com"},"repository":{"url":"git+https://github.com/Tem-man/power-link.git","type":"git"},"_npmVersion":"10.9.2","description":"A pure TypeScript visual node connector for creating draggable connections between nodes. Framework-agnostic and easy to use","directories":{},"_nodeVersion":"23.11.1","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.1","vitest":"^1.2.2","typescript":"^5.3.3","@connector/tsconfig":"workspace:*"},"_npmOperationalInternal":{"tmp":"tmp/power-link_2.0.5_1773568033671_0.23671404906908355","host":"s3://npm-registry-packages-npm-production"}},"2.1.0":{"name":"power-link","version":"2.1.0","description":"A pure TypeScript visual node connector for creating draggable connections between nodes. Framework-agnostic and easy to use","author":{"name":"Lin Ji Man","email":"Temman_lin@qq.com"},"keywords":["connector","node-link","visual-connector","drag-line","bezier-curve","high-customization","flow-chart"],"license":"MIT","homepage":"https://tem-man.github.io/power-link","repository":{"type":"git","url":"git+https://github.com/Tem-man/power-link.git"},"main":"./dist/index.js","module":"./dist/index.mjs","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"scripts":{"build":"tsup","dev":"tsup --watch","test":"vitest","lint":"eslint . --ext ts --report-unused-disable-directives --max-warnings 0","clean":"rm -rf dist .turbo node_modules"},"devDependencies":{"@connector/tsconfig":"workspace:*","tsup":"^8.0.1","typescript":"^5.3.3","vitest":"^1.2.2"},"_id":"power-link@2.1.0","gitHead":"041e08c8f648d20ea057ed04c44f14bb22fbf182","bugs":{"url":"https://github.com/Tem-man/power-link/issues"},"_nodeVersion":"23.11.1","_npmVersion":"10.9.2","dist":{"integrity":"sha512-UoJkJb9LK4wpShSN86odY/iETXCsPV9jwKjQvQYAgaw4Stj6Byt3pQs7QGPl7stbH3MRwfZA3HJRJ406IKmw4g==","shasum":"a31beb30e4dcc8eeafda261f034e7a13d4380618","tarball":"https://registry.npmjs.org/power-link/-/power-link-2.1.0.tgz","fileCount":7,"unpackedSize":221207,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCRlFSvk5Bza4fTr3ciLMhuJGfTz3/Wz5beDgLNoIsnhgIhAOeI00ZuvY0xSWvffmr0IEl7++024c42qH37PgWi3hk0"}]},"_npmUser":{"name":"james_man","email":"temman_lin@qq.com"},"directories":{},"maintainers":[{"name":"james_man","email":"temman_lin@qq.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/power-link_2.1.0_1773585573443_0.9672771266362421"},"_hasShrinkwrap":false}},"time":{"created":"2025-11-22T04:03:32.896Z","modified":"2026-03-15T14:39:33.694Z","0.0.4":"2025-11-22T04:03:33.255Z","0.0.5":"2025-11-22T04:30:04.850Z","0.0.6":"2025-11-22T04:40:49.375Z","0.0.7":"2025-11-29T03:18:53.229Z","0.0.8":"2025-12-06T04:00:14.307Z","0.0.9":"2025-12-20T04:14:00.814Z","0.1.0":"2026-01-18T15:09:42.251Z","0.1.1":"2026-01-18T15:14:37.418Z","0.1.2":"2026-01-18T15:16:45.177Z","1.0.0":"2026-02-07T09:14:36.920Z","1.0.1":"2026-02-07T09:20:09.974Z","1.0.2":"2026-02-07T09:48:05.807Z","1.0.3":"2026-02-26T06:43:40.834Z","1.0.4":"2026-03-04T01:31:38.634Z","1.0.5":"2026-03-04T01:33:38.898Z","1.0.6":"2026-03-04T01:36:28.825Z","1.0.7":"2026-03-04T01:37:23.555Z","1.0.8":"2026-03-04T01:38:23.759Z","1.0.9":"2026-03-04T01:41:44.741Z","1.0.10":"2026-03-04T01:42:20.663Z","1.0.11":"2026-03-04T01:43:22.162Z","1.0.12":"2026-03-04T01:44:11.983Z","2.0.0":"2026-03-07T10:32:20.313Z","2.0.1":"2026-03-07T10:41:51.396Z","2.0.2":"2026-03-08T01:15:46.909Z","2.0.3":"2026-03-08T05:27:41.030Z","2.0.4":"2026-03-08T05:36:32.154Z","2.0.5":"2026-03-15T09:47:13.805Z","2.1.0":"2026-03-15T14:39:33.584Z"},"bugs":{"url":"https://github.com/Tem-man/power-link/issues"},"author":{"name":"Lin Ji Man","email":"Temman_lin@qq.com"},"license":"MIT","homepage":"https://tem-man.github.io/power-link","keywords":["connector","node-link","visual-connector","drag-line","bezier-curve","high-customization","flow-chart"],"repository":{"type":"git","url":"git+https://github.com/Tem-man/power-link.git"},"description":"A pure TypeScript visual node connector for creating draggable connections between nodes. Framework-agnostic and easy to use","maintainers":[{"name":"james_man","email":"temman_lin@qq.com"}],"readme":"# power-link\r\n\r\n[![npm version](https://img.shields.io/npm/v/power-link.svg)](https://www.npmjs.com/package/power-link)\r\n[![license](https://img.shields.io/npm/l/power-link.svg)](https://github.com/Tem-man/power-link/blob/main)\r\n\r\nA pure TypeScript visual node connector for creating draggable connections between nodes. Framework-agnostic and easy to use.\r\n\r\n![Node Link Connector Demo](https://github.com/Tem-man/power-link/blob/main/public/images/screen-shot.png)\r\n\r\n### online demo\r\nvisit [online demo](https://tem-man.github.io/power-link)\r\n\r\n## ✨ Features\r\n\r\n- 🎯 **Visual Node Connections** - Create beautiful bezier curve connections between nodes\r\n- 🖱️ **Drag & Drop** - Intuitive drag-and-drop connection creation\r\n- 🔄 **Node Dragging** - Move nodes around with automatic connection updates\r\n- 🧲 **Smart Snapping** - Automatic connection point detection and snapping\r\n- 🎨 **Customizable** - Fully configurable colors, sizes, and behaviors\r\n- 🚫 **Delete Connections** - Hover over connections to show delete button\r\n- 📦 **Zero Dependencies** - Pure JavaScript, no framework required\r\n- 🎭 **Multiple Connection Points** - Support for left and right connection dots\r\n- 🔌 **Event Callbacks** - Listen to connection and disconnection events\r\n- 🖱️ **Context Menu Hooks** - `onNodeContextMenu` and `onCanvasContextMenu` for custom right-click menus\r\n- 📐 **Coordinate Conversion** - `clientToCanvas()` for converting viewport coordinates to canvas space\r\n\r\n## 📦 Installation\r\n\r\n```bash\r\nnpm install power-link\r\n```\r\n\r\nOr using yarn:\r\n\r\n```bash\r\nyarn add power-link\r\n```\r\n\r\nOr using pnpm:\r\n\r\n```bash\r\npnpm add power-link\r\n```\r\n\r\n## 🚀 Quick Start\r\n\r\n### Basic Usage\r\n\r\n```javascript\r\nimport Connector from \"power-link\";\r\n\r\n// 1. Get container element\r\nconst container = document.getElementById(\"connector-container\");\r\n\r\n// 2. Create connector instance\r\nconst connector = new Connector({\r\n  container: container,\r\n\r\n  // Optional configuration\r\n  lineColor: \"#155BD4\",\r\n  lineWidth: 2,\r\n  dotSize: 12,\r\n  dotColor: \"#155BD4\",\r\n\r\n  // Event callbacks\r\n  onConnect: (connection) => {\r\n    console.log(\"Connection created:\", connection);\r\n    // connection: { from: 'node1', to: 'node2', fromDot: 'right', toDot: 'left' }\r\n  },\r\n\r\n  onDisconnect: (connection) => {\r\n    console.log(\"Connection removed:\", connection);\r\n  },\r\n\r\n  onViewChange: (viewState) => {\r\n    console.log(\"View changed:\", viewState);\r\n    // viewState: { scale: 1, translateX: 0, translateY: 0 }\r\n    // Save view state to restore later\r\n  },\r\n\r\n  onNodeMove: ({ id, x, y }) => {\r\n    console.log(\"Node moved:\", id, \"to\", x, y);\r\n    // Synchronize node position with your state management\r\n    // This prevents nodes from jumping back after dragging\r\n  }\r\n});\r\n\r\n// 3. Register nodes\r\nconst node1 = document.getElementById(\"node1\");\r\nconst node2 = document.getElementById(\"node2\");\r\n\r\nconnector.registerNode(\"node1\", node1, {\r\n  dotPositions: [\"right\"] // Only right connection dot\r\n});\r\n\r\nconnector.registerNode(\"node2\", node2, {\r\n  dotPositions: [\"left\", \"right\"] // Both left and right dots\r\n});\r\n```\r\n\r\n### HTML Structure\r\n\r\n```html\r\n<div\r\n  id=\"connector-container\"\r\n  style=\"position: relative; height: 600px;\"\r\n>\r\n  <div\r\n    id=\"node1\"\r\n    style=\"position: absolute; left: 100px; top: 100px;\"\r\n  >\r\n    Node 1\r\n  </div>\r\n  <div\r\n    id=\"node2\"\r\n    style=\"position: absolute; left: 400px; top: 100px;\"\r\n  >\r\n    Node 2\r\n  </div>\r\n</div>\r\n```\r\n\r\n## 📖 API Documentation\r\n\r\n### Constructor Options\r\n\r\n| Option             | Type        | Default      | Description                                     |\r\n| ------------------ | ----------- | ------------ | ----------------------------------------------- |\r\n| `container`        | HTMLElement | **Required** | Container element for the connector             |\r\n| `lineColor`        | String      | `'#155BD4'`  | Color of connection lines                       |\r\n| `lineWidth`        | Number      | `2`          | Width of connection lines                       |\r\n| `dotSize`          | Number      | `12`         | Size of connection dots                         |\r\n| `dotColor`         | String      | `'#155BD4'`  | Color of connection dots                        |\r\n| `dotHoverScale`    | Number      | `1.8`        | Scale factor when hovering over connection dots |\r\n| `deleteButtonSize` | Number      | `20`         | Size of delete button                           |\r\n| `enableNodeDrag`   | Boolean     | `true`       | Enable node dragging                            |\r\n| `enableSnap`       | Boolean     | `true`       | Enable connection snapping                      |\r\n| `snapDistance`     | Number      | `20`         | Snap distance in pixels                         |\r\n| `enableZoom`       | Boolean     | `true`       | Enable zoom functionality                       |\r\n| `enablePan`        | Boolean     | `true`       | Enable pan functionality                        |\r\n| `minZoom`          | Number      | `0.1`        | Minimum zoom level (10%)                        |\r\n| `maxZoom`          | Number      | `4`          | Maximum zoom level (400%)                       |\r\n| `zoomStep`         | Number      | `0.1`        | Zoom step size (10%)                            |\r\n| `onConnect`        | Function    | `() => {}`   | Callback when connection is created             |\r\n| `onDisconnect`     | Function    | `() => {}`   | Callback when connection is removed             |\r\n| `onViewChange`     | Function    | `() => {}`   | Callback when view state changes (zoom/pan)    |\r\n| `onNodeMove`       | Function    | `() => {}`   | Callback when a node is dragged (receives `{ id, x, y }`) |\r\n| `onNodeSelect`     | Function    | `() => {}`   | Callback when a node is selected/deselected (receives node info or `null`) |\r\n| `onNodeDelete`     | Function    | `() => {}`   | Callback when a node is deleted (receives `{ id, info }`) |\r\n| `onNodeContextMenu` | Function   | -            | Callback when right-clicking a node (receives `{ id, info, clientX, clientY }`). Library auto prevents default menu. |\r\n| `onCanvasContextMenu` | Function | -            | Callback when right-clicking empty canvas (receives `{ clientX, clientY, canvasX, canvasY }`). `canvasX/Y` are pre-converted coordinates. |\r\n\r\n### Methods\r\n\r\n#### `registerNode(id, element, options)`\r\n\r\nRegister a node for connection.\r\n\r\n**Parameters:**\r\n\r\n- `id` (String): Unique identifier for the node\r\n- `element` (HTMLElement): DOM element of the node\r\n- `options` (Object): Node configuration\r\n  - `label` (String): Node name/label (optional)\r\n  - `dotPositions` (String | Array): Connection dot positions\r\n    - `'both'`: Both left and right dots\r\n    - `'left'`: Only left dot (string format)\r\n    - `'right'`: Only right dot (string format)\r\n    - `['left', 'right']`: Array format, both sides\r\n    - `['left']`: Only left dot (array format)\r\n    - `['right']`: Only right dot (array format)\r\n  - `info` (Object): Node extraneous information\r\n\r\n**Returns:** Node object\r\n\r\n**Example:**\r\n\r\n```javascript\r\nconnector.registerNode(\"myNode\", element, {\r\n  label: \"My Node\",\r\n  dotPositions: [\"right\"],\r\n  info: {\r\n    id: \"123\",\r\n    name: \"apple\",\r\n    desc: \"this is a red apple\"\r\n  }\r\n});\r\n```\r\n\r\n#### `createConnection(fromNodeId, toNodeId, fromDot, toDot, options)`\r\n\r\nProgrammatically create a connection between nodes.\r\n\r\n**Parameters:**\r\n\r\n- `fromNodeId` (String): Source node ID\r\n- `toNodeId` (String): Target node ID\r\n- `fromDot` (String): Source connection dot position - `'left'` or `'right'` (optional)\r\n- `toDot` (String): Target connection dot position - `'left'` or `'right'` (optional)\r\n- `options` (Object): Configuration options (optional)\r\n  - `silent` (boolean): Whether to create silently (without triggering callbacks)\r\n\r\n**Returns:** Connection object or undefined\r\n\r\n**Example:**\r\n\r\n```javascript\r\n// Create connection with callbacks\r\nconnector.createConnection(\"node1\", \"node2\");\r\n\r\n// Create connection with specific dot positions\r\nconnector.createConnection(\"node1\", \"node2\", \"right\", \"left\");\r\n\r\n// Create connection silently without triggering callbacks\r\nconnector.createConnection(\"node1\", \"node2\", \"right\", \"left\", { silent: true });\r\n```\r\n\r\n#### `disconnect(connectionId，options)`\r\n\r\nRemove a connection.\r\n\r\n**Parameters:**\r\n\r\n- `connectionId` (String): Connection ID (optional, if not provided, removes all connections)\r\n- `options` (Object): Configuration options (optional)\r\n  - `silent` (boolean): Whether to disconnect silently (without triggering callbacks)\r\n\r\n**Example:**\r\n\r\n```javascript\r\nconnector.disconnect(); // Remove all connections\r\nconnector.disconnect(\"connection-id\"); // Remove specific connection\r\nconnector.disconnect(\"connection-id\", { silent: true }); // Remove connection silently without triggering callbacks\r\n```\r\n\r\n#### `getConnections()`\r\n\r\nGet all connections.\r\n\r\n**Returns:** Array of connection information\r\n\r\n**Example:**\r\n\r\n```javascript\r\nconst connections = connector.getConnections();\r\n// [{ id: '...', from: 'node1', to: 'node2', fromDot: 'right', toDot: 'left' }]\r\n```\r\n\r\n#### `getNodeConnections(nodeId)`\r\n\r\nGet all connections for a specific node.\r\n\r\n**Parameters:**\r\n\r\n- `nodeId` (String): Node ID\r\n\r\n**Returns:** Array of connection information\r\n\r\n#### `updateNodePosition(nodeId)`\r\n\r\nUpdate node position (called when node is moved).\r\n\r\n**Parameters:**\r\n\r\n- `nodeId` (String): Node ID\r\n\r\n#### `deleteNode(id)`\r\n\r\nDelete a node and all its connections. This method removes the node from the connector, disconnects all associated connections, and triggers the `onNodeDelete` callback.\r\n\r\n**Note:** This method does not remove the DOM element itself. You should handle DOM removal in your framework (e.g., Vue/React) within the `onNodeDelete` callback.\r\n\r\n**Parameters:**\r\n\r\n- `id` (String): Node ID to delete\r\n\r\n**Example:**\r\n\r\n```javascript\r\n// Delete a specific node\r\nconnector.deleteNode('node1');\r\n\r\n// In your connector setup, handle the deletion callback\r\nconst connector = new Connector({\r\n  container: container,\r\n  onNodeDelete: ({ id, info }) => {\r\n    console.log('Node deleted:', id);\r\n    // Remove node from your state management\r\n    // In Vue: nodes.value = nodes.value.filter(n => n.id !== id);\r\n    // In React: setNodes(nodes.filter(n => n.id !== id));\r\n  }\r\n});\r\n```\r\n\r\n#### `destroy(options)`\r\n\r\nDestroy the connector and clean up all resources.\r\n\r\n**Parameters:**\r\n\r\n- `options` (Object): Configuration options (optional)\r\n  - `silent` (boolean): Whether to destroy silently (without triggering callbacks)\r\n\r\n**Example:**\r\n\r\n```javascript\r\nconnector.destroy(); // Destroy silently by default (without triggering callbacks)\r\nconnector.destroy({ silent: false }); // Destroy non-silently (triggering callbacks)\r\n```\r\n\r\n#### `setViewState(state)`\r\n\r\nSet the view state (for initialization or restoring view).\r\n\r\n**Parameters:**\r\n\r\n- `state` (Object): View state object\r\n  - `scale` (Number): View scale (optional)\r\n  - `translateX` (Number): X-axis translation (optional)\r\n  - `translateY` (Number): Y-axis translation (optional)\r\n\r\n**Example:**\r\n\r\n```javascript\r\nconnector.setViewState({\r\n  scale: 0.8,\r\n  translateX: 50,\r\n  translateY: 30\r\n});\r\n```\r\n\r\n#### `getViewState()`\r\n\r\nGet the current view state.\r\n\r\n**Returns:** ViewState object with `scale`, `translateX`, and `translateY` properties\r\n\r\n**Example:**\r\n\r\n```javascript\r\nconst viewState = connector.getViewState();\r\nconsole.log(viewState); // { scale: 1, translateX: 0, translateY: 0 }\r\n```\r\n\r\n#### `clientToCanvas(clientX, clientY)`\r\n\r\nConvert viewport (client) coordinates to canvas (contentWrapper) coordinates. Automatically accounts for current zoom and pan.\r\n\r\nUseful for: pasting nodes at cursor position, positioning tooltips, handling external drag-and-drop, etc.\r\n\r\n**Parameters:**\r\n\r\n- `clientX` (Number): X coordinate in viewport (e.g. `MouseEvent.clientX`)\r\n- `clientY` (Number): Y coordinate in viewport (e.g. `MouseEvent.clientY`)\r\n\r\n**Returns:** `{ x, y }` - Canvas coordinates\r\n\r\n**Example:**\r\n\r\n```javascript\r\n// Paste node at mouse cursor position\r\ncanvas.addEventListener('click', (e) => {\r\n  const pos = connector.clientToCanvas(e.clientX, e.clientY);\r\n  addNodeAt(pos.x, pos.y);\r\n});\r\n\r\n// Or with Ctrl+V paste\r\ndocument.addEventListener('keydown', (e) => {\r\n  if (e.ctrlKey && e.key === 'v') {\r\n    const pos = connector.clientToCanvas(lastMouseX, lastMouseY);\r\n    pasteNode(pos.x, pos.y);\r\n  }\r\n});\r\n```\r\n\r\n#### `setZoom(scale)`\r\n\r\nSet the zoom level (centered on canvas).\r\n\r\n**Parameters:**\r\n\r\n- `scale` (Number): Zoom scale (will be clamped to minZoom and maxZoom)\r\n\r\n**Example:**\r\n\r\n```javascript\r\nconnector.setZoom(1.5); // Zoom to 150%\r\n```\r\n\r\n#### `getZoom()`\r\n\r\nGet the current zoom level.\r\n\r\n**Returns:** Number - Current zoom scale\r\n\r\n**Example:**\r\n\r\n```javascript\r\nconst currentZoom = connector.getZoom();\r\nconsole.log(currentZoom); // 1.0\r\n```\r\n\r\n#### `zoomIn()`\r\n\r\nZoom in by one step.\r\n\r\n**Example:**\r\n\r\n```javascript\r\nconnector.zoomIn(); // Increase zoom by zoomStep\r\n```\r\n\r\n#### `zoomOut()`\r\n\r\nZoom out by one step.\r\n\r\n**Example:**\r\n\r\n```javascript\r\nconnector.zoomOut(); // Decrease zoom by zoomStep\r\n```\r\n\r\n#### `resetView()`\r\n\r\nReset the view to default state (scale: 1, translateX: 0, translateY: 0).\r\n\r\n**Example:**\r\n\r\n```javascript\r\nconnector.resetView(); // Reset to default view\r\n```\r\n\r\n#### `updateAllConnections()`\r\n\r\nUpdate all connection line positions (useful when container size changes or after manual node position updates).\r\n\r\n**Example:**\r\n\r\n```javascript\r\nconnector.updateAllConnections(); // Refresh all connection lines\r\n```\r\n\r\n#### `export()`\r\n\r\nExport the current topology (nodes, connections, and view state) as a JSON object.\r\n\r\n**Returns:** ExportData object containing:\r\n- `nodes`: Array of node data (id, label, x, y, info, dotPositions)\r\n- `connections`: Array of connection data (from, fromLabel, fromInfo, to, toLabel, toInfo, fromDot, toDot)\r\n- `viewState`: Current view state (scale, translateX, translateY)\r\n\r\n**Example:**\r\n\r\n```javascript\r\nconst data = connector.export();\r\nconsole.log(data);\r\n// {\r\n//   nodes: [\r\n//     { id: 'node1', label: 'Node 1', x: 100, y: 100, info: {...}, dotPositions: ['right'] },\r\n//     { id: 'node2', label: 'Node 2', x: 400, y: 100, info: {...}, dotPositions: ['left'] }\r\n//   ],\r\n//   connections: [\r\n//     { \r\n//       from: 'node1', \r\n//       fromLabel: 'Node 1', \r\n//       fromInfo: {...}, \r\n//       to: 'node2', \r\n//       toLabel: 'Node 2', \r\n//       toInfo: {...}, \r\n//       fromDot: 'right', \r\n//       toDot: 'left' \r\n//     }\r\n//   ],\r\n//   viewState: { scale: 1, translateX: 0, translateY: 0 }\r\n// }\r\n\r\n// Save to localStorage\r\nlocalStorage.setItem('topology', JSON.stringify(data));\r\n\r\n// Or send to server\r\nawait fetch('/api/topology', {\r\n  method: 'POST',\r\n  body: JSON.stringify(data)\r\n});\r\n```\r\n\r\n#### `import(data, nodeFactory?)`\r\n\r\nRestore topology from exported data. Supports two modes:\r\n\r\n**Parameters:**\r\n\r\n- `data` (ExportData): Topology data returned by `export()`\r\n- `nodeFactory` (Function, optional): Factory function for creating DOM elements (native JS mode only)\r\n\r\n**Two Usage Modes:**\r\n\r\n1. **Framework Mode (Vue/React/etc.) - No nodeFactory**\r\n   - Framework handles DOM rendering\r\n   - Library finds elements by `id` attribute\r\n   - Use when nodes are managed by framework reactivity\r\n\r\n2. **Native JS Mode - With nodeFactory**\r\n   - Library calls factory to create DOM elements\r\n   - Library handles positioning and mounting\r\n   - Use for pure JavaScript applications\r\n\r\n**Returns:** Promise<void>\r\n\r\n**Example (Framework Mode - Vue):**\r\n\r\n```javascript\r\n// Save\r\nconst data = connector.export();\r\nlocalStorage.setItem('topology', JSON.stringify(data));\r\n\r\n// Load\r\nconst savedData = JSON.parse(localStorage.getItem('topology'));\r\n// 1. Update framework reactive state (triggers DOM rendering)\r\nnodes.value = savedData.nodes;\r\n// 2. Wait for DOM to be ready\r\nawait nextTick();\r\n// 3. Import (library finds elements by id and restores connections)\r\nawait connector.import(savedData);\r\n```\r\n\r\n**Example (Native JS Mode):**\r\n\r\n```javascript\r\n// Save\r\nconst data = connector.export();\r\nlocalStorage.setItem('topology', JSON.stringify(data));\r\n\r\n// Load\r\nconst savedData = JSON.parse(localStorage.getItem('topology'));\r\nawait connector.import(savedData, (nodeData) => {\r\n  // Factory function: create and return DOM element\r\n  const el = document.createElement('div');\r\n  el.id = nodeData.id;\r\n  el.className = 'node';\r\n  el.textContent = nodeData.info?.name || nodeData.id;\r\n  el.style.position = 'absolute';\r\n  // Library will set left/top automatically\r\n  return el;\r\n});\r\n```\r\n\r\n**Note:** Connections are restored silently (without triggering `onConnect` callbacks) to avoid duplicate events during data restoration.\r\n\r\n\r\n## 🎨 Usage Examples\r\n\r\n### Vue 3\r\n\r\n```vue\r\n<template>\r\n  <div\r\n    class=\"container\"\r\n    ref=\"containerRef\"\r\n  >\r\n    <div\r\n      class=\"node\"\r\n      ref=\"node1Ref\"\r\n    >\r\n      Node 1\r\n    </div>\r\n    <div\r\n      class=\"node\"\r\n      ref=\"node2Ref\"\r\n    >\r\n      Node 2\r\n    </div>\r\n  </div>\r\n</template>\r\n\r\n<script setup>\r\n  import { ref, onMounted, onBeforeUnmount } from \"vue\";\r\n  import Connector from \"power-link\";\r\n\r\n  const containerRef = ref(null);\r\n  const node1Ref = ref(null);\r\n  const node2Ref = ref(null);\r\n\r\n  let connector = null;\r\n\r\n  onMounted(() => {\r\n    connector = new Connector({\r\n      container: containerRef.value,\r\n      onConnect: (connection) => {\r\n        console.log(\"Connection created:\", connection);\r\n      },\r\n      onDisconnect: (connection) => {\r\n        console.log(\"Connection removed:\", connection);\r\n      }\r\n    });\r\n\r\n    connector.registerNode(\"node1\", node1Ref.value, {\r\n      dotPositions: [\"right\"],\r\n      info: {\r\n        id: \"123\",\r\n        name: \"apple\",\r\n        desc: \"this is a red apple\"\r\n      }\r\n    });\r\n\r\n    connector.registerNode(\"node2\", node2Ref.value, {\r\n      dotPositions: [\"left\"],\r\n      info: {\r\n        id: \"456\",\r\n        name: \"pear\",\r\n        desc: \"this is a yellow pear\"\r\n      }\r\n    });\r\n  });\r\n\r\n  onBeforeUnmount(() => {\r\n    if (connector) {\r\n      connector.destroy();\r\n    }\r\n  });\r\n</script>\r\n\r\n<style scoped>\r\n  .container {\r\n    position: relative;\r\n    height: 600px;\r\n    background: #f5f5f5;\r\n  }\r\n\r\n  .node {\r\n    position: absolute;\r\n    padding: 20px;\r\n    background: white;\r\n    border-radius: 8px;\r\n    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\r\n    cursor: move;\r\n  }\r\n</style>\r\n````\r\n\r\n### React\r\n\r\n```jsx\r\nimport { useEffect, useRef } from \"react\";\r\nimport Connector from \"power-link\";\r\n\r\nfunction App() {\r\n  const containerRef = useRef(null);\r\n  const node1Ref = useRef(null);\r\n  const node2Ref = useRef(null);\r\n  const connectorRef = useRef(null);\r\n\r\n  useEffect(() => {\r\n    if (!containerRef.current) return;\r\n\r\n    connectorRef.current = new Connector({\r\n      container: containerRef.current,\r\n      onConnect: (connection) => {\r\n        console.log(\"Connection created:\", connection);\r\n      },\r\n      onDisconnect: (connection) => {\r\n        console.log(\"Connection removed:\", connection);\r\n      }\r\n    });\r\n\r\n    connectorRef.current.registerNode(\"node1\", node1Ref.current, {\r\n      dotPositions: [\"right\"],\r\n      info: {\r\n        id: \"123\",\r\n        name: \"apple\",\r\n        desc: \"this is a red apple\"\r\n      }\r\n    });\r\n\r\n    connectorRef.current.registerNode(\"node2\", node2Ref.current, {\r\n      dotPositions: [\"left\"],\r\n      info: {\r\n        id: \"456\",\r\n        name: \"pear\",\r\n        desc: \"this is a yellow pear\"\r\n      }\r\n    });\r\n\r\n    return () => {\r\n      if (connectorRef.current) {\r\n        connectorRef.current.destroy();\r\n      }\r\n    };\r\n  }, []);\r\n\r\n  return (\r\n    <div\r\n      ref={containerRef}\r\n      style={{ position: \"relative\", height: \"600px\" }}\r\n    >\r\n      <div\r\n        ref={node1Ref}\r\n        style={{ position: \"absolute\", left: \"100px\", top: \"100px\" }}\r\n      >\r\n        Node 1\r\n      </div>\r\n      <div\r\n        ref={node2Ref}\r\n        style={{ position: \"absolute\", left: \"400px\", top: \"100px\" }}\r\n      >\r\n        Node 2\r\n      </div>\r\n    </div>\r\n  );\r\n}\r\n```\r\n\r\n### Vanilla JavaScript\r\n\r\n```html\r\n<!DOCTYPE html>\r\n<html>\r\n  <head>\r\n    <style>\r\n      #container {\r\n        position: relative;\r\n        height: 600px;\r\n        background: #f5f5f5;\r\n      }\r\n      .node {\r\n        position: absolute;\r\n        padding: 20px;\r\n        background: white;\r\n        border-radius: 8px;\r\n        box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\r\n        cursor: move;\r\n      }\r\n    </style>\r\n  </head>\r\n  <body>\r\n    <div id=\"container\">\r\n      <div\r\n        id=\"node1\"\r\n        class=\"node\"\r\n        style=\"left: 100px; top: 100px;\"\r\n      >\r\n        Node 1\r\n      </div>\r\n      <div\r\n        id=\"node2\"\r\n        class=\"node\"\r\n        style=\"left: 400px; top: 100px;\"\r\n      >\r\n        Node 2\r\n      </div>\r\n    </div>\r\n\r\n    <script type=\"module\">\r\n      import Connector from \"power-link\";\r\n\r\n      const connector = new Connector({\r\n        container: document.getElementById(\"container\"),\r\n        onConnect: (connection) => {\r\n          console.log(\"Connection created:\", connection);\r\n        }\r\n      });\r\n\r\n      connector.registerNode(\"node1\", document.getElementById(\"node1\"), {\r\n        dotPositions: [\"right\"],\r\n        info: {\r\n          id: \"123\",\r\n          name: \"apple\",\r\n          desc: \"this is a red apple\"\r\n        }\r\n      });\r\n\r\n      connector.registerNode(\"node2\", document.getElementById(\"node2\"), {\r\n        dotPositions: [\"left\"],\r\n        info: {\r\n          id: \"456\",\r\n          name: \"pear\",\r\n          desc: \"this is a yellow pear\"\r\n        }\r\n      });\r\n    </script>\r\n  </body>\r\n</html>\r\n```\r\n\r\n## 🎯 Advanced Features\r\n\r\n### Multiple Connection Points\r\n\r\n```javascript\r\n// Node with both left and right connection points\r\nconnector.registerNode(\"centerNode\", element, {\r\n  dotPositions: [\"left\", \"right\"]\r\n});\r\n\r\n// Node with only left connection point\r\nconnector.registerNode(\"endNode\", element, {\r\n  dotPositions: [\"left\"],\r\n  info: {\r\n    id: \"456\",\r\n    name: \"pear\",\r\n    desc: \"this is a yellow pear\"\r\n  }\r\n});\r\n\r\n// Node with only right connection point\r\nconnector.registerNode(\"startNode\", element, {\r\n  dotPositions: [\"right\"]\r\n});\r\n```\r\n\r\n### Silent Operations (No Callbacks)\r\n\r\nSometimes you may want to perform operations without triggering callbacks, such as when initializing connections from saved data or bulk operations.\r\n\r\n```javascript\r\n// Silent connection creation (won't trigger onConnect callback)\r\nconnector.createConnection(\"node1\", \"node2\", \"right\", \"left\", { silent: true });\r\n\r\n// Silent disconnection (won't trigger onDisconnect callback)\r\nconnector.disconnect(\"connection-id\", { silent: true });\r\n\r\n// Silent destroy (won't trigger callbacks, default behavior)\r\nconnector.destroy(); // Default is silent\r\nconnector.destroy({ silent: false }); // Non-silent destroy (triggers callbacks)\r\n\r\n// Example: Restore connections from saved data without triggering callbacks\r\nconst savedConnections = [\r\n  { from: \"node1\", to: \"node2\", fromDot: \"right\", toDot: \"left\" },\r\n  { from: \"node2\", to: \"node3\", fromDot: \"right\", toDot: \"left\" }\r\n];\r\n\r\nsavedConnections.forEach((conn) => {\r\n  connector.createConnection(\r\n    conn.from,\r\n    conn.to,\r\n    conn.fromDot,\r\n    conn.toDot,\r\n    { silent: true }\r\n  );\r\n});\r\n```\r\n\r\n### Node Info and Connection Data\r\n\r\nYou can attach custom information to nodes using the `info` parameter, which will be available in connection callbacks.\r\n\r\n```javascript\r\n// Register node with custom info\r\nconst items = [\r\n  { id: \"node1\", name: \"Apple\", desc: \"This is a red apple\", type: \"fruit\" },\r\n  { id: \"node2\", name: \"Pear\", desc: \"This is a yellow pear\", type: \"fruit\" }\r\n];\r\n\r\nitems.forEach((item) => {\r\n  const nodeElement = document.getElementById(item.id);\r\n  connector.registerNode(item.id, nodeElement, {\r\n    dotPositions: [\"left\"],\r\n    info: item // Attach custom info to the node\r\n  });\r\n});\r\n\r\n// Access node info in connection callbacks\r\nconst connector = new Connector({\r\n  container: container,\r\n  onConnect: async (connection) => {\r\n    console.log(\"Connection created:\", connection);\r\n    console.log(\"From node info:\", connection.fromInfo);\r\n    // { id: \"node1\", name: \"Apple\", desc: \"This is a red apple\", type: \"fruit\" }\r\n    console.log(\"To node info:\", connection.toInfo);\r\n    // { id: \"node2\", name: \"Pear\", desc: \"This is a yellow pear\", type: \"fruit\" }\r\n\r\n    // You can use the info for saving to database, validation, etc.\r\n    await saveConnection({\r\n      from: connection.from,\r\n      to: connection.to,\r\n      fromInfo: connection.fromInfo,\r\n      toInfo: connection.toInfo\r\n    });\r\n  },\r\n\r\n  onDisconnect: (connection) => {\r\n    console.log(\"Connection removed:\", connection);\r\n    console.log(\"From node info:\", connection.fromInfo);\r\n    console.log(\"To node info:\", connection.toInfo);\r\n  }\r\n});\r\n```\r\n\r\n### Custom Styling\r\n\r\n```javascript\r\nconst connector = new Connector({\r\n  container: container,\r\n  lineColor: \"#FF6B6B\", // Red connections\r\n  lineWidth: 3, // Thicker lines\r\n  dotSize: 16, // Larger dots\r\n  dotColor: \"#4ECDC4\", // Teal dots\r\n  deleteButtonSize: 24 // Larger delete button\r\n});\r\n```\r\n\r\n### Event Handling\r\n\r\n```javascript\r\nconst connector = new Connector({\r\n  container: container,\r\n\r\n  onConnect: (connection) => {\r\n    console.log(\"New connection:\", connection);\r\n    // { from: 'node1', to: 'node2', fromDot: 'right', toDot: 'left' }\r\n\r\n    // Save to database, update state, etc.\r\n    saveConnection(connection);\r\n  },\r\n\r\n  onDisconnect: (connection) => {\r\n    console.log(\"Connection removed:\", connection);\r\n\r\n    // Update database, state, etc.\r\n    removeConnection(connection);\r\n  },\r\n\r\n  onViewChange: (viewState) => {\r\n    console.log(\"View changed:\", viewState);\r\n    // { scale: 1, translateX: 0, translateY: 0 }\r\n\r\n    // Save view state to restore later\r\n    saveViewState(viewState);\r\n  },\r\n\r\n  onNodeMove: ({ id, x, y }) => {\r\n    console.log(\"Node moved:\", id, \"to\", x, y);\r\n    // Synchronize node position with your state management\r\n    // This prevents nodes from jumping back to original position after dragging\r\n    // In Vue: const node = nodes.value.find(n => n.id === id); if (node) { node.x = x; node.y = y; }\r\n    // In React: setNodes(nodes.map(n => n.id === id ? { ...n, x, y } : n));\r\n  },\r\n\r\n  onNodeSelect: (info) => {\r\n    if (info) {\r\n      console.log(\"Node selected:\", info.id, info.info);\r\n    } else {\r\n      console.log(\"Node deselected\");\r\n    }\r\n  },\r\n\r\n  onNodeDelete: ({ id, info }) => {\r\n    console.log(\"Node deleted:\", id);\r\n    // Remove node from your state management\r\n    // In Vue: nodes.value = nodes.value.filter(n => n.id !== id);\r\n    // In React: setNodes(nodes.filter(n => n.id !== id));\r\n  },\r\n\r\n  // Right-click on a node - show custom context menu\r\n  onNodeContextMenu: ({ id, info, clientX, clientY }) => {\r\n    console.log(\"Node right-clicked:\", id, \"at\", clientX, clientY);\r\n    // Show your custom menu at (clientX, clientY)\r\n    // e.g. showContextMenu(clientX, clientY, { id, info });\r\n  },\r\n\r\n  // Right-click on empty canvas - e.g. paste menu\r\n  onCanvasContextMenu: ({ clientX, clientY, canvasX, canvasY }) => {\r\n    console.log(\"Canvas right-clicked at\", clientX, clientY, \"→ canvas\", canvasX, canvasY);\r\n    // canvasX/Y are pre-converted for paste position, tooltip placement, etc.\r\n    // e.g. showPasteMenu(clientX, clientY, { x: canvasX, y: canvasY });\r\n  }\r\n});\r\n```\r\n\r\n### Node Management\r\n\r\n#### Node Position Synchronization\r\n\r\nWhen using frameworks like Vue or React, you need to synchronize node positions after dragging to prevent nodes from jumping back to their original position. Use the `onNodeMove` callback:\r\n\r\n**Vue Example:**\r\n\r\n```javascript\r\nconst connector = new Connector({\r\n  container: containerRef.value,\r\n  onNodeMove: ({ id, x, y }) => {\r\n    // Update Vue reactive state\r\n    const node = nodes.value.find(n => n.id === id);\r\n    if (node) {\r\n      node.x = x;\r\n      node.y = y;\r\n    }\r\n  }\r\n});\r\n```\r\n\r\n**React Example:**\r\n\r\n```javascript\r\nconst connector = new Connector({\r\n  container: containerRef.current,\r\n  onNodeMove: ({ id, x, y }) => {\r\n    // Update React state\r\n    setNodes(prevNodes => \r\n      prevNodes.map(n => n.id === id ? { ...n, x, y } : n)\r\n    );\r\n  }\r\n});\r\n```\r\n\r\n### View Management\r\n\r\n```javascript\r\n// Get current view state\r\nconst viewState = connector.getViewState();\r\nconsole.log(viewState); // { scale: 1, translateX: 0, translateY: 0 }\r\n\r\n// Set view state (restore saved view)\r\nconnector.setViewState({\r\n  scale: 0.8,\r\n  translateX: 100,\r\n  translateY: 50\r\n});\r\n\r\n// Zoom controls\r\nconnector.setZoom(1.5); // Set zoom to 150%\r\nconnector.zoomIn(); // Zoom in by one step\r\nconnector.zoomOut(); // Zoom out by one step\r\nconst currentZoom = connector.getZoom(); // Get current zoom\r\n\r\n// Reset view\r\nconnector.resetView(); // Reset to default (scale: 1, translateX: 0, translateY: 0)\r\n\r\n// Update all connections (useful after manual node position changes)\r\nconnector.updateAllConnections();\r\n```\r\n\r\n### Save and Restore Topology\r\n\r\nThe `export()` and `import()` methods allow you to save and restore the entire topology (nodes, connections, and view state).\r\n\r\n**Save Topology:**\r\n\r\n```javascript\r\n// Export current topology\r\nconst data = connector.export();\r\n\r\n// Save to localStorage\r\nlocalStorage.setItem('topology', JSON.stringify(data));\r\n\r\n// Or save to server\r\nawait fetch('/api/topology', {\r\n  method: 'POST',\r\n  headers: { 'Content-Type': 'application/json' },\r\n  body: JSON.stringify(data)\r\n});\r\n```\r\n\r\n**Restore Topology (Framework Mode - Vue Example):**\r\n\r\n```vue\r\n<script setup>\r\nimport { ref, onMounted, nextTick } from 'vue';\r\nimport Connector from 'power-link';\r\n\r\nconst containerRef = ref(null);\r\nconst nodes = ref([]);\r\nlet connector = null;\r\n\r\nconst saveTopology = () => {\r\n  const data = connector.export();\r\n  // label is now included in export() by default\r\n  // Merge other custom fields (type, etc.) if needed\r\n  data.nodes = data.nodes.map(exportNode => {\r\n    const origin = nodes.value.find(n => n.id === exportNode.id);\r\n    return { ...exportNode, type: origin?.type };\r\n  });\r\n  localStorage.setItem('topology', JSON.stringify(data));\r\n};\r\n\r\nconst loadTopology = async () => {\r\n  const saved = localStorage.getItem('topology');\r\n  if (saved) {\r\n    const data = JSON.parse(saved);\r\n    // 1. Update reactive state (triggers framework rendering)\r\n    nodes.value = data.nodes;\r\n    // 2. Wait for DOM to be ready\r\n    await nextTick();\r\n    // 3. Import (library finds elements by id and restores connections + view state)\r\n    await connector.import(data);\r\n  }\r\n};\r\n\r\nonMounted(() => {\r\n  connector = new Connector({ container: containerRef.value });\r\n  loadTopology();\r\n});\r\n</script>\r\n```\r\n\r\n**Restore Topology (Native JS Mode):**\r\n\r\n```javascript\r\nconst loadTopology = async () => {\r\n  const saved = localStorage.getItem('topology');\r\n  if (saved) {\r\n    const data = JSON.parse(saved);\r\n    // Import with factory function\r\n    await connector.import(data, (nodeData) => {\r\n      const el = document.createElement('div');\r\n      el.id = nodeData.id;\r\n      el.className = 'node';\r\n      el.textContent = nodeData.info?.name || nodeData.id;\r\n      // Library will set position automatically\r\n      return el;\r\n    });\r\n  }\r\n};\r\n```\r\n\r\n**What's Included in Export:**\r\n\r\n- **Nodes**: ID, label (node name), position (x, y), custom info, dot positions\r\n- **Connections**: from, fromLabel, fromInfo, to, toLabel, toInfo, fromDot, toDot\r\n- **View State**: Current zoom level and pan position (scale, translateX, translateY)\r\n\r\n**Benefits:**\r\n\r\n- ✅ Save/load entire graph state\r\n- ✅ Restore view position and zoom level\r\n- ✅ Preserve all node positions and connections\r\n- ✅ Works with any storage backend (localStorage, database, etc.)\r\n\r\n## 🔧 Browser Support\r\n\r\n- Chrome (latest)\r\n- Firefox (latest)\r\n- Safari (latest)\r\n- Edge (latest)\r\n\r\n## 📝 License\r\n\r\nMIT License\r\n\r\n## 🌟 Show Your Support\r\n\r\nGive a ⭐️ on [GitHub](https://github.com/Tem-man/power-link) if this project helped you!\r\n\r\n## 🤝 Contributing\r\n\r\nIf you have any questions or need help, please open an issue on GitHub.\r\n\r\n---\r\n\r\n","readmeFilename":"README.md"}