{"_id":"@basementuniverse/particles-2d","_rev":"11-0918bd54bbff1e07fa03f6e53ed63aef","name":"@basementuniverse/particles-2d","dist-tags":{"latest":"1.6.0"},"versions":{"1.0.1":{"name":"@basementuniverse/particles-2d","version":"1.0.1","author":{"url":"https://gordonlarrigan.com","name":"Gordon Larrigan","email":"gordonlarrigan@gmail.com"},"license":"MIT","_id":"@basementuniverse/particles-2d@1.0.1","maintainers":[{"name":"basementuniverse","email":"gordonlarrigan@gmail.com"}],"homepage":"https://github.com/basementuniverse/particles-2d#readme","bugs":{"url":"https://github.com/basementuniverse/particles-2d/issues"},"dist":{"shasum":"c347799cccfec0cea96ee11557f65b07cac98994","tarball":"https://registry.npmjs.org/@basementuniverse/particles-2d/-/particles-2d-1.0.1.tgz","fileCount":7,"integrity":"sha512-aH48DegVvEWPINxIW+jPWkHp+t0KYrlkVDVQhPD/sDAl5IiAjJ6VB17eIg+T8R5L/jXTvxtLSbcbegcbKNQEbg==","signatures":[{"sig":"MEQCIEPxUO89w4DbC4+7DZSNeTgz5gC6JDwQGcG+M0ykJB8BAiAJx5lqgDKE52OKBhfm4vTCrmsmfh/SMuPeW6Eyyqq9BA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":334915},"main":"build/index.js","types":"build/index.d.ts","gitHead":"59c4de1e7a1b6b979319c683b4a4d5b477890f6f","scripts":{"build":"webpack","watch":"webpack --watch"},"_npmUser":{"name":"basementuniverse","email":"gordonlarrigan@gmail.com"},"repository":{"url":"git+https://github.com/basementuniverse/particles-2d.git","type":"git"},"_npmVersion":"10.8.2","description":"A component for animating and rendering particles in 2d games","directories":{},"_nodeVersion":"20.18.3","dependencies":{"@basementuniverse/vec":"^2.3.4","@basementuniverse/utils":"^1.7.0","@basementuniverse/parsecolor":"^1.0.2","@basementuniverse/canvas-helpers":"^1.2.1","@basementuniverse/intersection-helpers":"^0.3.0"},"_hasShrinkwrap":false,"devDependencies":{"webpack":"^5.3.2","ts-loader":"^8.0.7","typescript":"^4.9.4","@types/node":"^18.11.12","webpack-cli":"^4.1.0","clean-webpack-plugin":"^4.0.0-alpha.0"},"_npmOperationalInternal":{"tmp":"tmp/particles-2d_1.0.1_1752463619575_0.016828820729696936","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@basementuniverse/particles-2d","version":"1.0.2","author":{"url":"https://gordonlarrigan.com","name":"Gordon Larrigan","email":"gordonlarrigan@gmail.com"},"license":"MIT","_id":"@basementuniverse/particles-2d@1.0.2","maintainers":[{"name":"basementuniverse","email":"gordonlarrigan@gmail.com"}],"homepage":"https://github.com/basementuniverse/particles-2d#readme","bugs":{"url":"https://github.com/basementuniverse/particles-2d/issues"},"dist":{"shasum":"735c1594f93d44da7807a74e5ecfd92f7ce604e7","tarball":"https://registry.npmjs.org/@basementuniverse/particles-2d/-/particles-2d-1.0.2.tgz","fileCount":8,"integrity":"sha512-9HQROM4Xciw//CrXBYZ7jN9pLB37GKSZ/zKmNr/1GxDJcmBr6cddufNc2LwF79Ci39rxDPoGkyryKn/uVQBQMw==","signatures":[{"sig":"MEUCIQD1GG1Fp9l1RFLZAk+xC4DvAm9d6XKFHKuHYlOsanguYQIgdor+G5EIpLgzHytdVnRfnOx+UfkCf53aiVHPcAJFaXw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3055702},"main":"build/index.js","types":"build/index.d.ts","gitHead":"a6c92cd4c468dd4f445f5323d0fc67d8bdc07116","scripts":{"build":"webpack","watch":"webpack --watch"},"_npmUser":{"name":"basementuniverse","email":"gordonlarrigan@gmail.com"},"repository":{"url":"git+https://github.com/basementuniverse/particles-2d.git","type":"git"},"_npmVersion":"10.8.2","description":"A component for animating and rendering particles in 2d games","directories":{},"_nodeVersion":"20.18.3","dependencies":{"@basementuniverse/vec":"^2.3.4","@basementuniverse/utils":"^1.7.0","@basementuniverse/parsecolor":"^1.0.2","@basementuniverse/canvas-helpers":"^1.2.1","@basementuniverse/intersection-helpers":"^0.3.0"},"_hasShrinkwrap":false,"devDependencies":{"webpack":"^5.3.2","ts-loader":"^8.0.7","typescript":"^4.9.4","@types/node":"^18.11.12","webpack-cli":"^4.1.0","clean-webpack-plugin":"^4.0.0-alpha.0"},"_npmOperationalInternal":{"tmp":"tmp/particles-2d_1.0.2_1752543494693_0.5644011556206041","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"@basementuniverse/particles-2d","version":"1.1.1","author":{"url":"https://gordonlarrigan.com","name":"Gordon Larrigan","email":"gordonlarrigan@gmail.com"},"license":"MIT","_id":"@basementuniverse/particles-2d@1.1.1","maintainers":[{"name":"basementuniverse","email":"gordonlarrigan@gmail.com"}],"homepage":"https://github.com/basementuniverse/particles-2d#readme","bugs":{"url":"https://github.com/basementuniverse/particles-2d/issues"},"dist":{"shasum":"86d7814a217738818a1a2d8f6a065d39cbad8c6f","tarball":"https://registry.npmjs.org/@basementuniverse/particles-2d/-/particles-2d-1.1.1.tgz","fileCount":8,"integrity":"sha512-SGioL07QOby9CXF6ld/mGycpDKR9SqrzQNDUFfJVZtnDYfQM8EDy3oou4s+kQusP0kv1EtaNM6GlXVPA2DpWfw==","signatures":[{"sig":"MEUCIQCTkAOasOjSHtCYEQ7NmgFAo7r9f0FZQKm8NB1/3RLAMAIgAyBVJsa+PWaY7usuPzGOHtUwr8CgJf37i+BsuhvhWro=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3061509},"main":"build/index.js","types":"build/index.d.ts","gitHead":"09c4d88c1c232966424de4aeb3163668cade4830","scripts":{"build":"webpack","watch":"webpack --watch"},"_npmUser":{"name":"basementuniverse","email":"gordonlarrigan@gmail.com"},"repository":{"url":"git+https://github.com/basementuniverse/particles-2d.git","type":"git"},"_npmVersion":"11.5.1","description":"A component for animating and rendering particles in 2d games","directories":{},"_nodeVersion":"24.5.0","dependencies":{"@basementuniverse/vec":"^2.3.4","@basementuniverse/utils":"^1.7.0","@basementuniverse/parsecolor":"^1.0.2","@basementuniverse/canvas-helpers":"^1.2.1","@basementuniverse/intersection-helpers":"^0.3.0"},"_hasShrinkwrap":false,"devDependencies":{"webpack":"^5.3.2","ts-loader":"^8.0.7","typescript":"^4.9.4","@types/node":"^18.11.12","webpack-cli":"^4.1.0","clean-webpack-plugin":"^4.0.0-alpha.0"},"_npmOperationalInternal":{"tmp":"tmp/particles-2d_1.1.1_1754232859874_0.43598711337908114","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@basementuniverse/particles-2d","version":"1.2.0","author":{"url":"https://gordonlarrigan.com","name":"Gordon Larrigan","email":"gordonlarrigan@gmail.com"},"license":"MIT","_id":"@basementuniverse/particles-2d@1.2.0","maintainers":[{"name":"basementuniverse","email":"gordonlarrigan@gmail.com"}],"homepage":"https://github.com/basementuniverse/particles-2d#readme","bugs":{"url":"https://github.com/basementuniverse/particles-2d/issues"},"dist":{"shasum":"822eebad20b1af7f942fa9f9fa2c76395aa947b4","tarball":"https://registry.npmjs.org/@basementuniverse/particles-2d/-/particles-2d-1.2.0.tgz","fileCount":5,"integrity":"sha512-fDvXfoLgbrlBIRnVYK0+7uSobVIPzQMuT/oHqnOHiEUt2mRX/yYWh2fX4RT0/QnzxyvHWnTR38bRtQktJhqvNw==","signatures":[{"sig":"MEYCIQDBUvWthtKBw8YL9pEYEgosthvVF2u/M03jO9ThkVShhgIhAPK8nZqx9XYkymdwONymx2Qcu9ihD+J0/VR9R8IiA2J/","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":340271},"main":"build/index.js","types":"build/index.d.ts","gitHead":"78c3c7fb89e0b9b559e8a117ac23833eaafb03f5","scripts":{"build":"webpack","watch":"webpack --watch"},"_npmUser":{"name":"basementuniverse","email":"gordonlarrigan@gmail.com"},"repository":{"url":"git+https://github.com/basementuniverse/particles-2d.git","type":"git"},"_npmVersion":"11.5.1","description":"A component for animating and rendering particles in 2d games","directories":{},"_nodeVersion":"24.5.0","dependencies":{"@basementuniverse/vec":"^2.3.5","@basementuniverse/utils":"^1.7.0","@basementuniverse/parsecolor":"^1.0.2","@basementuniverse/canvas-helpers":"^1.2.1","@basementuniverse/intersection-helpers":"^0.3.0"},"_hasShrinkwrap":false,"devDependencies":{"webpack":"^5.3.2","ts-loader":"^8.0.7","typescript":"^4.9.4","@types/node":"^18.11.12","webpack-cli":"^4.1.0","clean-webpack-plugin":"^4.0.0-alpha.0"},"_npmOperationalInternal":{"tmp":"tmp/particles-2d_1.2.0_1754821976137_0.48775518658528494","host":"s3://npm-registry-packages-npm-production"}},"1.2.1":{"name":"@basementuniverse/particles-2d","version":"1.2.1","author":{"url":"https://gordonlarrigan.com","name":"Gordon Larrigan","email":"gordonlarrigan@gmail.com"},"license":"MIT","_id":"@basementuniverse/particles-2d@1.2.1","maintainers":[{"name":"basementuniverse","email":"gordonlarrigan@gmail.com"}],"homepage":"https://github.com/basementuniverse/particles-2d#readme","bugs":{"url":"https://github.com/basementuniverse/particles-2d/issues"},"dist":{"shasum":"e1c9f3886a74d803e4b829b5dbb343b740b6a681","tarball":"https://registry.npmjs.org/@basementuniverse/particles-2d/-/particles-2d-1.2.1.tgz","fileCount":5,"integrity":"sha512-thzd/s9osqHbV/VFl5oo3bJ3qelB7AjolQORXkTBDqWpaWN+e2Z89C6oTaPkSeiLcOmV0UEhnumEaKUz2ex7Kw==","signatures":[{"sig":"MEQCIEzTFN/FAKPWnoJopS7Rxt4ohokPrtcOSruKiibVBFXBAiBK74eKxdaxyB9qSdZfZkEEO+YZVyyuz4vQojkIdI0+ow==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":341072},"main":"build/index.js","types":"build/index.d.ts","gitHead":"bdabb1dbc1051230fcd539f618c25f627980e58d","scripts":{"build":"webpack","watch":"webpack --watch"},"_npmUser":{"name":"basementuniverse","email":"gordonlarrigan@gmail.com"},"repository":{"url":"git+https://github.com/basementuniverse/particles-2d.git","type":"git"},"_npmVersion":"11.5.1","description":"A component for animating and rendering particles in 2d games","directories":{},"_nodeVersion":"24.5.0","dependencies":{"@basementuniverse/vec":"^2.3.5","@basementuniverse/utils":"^1.7.0","@basementuniverse/parsecolor":"^1.0.2","@basementuniverse/canvas-helpers":"^1.2.1","@basementuniverse/intersection-helpers":"^0.3.0"},"_hasShrinkwrap":false,"devDependencies":{"webpack":"^5.3.2","ts-loader":"^8.0.7","typescript":"^4.9.4","@types/node":"^18.11.12","webpack-cli":"^4.1.0","clean-webpack-plugin":"^4.0.0-alpha.0"},"_npmOperationalInternal":{"tmp":"tmp/particles-2d_1.2.1_1759078384686_0.8383516470257011","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@basementuniverse/particles-2d","version":"1.3.0","author":{"url":"https://gordonlarrigan.com","name":"Gordon Larrigan","email":"gordonlarrigan@gmail.com"},"license":"MIT","_id":"@basementuniverse/particles-2d@1.3.0","maintainers":[{"name":"basementuniverse","email":"gordonlarrigan@gmail.com"}],"homepage":"https://github.com/basementuniverse/particles-2d#readme","bugs":{"url":"https://github.com/basementuniverse/particles-2d/issues"},"dist":{"shasum":"4f0fe3e8d274fb637d0a18a376569ecb4955576e","tarball":"https://registry.npmjs.org/@basementuniverse/particles-2d/-/particles-2d-1.3.0.tgz","fileCount":5,"integrity":"sha512-7AzhwWVt91BrXy5wm4fXAyEvCmqmbImlcvW3QSZtyBI4SGDh3Kvpbfub4EzYsatot8Ran44blNoun3ifmQfS8Q==","signatures":[{"sig":"MEYCIQClpMeumgSgTVitI8ZPS3MXwkyxCHjHhq+87YROKikLOgIhAM2u35eQODSwUev7qZaSDVLcUAAsXn3qJ/V+78g0hYgs","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":346182},"main":"build/index.js","types":"build/index.d.ts","gitHead":"ff235f8565e8a3f2c9942636bab07994dfac6fc2","scripts":{"build":"webpack","watch":"webpack --watch"},"_npmUser":{"name":"basementuniverse","email":"gordonlarrigan@gmail.com"},"repository":{"url":"git+https://github.com/basementuniverse/particles-2d.git","type":"git"},"_npmVersion":"11.6.2","description":"A component for animating and rendering particles in 2d games","directories":{},"_nodeVersion":"24.12.0","dependencies":{"@basementuniverse/vec":"^2.3.5","@basementuniverse/utils":"^1.7.0","@basementuniverse/parsecolor":"^1.0.2","@basementuniverse/canvas-helpers":"^1.2.1","@basementuniverse/intersection-helpers":"^0.3.0"},"_hasShrinkwrap":false,"devDependencies":{"webpack":"^5.3.2","ts-loader":"^8.0.7","typescript":"^4.9.4","@types/node":"^18.11.12","webpack-cli":"^4.1.0","clean-webpack-plugin":"^4.0.0-alpha.0"},"_npmOperationalInternal":{"tmp":"tmp/particles-2d_1.3.0_1769892968201_0.11755441346977169","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"@basementuniverse/particles-2d","version":"1.4.0","author":{"url":"https://gordonlarrigan.com","name":"Gordon Larrigan","email":"gordonlarrigan@gmail.com"},"license":"MIT","_id":"@basementuniverse/particles-2d@1.4.0","maintainers":[{"name":"basementuniverse","email":"gordonlarrigan@gmail.com"}],"homepage":"https://github.com/basementuniverse/particles-2d#readme","bugs":{"url":"https://github.com/basementuniverse/particles-2d/issues"},"dist":{"shasum":"b837b49bd862219086ad73d01812be56c01ad262","tarball":"https://registry.npmjs.org/@basementuniverse/particles-2d/-/particles-2d-1.4.0.tgz","fileCount":5,"integrity":"sha512-OMiz+y1YmufeMQ14pQhWE4xrWF055KvZf8MfASCMSyzIR8cMcFH5iLmqpRoQiz1aoPSnMHEJ8tMcQkRu0wH1nA==","signatures":[{"sig":"MEQCICaSp84vEONvZBPZTI9zx2iudEAYo226Rs2MGjux5+VXAiBc6W0K5AjLQOSVUcDmiDRJdUTBYgLhXuqdQxmg5u1kxA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":346773},"main":"build/index.js","types":"build/index.d.ts","gitHead":"23cc93e0d1beecc56e2ad8aebe50d510d6f90fc3","scripts":{"build":"webpack","watch":"webpack --watch"},"_npmUser":{"name":"basementuniverse","email":"gordonlarrigan@gmail.com"},"repository":{"url":"git+https://github.com/basementuniverse/particles-2d.git","type":"git"},"_npmVersion":"11.6.2","description":"A component for animating and rendering particles in 2d games","directories":{},"_nodeVersion":"24.12.0","dependencies":{"@basementuniverse/vec":"^2.3.5","@basementuniverse/utils":"^1.7.0","@basementuniverse/parsecolor":"^1.0.2","@basementuniverse/canvas-helpers":"^1.2.1","@basementuniverse/intersection-helpers":"^0.3.0"},"_hasShrinkwrap":false,"devDependencies":{"webpack":"^5.3.2","ts-loader":"^8.0.7","typescript":"^4.9.4","@types/node":"^18.11.12","webpack-cli":"^4.1.0","clean-webpack-plugin":"^4.0.0-alpha.0"},"_npmOperationalInternal":{"tmp":"tmp/particles-2d_1.4.0_1769966458272_0.8967821283070125","host":"s3://npm-registry-packages-npm-production"}},"1.4.1":{"name":"@basementuniverse/particles-2d","version":"1.4.1","author":{"url":"https://gordonlarrigan.com","name":"Gordon Larrigan","email":"gordonlarrigan@gmail.com"},"license":"MIT","_id":"@basementuniverse/particles-2d@1.4.1","maintainers":[{"name":"basementuniverse","email":"gordonlarrigan@gmail.com"}],"homepage":"https://github.com/basementuniverse/particles-2d#readme","bugs":{"url":"https://github.com/basementuniverse/particles-2d/issues"},"dist":{"shasum":"bc8232beec2e303facd34e4c0f5eca963aeaadb7","tarball":"https://registry.npmjs.org/@basementuniverse/particles-2d/-/particles-2d-1.4.1.tgz","fileCount":5,"integrity":"sha512-2yiceDy8A93H0AAZl+GmwMNn/7t+hglohcL6awTA2GMttOgjBmd69WOj7EvqE5DY00Xl9vklKXnB8rz67evjxA==","signatures":[{"sig":"MEYCIQD+F5gXOEcBrP9v3ZX39WfjtaE3+wr9yhS/wp9i1Px/twIhAJbsVyTDrzsR5YhERRlPiea1TJlAhJIl+Tzj715qt/XF","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":347243},"main":"build/index.js","types":"build/index.d.ts","gitHead":"e177cfb348707100e5c96a8ad277913b3bdf76ae","scripts":{"build":"webpack","watch":"webpack --watch"},"_npmUser":{"name":"basementuniverse","email":"gordonlarrigan@gmail.com"},"repository":{"url":"git+https://github.com/basementuniverse/particles-2d.git","type":"git"},"_npmVersion":"11.6.2","description":"A component for animating and rendering particles in 2d games","directories":{},"_nodeVersion":"24.12.0","dependencies":{"@basementuniverse/vec":"^2.5.0","@basementuniverse/utils":"^1.8.1","@basementuniverse/parsecolor":"^1.0.2","@basementuniverse/canvas-helpers":"^1.6.0","@basementuniverse/intersection-helpers":"^0.5.0"},"_hasShrinkwrap":false,"devDependencies":{"webpack":"^5.3.2","ts-loader":"^8.0.7","typescript":"^4.9.4","@types/node":"^18.11.12","webpack-cli":"^4.1.0","clean-webpack-plugin":"^4.0.0-alpha.0"},"_npmOperationalInternal":{"tmp":"tmp/particles-2d_1.4.1_1769987053047_0.7512571502128855","host":"s3://npm-registry-packages-npm-production"}},"1.5.0":{"name":"@basementuniverse/particles-2d","version":"1.5.0","author":{"url":"https://gordonlarrigan.com","name":"Gordon Larrigan","email":"gordonlarrigan@gmail.com"},"license":"MIT","_id":"@basementuniverse/particles-2d@1.5.0","maintainers":[{"name":"basementuniverse","email":"gordonlarrigan@gmail.com"}],"homepage":"https://github.com/basementuniverse/particles-2d#readme","bugs":{"url":"https://github.com/basementuniverse/particles-2d/issues"},"dist":{"shasum":"761c1d53761ba55d3d6f523a04c9d3193b15c357","tarball":"https://registry.npmjs.org/@basementuniverse/particles-2d/-/particles-2d-1.5.0.tgz","fileCount":5,"integrity":"sha512-qS+fpxuebU5RIhm+1lMgvCRstUft+NtiMMCDttGi0a3VLNogb11QzmBabyVA3GbnO5uzPbdy2fJraaXTMA8qXw==","signatures":[{"sig":"MEYCIQCUrYPDRlPkS8PYi1eyLwkG18q+bpIgtv4o7inmIqhcrwIhAPWRs1HtwnIBdhJTpMfN48IhDydNsjjwxjGpe2uWtdFt","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":282565},"main":"build/index.js","types":"build/index.d.ts","gitHead":"147aae47658e315eccebf1587eb349553b7d380b","scripts":{"build":"webpack","watch":"webpack --watch"},"_npmUser":{"name":"basementuniverse","email":"gordonlarrigan@gmail.com"},"repository":{"url":"git+https://github.com/basementuniverse/particles-2d.git","type":"git"},"_npmVersion":"11.6.2","description":"A component for animating and rendering particles in 2d games","directories":{},"_nodeVersion":"24.12.0","dependencies":{"@basementuniverse/vec":"^2.5.0","@basementuniverse/utils":"^1.8.1","@basementuniverse/parsecolor":"^1.0.2","@basementuniverse/canvas-helpers":"^1.6.0","@basementuniverse/intersection-helpers":"^0.5.0"},"_hasShrinkwrap":false,"devDependencies":{"webpack":"^5.3.2","ts-loader":"^8.0.7","typescript":"^4.9.4","@types/node":"^18.11.12","webpack-cli":"^4.1.0","clean-webpack-plugin":"^4.0.0-alpha.0"},"_npmOperationalInternal":{"tmp":"tmp/particles-2d_1.5.0_1770419170731_0.3597204000473828","host":"s3://npm-registry-packages-npm-production"}},"1.5.1":{"name":"@basementuniverse/particles-2d","version":"1.5.1","author":{"url":"https://gordonlarrigan.com","name":"Gordon Larrigan","email":"gordonlarrigan@gmail.com"},"license":"MIT","_id":"@basementuniverse/particles-2d@1.5.1","maintainers":[{"name":"basementuniverse","email":"gordonlarrigan@gmail.com"}],"homepage":"https://github.com/basementuniverse/particles-2d#readme","bugs":{"url":"https://github.com/basementuniverse/particles-2d/issues"},"dist":{"shasum":"bf8f9341d358f2cb02e3a87d42708088c04776a8","tarball":"https://registry.npmjs.org/@basementuniverse/particles-2d/-/particles-2d-1.5.1.tgz","fileCount":5,"integrity":"sha512-/TCXZZWdCEsMG6NZbsDa6va4UgdfrfUUC7pYLgxNvIe9QMA16qza4QDyN3rIMEjtTApdI0V+6asG7CZYpcRfMQ==","signatures":[{"sig":"MEYCIQC4QzCpx3a81a2G5xS79m3FvyRN3t7JbdzfxROBC4h5cwIhAK29ufBddchJB7IAa1HFXq4Pg6qqDukw6hUJw2vrSrMi","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":282571},"main":"build/index.js","types":"build/index.d.ts","gitHead":"53490d659d6a82aa2dbe152511bc1ba5a07c8f2c","scripts":{"build":"webpack","watch":"webpack --watch"},"_npmUser":{"name":"basementuniverse","email":"gordonlarrigan@gmail.com"},"repository":{"url":"git+https://github.com/basementuniverse/particles-2d.git","type":"git"},"_npmVersion":"11.6.2","description":"A component for animating and rendering particles in 2d games","directories":{},"_nodeVersion":"24.12.0","dependencies":{"@basementuniverse/vec":"^2.5.0","@basementuniverse/utils":"^1.8.1","@basementuniverse/parsecolor":"^1.0.2","@basementuniverse/canvas-helpers":"^1.6.0","@basementuniverse/intersection-helpers":"^0.5.0"},"_hasShrinkwrap":false,"devDependencies":{"webpack":"^5.3.2","ts-loader":"^8.0.7","typescript":"^4.9.4","@types/node":"^18.11.12","webpack-cli":"^4.1.0","clean-webpack-plugin":"^4.0.0-alpha.0"},"_npmOperationalInternal":{"tmp":"tmp/particles-2d_1.5.1_1770779919929_0.07592086070378534","host":"s3://npm-registry-packages-npm-production"}},"1.6.0":{"name":"@basementuniverse/particles-2d","version":"1.6.0","description":"A component for animating and rendering particles in 2d games","author":{"name":"Gordon Larrigan","email":"gordonlarrigan@gmail.com","url":"https://gordonlarrigan.com"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/basementuniverse/particles-2d.git"},"main":"build/index.js","types":"build/index.d.ts","scripts":{"build":"webpack --mode production","build:dev":"webpack --mode development","watch":"webpack --watch"},"dependencies":{"@basementuniverse/canvas-helpers":"^1.6.0","@basementuniverse/color":"^1.6.1","@basementuniverse/intersection-helpers":"^0.5.0","@basementuniverse/utils":"^1.8.1","@basementuniverse/vec":"^2.5.1"},"devDependencies":{"@types/node":"^18.11.12","clean-webpack-plugin":"^4.0.0-alpha.0","ts-loader":"^8.0.7","typescript":"^4.9.4","webpack":"^5.3.2","webpack-cli":"^4.1.0"},"gitHead":"54c09972e1e0ab4e05e4c5971a6b89854bcda9e1","_id":"@basementuniverse/particles-2d@1.6.0","bugs":{"url":"https://github.com/basementuniverse/particles-2d/issues"},"homepage":"https://github.com/basementuniverse/particles-2d#readme","_nodeVersion":"24.12.0","_npmVersion":"11.6.2","dist":{"integrity":"sha512-1uEzitHuNIJz+rzvYV5oeMwJ8o1OhzA/W451eiYwPVR3xYGg2ctSdgzujbxLTsHxc691AVm6haXlJcH0NpKXhA==","shasum":"4e4b0ec8154e3c84d5cb07cbcbc43bc98ea085b6","tarball":"https://registry.npmjs.org/@basementuniverse/particles-2d/-/particles-2d-1.6.0.tgz","fileCount":6,"unpackedSize":202411,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIBpVpphm2yg16VAsLvoOoqadxHIT1Z0z+Pobzo8iZueyAiBNFuONrYMxgkKyJwVJ1sfb5r3UTptkZfxRqyW4S65TjQ=="}]},"_npmUser":{"name":"basementuniverse","email":"gordonlarrigan@gmail.com"},"directories":{},"maintainers":[{"name":"basementuniverse","email":"gordonlarrigan@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/particles-2d_1.6.0_1786899821968_0.5741279387335814"},"_hasShrinkwrap":false}},"time":{"created":"2025-07-14T03:26:59.490Z","modified":"2026-08-16T17:03:42.270Z","1.0.1":"2025-07-14T03:26:59.748Z","1.0.2":"2025-07-15T01:38:14.921Z","1.1.1":"2025-08-03T14:54:20.134Z","1.2.0":"2025-08-10T10:32:56.378Z","1.2.1":"2025-09-28T16:53:04.862Z","1.3.0":"2026-01-31T20:56:08.375Z","1.4.0":"2026-02-01T17:20:58.430Z","1.4.1":"2026-02-01T23:04:13.177Z","1.5.0":"2026-02-06T23:06:10.903Z","1.5.1":"2026-02-11T03:18:40.084Z","1.6.0":"2026-08-16T17:03:42.090Z"},"bugs":{"url":"https://github.com/basementuniverse/particles-2d/issues"},"author":{"name":"Gordon Larrigan","email":"gordonlarrigan@gmail.com","url":"https://gordonlarrigan.com"},"license":"MIT","homepage":"https://github.com/basementuniverse/particles-2d#readme","repository":{"type":"git","url":"git+https://github.com/basementuniverse/particles-2d.git"},"description":"A component for animating and rendering particles in 2d games","maintainers":[{"name":"basementuniverse","email":"gordonlarrigan@gmail.com"}],"readme":"# Game Component: Particle System 2D\n\nA basic particle system component for use in 2d games.\n\n## Installation\n\n```bash\nnpm install @basementuniverse/particles-2d\n```\n\nFor direct browser usage, include the UMD build with a script tag:\n\n```html\n<script src=\"build/index.js\"></script>\n```\n\nThe build exposes its exports through the `BasementUniverseParticles2d` browser\nnamespace. It does not add each export directly to `window`.\n\n## How to use\n\nSee `/demos` for some examples.\n\n1. Import the component and any other classes you need:\n\n```js\nimport {\n  ParticleSystem,\n  Emitter,\n  Attractor,\n  ForceField,\n  Collider,\n  Sink,\n} from '@basementuniverse/particles-2d';\n```\n\nWhen using the library directly from a browser script, prefix exports with\n`BasementUniverseParticles2d`:\n\n```html\n<script src=\"build/index.js\"></script>\n<script>\n  const particleSystem = new BasementUniverseParticles2d.ParticleSystem();\n\n  particleSystem.add(new BasementUniverseParticles2d.Emitter({\n    // options here...\n  }));\n</script>\n```\n\n2. Create a `ParticleSystem` instance:\n\n```js\nconst particleSystem = new ParticleSystem();\n```\n\n3. Add emitters, attractors, force fields, and colliders as needed:\n\n```js\nparticleSystem.emitters.push(\n  new Emitter(/* See below for options */)\n);\n\nparticleSystem.attractors.push(\n  new Attractor(/* See below for options */)\n);\n\nparticleSystem.forceFields.push(\n  new ForceField(/* See below for options */)\n);\n\nparticleSystem.colliders.push(\n  new Collider(/* See below for options */)\n);\n\nparticleSystem.sinks.push(\n  new Sink(/* See below for options */)\n);\n```\n\n4. Update and render the particle system in your game loop:\n\n```js\nfunction update(deltaTime) {\n  particleSystem.update(deltaTime);\n\n  // Other game logic...\n}\n\nfunction draw(context) {\n  particleSystem.draw(context);\n\n  // Other rendering logic...\n}\n```\n\n5. The particle system can be removed when all particles and emitters are disposed:\n\n```js\nif (particleSystem.disposed) {\n  // Clean up resources or remove from game loop...\n}\n```\n\n## Utility types\n\n#### `vec2`\n\n```ts\n{ x: number, y: number }\n```\n\n#### `Color`\n\n```ts\n{ r: number, g: number, b: number, a?: number }\n```\n\n## Emitters\n\nEmitters are responsible for generating and emitting particles.\n\n```ts\nnew Emitter(\n  position: vec2, // { x: number, y: number }\n  size: vec2, // { x: number, y: number }\n  lifespan: number, // in seconds, use -1 for infinite lifespan\n  options?: EmitterOptions // see below...\n);\n```\n\n### Emitter Options\n\n```js\n{\n  particles: {\n    position\n    speed\n    direction\n    size\n    rotation\n    lifespan\n    style\n    options\n  },\n\n  emission: {\n    type\n    rate, n, delay, f // depends on type\n  }\n}\n```\n\n#### `particles.position`\n\nDefine the initial position of particles:\n\n- `'uniform'`: particles will be uniformly distributed within the emitter's area as defined by its `position` (this is the center) and `size`\n- `'normal'`: particles will be normally distributed within the emitter's area, i.e. more particles will be generated near the center of the emitter and fewer towards the edges\n- `(n: number) => vec2`: a function that returns a position for each particle, where `n` is the index of the particle being emitted (maybe useful if we're emitting multiple particles in a single frame)\n\n#### `particles.speed`\n\nDefine the initial speed of particles:\n\n- `number`: a constant speed for all particles\n- `{ min: number, max: number }`: a range of speeds for particles, each particle will have a random speed within this range\n- `(n: number) => number`: a function that returns a speed for each particle, where `n` is the index of the particle being emitted\n\n#### `particles.direction`\n\nDefine the initial direction of particles in radians (0 is right):\n\n- `number`: a constant direction for all particles\n- `{ min: number, max: number }`: a range of directions for particles, each particle will have a random direction within this range\n- `(n: number) => number`: a function that returns a direction for each particle, where `n` is the index of the particle being emitted\n\n#### `particles.size`\n\nDefine the initial size of particles:\n\n- `{ x: number, y: number }`: a constant size for all particles\n- `{ min: { x, y }, max: { x, y } }`: a range of sizes for particles, each particle will have a random size within this range\n- `(n: number) => { x: number, y: number }`: a function that returns a size for each particle, where `n` is the index of the particle being emitted\n\n#### `particles.rotation`\n\nDefine the initial rotation of particles in radians (0 is right):\n\n- `null`: rotation will be calculated based on the particle's velocity\n- `number`: a constant rotation for all particles\n- `{ min: number, max: number }`: a range of rotations for particles, each particle will have a random rotation within this range\n- `(n: number) => number`: a function that returns a rotation for each particle, where `n` is the index of the particle being emitted\n\n#### `particles.lifespan`\n\nDefine the lifespan of particles in seconds:\n\n- `number`: a constant lifespan for all particles\n- `{ min: number, max: number }`: a range of lifespans for particles, each particle will have a random lifespan within this range\n- `(n: number) => number`: a function that returns a lifespan for each particle, where `n` is the index of the particle being emitted\n\n#### `particles.style`\n\nThere are a few default \"built-in\" styles:\n\n```ts\n{\n  // the size of the dot will be max(size.x, size.y)\n  style: 'dot';\n  color: Color | string | Color[] | string[]; // fixed or random color\n  glow?: {\n    color: Color | string | Color[] | string[];\n    amount: number;\n  };\n  fade?: {\n    in: number; // fade in duration in seconds\n    out: number; // fade out duration in seconds\n  };\n}\n```\n\n```ts\n{\n  // the size of the radial gradient will be max(size.x, size.y)\n  style: 'radial';\n  color: Color | string | Color[] | string[]; // fixed or random color\n  fade?: {\n    in: number; // fade in duration in seconds\n    out: number; // fade out duration in seconds\n  };\n}\n```\n\n```ts\n{\n  // the length of the line will be size.x, and the width will be size.y\n  style: 'line';\n  color: Color | string | Color[] | string[];\n  rotationOffset?: number; // how much to offset the particle's rotation in radians\n  glow?: {\n    color: Color | string | Color[] | string[];\n    amount: number;\n  };\n  fade?: {\n    in: number; // fade in duration in seconds\n    out: number; // fade out duration in seconds\n  };\n}\n```\n\n```ts\n{\n  // the size of the image is defined by size.x and size.y\n  style: 'image';\n  image: HTMLImageElement; // the image to render\n  rotationOffset?: number; // how much to offset the particle's rotation in radians\n  fade?: {\n    in: number; // fade in duration in seconds\n    out: number; // fade out duration in seconds\n  };\n}\n```\n\n#### `particles.style.trail`\n\nParticles can optionally have a trail effect.\n\n```ts\n{\n  // the size of the image is defined by size.x and size.y\n  style: '...';\n  // other style options (see above)...\n  trail: {\n    length: number; // how many trail segments to keep\n    color?: Color | string | Color[] | string[]; // fixed or random color for the trail, if not provided we use the particle's color\n    width?: number; // width of the trail segments, if not provided we use the particle's size\n    widthDecay?: number; // how much to decay the width of the trail segments, 0 means no decay, 1 means full decay (the trail will disappear over its length), negative numbers cause the trail to grow wider over its length\n    alphaDecay?: number; // how much to decay the alpha of the trail segments, 0 means no decay, 1 means full decay (the trail will fade out over its length)\n    decayTime?: number; // how quickly trail segments fade out (in seconds), when a particle stops the trail will continue to fade based on this value (default: 0.5)\n  }\n}\n```\n\n#### `particles.options`\n\n```ts\n{\n  useAttractors: boolean | string | string[]; // which attractors should affect these particles\n  useForceFields: boolean | string | string[]; // which force fields should affect these particles\n  useColliders: boolean | string | string[]; // which colliders should affect these particles\n  useSinks: boolean | string | string[]; // which sinks should affect these particles\n  maxSpeed: number; // maximum speed (velocity magnitude) for particles, use -1 for no limit\n\n  defaultUpdates: 'none' | 'all' | ParticleDefaultUpdateTypes;\n  update?: (system: ParticleSystem, dt: number) => void;\n\n  defaultDraws: 'none' | 'all' | ParticleDefaultDrawTypes;\n  preDraw?: (system: ParticleSystem, context: CanvasRenderingContext2D) => void;\n  postDraw?: (system: ParticleSystem, context: CanvasRenderingContext2D) => void;\n}\n```\n\nFor `useAttractors`, `useForceFields`, `useColliders`, and `useSinks`:\n- `false`: particles are not affected by any of these elements\n- `true`: particles are affected by all of these elements\n- `'id'`: particles are affected only by the element with this specific id\n- `['id1', 'id2', ...]`: particles are affected only by elements with these ids\n\nDefault update types:\n- `age`: update the age of particles and handle disposal\n- `physics`: update the velocity of particles based on forces, collisions, etc.\n- `direction`: update the direction of particles based on their velocity\n- `position`: integrate the position of particles based on their velocity\n\nDefault draw types:\n- `transforms`: apply transformations like translation and rotation\n- `fade`: apply fade in/out effects to particles\n- `styles`: render the particle's style (dot, radial, line, image)\n\n#### `emission`\n\nVarious particle emission types are available:\n\n```ts\n{\n  // emit some number of particles per second\n  type: 'rate';\n  rate: number | { min: number, max: number };\n}\n```\n\nIf rate is a random range, the rate will be updated every second.\n\n```ts\n{\n  // emit some number of particles immediately and then automatically dispose the emitter\n  type: 'burst';\n  n: number | { min: number, max: number };\n  delay?: number; // optional delay in seconds before emitting\n}\n```\n\n```ts\n{\n  // custom function, this will be called every frame and should return the number of particles to emit\n  type: 'custom';\n  f: () => number;\n}\n```\n\n## Attractors\n\nAttractors can attract or repel particles in range of the attractor.\n\n```ts\nnew Attractor(\n  position: vec2, // { x: number, y: number }\n  range: number,\n  force: number, // negative for repulsion, positive for attraction\n  falloff: number,\n  lifespan: number, // use -1 for infinite lifespan\n  id?: string // optional unique identifier for selective particle targeting\n);\n```\n\n## Force Fields\n\nForce fields apply a force to all particles.\n\n```ts\nnew ForceField(\n  force: vec2, // { x: number, y: number }\n  lifespan: number, // use -1 for infinite lifespan\n  customForce?: string | ((system: ParticleSystem, forceField: ForceField, dt: number) => void), // optional built-in name or custom force function\n  customForceParams?: Record<string, any>, // optional parameters for built-in or custom force functions\n  id?: string // optional unique identifier for selective particle targeting\n);\n```\n\n### Built-in Force Functions\n\nYou can use built-in force functions by passing their name as a string to `customForce`:\n\n#### `wave`\n\nCreates a wave effect, causing particles to oscillate back and forth perpendicular to the force field's force direction.\n\nParameters:\n- `frequency` (number, default: 1): Controls how many oscillations occur per second\n- `amplitude` (number, default: 50): Controls how far particles are pushed from side to side\n\nExample:\n\n```ts\nsystem.forceFields.push(new ForceField(\n  { x: 0, y: 0 },  // not used with built-in function\n  -1,              // lifespan\n  'wave',          // built-in function name\n  {\n    frequency: 2,\n    amplitude: 100\n  }\n));\n```\n\n#### `vortex`\n\nCreates a vortex effect, causing particles to spiral around a center point.\n\nParameters:\n- `center` (vec2, required): The center point of the vortex\n- `strength` (number, default: 1): Controls how strongly particles are pulled into the vortex\n- `range` (number, default: 100): Controls how far from the center the vortex effect is applied\n- `clockwise` (boolean, default: false): If true, particles spiral clockwise\n\nExample:\n\n```ts\nsystem.forceFields.push(new ForceField(\n  { x: 0, y: 0 },  // not used with built-in function\n  -1,              // lifespan\n  'vortex',        // built-in function name\n  {\n    center: { x: 400, y: 300 },\n    strength: 500,\n    range: 200,\n    clockwise: false\n  },\n  'my-vortex'     // optional id\n));\n```\n\n#### `orbital`\n\nCreates an orbital effect, causing particles to orbit around a center point in a circular path.\n\nParameters:\n- `center` (vec2, required): The center point of the orbital effect\n- `strength` (number, default: 1): Controls how strongly particles are pulled into orbit\n- `range` (number, default: 100): Controls how far from the center the orbital effect is applied\n\nExample:\n\n```ts\nsystem.forceFields.push(new ForceField(\n  { x: 0, y: 0 },\n  -1,\n  'orbital',\n  {\n    center: { x: 400, y: 300 },\n    strength: 1000,\n    range: 150\n  }\n));\n```\n\n#### `vectorField`\n\nCreates a vector field effect using noise to create complex, flowing motion patterns.\n\nParameters:\n- `noise` (function, required): A noise function with signature `(x: number, y: number, z: number) => number` that returns values in range [-1, 1]\n- `noiseScale` (number, default: 0.01): Controls the size of noise features\n  - Smaller values = larger, smoother features\n  - Larger values = smaller, more chaotic features\n- `timeScale` (number, default: 0.1): Controls how quickly the field changes over time\n- `forceAmount` (number, default: 100): Controls how strongly particles are affected\n\nExample:\n\n```ts\n// Assuming you have a simplex noise library\nimport { createNoise3D } from 'simplex-noise';\nconst noise3D = createNoise3D();\n\nsystem.forceFields.push(new ForceField(\n  { x: 0, y: 0 },\n  -1,\n  'vectorField',\n  {\n    noise: noise3D,\n    noiseScale: 0.005,\n    timeScale: 0.2,\n    forceAmount: 150\n  }\n));\n```\n\n#### `turbulence`\n\nCreates a turbulence effect using random forces to create chaotic, jittery motion.\n\nParameters:\n- `strength` (number, default: 100): Controls how strongly particles are affected\n- `frequency` (number, default: 10): Controls how often the random force changes\n  - Higher values = more rapid changes in direction\n  - Lower values = slower, more flowing changes\n\nExample:\n\n```ts\nsystem.forceFields.push(new ForceField(\n  { x: 0, y: 0 },\n  -1,\n  'turbulence',\n  {\n    strength: 150,\n    frequency: 20\n  }\n));\n```\n\n#### `drag`\n\nCreates a drag effect, simulating air resistance or friction that slows particles over time.\n\nParameters:\n- `coefficient` (number, default: 0.5): Controls how much drag is applied\n  - 0 = no drag\n  - 1 = maximum drag (particles slow to a stop quickly)\n  - Higher values = even stronger drag\n\nExample:\n\n```ts\nsystem.forceFields.push(new ForceField(\n  { x: 0, y: 0 },\n  -1,\n  'drag',\n  {\n    coefficient: 0.8\n  }\n));\n```\n\n#### `boids`\n\nImplements boids flocking behavior, causing particles to exhibit emergent group dynamics with three classic rules:\n- **Separation**: avoid crowding neighbors\n- **Alignment**: steer towards average heading of neighbors\n- **Cohesion**: steer towards average position of neighbors\n\nParameters:\n- `separationDistance` (number, default: 25): How close is too close\n- `alignmentDistance` (number, default: 50): Range for alignment behavior\n- `cohesionDistance` (number, default: 50): Range for cohesion behavior\n- `separationWeight` (number, default: 1.5): Strength of separation force\n- `alignmentWeight` (number, default: 1.0): Strength of alignment force\n- `cohesionWeight` (number, default: 1.0): Strength of cohesion force\n\n**⚠️ Performance Warning**: This force function checks each particle against all others in the system, resulting in O(n²) complexity. Only use with relatively small particle counts (recommended: < 200 particles). For larger systems, consider implementing custom boids behavior with spatial optimization.\n\nExample:\n\n```ts\nsystem.forceFields.push(new ForceField(\n  { x: 0, y: 0 },\n  -1,\n  'boids',\n  {\n    separationDistance: 30,\n    alignmentDistance: 60,\n    cohesionDistance: 60,\n    separationWeight: 2.0,\n    alignmentWeight: 1.0,\n    cohesionWeight: 0.8\n  }\n));\n```\n\n### Custom Force Function\n\nYou can optionally provide a custom function to apply forces to particles. This function is called for each particle affected by the force field:\n\n- The function is bound to the current particle, so `this` refers to the particle\n- Parameters:\n  - `system`: The particle system\n  - `forceField`: The force field instance\n  - `dt`: Delta time in seconds\n\nExample:\n\n```ts\n// Vortex force field that rotates particles around a point\nsystem.forceFields.push(new ForceField(\n  { x: 0, y: 0 },  // force vector (not used with custom function)\n  -1,              // lifespan\n  function(system, forceField, dt) {\n    // 'this' is the current particle\n    const center = { x: 400, y: 300 };\n    const toCenter = { x: center.x - this.position.x, y: center.y - this.position.y };\n    const distance = Math.sqrt(toCenter.x * toCenter.x + toCenter.y * toCenter.y);\n\n    if (distance > 0) {\n      // Apply tangential force for vortex effect\n      const tangent = { x: -toCenter.y, y: toCenter.x };\n      const strength = 500 / distance;\n      this.velocity.x += tangent.x * strength * dt;\n      this.velocity.y += tangent.y * strength * dt;\n    }\n  },\n  'vortex'  // optional id\n));\n```\n\n## Colliders\n\nColliders are used for detecting and handling collisions with particles.\n\n```ts\nnew Collider(\n  geometry, // see below...\n  restitution: number, // how bouncy the collider is, 0 is no bounce, 1 is full bounce\n  friction: number, // how much friction the collider has, 0 is no friction,  1 is full friction\n  randomness: number, // how much to randomly offset the direction of particles when they collide, 0 is no randomness, 1 is full randomness (the particle will be offset randomly +/- PI radians)\n  id?: string // optional unique identifier for selective particle targeting\n);\n```\n\n### Collider Geometry\n\nCollider geometry can be defined in various ways:\n\n```ts\n{\n  type: 'circle';\n  position: vec2; // { x: number, y: number }\n  radius: number;\n}\n```\n\n```ts\n{\n  type: 'rectangle';\n  position: vec2; // { x: number, y: number }\n  size: vec2; // { x: number, y: number }\n  rotation?: number; // optional rotation in radians\n}\n```\n\n```ts\n{\n  type: 'polygon';\n  vertices: vec2[]; // array of vertices defining the polygon\n}\n```\n\n## Sinks\n\nSinks destroy or fade out particles within range of the sink.\n\n```ts\nnew Sink(\n  position: vec2, // { x: number, y: number }\n  range: number, // range of effect\n  strength: number, // how fast to accelerate particle aging (multiplier)\n  falloff: number, // distance-based effect gradient (higher = stronger at center)\n  mode: 'instant' | 'fade', // 'instant' destroys immediately, 'fade' accelerates aging\n  lifespan: number, // use -1 for infinite lifespan\n  id?: string // optional unique identifier for selective particle targeting\n);\n```\n\nSinks use age acceleration to destroy particles:\n\n- **'instant' mode**: particles are immediately disposed when they enter the sink's range\n- **'fade' mode**: particles age faster within the sink's range, causing them to naturally reach their lifespan and trigger any configured fade-out effects\n\nThe `strength` parameter determines how much faster particles age (e.g., `strength = 5` means particles age 5x faster). The `falloff` parameter creates a distance-based gradient, making the effect stronger near the center of the sink.\n\n### Example Use Cases\n\n```ts\n// Gradual fade sink (respects particle fade settings)\nsystem.sinks.push(new Sink(\n  { x: 750, y: 50 },  // position at HUD element\n  60,                  // range\n  5,                   // 5x aging acceleration\n  0.8,                 // gentle falloff\n  'fade',              // respect fade-out settings\n  3                    // dispose sink after 3 seconds\n));\n\n// Instant destruction sink\nsystem.sinks.push(new Sink(\n  { x: 400, y: 300 },\n  40,\n  Infinity,            // not used in instant mode\n  1,\n  'instant',           // particles vanish immediately\n  -1                   // permanent\n));\n```\n","readmeFilename":"README.md"}