{"_id":"@mmstack/dnd","_rev":"28-9a1021d29108a235f22683e4051445f3","name":"@mmstack/dnd","dist-tags":{"latest":"22.5.1","v21-lts":"21.5.1"},"versions":{"22.0.0":{"name":"@mmstack/dnd","version":"22.0.0","keywords":["angular","dnd","drag-and-drop","pragmatic-drag-and-drop","drag","drop"],"license":"MIT","_id":"@mmstack/dnd@22.0.0","maintainers":[{"name":"mmstack","email":"mulec.mihaj@gmail.com"}],"homepage":"https://github.com/mihajm/mmstack/blob/master/packages/dnd","bugs":{"url":"https://github.com/mihajm/mmstack/issues"},"dist":{"shasum":"1c5abc4c0e0b14cda75f0ff5eb3977163fd5c3d8","tarball":"https://registry.npmjs.org/@mmstack/dnd/-/dnd-22.0.0.tgz","fileCount":6,"integrity":"sha512-Z6zrCg/hyRwsvVrwZrczft7SXLDP/nopmapQM/7+tyvoYHmcNwE3G7fW5gPC56CHoy+znAT39rsoLeDynsMr4A==","signatures":[{"sig":"MEUCIC//jOdDfE4uP9kse9LyBz3WcUWneqOggMd0pJzFl1eXAiEA/3cDAydcBCKDSs+Lw6X8M51H7ftz01b77cXj4QygXXI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":186862},"type":"module","module":"fesm2022/mmstack-dnd.mjs","exports":{".":{"types":"./types/mmstack-dnd.d.ts","default":"./fesm2022/mmstack-dnd.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"d28fbac03591c87a34e92d1a37dd771683e5c744","typings":"types/mmstack-dnd.d.ts","_npmUser":{"name":"mmstack","email":"mulec.mihaj@gmail.com"},"repository":{"url":"git+https://github.com/mihajm/mmstack.git","type":"git","directory":"packages/dnd"},"_npmVersion":"11.14.1","description":"A signals-first Angular binding for [@atlaskit/pragmatic-drag-and-drop](https://www.npmjs.com/package/@atlaskit/pragmatic-drag-and-drop) (v2). Make any element draggable or a drop target with a typed payload, and read every piece of drag state as a `Signa","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/core":">=22 <23","@angular/common":">=22 <23","@atlaskit/pragmatic-drag-and-drop":"~2.0.1"},"optionalDependencies":{"@atlaskit/pragmatic-drag-and-drop-hitbox":"~2.0.0","@atlaskit/pragmatic-drag-and-drop-flourish":"~3.0.1","@atlaskit/pragmatic-drag-and-drop-auto-scroll":"~3.0.0","@atlaskit/pragmatic-drag-and-drop-live-region":"~2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dnd_22.0.0_1782658987580_0.47824082678333535","host":"s3://npm-registry-packages-npm-production"}},"21.0.0":{"name":"@mmstack/dnd","version":"21.0.0","keywords":["angular","dnd","drag-and-drop","pragmatic-drag-and-drop","drag","drop"],"license":"MIT","_id":"@mmstack/dnd@21.0.0","maintainers":[{"name":"mmstack","email":"mulec.mihaj@gmail.com"}],"homepage":"https://github.com/mihajm/mmstack/blob/master/packages/dnd","bugs":{"url":"https://github.com/mihajm/mmstack/issues"},"dist":{"shasum":"61130f81bbf832104f658fa588d047135d60fe80","tarball":"https://registry.npmjs.org/@mmstack/dnd/-/dnd-21.0.0.tgz","fileCount":6,"integrity":"sha512-m3RDV9LMwPnfVO5KlQ9akDzBNF6hoF9XlPvbf+tBpvml6nXw0q7iUHIRMCiI6SWhwhFHqDAiD2UxTWDElQYM4w==","signatures":[{"sig":"MEUCIFAE2Rye6Ndnmg7nZqes2VDSQyIKiLTni2+wI74lyXMzAiEA0NWGQvb2yEkhiQcSoolJBkhEWvXTtfPxMCfLzZOrZRQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":186619},"type":"module","module":"fesm2022/mmstack-dnd.mjs","exports":{".":{"types":"./types/mmstack-dnd.d.ts","default":"./fesm2022/mmstack-dnd.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"607746dc7d22eb800a1d3e10554f7828fd9021e3","typings":"types/mmstack-dnd.d.ts","_npmUser":{"name":"mmstack","email":"mulec.mihaj@gmail.com"},"repository":{"url":"git+https://github.com/mihajm/mmstack.git","type":"git","directory":"packages/dnd"},"_npmVersion":"11.14.1","description":"A signals-first Angular binding for [@atlaskit/pragmatic-drag-and-drop](https://www.npmjs.com/package/@atlaskit/pragmatic-drag-and-drop) (v2). Make any element draggable or a drop target with a typed payload, and read every piece of drag state as a `Signa","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"@angular/core":">=21 <23","@angular/common":">=21 <23","@atlaskit/pragmatic-drag-and-drop":"~2.0.1"},"optionalDependencies":{"@atlaskit/pragmatic-drag-and-drop-hitbox":"~2.0.0","@atlaskit/pragmatic-drag-and-drop-flourish":"~3.0.1","@atlaskit/pragmatic-drag-and-drop-auto-scroll":"~3.0.0","@atlaskit/pragmatic-drag-and-drop-live-region":"~2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dnd_21.0.0_1782659402198_0.960548838260364","host":"s3://npm-registry-packages-npm-production"}},"22.1.0":{"name":"@mmstack/dnd","version":"22.1.0","keywords":["angular","dnd","drag-and-drop","pragmatic-drag-and-drop","drag","drop"],"license":"MIT","_id":"@mmstack/dnd@22.1.0","maintainers":[{"name":"mmstack","email":"mulec.mihaj@gmail.com"}],"homepage":"https://github.com/mihajm/mmstack/blob/master/packages/dnd","bugs":{"url":"https://github.com/mihajm/mmstack/issues"},"dist":{"shasum":"6d3fbaf36deb07e5ab527f03760a5b023eafe992","tarball":"https://registry.npmjs.org/@mmstack/dnd/-/dnd-22.1.0.tgz","fileCount":9,"integrity":"sha512-5uXLN2zWUtp2Axu46DTkjGW2alWfzDWaxPmHu/5UNBUKg9/GCqRgFVFt4Xip0lnzzZ4MHX6lHUuLGgDjpJg/Bg==","signatures":[{"sig":"MEYCIQDOy90TnB0spi+Hs2EPklwlskyNQhsdvpKPOM1ulx3fLgIhANwKtObhPb2EiNYuyacsrTS7DRdvu3enBQpCSnvpMHYA","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":474650},"type":"module","module":"fesm2022/mmstack-dnd.mjs","exports":{".":{"types":"./types/mmstack-dnd.d.ts","default":"./fesm2022/mmstack-dnd.mjs"},"./plugins":{"types":"./types/mmstack-dnd-plugins.d.ts","default":"./fesm2022/mmstack-dnd-plugins.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"e102493565f324d9e0fce5738f4de59ee59153b9","typings":"types/mmstack-dnd.d.ts","_npmUser":{"name":"mmstack","email":"mulec.mihaj@gmail.com"},"repository":{"url":"git+https://github.com/mihajm/mmstack.git","type":"git","directory":"packages/dnd"},"_npmVersion":"11.14.1","description":"Signals-first drag & drop for Angular. Make any element draggable or a drop target with a **typed payload**, read every bit of drag state as a `Signal`, and build reorderable lists — single or cross-list — on the same primitives. Choose the engine per ele","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/core":">=22 <23","@angular/common":">=22 <23","@mmstack/primitives":"^22.3.0","@atlaskit/pragmatic-drag-and-drop":"~2.0.1"},"optionalDependencies":{"@atlaskit/pragmatic-drag-and-drop-hitbox":"~2.0.0","@atlaskit/pragmatic-drag-and-drop-flourish":"~3.0.1","@atlaskit/pragmatic-drag-and-drop-auto-scroll":"~3.0.0","@atlaskit/pragmatic-drag-and-drop-live-region":"~2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dnd_22.1.0_1782918657232_0.981643055357885","host":"s3://npm-registry-packages-npm-production"}},"21.1.0":{"name":"@mmstack/dnd","version":"21.1.0","keywords":["angular","dnd","drag-and-drop","pragmatic-drag-and-drop","drag","drop"],"license":"MIT","_id":"@mmstack/dnd@21.1.0","maintainers":[{"name":"mmstack","email":"mulec.mihaj@gmail.com"}],"homepage":"https://github.com/mihajm/mmstack/blob/master/packages/dnd","bugs":{"url":"https://github.com/mihajm/mmstack/issues"},"dist":{"shasum":"e177f9f71c396e9fe92ddfad9320303d740cd5e1","tarball":"https://registry.npmjs.org/@mmstack/dnd/-/dnd-21.1.0.tgz","fileCount":9,"integrity":"sha512-TjUrpyF+fAOak8z1nZOyn8RD7RZDQdx4O+XdOBK72xS7mg6/vYwVFhaJUg2hlrsXwPmsl8y596hCSiix4aCfqA==","signatures":[{"sig":"MEUCIFUFHobi6CH451IJbxCDAV7asayGAoD7hGEsVikFiE5OAiEAuID/jAGiGQJdq8ld27rgneFS7X6ny7c1beY9KyYGUzk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":473956},"type":"module","module":"fesm2022/mmstack-dnd.mjs","exports":{".":{"types":"./types/mmstack-dnd.d.ts","default":"./fesm2022/mmstack-dnd.mjs"},"./plugins":{"types":"./types/mmstack-dnd-plugins.d.ts","default":"./fesm2022/mmstack-dnd-plugins.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"b551c6b0e6ea01366431ca78409bcd84dddf1899","typings":"types/mmstack-dnd.d.ts","_npmUser":{"name":"mmstack","email":"mulec.mihaj@gmail.com"},"repository":{"url":"git+https://github.com/mihajm/mmstack.git","type":"git","directory":"packages/dnd"},"_npmVersion":"11.14.1","description":"Signals-first drag & drop for Angular. Make any element draggable or a drop target with a **typed payload**, read every bit of drag state as a `Signal`, and build reorderable lists — single or cross-list — on the same primitives. Choose the engine per ele","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"@angular/core":">=21 <22","@angular/common":">=21 <22","@mmstack/primitives":"^21.3.0","@atlaskit/pragmatic-drag-and-drop":"~2.0.1"},"optionalDependencies":{"@atlaskit/pragmatic-drag-and-drop-hitbox":"~2.0.0","@atlaskit/pragmatic-drag-and-drop-flourish":"~3.0.1","@atlaskit/pragmatic-drag-and-drop-auto-scroll":"~3.0.0","@atlaskit/pragmatic-drag-and-drop-live-region":"~2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dnd_21.1.0_1782919049706_0.28325167507992344","host":"s3://npm-registry-packages-npm-production"}},"22.2.0":{"name":"@mmstack/dnd","version":"22.2.0","keywords":["angular","dnd","drag-and-drop","pragmatic-drag-and-drop","drag","drop"],"license":"MIT","_id":"@mmstack/dnd@22.2.0","maintainers":[{"name":"mmstack","email":"mulec.mihaj@gmail.com"}],"homepage":"https://github.com/mihajm/mmstack/blob/master/packages/dnd","bugs":{"url":"https://github.com/mihajm/mmstack/issues"},"dist":{"shasum":"1900ba54303e285804fa171c24e9590847420f18","tarball":"https://registry.npmjs.org/@mmstack/dnd/-/dnd-22.2.0.tgz","fileCount":9,"integrity":"sha512-OItWCSlyxMDGlXEv2jv3J+vOC1Cyxbo61AdNhmS84N4T/MeSPGjR+CodE4B2k3AwNDd0FM7lVbUdtidraqN+DA==","signatures":[{"sig":"MEYCIQDivdXNg/zayRCP1If1S/1yJ5CrMyfibR+IvzJzKsnoJQIhAIr8oe7ZfTHqGuEe/eUZVOEyBdcgBo80RZzY6uP7bk3K","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":483711},"type":"module","module":"fesm2022/mmstack-dnd.mjs","exports":{".":{"types":"./types/mmstack-dnd.d.ts","default":"./fesm2022/mmstack-dnd.mjs"},"./plugins":{"types":"./types/mmstack-dnd-plugins.d.ts","default":"./fesm2022/mmstack-dnd-plugins.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"cc8daf95b6576f0ed96bcd3d557d7ffa3bc96f60","typings":"types/mmstack-dnd.d.ts","_npmUser":{"name":"mmstack","email":"mulec.mihaj@gmail.com"},"repository":{"url":"git+https://github.com/mihajm/mmstack.git","type":"git","directory":"packages/dnd"},"_npmVersion":"11.14.1","description":"Signals-first drag & drop for Angular. Make any element draggable or a drop target with a **typed payload**, read every bit of drag state as a `Signal`, and build reorderable lists — single or cross-list — on the same primitives. Choose the engine per ele","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/core":">=22 <23","@angular/common":">=22 <23","@mmstack/primitives":"^22.4.0","@atlaskit/pragmatic-drag-and-drop":"~2.0.1"},"optionalDependencies":{"@atlaskit/pragmatic-drag-and-drop-hitbox":"~2.0.0","@atlaskit/pragmatic-drag-and-drop-flourish":"~3.0.1","@atlaskit/pragmatic-drag-and-drop-auto-scroll":"~3.0.0","@atlaskit/pragmatic-drag-and-drop-live-region":"~2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dnd_22.2.0_1782971978989_0.6471586926399071","host":"s3://npm-registry-packages-npm-production"}},"21.2.0":{"name":"@mmstack/dnd","version":"21.2.0","keywords":["angular","dnd","drag-and-drop","pragmatic-drag-and-drop","drag","drop"],"license":"MIT","_id":"@mmstack/dnd@21.2.0","maintainers":[{"name":"mmstack","email":"mulec.mihaj@gmail.com"}],"homepage":"https://github.com/mihajm/mmstack/blob/master/packages/dnd","bugs":{"url":"https://github.com/mihajm/mmstack/issues"},"dist":{"shasum":"66c313445c3598fecdc7d5694d1a15c5e4020bc1","tarball":"https://registry.npmjs.org/@mmstack/dnd/-/dnd-21.2.0.tgz","fileCount":9,"integrity":"sha512-KI9BEbAZZCq5X3XUrhIdHw2CGu6IFUTDa9bZW2He7XuM8uVcFMLDwHHJAkzGRig/ff+iu0gfvh7Q/p+gTDws6Q==","signatures":[{"sig":"MEQCIGGcx6P072+0S4+RqaahFKDfwfPinCy0JIUOI26Fc0VdAiAJSgAXPiIqYtdfXP5YHKgEz2jWu7RDD21x76LrlPX6eA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":483017},"type":"module","module":"fesm2022/mmstack-dnd.mjs","exports":{".":{"types":"./types/mmstack-dnd.d.ts","default":"./fesm2022/mmstack-dnd.mjs"},"./plugins":{"types":"./types/mmstack-dnd-plugins.d.ts","default":"./fesm2022/mmstack-dnd-plugins.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"797367dfd7986c387dc94f1da17ef7f6301bbda4","typings":"types/mmstack-dnd.d.ts","_npmUser":{"name":"mmstack","email":"mulec.mihaj@gmail.com"},"repository":{"url":"git+https://github.com/mihajm/mmstack.git","type":"git","directory":"packages/dnd"},"_npmVersion":"11.14.1","description":"Signals-first drag & drop for Angular. Make any element draggable or a drop target with a **typed payload**, read every bit of drag state as a `Signal`, and build reorderable lists — single or cross-list — on the same primitives. Choose the engine per ele","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"@angular/core":">=21 <22","@angular/common":">=21 <22","@mmstack/primitives":"^21.4.0","@atlaskit/pragmatic-drag-and-drop":"~2.0.1"},"optionalDependencies":{"@atlaskit/pragmatic-drag-and-drop-hitbox":"~2.0.0","@atlaskit/pragmatic-drag-and-drop-flourish":"~3.0.1","@atlaskit/pragmatic-drag-and-drop-auto-scroll":"~3.0.0","@atlaskit/pragmatic-drag-and-drop-live-region":"~2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dnd_21.2.0_1782972939823_0.9870249051165672","host":"s3://npm-registry-packages-npm-production"}},"22.3.0":{"name":"@mmstack/dnd","version":"22.3.0","keywords":["angular","dnd","drag-and-drop","pragmatic-drag-and-drop","drag","drop"],"license":"MIT","_id":"@mmstack/dnd@22.3.0","maintainers":[{"name":"mmstack","email":"mulec.mihaj@gmail.com"}],"homepage":"https://github.com/mihajm/mmstack/blob/master/packages/dnd","bugs":{"url":"https://github.com/mihajm/mmstack/issues"},"dist":{"shasum":"ae69800ff1964d755933b0ec1f4cd5bf3df52b96","tarball":"https://registry.npmjs.org/@mmstack/dnd/-/dnd-22.3.0.tgz","fileCount":9,"integrity":"sha512-DvtVIvHx94v975KkXK/CYpeLdIZCMT1l+J2n4J/qMxzji/qpsAZaExg2mTPFWbfLri+FcAUq7ZqTsymdaCDtKQ==","signatures":[{"sig":"MEYCIQD2VHXFjGte/UlGCxXLmY92frIZM6nmQxY3Ft+JVL2VKwIhAItUqVV5BLpGFHykZx6xzKOJrRk0PbMOISzaiGAp3gCl","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":485000},"type":"module","module":"fesm2022/mmstack-dnd.mjs","exports":{".":{"types":"./types/mmstack-dnd.d.ts","default":"./fesm2022/mmstack-dnd.mjs"},"./plugins":{"types":"./types/mmstack-dnd-plugins.d.ts","default":"./fesm2022/mmstack-dnd-plugins.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"7b40167774382053bdbc121c0ba659feb087f1dd","typings":"types/mmstack-dnd.d.ts","_npmUser":{"name":"mmstack","email":"mulec.mihaj@gmail.com"},"repository":{"url":"git+https://github.com/mihajm/mmstack.git","type":"git","directory":"packages/dnd"},"_npmVersion":"11.14.1","description":"Signals-first drag & drop for Angular. Make any element draggable or a drop target with a **typed payload**, read every bit of drag state as a `Signal`, and build reorderable lists — single or cross-list — on the same primitives. Choose the engine per ele","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/core":">=22 <23","@angular/common":">=22 <23","@mmstack/primitives":"^22.5.0","@atlaskit/pragmatic-drag-and-drop":"~2.0.1"},"optionalDependencies":{"@atlaskit/pragmatic-drag-and-drop-hitbox":"~2.0.0","@atlaskit/pragmatic-drag-and-drop-flourish":"~3.0.1","@atlaskit/pragmatic-drag-and-drop-auto-scroll":"~3.0.0","@atlaskit/pragmatic-drag-and-drop-live-region":"~2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dnd_22.3.0_1783016376202_0.7563603972732247","host":"s3://npm-registry-packages-npm-production"}},"21.3.0":{"name":"@mmstack/dnd","version":"21.3.0","keywords":["angular","dnd","drag-and-drop","pragmatic-drag-and-drop","drag","drop"],"license":"MIT","_id":"@mmstack/dnd@21.3.0","maintainers":[{"name":"mmstack","email":"mulec.mihaj@gmail.com"}],"homepage":"https://github.com/mihajm/mmstack/blob/master/packages/dnd","bugs":{"url":"https://github.com/mihajm/mmstack/issues"},"dist":{"shasum":"e335262028581d44dd2f0f5e91b8127504cdd23d","tarball":"https://registry.npmjs.org/@mmstack/dnd/-/dnd-21.3.0.tgz","fileCount":9,"integrity":"sha512-hFR4XaiSgYh8p5HmjOkuf515rq6iIBlHFfgVQH3cl7sGbGWb+21qjKy0bvjbQ0EeeGYZ00KegMUQLA9zV4ZYGg==","signatures":[{"sig":"MEUCIQDGit/j0GF3O3RSpGcK8F3qWNdJv/Vl7NrYXqHhDK/43wIgKunMuLZToAdfB/9M/NyjVM1Wyqq3uv/uOzSLesveQGU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":484558},"type":"module","module":"fesm2022/mmstack-dnd.mjs","exports":{".":{"types":"./types/mmstack-dnd.d.ts","default":"./fesm2022/mmstack-dnd.mjs"},"./plugins":{"types":"./types/mmstack-dnd-plugins.d.ts","default":"./fesm2022/mmstack-dnd-plugins.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"86a2226b35351059cbe3f1015bb005192f9ed9f0","typings":"types/mmstack-dnd.d.ts","_npmUser":{"name":"mmstack","email":"mulec.mihaj@gmail.com"},"repository":{"url":"git+https://github.com/mihajm/mmstack.git","type":"git","directory":"packages/dnd"},"_npmVersion":"11.14.1","description":"Signals-first drag & drop for Angular. Make any element draggable or a drop target with a **typed payload**, read every bit of drag state as a `Signal`, and build reorderable lists — single or cross-list — on the same primitives. Choose the engine per ele","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"@angular/core":">=21 <22","@angular/common":">=21 <22","@mmstack/primitives":"^21.5.0","@atlaskit/pragmatic-drag-and-drop":"~2.0.1"},"optionalDependencies":{"@atlaskit/pragmatic-drag-and-drop-hitbox":"~2.0.0","@atlaskit/pragmatic-drag-and-drop-flourish":"~3.0.1","@atlaskit/pragmatic-drag-and-drop-auto-scroll":"~3.0.0","@atlaskit/pragmatic-drag-and-drop-live-region":"~2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dnd_21.3.0_1783019108913_0.054662302638771365","host":"s3://npm-registry-packages-npm-production"}},"21.4.0":{"name":"@mmstack/dnd","version":"21.4.0","keywords":["angular","dnd","drag-and-drop","pragmatic-drag-and-drop","drag","drop"],"license":"MIT","_id":"@mmstack/dnd@21.4.0","maintainers":[{"name":"mmstack","email":"mulec.mihaj@gmail.com"}],"homepage":"https://github.com/mihajm/mmstack/blob/master/packages/dnd","bugs":{"url":"https://github.com/mihajm/mmstack/issues"},"dist":{"shasum":"f920cf7622880eee40e79efb72c13f7dce0e48c8","tarball":"https://registry.npmjs.org/@mmstack/dnd/-/dnd-21.4.0.tgz","fileCount":9,"integrity":"sha512-NSzZgAsriqEfXXuq6sslpdn6GmCeRnIAqHGXdFhvDYsRo3nDogvXK/wZLQ2kOy4zrjq/20B2RK+9Y0Twk9kjMQ==","signatures":[{"sig":"MEUCIBQc7TtnKUtjIDmRXJHmlG33UazayLDP3rugVdXxYznoAiEAhPIlXhZv8ft0ibVbZEMLa95gOEFgp5D7CHIXsUxvuDw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1062289},"type":"module","module":"fesm2022/mmstack-dnd.mjs","exports":{".":{"types":"./types/mmstack-dnd.d.ts","default":"./fesm2022/mmstack-dnd.mjs"},"./plugins":{"types":"./types/mmstack-dnd-plugins.d.ts","default":"./fesm2022/mmstack-dnd-plugins.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"f71d705fdd9792a9552c0447e798cc3ee59cffb3","typings":"types/mmstack-dnd.d.ts","_npmUser":{"name":"mmstack","email":"mulec.mihaj@gmail.com"},"repository":{"url":"git+https://github.com/mihajm/mmstack.git","type":"git","directory":"packages/dnd"},"_npmVersion":"11.14.1","description":"Signals-first drag & drop for Angular. Make any element draggable or a drop target with a **typed payload**, read every bit of drag state as a `Signal`, and build reorderable lists — single or cross-list — on the same primitives. Choose the engine per ele","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"@angular/core":">=21 <22","@angular/common":">=21 <22","@mmstack/primitives":">=21.6 <22","@atlaskit/pragmatic-drag-and-drop":"~2.0.1"},"optionalDependencies":{"@atlaskit/pragmatic-drag-and-drop-hitbox":"~2.0.0","@atlaskit/pragmatic-drag-and-drop-flourish":"~3.0.1","@atlaskit/pragmatic-drag-and-drop-auto-scroll":"~3.0.0","@atlaskit/pragmatic-drag-and-drop-live-region":"~2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dnd_21.4.0_1783224519419_0.6037168703360283","host":"s3://npm-registry-packages-npm-production"}},"22.4.0":{"name":"@mmstack/dnd","version":"22.4.0","keywords":["angular","dnd","drag-and-drop","pragmatic-drag-and-drop","drag","drop"],"license":"MIT","_id":"@mmstack/dnd@22.4.0","maintainers":[{"name":"mmstack","email":"mulec.mihaj@gmail.com"}],"homepage":"https://github.com/mihajm/mmstack/blob/master/packages/dnd","bugs":{"url":"https://github.com/mihajm/mmstack/issues"},"dist":{"shasum":"2f32eed8cdc37dc8e29303fa449c2ccb0e96d711","tarball":"https://registry.npmjs.org/@mmstack/dnd/-/dnd-22.4.0.tgz","fileCount":9,"integrity":"sha512-zOpmIz5C/A4hmf1MsvHyqctCC6SI1C87iqfXILfvEfCwOU3L860eSc9P7uyLhG131XLtHZnIITZIxRvgE1e9qw==","signatures":[{"sig":"MEQCIBDKVnq8Olmck71kbU/WvHcEYeHoXUYs0R78NIK7NMO8AiBYLPrTT66x6ESTPqLJ5s640rGpMN7NVWufbt8z9UQ9zw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1064073},"type":"module","module":"fesm2022/mmstack-dnd.mjs","exports":{".":{"types":"./types/mmstack-dnd.d.ts","default":"./fesm2022/mmstack-dnd.mjs"},"./plugins":{"types":"./types/mmstack-dnd-plugins.d.ts","default":"./fesm2022/mmstack-dnd-plugins.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"986529e35f0bfb8f123a4df2b7fafe8a01264f34","typings":"types/mmstack-dnd.d.ts","_npmUser":{"name":"mmstack","email":"mulec.mihaj@gmail.com"},"repository":{"url":"git+https://github.com/mihajm/mmstack.git","type":"git","directory":"packages/dnd"},"_npmVersion":"11.14.1","description":"Signals-first drag & drop for Angular. Make any element draggable or a drop target with a **typed payload**, read every bit of drag state as a `Signal`, and build reorderable lists — single or cross-list — on the same primitives. Choose the engine per ele","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/core":">=22 <23","@angular/common":">=22 <23","@mmstack/primitives":">=22.6 <23","@atlaskit/pragmatic-drag-and-drop":"~2.0.1"},"optionalDependencies":{"@atlaskit/pragmatic-drag-and-drop-hitbox":"~2.0.0","@atlaskit/pragmatic-drag-and-drop-flourish":"~3.0.1","@atlaskit/pragmatic-drag-and-drop-auto-scroll":"~3.0.0","@atlaskit/pragmatic-drag-and-drop-live-region":"~2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dnd_22.4.0_1783224623726_0.1279308107897814","host":"s3://npm-registry-packages-npm-production"}},"21.4.1":{"name":"@mmstack/dnd","version":"21.4.1","keywords":["angular","dnd","drag-and-drop","pragmatic-drag-and-drop","drag","drop"],"license":"MIT","_id":"@mmstack/dnd@21.4.1","maintainers":[{"name":"mmstack","email":"mulec.mihaj@gmail.com"}],"homepage":"https://github.com/mihajm/mmstack/blob/master/packages/dnd","bugs":{"url":"https://github.com/mihajm/mmstack/issues"},"dist":{"shasum":"90ccf08e7360a334844595d0f4ad2560c9e4744f","tarball":"https://registry.npmjs.org/@mmstack/dnd/-/dnd-21.4.1.tgz","fileCount":9,"integrity":"sha512-Mbwp2ykcnDMbWTyQiIiiWzNIzc9H2F1WXxd3GzvZ5ld+3vR4jT3WWAZGkpEgNYFsJ3u6AtDFkcLCA8/KP7Fc7w==","signatures":[{"sig":"MEUCIQDTO75UzFR3r9IFsIfRkr3iO6bixb+24BPQMzMeReq3LQIgcsAyRisPTlY2i3Ciu1oMhYjEoOAoWjmXwLn6oDXs3SM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1076471},"type":"module","module":"fesm2022/mmstack-dnd.mjs","exports":{".":{"types":"./types/mmstack-dnd.d.ts","default":"./fesm2022/mmstack-dnd.mjs"},"./plugins":{"types":"./types/mmstack-dnd-plugins.d.ts","default":"./fesm2022/mmstack-dnd-plugins.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"2210feb3e5558a01c5645eb2c1d536a01396149a","typings":"types/mmstack-dnd.d.ts","_npmUser":{"name":"mmstack","email":"mulec.mihaj@gmail.com"},"repository":{"url":"git+https://github.com/mihajm/mmstack.git","type":"git","directory":"packages/dnd"},"_npmVersion":"11.14.1","description":"Signals-first drag & drop for Angular. Make any element draggable or a drop target with a **typed payload**, read every bit of drag state as a `Signal`, and build reorderable lists — single or cross-list — on the same primitives. Choose the engine per ele","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"@angular/core":">=21 <22","@angular/common":">=21 <22","@mmstack/primitives":">=21.6 <22","@atlaskit/pragmatic-drag-and-drop":"~2.0.1"},"optionalDependencies":{"@atlaskit/pragmatic-drag-and-drop-hitbox":"~2.0.0","@atlaskit/pragmatic-drag-and-drop-flourish":"~3.0.1","@atlaskit/pragmatic-drag-and-drop-auto-scroll":"~3.0.0","@atlaskit/pragmatic-drag-and-drop-live-region":"~2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dnd_21.4.1_1783225660591_0.1727408268525854","host":"s3://npm-registry-packages-npm-production"}},"22.4.1":{"name":"@mmstack/dnd","version":"22.4.1","keywords":["angular","dnd","drag-and-drop","pragmatic-drag-and-drop","drag","drop"],"license":"MIT","_id":"@mmstack/dnd@22.4.1","maintainers":[{"name":"mmstack","email":"mulec.mihaj@gmail.com"}],"homepage":"https://github.com/mihajm/mmstack/blob/master/packages/dnd","bugs":{"url":"https://github.com/mihajm/mmstack/issues"},"dist":{"shasum":"1c7946737894529f6413309385163516990d1ff3","tarball":"https://registry.npmjs.org/@mmstack/dnd/-/dnd-22.4.1.tgz","fileCount":9,"integrity":"sha512-2tIFQR1aV5g+ziUPwfP8n3SiooI/z/7cn9H9juLNCdSA24QOCCaPwqZBL9rwjf7zEQQqviLU2gbiMVTm4dQK7Q==","signatures":[{"sig":"MEUCIHiJzbebc8eBZZ4VZkqpaoe2kt3rwKJm6LB0R0EqvUOHAiEA5hDKJ61qf77SLfNUl4PzgLYPPxKhik9On3pgSwXXPvM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1078378},"type":"module","module":"fesm2022/mmstack-dnd.mjs","exports":{".":{"types":"./types/mmstack-dnd.d.ts","default":"./fesm2022/mmstack-dnd.mjs"},"./plugins":{"types":"./types/mmstack-dnd-plugins.d.ts","default":"./fesm2022/mmstack-dnd-plugins.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"ddf491848f2ba217e83a6ec4ed9131b4b585e889","typings":"types/mmstack-dnd.d.ts","_npmUser":{"name":"mmstack","email":"mulec.mihaj@gmail.com"},"repository":{"url":"git+https://github.com/mihajm/mmstack.git","type":"git","directory":"packages/dnd"},"_npmVersion":"11.14.1","description":"Signals-first drag & drop for Angular. Make any element draggable or a drop target with a **typed payload**, read every bit of drag state as a `Signal`, and build reorderable lists — single or cross-list — on the same primitives. Choose the engine per ele","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/core":">=22 <23","@angular/common":">=22 <23","@mmstack/primitives":">=22.6 <23","@atlaskit/pragmatic-drag-and-drop":"~2.0.1"},"optionalDependencies":{"@atlaskit/pragmatic-drag-and-drop-hitbox":"~2.0.0","@atlaskit/pragmatic-drag-and-drop-flourish":"~3.0.1","@atlaskit/pragmatic-drag-and-drop-auto-scroll":"~3.0.0","@atlaskit/pragmatic-drag-and-drop-live-region":"~2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dnd_22.4.1_1783225704412_0.7492445808891117","host":"s3://npm-registry-packages-npm-production"}},"22.4.2":{"name":"@mmstack/dnd","version":"22.4.2","keywords":["angular","dnd","drag-and-drop","pragmatic-drag-and-drop","drag","drop"],"license":"MIT","_id":"@mmstack/dnd@22.4.2","maintainers":[{"name":"mmstack","email":"mulec.mihaj@gmail.com"}],"homepage":"https://github.com/mihajm/mmstack/blob/master/packages/dnd","bugs":{"url":"https://github.com/mihajm/mmstack/issues"},"dist":{"shasum":"fe6c886ac5bb8a088b030e1b86cc5919ae3765e5","tarball":"https://registry.npmjs.org/@mmstack/dnd/-/dnd-22.4.2.tgz","fileCount":9,"integrity":"sha512-H+wyfW4q29lWGNxMRkivCdCFB3w4uMqbK2J/YvGN3zV+LOy11GGG4aMMu7e8Ku0r/yslU6XOGsUo3vjuE3lCtg==","signatures":[{"sig":"MEUCIAz991t1hWcFlYELIW8oMnRblzSYiF29OfrcXKWmbWoKAiEA4hsXKbJeXuwu2pVnaU+4/PBitTTy3VgSfz1/3xRs9Ew=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1086304},"type":"module","module":"fesm2022/mmstack-dnd.mjs","exports":{".":{"types":"./types/mmstack-dnd.d.ts","default":"./fesm2022/mmstack-dnd.mjs"},"./plugins":{"types":"./types/mmstack-dnd-plugins.d.ts","default":"./fesm2022/mmstack-dnd-plugins.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"928514ebc8bfb43d3d1954c55a3df7d830680b55","typings":"types/mmstack-dnd.d.ts","_npmUser":{"name":"mmstack","email":"mulec.mihaj@gmail.com"},"repository":{"url":"git+https://github.com/mihajm/mmstack.git","type":"git","directory":"packages/dnd"},"_npmVersion":"11.14.1","description":"Signals-first drag & drop for Angular. Make any element draggable or a drop target with a **typed payload**, read every bit of drag state as a `Signal`, and build reorderable lists — single or cross-list — on the same primitives. Choose the engine per ele","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/core":">=22 <23","@angular/common":">=22 <23","@mmstack/primitives":">=22.6 <23","@atlaskit/pragmatic-drag-and-drop":"~2.0.1"},"optionalDependencies":{"@atlaskit/pragmatic-drag-and-drop-hitbox":"~2.0.0","@atlaskit/pragmatic-drag-and-drop-flourish":"~3.0.1","@atlaskit/pragmatic-drag-and-drop-auto-scroll":"~3.0.0","@atlaskit/pragmatic-drag-and-drop-live-region":"~2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dnd_22.4.2_1783317597757_0.4489240998289885","host":"s3://npm-registry-packages-npm-production"}},"21.4.2":{"name":"@mmstack/dnd","version":"21.4.2","keywords":["angular","dnd","drag-and-drop","pragmatic-drag-and-drop","drag","drop"],"license":"MIT","_id":"@mmstack/dnd@21.4.2","maintainers":[{"name":"mmstack","email":"mulec.mihaj@gmail.com"}],"homepage":"https://github.com/mihajm/mmstack/blob/master/packages/dnd","bugs":{"url":"https://github.com/mihajm/mmstack/issues"},"dist":{"shasum":"91c9b8822d56563b2f82f864545313facb4b9973","tarball":"https://registry.npmjs.org/@mmstack/dnd/-/dnd-21.4.2.tgz","fileCount":9,"integrity":"sha512-oY/MH9g5AhfDNCl2nbc4eW6flx1HabCU3Kc1sVSXiXQbztGsDRFo32Lf5z5448gLR42fAK5yS8x4KCA0jQL+AA==","signatures":[{"sig":"MEYCIQD5AZy3B/PMChSXRHDa6/JA25JSjfn7HTUUTDlpkXamfQIhAPJXZ88HfpJ+2tRHmDnjA6ymVA0j00HBLywKiPPT6rc/","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1084397},"type":"module","module":"fesm2022/mmstack-dnd.mjs","exports":{".":{"types":"./types/mmstack-dnd.d.ts","default":"./fesm2022/mmstack-dnd.mjs"},"./plugins":{"types":"./types/mmstack-dnd-plugins.d.ts","default":"./fesm2022/mmstack-dnd-plugins.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"de0eabbb671bfa142270ca02885bfbfed5260cfa","typings":"types/mmstack-dnd.d.ts","_npmUser":{"name":"mmstack","email":"mulec.mihaj@gmail.com"},"repository":{"url":"git+https://github.com/mihajm/mmstack.git","type":"git","directory":"packages/dnd"},"_npmVersion":"11.14.1","description":"Signals-first drag & drop for Angular. Make any element draggable or a drop target with a **typed payload**, read every bit of drag state as a `Signal`, and build reorderable lists — single or cross-list — on the same primitives. Choose the engine per ele","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"@angular/core":">=21 <22","@angular/common":">=21 <22","@mmstack/primitives":">=21.6 <22","@atlaskit/pragmatic-drag-and-drop":"~2.0.1"},"optionalDependencies":{"@atlaskit/pragmatic-drag-and-drop-hitbox":"~2.0.0","@atlaskit/pragmatic-drag-and-drop-flourish":"~3.0.1","@atlaskit/pragmatic-drag-and-drop-auto-scroll":"~3.0.0","@atlaskit/pragmatic-drag-and-drop-live-region":"~2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dnd_21.4.2_1783318364159_0.2917189678624539","host":"s3://npm-registry-packages-npm-production"}},"21.4.3":{"name":"@mmstack/dnd","version":"21.4.3","keywords":["angular","dnd","drag-and-drop","pragmatic-drag-and-drop","drag","drop"],"license":"MIT","_id":"@mmstack/dnd@21.4.3","maintainers":[{"name":"mmstack","email":"mulec.mihaj@gmail.com"}],"homepage":"https://github.com/mihajm/mmstack/blob/master/packages/dnd","bugs":{"url":"https://github.com/mihajm/mmstack/issues"},"dist":{"shasum":"240ec9118adee481ab34dfab2adca8a0c6c45a8b","tarball":"https://registry.npmjs.org/@mmstack/dnd/-/dnd-21.4.3.tgz","fileCount":9,"integrity":"sha512-+SBJpAb9hqSF31Rvjaf3s2xTpjgCO6JXKYmMSnXEz+K/XV6D8FQQ44jMjfbjXdVJneCt2Prxp49614Xw4h4b/w==","signatures":[{"sig":"MEQCIAtG3U1hZDEcIJA3icPG6zKcygEQ+qmR+HX+7VeyX7XRAiA//MwYrUDKp9ykoxSlRiC+QlCYF5hKk45jojVBt2ibpA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1085017},"type":"module","module":"fesm2022/mmstack-dnd.mjs","exports":{".":{"types":"./types/mmstack-dnd.d.ts","default":"./fesm2022/mmstack-dnd.mjs"},"./plugins":{"types":"./types/mmstack-dnd-plugins.d.ts","default":"./fesm2022/mmstack-dnd-plugins.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"abc8565898b8b5491937d71c18fae13c5c26a5fe","typings":"types/mmstack-dnd.d.ts","_npmUser":{"name":"mmstack","email":"mulec.mihaj@gmail.com"},"repository":{"url":"git+https://github.com/mihajm/mmstack.git","type":"git","directory":"packages/dnd"},"_npmVersion":"11.14.1","description":"Signals-first drag & drop for Angular. Make any element draggable or a drop target with a **typed payload**, read every bit of drag state as a `Signal`, and build reorderable lists — single or cross-list — on the same primitives. Choose the engine per ele","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"@angular/core":">=21 <22","@angular/common":">=21 <22","@mmstack/primitives":">=21.6 <22","@atlaskit/pragmatic-drag-and-drop":"~2.0.1"},"optionalDependencies":{"@atlaskit/pragmatic-drag-and-drop-hitbox":"~2.0.0","@atlaskit/pragmatic-drag-and-drop-flourish":"~3.0.1","@atlaskit/pragmatic-drag-and-drop-auto-scroll":"~3.0.0","@atlaskit/pragmatic-drag-and-drop-live-region":"~2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dnd_21.4.3_1785841210261_0.7364041640576389","host":"s3://npm-registry-packages-npm-production"}},"22.4.3":{"name":"@mmstack/dnd","version":"22.4.3","keywords":["angular","dnd","drag-and-drop","pragmatic-drag-and-drop","drag","drop"],"license":"MIT","_id":"@mmstack/dnd@22.4.3","maintainers":[{"name":"mmstack","email":"mulec.mihaj@gmail.com"}],"homepage":"https://github.com/mihajm/mmstack/blob/master/packages/dnd","bugs":{"url":"https://github.com/mihajm/mmstack/issues"},"dist":{"shasum":"8e9589529e1ca200f214d90440b6226f2e372760","tarball":"https://registry.npmjs.org/@mmstack/dnd/-/dnd-22.4.3.tgz","fileCount":9,"integrity":"sha512-0hQMU+yv/mx/3bLQGqvtnzYy2gVQYkAYr7mXkgggBciQhrCHdkYqJngfJpfzOZSYBTlrYdAtu/QhfNu3sij5Xg==","signatures":[{"sig":"MEYCIQC3SlmYwelQmUFqjpVQeZWsPQ4TJbZH+/V2dgw+H7VeVAIhAJ1Lo7N4KZr69yUwfGz00oVbJnscVyxtTpQGjgkz+0Q2","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1086924},"type":"module","module":"fesm2022/mmstack-dnd.mjs","exports":{".":{"types":"./types/mmstack-dnd.d.ts","default":"./fesm2022/mmstack-dnd.mjs"},"./plugins":{"types":"./types/mmstack-dnd-plugins.d.ts","default":"./fesm2022/mmstack-dnd-plugins.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"b874349c14b1d7dc3d2797a2d6454b28b9120326","typings":"types/mmstack-dnd.d.ts","_npmUser":{"name":"mmstack","email":"mulec.mihaj@gmail.com"},"repository":{"url":"git+https://github.com/mihajm/mmstack.git","type":"git","directory":"packages/dnd"},"_npmVersion":"11.14.1","description":"Signals-first drag & drop for Angular. Make any element draggable or a drop target with a **typed payload**, read every bit of drag state as a `Signal`, and build reorderable lists — single or cross-list — on the same primitives. Choose the engine per ele","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/core":">=22 <23","@angular/common":">=22 <23","@mmstack/primitives":">=22.6 <23","@atlaskit/pragmatic-drag-and-drop":"~2.0.1"},"optionalDependencies":{"@atlaskit/pragmatic-drag-and-drop-hitbox":"~2.0.0","@atlaskit/pragmatic-drag-and-drop-flourish":"~3.0.1","@atlaskit/pragmatic-drag-and-drop-auto-scroll":"~3.0.0","@atlaskit/pragmatic-drag-and-drop-live-region":"~2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dnd_22.4.3_1785841261480_0.07929274742066705","host":"s3://npm-registry-packages-npm-production"}},"21.4.4":{"name":"@mmstack/dnd","version":"21.4.4","keywords":["angular","dnd","drag-and-drop","pragmatic-drag-and-drop","drag","drop"],"license":"MIT","_id":"@mmstack/dnd@21.4.4","maintainers":[{"name":"mmstack","email":"mulec.mihaj@gmail.com"}],"homepage":"https://github.com/mihajm/mmstack/blob/master/packages/dnd","bugs":{"url":"https://github.com/mihajm/mmstack/issues"},"dist":{"shasum":"4c159f85e56d8d0d8ff1dd6a92b7469ceb85db96","tarball":"https://registry.npmjs.org/@mmstack/dnd/-/dnd-21.4.4.tgz","fileCount":9,"integrity":"sha512-RM56wAhgnmYkx8eBnQqonO0BUOCZFNNWOGwo+xYJ76eQOsKRaNgf3Z9g5npTqyUqDuVn52qPvLi95Y9zqxT2jg==","signatures":[{"sig":"MEUCIQCNUrIjlh17TF0F4ENeRLDp5bBga/oj2RHRk8GBItuEGgIgd7MI3WUaAaZM73KFdjanTW5Wn8QYxa3bNYyuhohnQMM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1086672},"type":"module","module":"fesm2022/mmstack-dnd.mjs","exports":{".":{"types":"./types/mmstack-dnd.d.ts","default":"./fesm2022/mmstack-dnd.mjs"},"./plugins":{"types":"./types/mmstack-dnd-plugins.d.ts","default":"./fesm2022/mmstack-dnd-plugins.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"ca4b647b57b91ecfaa3b5cf8fa11929e8380d6fc","typings":"types/mmstack-dnd.d.ts","_npmUser":{"name":"mmstack","email":"mulec.mihaj@gmail.com"},"repository":{"url":"git+https://github.com/mihajm/mmstack.git","type":"git","directory":"packages/dnd"},"_npmVersion":"11.14.1","description":"Signals-first drag & drop for Angular. Make any element draggable or a drop target with a **typed payload**, read every bit of drag state as a `Signal`, and build reorderable lists — single or cross-list — on the same primitives. Choose the engine per ele","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"@angular/core":">=21 <22","@angular/common":">=21 <22","@mmstack/primitives":">=21.6 <22","@atlaskit/pragmatic-drag-and-drop":"~2.0.1"},"optionalDependencies":{"@atlaskit/pragmatic-drag-and-drop-hitbox":"~2.0.0","@atlaskit/pragmatic-drag-and-drop-flourish":"~3.0.1","@atlaskit/pragmatic-drag-and-drop-auto-scroll":"~3.0.0","@atlaskit/pragmatic-drag-and-drop-live-region":"~2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dnd_21.4.4_1785842115644_0.483716079226586","host":"s3://npm-registry-packages-npm-production"}},"22.4.4":{"name":"@mmstack/dnd","version":"22.4.4","keywords":["angular","dnd","drag-and-drop","pragmatic-drag-and-drop","drag","drop"],"license":"MIT","_id":"@mmstack/dnd@22.4.4","maintainers":[{"name":"mmstack","email":"mulec.mihaj@gmail.com"}],"homepage":"https://github.com/mihajm/mmstack/blob/master/packages/dnd","bugs":{"url":"https://github.com/mihajm/mmstack/issues"},"dist":{"shasum":"b7eac6a3062eb39eea6a42a830fea1f0c8f8e6a3","tarball":"https://registry.npmjs.org/@mmstack/dnd/-/dnd-22.4.4.tgz","fileCount":9,"integrity":"sha512-Db8eE8RawkfjvxmB3PFci+Qq7eQu2KGbWiJdm+U2OrcwjC3hWyz+Aab8qYcu6fQ3/OUjqzBfzZRQv2ZNvUQdlQ==","signatures":[{"sig":"MEQCIDXWP5o8BNXxfN1iO55MmRlZOEMmiF1fgCKunoYKQolQAiB0uXIKIaLXPu/jdAuuTPc62KSX1IU96zm8BrgKpulxWw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1088579},"type":"module","module":"fesm2022/mmstack-dnd.mjs","exports":{".":{"types":"./types/mmstack-dnd.d.ts","default":"./fesm2022/mmstack-dnd.mjs"},"./plugins":{"types":"./types/mmstack-dnd-plugins.d.ts","default":"./fesm2022/mmstack-dnd-plugins.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"41719608d75a484388e8d295610b69edfb198f53","typings":"types/mmstack-dnd.d.ts","_npmUser":{"name":"mmstack","email":"mulec.mihaj@gmail.com"},"repository":{"url":"git+https://github.com/mihajm/mmstack.git","type":"git","directory":"packages/dnd"},"_npmVersion":"11.14.1","description":"Signals-first drag & drop for Angular. Make any element draggable or a drop target with a **typed payload**, read every bit of drag state as a `Signal`, and build reorderable lists — single or cross-list — on the same primitives. Choose the engine per ele","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/core":">=22 <23","@angular/common":">=22 <23","@mmstack/primitives":">=22.6 <23","@atlaskit/pragmatic-drag-and-drop":"~2.0.1"},"optionalDependencies":{"@atlaskit/pragmatic-drag-and-drop-hitbox":"~2.0.0","@atlaskit/pragmatic-drag-and-drop-flourish":"~3.0.1","@atlaskit/pragmatic-drag-and-drop-auto-scroll":"~3.0.0","@atlaskit/pragmatic-drag-and-drop-live-region":"~2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dnd_22.4.4_1785842159707_0.2008143168988461","host":"s3://npm-registry-packages-npm-production"}},"22.4.5":{"name":"@mmstack/dnd","version":"22.4.5","keywords":["angular","dnd","drag-and-drop","pragmatic-drag-and-drop","drag","drop"],"license":"MIT","_id":"@mmstack/dnd@22.4.5","maintainers":[{"name":"mmstack","email":"mulec.mihaj@gmail.com"}],"homepage":"https://github.com/mihajm/mmstack/blob/master/packages/dnd","bugs":{"url":"https://github.com/mihajm/mmstack/issues"},"dist":{"shasum":"124b248127ffb3dc394c4c03896fa1a8586e4f70","tarball":"https://registry.npmjs.org/@mmstack/dnd/-/dnd-22.4.5.tgz","fileCount":9,"integrity":"sha512-m1vtYKYpVdHjhgJu2BiSo0OCfg0EeKvaUVBXFeQxUpzmAnT8kuo4eqBVJggSUuBw4e3ACQYK1jz9ccUxwFEHBA==","signatures":[{"sig":"MEQCIBf6H6o9JqgPhMlUE8RbPynSJFm5KZjpBSUm3xhGfJJ/AiAJeArZADghf+uFJHRQbFKv9AwsbttBAQXGTN3aSUE7qA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1088911},"type":"module","module":"fesm2022/mmstack-dnd.mjs","exports":{".":{"types":"./types/mmstack-dnd.d.ts","default":"./fesm2022/mmstack-dnd.mjs"},"./plugins":{"types":"./types/mmstack-dnd-plugins.d.ts","default":"./fesm2022/mmstack-dnd-plugins.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"496ae471c3cc5ecc7b9d33a950beaca369b5f201","typings":"types/mmstack-dnd.d.ts","_npmUser":{"name":"mmstack","email":"mulec.mihaj@gmail.com"},"repository":{"url":"git+https://github.com/mihajm/mmstack.git","type":"git","directory":"packages/dnd"},"_npmVersion":"11.14.1","description":"Signals-first drag & drop for Angular. Make any element draggable or a drop target with a **typed payload**, read every bit of drag state as a `Signal`, and build reorderable lists — single or cross-list — on the same primitives. Choose the engine per ele","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/core":">=22 <23","@angular/common":">=22 <23","@mmstack/primitives":">=22.6 <23","@atlaskit/pragmatic-drag-and-drop":"~2.0.1","@atlaskit/pragmatic-drag-and-drop-hitbox":"~2.0.0","@atlaskit/pragmatic-drag-and-drop-flourish":"~3.0.1","@atlaskit/pragmatic-drag-and-drop-auto-scroll":"~3.0.0","@atlaskit/pragmatic-drag-and-drop-live-region":"~2.0.0"},"peerDependenciesMeta":{"@atlaskit/pragmatic-drag-and-drop-hitbox":{"optional":true},"@atlaskit/pragmatic-drag-and-drop-flourish":{"optional":true},"@atlaskit/pragmatic-drag-and-drop-auto-scroll":{"optional":true},"@atlaskit/pragmatic-drag-and-drop-live-region":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/dnd_22.4.5_1787037231101_0.9606737750861847","host":"s3://npm-registry-packages-npm-production"}},"21.4.5":{"name":"@mmstack/dnd","version":"21.4.5","keywords":["angular","dnd","drag-and-drop","pragmatic-drag-and-drop","drag","drop"],"license":"MIT","_id":"@mmstack/dnd@21.4.5","maintainers":[{"name":"mmstack","email":"mulec.mihaj@gmail.com"}],"homepage":"https://github.com/mihajm/mmstack/blob/master/packages/dnd","bugs":{"url":"https://github.com/mihajm/mmstack/issues"},"dist":{"shasum":"3fc457c2042583db3426b3eeef680e261b3adc4d","tarball":"https://registry.npmjs.org/@mmstack/dnd/-/dnd-21.4.5.tgz","fileCount":9,"integrity":"sha512-aHl45HXQ+Pv2g9Y2NKGGqSq2i0AWK0kTCo+x34SRgK/H6cLzLlmnKXdPLUe+quzOz2MpywtQ4pGLyjUpvkzxLg==","signatures":[{"sig":"MEQCIHETLGpKK8J6wfkds65EVU1rELN5teN6VTyJ22U8PsaiAiAjD5G0B3lS3k3LI/BK9C4cdYNcJWjI+UAjbHfCNYxr7w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1087036},"type":"module","module":"fesm2022/mmstack-dnd.mjs","exports":{".":{"types":"./types/mmstack-dnd.d.ts","default":"./fesm2022/mmstack-dnd.mjs"},"./plugins":{"types":"./types/mmstack-dnd-plugins.d.ts","default":"./fesm2022/mmstack-dnd-plugins.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"b51b88d06b7a7101a3b35a5291e60995b82fe790","typings":"types/mmstack-dnd.d.ts","_npmUser":{"name":"mmstack","email":"mulec.mihaj@gmail.com"},"repository":{"url":"git+https://github.com/mihajm/mmstack.git","type":"git","directory":"packages/dnd"},"_npmVersion":"11.14.1","description":"Signals-first drag & drop for Angular. Make any element draggable or a drop target with a **typed payload**, read every bit of drag state as a `Signal`, and build reorderable lists — single or cross-list — on the same primitives. Choose the engine per ele","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"@angular/core":">=21 <22","@angular/common":">=21 <22","@mmstack/primitives":">=21.6 <22","@atlaskit/pragmatic-drag-and-drop":"~2.0.1"},"optionalDependencies":{"@atlaskit/pragmatic-drag-and-drop-hitbox":"~2.0.0","@atlaskit/pragmatic-drag-and-drop-flourish":"~3.0.1","@atlaskit/pragmatic-drag-and-drop-auto-scroll":"~3.0.0","@atlaskit/pragmatic-drag-and-drop-live-region":"~2.0.0"},"peerDependenciesMeta":{"@atlaskit/pragmatic-drag-and-drop-hitbox":{"optional":true},"@atlaskit/pragmatic-drag-and-drop-flourish":{"optional":true},"@atlaskit/pragmatic-drag-and-drop-auto-scroll":{"optional":true},"@atlaskit/pragmatic-drag-and-drop-live-region":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/dnd_21.4.5_1787037268252_0.1425667081840274","host":"s3://npm-registry-packages-npm-production"}},"22.4.6":{"name":"@mmstack/dnd","version":"22.4.6","keywords":["angular","dnd","drag-and-drop","pragmatic-drag-and-drop","drag","drop"],"license":"MIT","_id":"@mmstack/dnd@22.4.6","maintainers":[{"name":"mmstack","email":"mulec.mihaj@gmail.com"}],"homepage":"https://github.com/mihajm/mmstack/blob/master/packages/dnd","bugs":{"url":"https://github.com/mihajm/mmstack/issues"},"dist":{"shasum":"52a20ce824bb2a1cd14936216a18f194482b7fc3","tarball":"https://registry.npmjs.org/@mmstack/dnd/-/dnd-22.4.6.tgz","fileCount":9,"integrity":"sha512-oTnNQzUIGtHISGqHqBVrNzCPxSVq+RLCnyC3ylLQENNNhKGrYHRw5IFzYcBWRt5eRr1zZzNwtclhFGXvmUt4RQ==","signatures":[{"sig":"MEYCIQDY2T3KVOoqk3raMDNfI8a/TjMOEvRCvL3r2ldulVQ0hwIhAMvFQxgYjFVOlaX46MQ2nN1NRhHWpghpObjLY4ImHJ4O","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1088911},"type":"module","module":"fesm2022/mmstack-dnd.mjs","exports":{".":{"types":"./types/mmstack-dnd.d.ts","default":"./fesm2022/mmstack-dnd.mjs"},"./plugins":{"types":"./types/mmstack-dnd-plugins.d.ts","default":"./fesm2022/mmstack-dnd-plugins.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"4393c8dfb6373b2c96212ff94904ed17ad4bae04","typings":"types/mmstack-dnd.d.ts","_npmUser":{"name":"mmstack","email":"mulec.mihaj@gmail.com"},"repository":{"url":"git+https://github.com/mihajm/mmstack.git","type":"git","directory":"packages/dnd"},"_npmVersion":"11.14.1","description":"Signals-first drag & drop for Angular. Make any element draggable or a drop target with a **typed payload**, read every bit of drag state as a `Signal`, and build reorderable lists — single or cross-list — on the same primitives. Choose the engine per ele","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/core":">=22 <23","@angular/common":">=22 <23","@mmstack/primitives":">=22.6 <23","@atlaskit/pragmatic-drag-and-drop":"~2.0.1","@atlaskit/pragmatic-drag-and-drop-hitbox":"~2.0.0","@atlaskit/pragmatic-drag-and-drop-flourish":"~3.0.1","@atlaskit/pragmatic-drag-and-drop-auto-scroll":"~3.0.0","@atlaskit/pragmatic-drag-and-drop-live-region":"~2.0.0"},"peerDependenciesMeta":{"@atlaskit/pragmatic-drag-and-drop-hitbox":{"optional":true},"@atlaskit/pragmatic-drag-and-drop-flourish":{"optional":true},"@atlaskit/pragmatic-drag-and-drop-auto-scroll":{"optional":true},"@atlaskit/pragmatic-drag-and-drop-live-region":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/dnd_22.4.6_1787640728022_0.6747537810210189","host":"s3://npm-registry-packages-npm-production"}},"21.4.6":{"name":"@mmstack/dnd","version":"21.4.6","keywords":["angular","dnd","drag-and-drop","pragmatic-drag-and-drop","drag","drop"],"license":"MIT","_id":"@mmstack/dnd@21.4.6","maintainers":[{"name":"mmstack","email":"mulec.mihaj@gmail.com"}],"homepage":"https://github.com/mihajm/mmstack/blob/master/packages/dnd","bugs":{"url":"https://github.com/mihajm/mmstack/issues"},"dist":{"shasum":"4d59819ab6af547d01e120cc3b2646517a517748","tarball":"https://registry.npmjs.org/@mmstack/dnd/-/dnd-21.4.6.tgz","fileCount":9,"integrity":"sha512-2a04gL3BFvkRvAJbKoCzS5RvfpoaT8Ey1gDtwBMngTKr1CkYL2E1UQrLQ/nYiiqnyXxoPhu3h8eKgqsE217/UA==","signatures":[{"sig":"MEQCIDied4sJZZ63hlpdFA8rE3YbE+83q9mJQ+jVh46kfCQTAiBmaKIzJgpAXbmwJmS5C2NT+xJr8gy0pI2MuAT36x+UCg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1087004},"type":"module","module":"fesm2022/mmstack-dnd.mjs","exports":{".":{"types":"./types/mmstack-dnd.d.ts","default":"./fesm2022/mmstack-dnd.mjs"},"./plugins":{"types":"./types/mmstack-dnd-plugins.d.ts","default":"./fesm2022/mmstack-dnd-plugins.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"9d33a916dd6ba54b66d81da90c67d80dde8e016e","typings":"types/mmstack-dnd.d.ts","_npmUser":{"name":"mmstack","email":"mulec.mihaj@gmail.com"},"repository":{"url":"git+https://github.com/mihajm/mmstack.git","type":"git","directory":"packages/dnd"},"_npmVersion":"11.14.1","description":"Signals-first drag & drop for Angular. Make any element draggable or a drop target with a **typed payload**, read every bit of drag state as a `Signal`, and build reorderable lists — single or cross-list — on the same primitives. Choose the engine per ele","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"@angular/core":">=21 <22","@angular/common":">=21 <22","@mmstack/primitives":">=21.6 <22","@atlaskit/pragmatic-drag-and-drop":"~2.0.1","@atlaskit/pragmatic-drag-and-drop-hitbox":"~2.0.0","@atlaskit/pragmatic-drag-and-drop-flourish":"~3.0.1","@atlaskit/pragmatic-drag-and-drop-auto-scroll":"~3.0.0","@atlaskit/pragmatic-drag-and-drop-live-region":"~2.0.0"},"peerDependenciesMeta":{"@atlaskit/pragmatic-drag-and-drop-hitbox":{"optional":true},"@atlaskit/pragmatic-drag-and-drop-flourish":{"optional":true},"@atlaskit/pragmatic-drag-and-drop-auto-scroll":{"optional":true},"@atlaskit/pragmatic-drag-and-drop-live-region":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/dnd_21.4.6_1787640870818_0.6555907439804565","host":"s3://npm-registry-packages-npm-production"}},"21.4.7":{"name":"@mmstack/dnd","version":"21.4.7","keywords":["angular","dnd","drag-and-drop","pragmatic-drag-and-drop","drag","drop"],"license":"MIT","_id":"@mmstack/dnd@21.4.7","maintainers":[{"name":"mmstack","email":"mulec.mihaj@gmail.com"}],"homepage":"https://github.com/mihajm/mmstack/blob/master/packages/dnd","bugs":{"url":"https://github.com/mihajm/mmstack/issues"},"dist":{"shasum":"7d17e499d417440db03b8bcb23e4e9518182e675","tarball":"https://registry.npmjs.org/@mmstack/dnd/-/dnd-21.4.7.tgz","fileCount":9,"integrity":"sha512-tuUGmhWxAy/Aun5LBCeL8J1l4HqkthshX2o8lbxt+Em+TqoAfXvnL9mJmMlbKlI+wLLnP9CCqKqeRI+ynvEysA==","signatures":[{"sig":"MEQCIFqBdK3MnA0qPvoNTlF8AWbk40fa51QtNeAFGtgq1N/YAiAThybXkKPGEnpF2wVs+dIYKCrSQ+boV+p0GF2nmNKUmA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCYaAW2GQXRa98SdGYa2iEYrxpophOogC6r5yPWG14w+gIgB9rnGT2/JV7ywFXELQ4F3AQDD2la11phtWIlUyjoRKE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1090325},"type":"module","module":"fesm2022/mmstack-dnd.mjs","exports":{".":{"types":"./types/mmstack-dnd.d.ts","default":"./fesm2022/mmstack-dnd.mjs"},"./plugins":{"types":"./types/mmstack-dnd-plugins.d.ts","default":"./fesm2022/mmstack-dnd-plugins.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"99d7b7907ed4d1ee783b70363429be09f9c74390","typings":"types/mmstack-dnd.d.ts","_npmUser":{"name":"mmstack","email":"mulec.mihaj@gmail.com"},"repository":{"url":"git+https://github.com/mihajm/mmstack.git","type":"git","directory":"packages/dnd"},"_npmVersion":"11.14.1","description":"Signals-first drag & drop for Angular. Make any element draggable or a drop target with a **typed payload**, read every bit of drag state as a `Signal`, and build reorderable lists — single or cross-list — on the same primitives. Choose the engine per ele","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"@angular/core":">=21 <22","@angular/common":">=21 <22","@mmstack/primitives":">=21.6 <22","@atlaskit/pragmatic-drag-and-drop":"~2.0.1","@atlaskit/pragmatic-drag-and-drop-hitbox":"~2.0.0","@atlaskit/pragmatic-drag-and-drop-flourish":"~3.0.1","@atlaskit/pragmatic-drag-and-drop-auto-scroll":"~3.0.0","@atlaskit/pragmatic-drag-and-drop-live-region":"~2.0.0"},"peerDependenciesMeta":{"@atlaskit/pragmatic-drag-and-drop-hitbox":{"optional":true},"@atlaskit/pragmatic-drag-and-drop-flourish":{"optional":true},"@atlaskit/pragmatic-drag-and-drop-auto-scroll":{"optional":true},"@atlaskit/pragmatic-drag-and-drop-live-region":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/dnd_21.4.7_1787892684383_0.13466880021121264","host":"s3://npm-registry-packages-npm-production"}},"22.4.7":{"name":"@mmstack/dnd","version":"22.4.7","keywords":["angular","dnd","drag-and-drop","pragmatic-drag-and-drop","drag","drop"],"license":"MIT","_id":"@mmstack/dnd@22.4.7","maintainers":[{"name":"mmstack","email":"mulec.mihaj@gmail.com"}],"homepage":"https://github.com/mihajm/mmstack/blob/master/packages/dnd","bugs":{"url":"https://github.com/mihajm/mmstack/issues"},"dist":{"shasum":"a6e6f716dd9865699f360ee4afcd5a4cebdd5113","tarball":"https://registry.npmjs.org/@mmstack/dnd/-/dnd-22.4.7.tgz","fileCount":9,"integrity":"sha512-IPzFwYNfYZlsfDoOp9xWxkQ1GTT6veLIcPJQguS7Yn/Tlm4hpLeWSPVMocv0GDKyE68R2BwUXQCt7V7JTPIW6A==","signatures":[{"sig":"MEUCIGrNqUR1c2K/QFsQUjK8ZB32hhRH155Yl+L1PJYSFDmFAiEA9Sti4dqr5yd1n9vT1Bhvdz5J3PWWkLx/dVtVMZEMkns=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDjbOUqR8FpA59qhsbAgy2eLUAF48FOpSLwTuFClcrdvAIhALL8MwyX+SCyeD61hQB82x3mBoymb0KB29b1o2UAofxY","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1092232},"type":"module","module":"fesm2022/mmstack-dnd.mjs","exports":{".":{"types":"./types/mmstack-dnd.d.ts","default":"./fesm2022/mmstack-dnd.mjs"},"./plugins":{"types":"./types/mmstack-dnd-plugins.d.ts","default":"./fesm2022/mmstack-dnd-plugins.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"e0b6ada1f9d8f3fe4e0b357a539b2325de7e1992","typings":"types/mmstack-dnd.d.ts","_npmUser":{"name":"mmstack","email":"mulec.mihaj@gmail.com"},"repository":{"url":"git+https://github.com/mihajm/mmstack.git","type":"git","directory":"packages/dnd"},"_npmVersion":"11.14.1","description":"Signals-first drag & drop for Angular. Make any element draggable or a drop target with a **typed payload**, read every bit of drag state as a `Signal`, and build reorderable lists — single or cross-list — on the same primitives. Choose the engine per ele","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/core":">=22 <23","@angular/common":">=22 <23","@mmstack/primitives":">=22.6 <23","@atlaskit/pragmatic-drag-and-drop":"~2.0.1","@atlaskit/pragmatic-drag-and-drop-hitbox":"~2.0.0","@atlaskit/pragmatic-drag-and-drop-flourish":"~3.0.1","@atlaskit/pragmatic-drag-and-drop-auto-scroll":"~3.0.0","@atlaskit/pragmatic-drag-and-drop-live-region":"~2.0.0"},"peerDependenciesMeta":{"@atlaskit/pragmatic-drag-and-drop-hitbox":{"optional":true},"@atlaskit/pragmatic-drag-and-drop-flourish":{"optional":true},"@atlaskit/pragmatic-drag-and-drop-auto-scroll":{"optional":true},"@atlaskit/pragmatic-drag-and-drop-live-region":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/dnd_22.4.7_1787892732444_0.5553918377566169","host":"s3://npm-registry-packages-npm-production"}},"21.5.0":{"name":"@mmstack/dnd","version":"21.5.0","keywords":["angular","dnd","drag-and-drop","pragmatic-drag-and-drop","drag","drop"],"license":"MIT","_id":"@mmstack/dnd@21.5.0","maintainers":[{"name":"mmstack","email":"mulec.mihaj@gmail.com"}],"homepage":"https://github.com/mihajm/mmstack/blob/master/packages/dnd","bugs":{"url":"https://github.com/mihajm/mmstack/issues"},"dist":{"shasum":"5f2c2154389e71ee73cbf04f261cdcef505477fc","tarball":"https://registry.npmjs.org/@mmstack/dnd/-/dnd-21.5.0.tgz","fileCount":9,"integrity":"sha512-m6RdwDdqdlBjuvGBQ/8GlldB3CkmSMQq2ZxlNDfeH80m/R3OPRKfhj2dX/A8s5g/LKKI4Abk9f7h5GfeOCh2TQ==","signatures":[{"sig":"MEQCIEyGIpbo+Om2EvHOS12E3Gpp9NbCJKAa0md8B52Q3uT7AiAPQElBJcothp0ApgsmsJxy7lppYj8yvqOlyMHtMmpmBw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIH2tSGUUmwmt7CaMKFC/bnos2M1wVZsnolJYFql+EiPrAiAsw4DjG9j+9DE6BFzx4pDqAx6v76bmlp+arRNZjYgtLg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1088580},"type":"module","module":"fesm2022/mmstack-dnd.mjs","exports":{".":{"types":"./types/mmstack-dnd.d.ts","default":"./fesm2022/mmstack-dnd.mjs"},"./plugins":{"types":"./types/mmstack-dnd-plugins.d.ts","default":"./fesm2022/mmstack-dnd-plugins.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"b9ce76818f286e5b38fcaee521e96276b3214c0d","typings":"types/mmstack-dnd.d.ts","_npmUser":{"name":"mmstack","email":"mulec.mihaj@gmail.com"},"repository":{"url":"git+https://github.com/mihajm/mmstack.git","type":"git","directory":"packages/dnd"},"_npmVersion":"11.14.1","description":"Signals-first drag & drop for Angular. Make any element draggable or a drop target with a **typed payload**, read every bit of drag state as a `Signal`, and build reorderable lists — single or cross-list — on the same primitives. Choose the engine per ele","directories":{},"sideEffects":false,"_nodeVersion":"24.21.0","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"@angular/core":">=21 <22","@mmstack/primitives":">=21.13 <22","@atlaskit/pragmatic-drag-and-drop":"~2.0.1","@atlaskit/pragmatic-drag-and-drop-hitbox":"~2.0.0","@atlaskit/pragmatic-drag-and-drop-flourish":"~3.0.1","@atlaskit/pragmatic-drag-and-drop-auto-scroll":"~3.0.0","@atlaskit/pragmatic-drag-and-drop-live-region":"~2.0.0"},"peerDependenciesMeta":{"@atlaskit/pragmatic-drag-and-drop-hitbox":{"optional":true},"@atlaskit/pragmatic-drag-and-drop-flourish":{"optional":true},"@atlaskit/pragmatic-drag-and-drop-auto-scroll":{"optional":true},"@atlaskit/pragmatic-drag-and-drop-live-region":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/dnd_21.5.0_1789379446204_0.7209082352020024","host":"s3://npm-registry-packages-npm-production"}},"22.5.0":{"name":"@mmstack/dnd","version":"22.5.0","keywords":["angular","dnd","drag-and-drop","pragmatic-drag-and-drop","drag","drop"],"license":"MIT","_id":"@mmstack/dnd@22.5.0","maintainers":[{"name":"mmstack","email":"mulec.mihaj@gmail.com"}],"homepage":"https://github.com/mihajm/mmstack/blob/master/packages/dnd","bugs":{"url":"https://github.com/mihajm/mmstack/issues"},"dist":{"shasum":"ae9998ae0ed224b1694c6c8b555ef1db32d93691","tarball":"https://registry.npmjs.org/@mmstack/dnd/-/dnd-22.5.0.tgz","fileCount":9,"integrity":"sha512-En4unYga3So+3yxH3oIrhWAgRhzbEIkDZ/O9efuDgrxLLbGzHQjc0ApLsPK2jPEV6E7bM+vMvjiLPtZtWBkRJQ==","signatures":[{"sig":"MEYCIQC/T01P2BA/cXkLwEkpU2iklz14QSG4BaineAtYtHESiQIhAP+acFuYjYDTYoh+e82nCPicaSNkX7qxlWqOdBiKDVAk","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCy15x3mW+NIfX2ASaToX1jefwfW0L/MKOuTK/N/6QOswIhAIwcMqpSZSqi3KjdlCyakrw9Raw6f+mqhiGXmwqS8wyi","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1090483},"type":"module","module":"fesm2022/mmstack-dnd.mjs","exports":{".":{"types":"./types/mmstack-dnd.d.ts","default":"./fesm2022/mmstack-dnd.mjs"},"./plugins":{"types":"./types/mmstack-dnd-plugins.d.ts","default":"./fesm2022/mmstack-dnd-plugins.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"0baea29ba83e97e768572f0baad57e7772cbbac1","typings":"types/mmstack-dnd.d.ts","_npmUser":{"name":"mmstack","email":"mulec.mihaj@gmail.com"},"repository":{"url":"git+https://github.com/mihajm/mmstack.git","type":"git","directory":"packages/dnd"},"_npmVersion":"11.14.1","description":"Signals-first drag & drop for Angular. Make any element draggable or a drop target with a **typed payload**, read every bit of drag state as a `Signal`, and build reorderable lists — single or cross-list — on the same primitives. Choose the engine per ele","directories":{},"sideEffects":false,"_nodeVersion":"24.21.0","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/core":">=22 <23","@mmstack/primitives":">=22.13 <23","@atlaskit/pragmatic-drag-and-drop":"~2.0.1","@atlaskit/pragmatic-drag-and-drop-hitbox":"~2.0.0","@atlaskit/pragmatic-drag-and-drop-flourish":"~3.0.1","@atlaskit/pragmatic-drag-and-drop-auto-scroll":"~3.0.0","@atlaskit/pragmatic-drag-and-drop-live-region":"~2.0.0"},"peerDependenciesMeta":{"@atlaskit/pragmatic-drag-and-drop-hitbox":{"optional":true},"@atlaskit/pragmatic-drag-and-drop-flourish":{"optional":true},"@atlaskit/pragmatic-drag-and-drop-auto-scroll":{"optional":true},"@atlaskit/pragmatic-drag-and-drop-live-region":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/dnd_22.5.0_1789379680155_0.24695116173065346","host":"s3://npm-registry-packages-npm-production"}},"21.5.1":{"name":"@mmstack/dnd","version":"21.5.1","keywords":["angular","dnd","drag-and-drop","pragmatic-drag-and-drop","drag","drop"],"license":"MIT","_id":"@mmstack/dnd@21.5.1","maintainers":[{"name":"mmstack","email":"mulec.mihaj@gmail.com"}],"homepage":"https://github.com/mihajm/mmstack/blob/master/packages/dnd","bugs":{"url":"https://github.com/mihajm/mmstack/issues"},"dist":{"shasum":"d5710684fd489c59f4f096c072cb0992db335544","tarball":"https://registry.npmjs.org/@mmstack/dnd/-/dnd-21.5.1.tgz","fileCount":9,"integrity":"sha512-Fa3Q2Y5yzlN5AmkLCzt8iFcknSuJ84WrjHeSzzXRkoI9O2dBivXi+PuF3oloaLZKiqyOJnHL1bUBVA6+fAIrRA==","signatures":[{"sig":"MEQCICe2XeSgrmvfnd99WdYhsJQbzDoxnnmvmpNJS9z3PK64AiBclozvufjJpoBlae98YC0rsmGX9NtLzgwXUnBpMrLikg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIBQKxBM9FIkKgxVQb0SDxE+wtNWJ1+u5noktVUzGB/xuAiEAj5/elNdMmGIbwzU+IT6dG1yVbbKRgUOV9dTGDYTn2ks=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1089081},"type":"module","module":"fesm2022/mmstack-dnd.mjs","exports":{".":{"types":"./types/mmstack-dnd.d.ts","default":"./fesm2022/mmstack-dnd.mjs"},"./plugins":{"types":"./types/mmstack-dnd-plugins.d.ts","default":"./fesm2022/mmstack-dnd-plugins.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"981e033655c64873fb650842ff2ea342203069ca","typings":"types/mmstack-dnd.d.ts","_npmUser":{"name":"mmstack","email":"mulec.mihaj@gmail.com"},"repository":{"url":"git+https://github.com/mihajm/mmstack.git","type":"git","directory":"packages/dnd"},"_npmVersion":"11.14.1","description":"Signals-first drag & drop for Angular. Make any element draggable or a drop target with a **typed payload**, read every bit of drag state as a `Signal`, and build reorderable lists — single or cross-list — on the same primitives. Choose the engine per ele","directories":{},"sideEffects":false,"_nodeVersion":"24.21.0","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"@angular/core":">=21 <22","@mmstack/primitives":">=21.13 <22","@atlaskit/pragmatic-drag-and-drop":"~2.0.1","@atlaskit/pragmatic-drag-and-drop-hitbox":"~2.0.0","@atlaskit/pragmatic-drag-and-drop-flourish":"~3.0.1","@atlaskit/pragmatic-drag-and-drop-auto-scroll":"~3.0.0","@atlaskit/pragmatic-drag-and-drop-live-region":"~2.0.0"},"peerDependenciesMeta":{"@atlaskit/pragmatic-drag-and-drop-hitbox":{"optional":true},"@atlaskit/pragmatic-drag-and-drop-flourish":{"optional":true},"@atlaskit/pragmatic-drag-and-drop-auto-scroll":{"optional":true},"@atlaskit/pragmatic-drag-and-drop-live-region":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/dnd_21.5.1_1790002290283_0.84400835987063","host":"s3://npm-registry-packages-npm-production"}},"22.5.1":{"_id":"@mmstack/dnd@22.5.1","bugs":{"url":"https://github.com/mihajm/mmstack/issues"},"dist":{"shasum":"d935c1d81ad8537d6e922dcda5b446f86b327145","tarball":"https://registry.npmjs.org/@mmstack/dnd/-/dnd-22.5.1.tgz","fileCount":9,"integrity":"sha512-Nq4gGaT3AUgjNk3Wmf2jJnzSJI0nFzq04tLVKxAXULNFhCWvusGvdx/pchVwsA8iesYADVGRiN21UXkcYYekFg==","signatures":[{"sig":"MEQCIA0fJ9QAXZCUl0iEFuJHh48aPFNB7jyvcp9+59ys/aw9AiAzhFifIfM5vFeCSnD1vdaz8n/Tx2N6SV1tYa4P7Pp5ug==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIC+4wJKY1BTLEDgRLytkd1Gh98lmP4Cd9nNReq152cjYAiAbk75uzVwpFdixVyqdHVBj5rrgNG4BvXLzI+hGyrNOKw=="}],"unpackedSize":1090984},"name":"@mmstack/dnd","type":"module","module":"fesm2022/mmstack-dnd.mjs","exports":{".":{"types":"./types/mmstack-dnd.d.ts","default":"./fesm2022/mmstack-dnd.mjs"},"./plugins":{"types":"./types/mmstack-dnd-plugins.d.ts","default":"./fesm2022/mmstack-dnd-plugins.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"818b501f74442e47aa6c8cb5db1a6efccc01e6c1","license":"MIT","typings":"types/mmstack-dnd.d.ts","version":"22.5.1","_npmUser":{"name":"mmstack","email":"mulec.mihaj@gmail.com"},"homepage":"https://github.com/mihajm/mmstack/blob/master/packages/dnd","keywords":["angular","dnd","drag-and-drop","pragmatic-drag-and-drop","drag","drop"],"repository":{"url":"git+https://github.com/mihajm/mmstack.git","type":"git","directory":"packages/dnd"},"_npmVersion":"11.14.1","description":"Signals-first drag & drop for Angular. Make any element draggable or a drop target with a **typed payload**, read every bit of drag state as a `Signal`, and build reorderable lists — single or cross-list — on the same primitives. Choose the engine per ele","directories":{},"maintainers":[{"name":"mmstack","email":"mulec.mihaj@gmail.com"}],"sideEffects":false,"_nodeVersion":"24.21.0","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/core":">=22 <23","@mmstack/primitives":">=22.13 <23","@atlaskit/pragmatic-drag-and-drop":"~2.0.1","@atlaskit/pragmatic-drag-and-drop-hitbox":"~2.0.0","@atlaskit/pragmatic-drag-and-drop-flourish":"~3.0.1","@atlaskit/pragmatic-drag-and-drop-auto-scroll":"~3.0.0","@atlaskit/pragmatic-drag-and-drop-live-region":"~2.0.0"},"peerDependenciesMeta":{"@atlaskit/pragmatic-drag-and-drop-hitbox":{"optional":true},"@atlaskit/pragmatic-drag-and-drop-flourish":{"optional":true},"@atlaskit/pragmatic-drag-and-drop-auto-scroll":{"optional":true},"@atlaskit/pragmatic-drag-and-drop-live-region":{"optional":true}},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/dnd_22.5.1_1790002320811_0.9460606802888645"}}},"time":{"created":"2026-06-28T15:03:07.365Z","modified":"2026-09-21T14:52:01.135Z","22.0.0":"2026-06-28T15:03:07.717Z","21.0.0":"2026-06-28T15:10:02.332Z","22.1.0":"2026-07-01T15:10:57.487Z","21.1.0":"2026-07-01T15:17:29.865Z","22.2.0":"2026-07-02T05:59:39.137Z","21.2.0":"2026-07-02T06:15:39.950Z","22.3.0":"2026-07-02T18:19:36.349Z","21.3.0":"2026-07-02T19:05:09.040Z","21.4.0":"2026-07-05T04:08:39.607Z","22.4.0":"2026-07-05T04:10:23.885Z","21.4.1":"2026-07-05T04:27:40.749Z","22.4.1":"2026-07-05T04:28:24.572Z","22.4.2":"2026-07-06T05:59:57.934Z","21.4.2":"2026-07-06T06:12:44.277Z","21.4.3":"2026-08-04T11:00:10.424Z","22.4.3":"2026-08-04T11:01:01.650Z","21.4.4":"2026-08-04T11:15:15.795Z","22.4.4":"2026-08-04T11:15:59.900Z","22.4.5":"2026-08-18T07:13:51.272Z","21.4.5":"2026-08-18T07:14:28.378Z","22.4.6":"2026-08-25T06:52:08.170Z","21.4.6":"2026-08-25T06:54:30.967Z","21.4.7":"2026-08-28T04:51:24.474Z","22.4.7":"2026-08-28T04:52:12.547Z","21.5.0":"2026-09-14T09:50:46.282Z","22.5.0":"2026-09-14T09:54:40.265Z","21.5.1":"2026-09-21T14:51:30.363Z","22.5.1":"2026-09-21T14:52:00.909Z"},"bugs":{"url":"https://github.com/mihajm/mmstack/issues"},"license":"MIT","homepage":"https://github.com/mihajm/mmstack/blob/master/packages/dnd","keywords":["angular","dnd","drag-and-drop","pragmatic-drag-and-drop","drag","drop"],"repository":{"url":"git+https://github.com/mihajm/mmstack.git","type":"git","directory":"packages/dnd"},"description":"Signals-first drag & drop for Angular. Make any element draggable or a drop target with a **typed payload**, read every bit of drag state as a `Signal`, and build reorderable lists — single or cross-list — on the same primitives. Choose the engine per ele","maintainers":[{"name":"mmstack","email":"mulec.mihaj@gmail.com"}],"readme":"# @mmstack/dnd\n\nSignals-first drag & drop for Angular. Make any element draggable or a drop target with a **typed payload**, read every bit of drag state as a `Signal`, and build reorderable lists — single or cross-list — on the same primitives. Choose the engine per element: **native** HTML5 (files, cross-window, a drop-indicator line) or a first-party **pointer / FLIP** engine (siblings glide to open a gap, no browser drag image). Accessible by default, tree-shakeable, and it works with zero configuration.\n\n[![License](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/mihajm/mmstack/blob/master/packages/dnd/LICENSE)\n\nBuilt on [@atlaskit/pragmatic-drag-and-drop](https://www.npmjs.com/package/@atlaskit/pragmatic-drag-and-drop) (v2) for the native engine; the pointer engine, sortable/FLIP, keyboard a11y, and the optional plugins are all first-party.\n\n## Highlights\n\n- **One reactive session.** Every per-element signal (`dragging`, `isDragOver`, `closestEdge`, …) is a `computed` off a single ambient session — no per-element writable signals, no callbacks writing into state, no effects copying signals. The core path has no recurring effects.\n- **Two engines, one API.** `native` uses HTML5 DnD (files, cross-window, the browser's drag image); `pointer` uses pointer events with FLIP (buttery same-page sorting, custom followers). Both feed the same session, so `monitor`, `dragging`, and `isDragOver` behave identically. Pick per element or set a default once.\n- **Sorting that doesn't fight Angular.** Reordering is a single splice on **your** `WritableSignal<T[]>` at drop — no parallel order state, the array untouched mid-drag. The pointer engine animates from derived state (FLIP) instead of mutating the DOM.\n- **Cross-list & nested.** Share one `sortableGroup<T>()` and items drag between lists; innermost wins for nested lists, with a `canReceive` guard.\n- **Accessible out of the box.** Focus + arrow-key reordering and screen-reader announcements are on by default (opt-out or fully replaceable).\n- **Zero required plugins.** Edge detection and auto-scroll are opt-in — use the first-party **zero-dependency** plugins from the secondary entry point `@mmstack/dnd/plugins`, or plug in pragmatic's sub-libraries. Missing a plugin degrades gracefully (dev warning + no-op), never a throw.\n- **Typed everywhere.** `accepts` narrows payloads with no casting; a symbol-keyed `meta` channel never collides with your data; engine-only options are compile-time-guarded per engine.\n- **Composable or declarative.** Every primitive is a plain function; every directive is a thin wrapper over it. And every option is DI-defaultable.\n- **Grids and canvases (preview).** A wrapping 2D sortable (`axis: 'wrap'`), a controlled spanning grid (`placementGrid`, the dashboard / form-builder model) and a free-form canvas (`canvas`: move, resize, rotate, marquee, snaplines, pan/zoom, containment). All of them write your state signal exactly once per gesture, which makes them a natural fit for op-log stores and undo history; grid and canvas moves commit as per-property ops, the collaboration-friendly shape.\n- **Open core.** When a shipped primitive doesn't fit, you don't fall back to writing drag-and-drop from scratch. The barrel also exposes the pieces the primitives are built from: the gesture chassis (`driveGesture`), the geometry hit-testing helpers, & more, so you can assemble a bespoke interaction on the same reactive session. These stay out of the docs to keep the surface small, but they are typed and discoverable from the barrel.\n\n## Installation\n\n```bash\nnpm install @mmstack/dnd @atlaskit/pragmatic-drag-and-drop\n```\n\n`@atlaskit/pragmatic-drag-and-drop` is a peer dependency (it powers the native engine and the shared global monitor). The **optional** sub-libraries below are _not_ peers — reach for them only if you prefer them over the first-party plugins (see [Plugins](#plugins)):\n\n```bash\nnpm install @atlaskit/pragmatic-drag-and-drop-hitbox       # edge detection\nnpm install @atlaskit/pragmatic-drag-and-drop-auto-scroll  # auto-scroll\nnpm install @atlaskit/pragmatic-drag-and-drop-flourish     # post-move flash\n```\n\n## Quick start\n\nDrag cards between two columns. `draggable` carries the typed payload, `dropTarget` narrows it with `accepts` and exposes `isDragOver`, and the drop updates your own signal. No plugins required.\n\n```ts\nimport { Component, signal } from '@angular/core';\nimport { Draggable, DropTarget } from '@mmstack/dnd';\n\ntype Column = 'todo' | 'done';\ntype Card = { id: number; title: string };\n\nconst isCard = (d: unknown): d is Card =>\n  !!d && typeof d === 'object' && 'id' in d;\n\n@Component({\n  selector: 'app-board',\n  imports: [Draggable, DropTarget],\n  template: `\n    @for (col of columns; track col) {\n      <section\n        mmDropTarget\n        #zone=\"mmDropTarget\"\n        [accepts]=\"isCard\"\n        [class.over]=\"zone.isDragOver()\"\n        (dropped)=\"move(col, $event.data)\"\n      >\n        <h3>{{ col }}</h3>\n        @for (card of board()[col]; track card.id) {\n          <article\n            mmDraggable\n            #d=\"mmDraggable\"\n            [data]=\"card\"\n            [class.dragging]=\"d.dragging()\"\n          >\n            {{ card.title }}\n          </article>\n        }\n      </section>\n    }\n  `,\n  styles: `\n    :host {\n      display: flex;\n      gap: 1rem;\n      font-family: system-ui, sans-serif;\n    }\n    section {\n      flex: 1;\n      min-height: 120px;\n      padding: 0.75rem;\n      border: 1px solid #e2e8f0;\n      border-radius: 8px;\n    }\n    section.over {\n      border-color: #2563eb;\n      background: #eff6ff;\n    }\n    h3 {\n      margin: 0 0 0.5rem;\n      text-transform: capitalize;\n    }\n    article {\n      margin-bottom: 0.5rem;\n      padding: 0.5rem 0.75rem;\n      background: #fff;\n      border: 1px solid #e2e8f0;\n      border-radius: 6px;\n      cursor: grab;\n      user-select: none;\n    }\n    article.dragging {\n      opacity: 0.4;\n    }\n  `,\n})\nexport class BoardComponent {\n  protected readonly isCard = isCard;\n  protected readonly columns: Column[] = ['todo', 'done'];\n\n  protected readonly board = signal<Record<Column, Card[]>>({\n    todo: [\n      { id: 1, title: 'Design' },\n      { id: 2, title: 'Build' },\n    ],\n    done: [{ id: 3, title: 'Kickoff' }],\n  });\n\n  protected move(to: Column, card: Card): void {\n    this.board.update((b) => {\n      const next: Record<Column, Card[]> = {\n        todo: b.todo.filter((c) => c.id !== card.id),\n        done: b.done.filter((c) => c.id !== card.id),\n      };\n      next[to] = [...next[to], card];\n      return next;\n    });\n  }\n}\n```\n\n`$event.data` is typed `Card` because `accepts` narrows it. Add the [hitbox plugin](#plugins) when you want edge-aware drops (insert before or after a target).\n\n## Primitives\n\n- `draggable<TData, TMeta>(opts)` / `Draggable`: make an element draggable with a typed payload and optional metadata.\n- `dropTarget<TAccept, TSelf, TMeta>(opts)` / `DropTarget`: make an element a drop target with a type-narrowing `accepts`, optional edge detection, and derived state.\n- `monitor<TAccept, TMeta>(opts)`: global drag-state observer (derived; callbacks optional).\n- `fileDropTarget(opts)` / `monitorExternal(opts)`: accept files dragged in from the OS (the external adapter).\n- `reorderable(signal, opts)` / `injectReorderable(signal, opts)` + `Reorderable` / `ReorderableItem` (/ `ReorderableHandle`): a sortable list over your own `WritableSignal<T[]>`. See [Sortable lists](#sortable-lists-reorderable).\n- `sortableGroup<T>()`: share one group object across lists so items drag between them; `DropIndicator`: the native engine's insertion line.\n- `DragHandle` (`mmDragHandle`): restrict drag initiation to a child element.\n- `autoScroll(opts)` / `mmAutoScroll`: edge auto-scroll (needs an auto-scroll plugin).\n- `provideDnd(config)`: register optional plugins and scope a session.\n- `provideDndDefaults` / `provideDraggableDefaults` / `provideDropTargetDefaults` / `provideReorderableDefaults`: set option defaults via DI. See [Defaults](#defaults).\n- Custom drag previews via the `preview` option on `draggable()`.\n\nBoth `draggable` and `dropTarget` take an `engine?: 'native' | 'pointer'` (default `'native'`). Native uses HTML5 drag-and-drop (files, cross-window, the browser's drag image); pointer uses pointer events (continuous position, no native drag image — you move the element, e.g. FLIP). Both feed the same session, so `dragging` / `isDragOver` / `monitor` work identically regardless of engine.\n\nEvery composable is a function. Every directive is a thin wrapper that forwards inputs into the composable and exposes its signal state.\n\n## The reactive model\n\n`monitorForElements` already broadcasts the full drag world on every move. A root `DndSession` captures it once into a signal, and everything per-element is a `computed`:\n\n```ts\n// inside dropTarget()\nconst isDragOver = computed(() => hitIndex() >= 0);\nconst closestEdge = computed(() => /* read from the session via the hitbox plugin */);\n```\n\n_There are no per-element writable signals, no callbacks writing into signals, and no effects copying one signal into another. Pragmatic's config hooks (`getInitialData`, `canDrop`, `getData`) are read lazily, so registration happens once. A reactive `dragHandle` is the only thing that re-registers, and only when the handle element changes._\n\n## draggable\n\n```ts\nimport { Component, signal } from '@angular/core';\nimport { draggable } from '@mmstack/dnd';\n\ntype Card = { id: string; title: string };\n\n@Component({\n  selector: 'app-card',\n  template: `{{ card().title }}`,\n  host: { '[class.dragging]': 'dnd.dragging()' },\n})\nexport class CardComponent {\n  readonly card = signal<Card>({ id: '1', title: 'Hello' });\n\n  protected readonly dnd = draggable<Card>({\n    data: this.card,\n    onDrop: ({ data, edge, location }) => {\n      console.log('dropped', data, 'edge', edge, 'onto', location.current);\n    },\n  });\n}\n```\n\nOr the directive:\n\n```html\n<div\n  mmDraggable\n  [data]=\"card()\"\n  #d=\"mmDraggable\"\n  [class.dragging]=\"d.dragging()\"\n  (dropped)=\"onDrop($event)\"\n>\n  {{ card().title }}\n</div>\n```\n\n## dropTarget\n\n`accepts` is a typeguard that narrows incoming payloads, so all events and signals are typed against `TAccept` with no casting.\n\n```ts\nimport { dropTarget } from '@mmstack/dnd';\n\ntype Card = { id: string };\nconst isCard = (d: unknown): d is Card =>\n  !!d && typeof d === 'object' && 'id' in d;\n\nprotected readonly zone = dropTarget<Card>({\n  accepts: isCard,\n  onDrop: ({ data }) => this.cards.update((cs) => [...cs, data]),\n});\n// zone.isDragOver(), zone.isInnermost(), zone.dragOverData(), zone.closestEdge()\n```\n\n`closestEdge` and `edges` need the hitbox plugin (see [Plugins](#plugins)); without it, drops still work — you just get no edge (`closestEdge()` stays `null`), plus a one-time dev warning. `dropTarget` also supports `sticky` (stay the active target after the pointer leaves) and `dropEffect` (`'move' | 'copy' | 'link'`), both pragmatic element-adapter features.\n\nBoth `draggable` and `dropTarget` accept `engine: 'pointer'` to drive via pointer events instead of native HTML5 DnD (see [Sortable lists](#sortable-lists-reorderable) for the engine trade-offs). In pointer mode `draggable` moves the element itself (there's no browser drag image), so `preview` renders a floating follower; native `preview` uses the browser's custom drag preview. The `engine` is resolved at creation. Edge detection (`edges` / `hitbox`) works on either engine, since the hitbox is pure geometry over the pointer position; `sticky` / `dropEffect` are native-only and compile-time-forbidden when `engine: 'pointer'`, and conversely `activationThreshold` (px before the drag activates, default 5) is pointer-only.\n\n## fileDropTarget (external / files)\n\nAccept files dragged from outside the browser (pragmatic's external adapter):\n\n```ts\nimport { fileDropTarget } from '@mmstack/dnd';\n\nprotected readonly drop = fileDropTarget({\n  onDrop: ({ files }) => this.upload(files), // files: File[]\n  // canDrop: ({ types }) => ...,  disabled, sticky, dropEffect\n});\n// drop.isDragOver(), drop.isInnermost()\n```\n\n`monitorExternal({ onDrop })` observes external drags globally. An element can be both an element target and a file target: apply both composables.\n\n## monitor\n\n```ts\nprotected readonly monitor = monitor<Card>({ accepts: isCard });\n// monitor.isDragging(), monitor.source()\n```\n\n`isDragging` and `source` are pure derivations of the ambient session. Pass `onDragStart` or `onDrop` to also attach a thin subscription for side effects.\n\n## Sortable lists (`reorderable`)\n\n`reorderable` turns your own `WritableSignal<T[]>` into a sortable list. Reordering is a single splice on your signal at drop — there's no parallel order state, and the array is untouched mid-drag. Bind the returned controller to the `mmReorderable` container + `mmReorderableItem` directives:\n\n```ts\nimport { Component, signal } from '@angular/core';\nimport { Reorderable, ReorderableItem, reorderable } from '@mmstack/dnd';\n\ntype Task = { id: number; label: string };\n\n@Component({\n  selector: 'app-list',\n  imports: [Reorderable, ReorderableItem],\n  template: `\n    <ul [mmReorderable]=\"list\">\n      @for (task of list.items(); track task.id) {\n        <li [mmReorderableItem]=\"task\">{{ task.label }}</li>\n      }\n    </ul>\n  `,\n})\nexport class ListComponent {\n  private readonly tasks = signal<Task[]>([\n    { id: 1, label: 'One' },\n    { id: 2, label: 'Two' },\n    { id: 3, label: 'Three' },\n  ]);\n  protected readonly list = reorderable(this.tasks, { key: (t) => t.id });\n}\n```\n\n> **`reorderable` vs `injectReorderable`.** `reorderable` is a pure factory (no DI — great for tests). Use `injectReorderable` (same signature, called from an injection context) when you want the list to pick up DI option [defaults](#defaults) — it captures the current `Injector` and hands it to `reorderable` for you.\n\nKeyboard reordering is on by default: focus a row, then arrow keys move it one step (axis-aware), and `Cmd`/`Ctrl` + arrow jumps to an end — announced via [`injectAnnounce`](#screen-reader-announcements), and the moved row is kept focused and scrolled into view. Every piece is opt-out or replaceable:\n\n```ts\nreorderable(this.items, {\n  key: (t) => t.id,\n  keyboard: false, // ← disable keys entirely (no tabindex, no handler)\n  announceMove: false, // ← silence announcements (no live region is created)\n  jumpModifier: (e) => e.shiftKey, // ← Shift instead of Cmd/Ctrl for the built-in jump\n\n  // …or take over keydown completely (custom keys / behaviour). `api.move(to)`\n  // reuses the built-in commit + announce + focus-restore; ignore it to do your own thing.\n  onKeyboardKeydown: (e, { index, total, move }) => {\n    if (e.key === 'j') {\n      e.preventDefault();\n      move(Math.min(index + 1, total - 1));\n    }\n    if (e.key === 'k') {\n      e.preventDefault();\n      move(Math.max(index - 1, 0));\n    }\n  },\n});\n```\n\n### Engines: `native` (indicator) vs `pointer` (FLIP)\n\nSame API, two render/drag models, chosen with `engine` (default `'native'`):\n\n- **`'native'`** — HTML5 drag-and-drop. Items stay put and a `DropIndicator` line shows where the drop will land. Composes with file / cross-window drags.\n- **`'pointer'`** — pointer events. Siblings glide (FLIP) to open a gap and the dragged element follows the pointer; the \"gap\" placeholder feel. In-page only.\n\n```ts\nreorderable(this.tasks, { key: (t) => t.id }); // native indicator (default)\nreorderable(this.tasks, { key: (t) => t.id, engine: 'pointer' }); // FLIP glide\n```\n\nThe item is `position: relative` in both engines so the native indicator can overlay; opt into the reserved gap space (pointer engine, cross-list) with `padding-bottom: calc(<your> + var(--mm-sortable-reserved, 0px))` on the container.\n\n**Escape cancels in both engines.** Pressing Escape (or a `pointercancel`, e.g. a touch scroll takeover) aborts the drag without committing — items glide back and nothing is spliced. Only a real release commits. The controller also exposes `cancel()` for a programmatic abort.\n\n### Cross-list\n\nGive two (or more) lists the **same** `sortableGroup<T>()` object and items drag between them:\n\n```ts\nimport { reorderable, sortableGroup } from '@mmstack/dnd';\n\nprivate readonly board = sortableGroup<Task>();\nprotected readonly todo = reorderable(this.todoItems, { key: (t) => t.id, group: this.board });\nprotected readonly done = reorderable(this.doneItems, { key: (t) => t.id, group: this.board });\n```\n\n`onItemLeft` fires on the source, `onItemArrived` on the target. For nested lists (a list inside another list's item), the innermost list wins; a `canReceive: (item) => boolean` guard rejects invalid drops — e.g. a tree node dropped into its own subtree.\n\n### External / palette insert\n\nAccept a payload dragged from **outside** any list (e.g. a palette `draggable`) and map it to a list item (native engine):\n\n```ts\nreorderable(this.items, {\n  key: (t) => t.id,\n  insert: {\n    accepts: (d): d is Chip => isChip(d),\n    create: (chip, index) => ({ id: nextId(), label: chip.kind }),\n  },\n  onItemInserted: ({ item, index }) => save(item, index),\n});\n```\n\n### Options\n\n`key` (required identity), `engine`, `axis` (`'y'` \\| `'x'` \\| `'wrap'`), `deadband` (px a center must be cleared before the insert flips), `activationThreshold` (px before a drag activates — pointer engine), `group`, `keyboard` (or `false`), `jumpModifier`, `onKeyboardKeydown` (own the keys), `announceMove` (custom message or `false` to silence), `animation` (FLIP-on-commit / pointer glide, or `false`), `autoScroll` (opt-in `{ edge, speed, edgeProportion?, maxSpeedAt? }` — needs an auto-scroll plugin, see below), `canReceive` (cross-list drop guard), `insertSize` (px an arriving foreign item's gap should occupy here, when this list renders arrivals smaller than they were at home), `insert` (foreign-payload mapping, native engine), and the callbacks `onReorder` / `onItemLeft` / `onItemArrived` / `onItemInserted`.\n\n### Wrap grids (`axis: 'wrap'`)\n\nA gallery or tag cloud is still an ordered list, it just wraps. `axis: 'wrap'` switches the pointer engine to a 2D collision model: item centers measured at drag start become static slots, the dragged tile resolves to the nearest slot, and displaced siblings glide to their new slot even across row boundaries. Same API, same directives:\n\n```ts\nprotected readonly gallery = reorderable(this.tiles, {\n  key: (t) => t.id,\n  engine: 'pointer',\n  axis: 'wrap',\n});\n```\n\nKeyboard follows the geometry: Left/Right step the reading order, Up/Down move to the nearest tile in the adjacent row. Wrap lists join `sortableGroup` like any other list, so you can drag rows from a vertical tray into a grid and back; an incoming item lands at the nearest slot, appending included.\n\nThe slot model is exact for uniform tiles and a good approximation for variable sizes, the same trade-off dnd-kit's rect sorting strategy makes. The native indicator engine has no 2D indicator placement, so wrap is pointer-engine territory (a dev warning fires if you combine them).\n\n## Placement grid (`placementGrid`) — preview\n\nThe dashboard model you know from [react-grid-layout](https://github.com/react-grid-layout/react-grid-layout) and Retool: items own a cell rect (`x`, `y`, `w`, `h` in grid cells, the `GridPlacement` shape) on a fixed-column grid. Dragging projects the pointer to a cell and previews the whole reflow as pure derivation; your `WritableSignal<T[]>` is written exactly once, at drop.\n\n```ts\nimport {\n  PlacementGrid,\n  PlacementGridItem,\n  PlacementGridResizeHandle,\n  placementGrid,\n  type GridPlacement,\n} from '@mmstack/dnd';\n\ntype Widget = GridPlacement & { id: string; label: string };\n\n@Component({\n  imports: [PlacementGrid, PlacementGridItem, PlacementGridResizeHandle],\n  template: `\n    <div [mmPlacementGrid]=\"grid\">\n      @for (w of grid.items(); track w.id) {\n        <div class=\"widget\" [mmPlacementGridItem]=\"w\">\n          {{ w.label }}\n          <i class=\"grip\" mmPlacementGridResizeHandle=\"se\"></i>\n        </div>\n      }\n    </div>\n  `,\n})\nexport class Dashboard {\n  private readonly widgets = signal<Widget[]>([\n    { id: 'chart', label: 'Chart', x: 0, y: 0, w: 6, h: 2 },\n    { id: 'kpis', label: 'KPIs', x: 6, y: 0, w: 3, h: 2 },\n  ]);\n  protected readonly grid = placementGrid(this.widgets, {\n    key: (w) => w.id,\n    cols: 12,\n    gap: 8,\n    rowHeight: 56,\n  });\n}\n```\n\nTwo compaction modes cover the two grid personalities:\n\n- `compact: 'vertical'` (default): colliding items push down and gravity pulls everything up, the classic dashboard reflow.\n- `compact: 'none'`: nothing moves. A cell is either free or the move is rejected (the projection sticks to the last valid cell). `grid.targetMask()` exposes the validity mask during a drag (`mask[y * cols + x]`), so you can render drop-cell affordances; a `canPlace` predicate layers your own rules on top. This is the mode for form builders with fixed slots.\n\nThe details that keep it honest: the projection only fires when the pointer crosses a cell, untouched items keep reference identity through both preview and commit (so a keyed `@for` and an op-log diff see minimal change), resize grips (`'e' | 's' | 'se'`) preview spans the same way, arrows move the focused widget one cell and Shift+arrows resize it, and edge auto-scroll works on both axes. `injectPlacementGrid` + `providePlacementGridDefaults` follow the usual DI-defaults pattern.\n\nGrids are `SortableGroupMember`s too. Put a `placementGrid` in the same `sortableGroup` as your palette list and dragged items drop at the pointed cell (`insertAtPoint`); items dragged out of the grid into a list behave like any cross-list move.\n\n## Free-form canvas (`canvas`) — preview\n\nFigma-style spatial editing over your own items signal: move (single or multi-select), resize from eight handles, rotate, marquee select, alignment snaplines, grid snap, keyboard nudge, pan/zoom, and CMMN-style containment. One delegated gesture per surface decides what a press means by the element it lands on, so items, handles and chrome never race each other.\n\n```ts\nimport { Canvas, CanvasItem, CanvasResizeHandle, injectCanvas, panZoom, type CanvasFrame } from '@mmstack/dnd';\n\ntype Widget = { id: string; frame: CanvasFrame };\n\n@Component({\n  imports: [Canvas, CanvasItem, CanvasResizeHandle],\n  template: `\n    <div class=\"viewport\" #viewport [mmCanvas]=\"ctrl\">\n      <div class=\"space\" [style.transform]=\"spaceCss()\">\n        @for (w of ctrl.items(); track w.id) {\n          <div class=\"widget\" [mmCanvasItem]=\"w\">\n            @if (ctrl.selection.has(w.id)) {\n              <i class=\"handle se\" mmCanvasResizeHandle=\"se\"></i>\n            }\n          </div>\n        }\n      </div>\n    </div>\n  `,\n})\nexport class Board {\n  private readonly widgets = signal<readonly Widget[]>([...]);\n  private readonly viewport = viewChild<ElementRef<HTMLElement>>('viewport');\n  protected readonly zoom = panZoom(this.viewport);\n  protected readonly ctrl = injectCanvas(this.widgets, {\n    key: (w) => w.id,\n    frame: (w) => w.frame,\n    patch: (w, frame) => ({ ...w, frame }),\n    grid: { size: 8 },\n    space: this.zoom,\n  });\n  protected readonly spaceCss = computed(() => {\n    const t = this.zoom.transform();\n    return `translate(${t.x}px, ${t.y}px) scale(${t.scale})`;\n  });\n}\n```\n\nThe state seam is a pair of pure lenses: `frame` reads an item's `CanvasFrame` (`x`, `y`, `width`, `height`, optional `rotation`), `patch` writes one back immutably. Mid-gesture nothing touches your signal; the live position is a transient overlay derived from a drag-start snapshot, and moves are transform-only (the browser composites, it does not lay out). On release the controller maps `patch` over the touched items in ONE write, preserving the identity of everything untouched.\n\nInteraction defaults match the tools people know: Shift locks a move to the dominant axis and holds the aspect ratio on resize, Alt resizes from the center, Ctrl bypasses snapping, a drag of an unselected item selects it, Shift-click toggles selection, empty-surface presses marquee (or click to clear), Escape cancels. Arrows nudge the selection by the grid step (Shift for 10 steps), Cmd/Ctrl+arrows resize. `ctrl.session` exposes the pure derivation core (`guides`, `marqueeRect`, `hoverContainer`, live deltas) so your chrome renders from signals; the demo's SVG snaplines are a dozen lines of template.\n\n`panZoom()` owns the space transform (wheel zoom around the cursor, middle-button pan) and doubles as the `space` option, so every gesture projects through the live transform. You can zoom mid-drag and the grabbed point stays under the cursor. Wheel input is normalized before it touches the scale: line- and page-mode deltas are scaled to pixel magnitude, a ctrl-wheel — how browsers deliver trackpad pinch — is boosted so pinching feels like pinching, and Safari's native page pinch-zoom is suppressed over the viewport. Rolling your own viewport instead? `zoomWheelDelta(event)` and `suppressNativePinch(el)` are exported on their own.\n\n### Containment (stages, frames, sections)\n\nFor editors where some items contain others (CMMN stages, page sections, Figma frames), the `containers` option resolves the innermost accepting container under the pointer while you drag:\n\n```ts\ninjectCanvas(this.nodes, {\n  // ...lenses\n  containers: {\n    isContainer: (n) => n.kind === 'stage',\n    containerOf: (n) => n.parent, // enables reparenting\n    canContain: (stage, item) => item.kind === 'task', // cycle guards live here\n  },\n  onReparent: ({ patches, container }) => {\n    // one write: new parent + frames rebased into its space\n    this.nodes.update((arr) =>\n      arr.map((n) => {\n        const frame = patches.get(n.id);\n        return frame ? { ...n, frame, parent: container } : n;\n      }),\n    );\n  },\n});\n```\n\nA move that stays in its container commits normally (the hover container is reported on the commit event). A drop over a different container becomes a reparent: the controller hands you frames already rebased into the target's coordinate space and does NOT write, so your tree restructuring and the frame updates land in a single update.\n\n### One gesture, one op batch (stores, undo, multiplayer)\n\nBecause every grid and canvas gesture commits as one identity-preserving write, an op-log store sees exactly the ops that changed:\n\n```ts\nimport { opLog, store, storeHistory } from '@mmstack/primitives';\n\nconst doc = store<{ widgets: Widget[] }>({ widgets: [...] });\nconst history = storeHistory(doc);\nconst ctrl = injectCanvas(doc.widgets, { key, frame, patch });\n\n// a whole drag emits ONE batch: [widgets, 3, 'frame', 'x'], [widgets, 3, 'frame', 'y']\nopLog(doc, { origin: clientId }).subscribe(sendToPeers);\n```\n\nThat gives you gesture-grained undo (`history.undo()` restores the whole drag), per-property ops for mesh sync (two peers moving different widgets never conflict, Figma-style last-write-wins per property), and a presence channel for free: `ctrl.liveFrames()` is the participants' in-flight frames, throttle it into your presence transport and feed peers' frames back through the `remoteOverlays` option to render their drags as ghosts. `lockedKeys` rejects local gestures on peer-held items.\n\nOne schema note for collaborative apps: array insert/remove diffs coarsely (a length change emits one whole-array op). The canvas itself never changes the array's length, but your create/delete layer does, and so do grid-in-a-group transfers (a palette drop into a `placementGrid` or a widget dragged out both change the array). Moves and resizes stay per-property either way; if concurrent creation or transfer matters, keep the authoritative document record-keyed (`Record<Id, Widget>`) and derive the arrays for rendering.\n\n### Diagram editors: bring ngx-vflow\n\nIf you are building a node-and-edge editor (BPMN, CMMN, data flows), you do not need to hand-roll edges, connection dragging and minimaps on top of `canvas`. [ngx-vflow](https://www.ngx-vflow.org/) is an excellent signal-native diagram shell, and it composes with the same store seam: keep the document in your store, mint vflow nodes from it, and commit drag ends in one write (`nodesChanges.position` marks dirty nodes, `nodeDragEnd` commits, `connect` appends edges). The playground's `/vflow-store` route is a complete working recipe, including undo. Note that ngx-vflow is browser-only, so render its route with `RenderMode.Client` under SSR.\n\n## Plugins\n\nEdge-aware drops (`hitbox`) and auto-scroll are **opt-in plugins**, registered once via `provideDnd` (per-call options take precedence). You can use our **zero-dependency** first-party plugins from `@mmstack/dnd/plugins` (no `@atlaskit/*` needed — great for pointer-only apps), or plug in the pragmatic sub-libraries:\n\n```ts\nimport { provideDnd } from '@mmstack/dnd';\n// first-party, zero-dep (unused ones tree-shake away):\nimport { edgeAutoScroll, closestEdge } from '@mmstack/dnd/plugins';\n\nbootstrapApplication(App, {\n  providers: [\n    provideDnd({\n      plugins: {\n        hitbox: closestEdge, // …or pragmatic's { attachClosestEdge, extractClosestEdge }\n        autoScroll: edgeAutoScroll, // …or pragmatic's autoScrollForElements\n      },\n    }),\n  ],\n});\n```\n\nResolution order is per-call option → `provideDnd` default → none. Without a plugin, the dependent feature (edge detection, auto-scroll) **degrades gracefully**: a one-time dev-mode warning naming the plugin, then a no-op (never a throw).\n\n> **Auto-scroll note.** `edgeAutoScroll` is engine-agnostic (drives both the pointer and native reorderable engines) and needs no pragmatic sub-package. Pragmatic's `autoScrollForElements` is monitor-driven, so it only serves the **native** engine — use `edgeAutoScroll` for the pointer engine.\n\n### Screen-reader announcements\n\n`injectAnnounce()` returns the active announcer: a registered `announce` plugin if you provided one, otherwise a built-in announcer (a shared polite and assertive ARIA live region, zero dependencies). Swap in Atlassian's `@atlaskit/pragmatic-drag-and-drop-live-region` or your own:\n\n```ts\nprovideDnd({ plugins: { announce: liveRegionAnnounce } });\n// in a component: injectAnnounce()('Card moved to position 2 of 5');\n```\n\n## Defaults\n\nSet option defaults once via DI instead of repeating them at every call. The canonical example is `engine` — flip your whole app to the pointer engine in one line:\n\n```ts\nimport { provideDndDefaults } from '@mmstack/dnd';\n\nbootstrapApplication(App, {\n  providers: [provideDndDefaults({ engine: 'pointer' })], // every primitive → pointer\n});\n```\n\n`provideDndDefaults` holds the **cross-primitive** defaults (currently `engine`). Each primitive also has its own provider for options only it understands, and it **inherits** the common defaults unless it sets that key itself:\n\n```ts\nimport {\n  provideDraggableDefaults,\n  provideDropTargetDefaults,\n  provideReorderableDefaults,\n} from '@mmstack/dnd';\n\nprovideReorderableDefaults({ axis: 'x', animation: { duration: 150 } });\nprovideDropTargetDefaults({ sticky: true, dropEffect: 'copy' });\nprovideDraggableDefaults({ engine: 'native' }); // e.g. keep draggables native while lists go pointer\n```\n\nEvery field is optional — provide just the one you care about. Resolution order, most-specific first:\n\n**per-call option → per-primitive default → common (`provideDndDefaults`) → built-in.**\n\n> One sharp edge: the engine-specific options are compile-time-guarded **per call**, but a DI default can flip the engine underneath a call site that omitted it. A native-only option (e.g. `insert`) is then silently ignored — `reorderable` warns about this in dev mode. Pin `engine` at the call site (or per-primitive default) where you rely on engine-specific options.\n\nEach provider accepts a value **or a factory** (`T | (() => T)`), matching `provideDnd`. Each token also has a matching reader — `injectDndDefaults`, `injectDraggableDefaults`, `injectDropTargetDefaults`, `injectReorderableDefaults` — returning the resolved defaults (or `null`); pass an `Injector` to read them outside an injection context.\n\nThe directives and the `draggable` / `dropTarget` composables pick defaults up automatically. For a reorderable list, use **`injectReorderable`** (the DI-aware wrapper) so the list resolves defaults; the pure `reorderable` reads no DI:\n\n```ts\nimport { injectReorderable } from '@mmstack/dnd';\n\nprotected readonly list = injectReorderable(this.tasks, { key: (t) => t.id });\n// picks up provideDndDefaults / provideReorderableDefaults; a per-call option still wins.\n```\n\n## Scoping a session\n\nThe drag session is `providedIn: 'root'`, so the library works with zero configuration. To give an independent surface its own session and coordinate space, add `provideDndSession()` to a component's `providers`; the `injectDnd*` helpers then resolve to that scoped session within its subtree:\n\n```ts\n@Component({ providers: [provideDndSession()] /* ... */ })\nexport class BoardComponent {}\n```\n\n## Custom drag previews\n\n```ts\ndraggable<Card>({\n  data: this.card,\n  preview: () => ({\n    template: this.previewTpl(),\n    context: this.card(),\n    offset: 'pointer-outside',\n  }),\n});\n```\n\nPass `{ component, bindings?, offset? }` (bindings via `inputBinding` / `outputBinding` / `twoWayBinding` from `@angular/core`), `{ template, context?, offset? }`, or `{ render, offset? }` (a raw escape hatch). `offset` is `'pointer-outside'` or `{ x, y }`.\n\n## Drag metadata (`meta`)\n\nBoth `draggable()` and `dropTarget()` carry a typed `meta` payload alongside `data`, keyed by symbols so it never collides with consumer data. It is the seam that higher-level patterns build on.\n\n```ts\nconst KIND = Symbol('kind');\ndraggable<Card, { [KIND]: 'todo' | 'done' }>({\n  data,\n  meta: () => ({ [KIND]: 'todo' }),\n});\ndropTarget<Card, void, { [KIND]: 'todo' | 'done' }>({\n  accepts: isCard,\n  canDrop: ({ source: { meta } }) => meta[KIND] === 'todo',\n});\n```\n\n## Recipes\n\nRender an Angular component or template as the drag image:\n\n```ts\ndraggable<Card>({\n  data: card,\n  preview: () => ({\n    template: tpl(),\n    context: card(),\n    offset: 'pointer-outside',\n  }),\n});\n```\n\nAccept only certain payloads:\n\n```ts\ndropTarget<Card>({\n  accepts: isCard,\n  canDrop: ({ source }) => source.data.status !== 'archived',\n});\n```\n\nUpload files on drop:\n\n```ts\nfileDropTarget({\n  canDrop: ({ types }) => types.includes('Files'),\n  onDrop: ({ files }) => upload(files),\n});\n```\n\n## Testing\n\nBecause per-element state is derived from the ambient session, most behaviour is unit-testable by setting the session and asserting the derived signals, with no drag simulation. `injectDndSession()` returns the writable session signal:\n\n```ts\nconst session = TestBed.runInInjectionContext(() => injectDndSession());\nsession.set({\n  sourceEl,\n  sourceData: boxData(card),\n  targets: [{ element: el, data: {} }],\n  pointer: { x: 0, y: 0 },\n  kind: 'transfer',\n  engine: 'native', // default already, just explicit for docs\n});\nexpect(zone.isDragOver()).toBe(true);\n```\n\nReorderable logic is testable without a DOM: `reorderable(signal, opts)` is a pure controller — drive `begin` / `move` / `end` and read the per-item state signals directly.\n\n### Vitest consumers: inline `@mmstack/dnd` + `@atlaskit/*`\n\n`@atlaskit/pragmatic-drag-and-drop 2.0.1` ships **without an `exports` map** — its subpaths (`element/adapter`, `element/set-custom-native-drag-preview`, …) are the legacy folder-with-`package.json` kind. Vitest externalizes `node_modules` by default and loads externalized packages with **Node's ESM resolver**, which refuses directory imports — so the first spec that touches this package fails with `ERR_UNSUPPORTED_DIR_IMPORT` (surfacing as `EISDIR` in some setups). Tell Vitest to inline both families, so Vite's resolver — which understands the legacy layout — processes them instead:\n\n```ts\n// vitest.config.ts\nexport default defineConfig({\n  test: {\n    server: { deps: { inline: [/@mmstack\\/dnd/, /@atlaskit\\//] } },\n  },\n});\n```\n\nBoth entries matter: once a package is externalized, Node resolves its inner imports itself — Vitest can't intercept them. Inlining `@mmstack/dnd` routes its `@atlaskit/*` imports through Vite; inlining `@atlaskit/*` makes those subpaths resolvable there. The same class of issue applies to anything else that externalizes dependencies to Node's resolver (e.g. a Vite dev SSR server) — the equivalent lever there is `ssr: { noExternal: [/@mmstack\\/dnd/, /@atlaskit\\//] }`.\n\n## SSR\n\nAll composables short-circuit on the server and return inert signals (`dragging` and `isDragOver` stay false); the session attaches no listeners.\n\n## Credits\n\n`@mmstack/dnd` is an unofficial, signals-first Angular DnD library. Its **native** engine builds on [pragmatic-drag-and-drop](https://github.com/atlassian/pragmatic-drag-and-drop) by Atlassian (Apache-2.0) — required as a peer dependency — which does the underlying HTML5 drag-and-drop work and provides the shared global monitor. This project is not affiliated with or endorsed by Atlassian. The optional `@atlaskit/*` packages (hitbox, auto-scroll, flourish, live-region) plug in through `provideDnd` and remain the property of their authors; the pointer engine, sortable/FLIP, keyboard a11y, and the first-party `@mmstack/dnd/plugins` are original work.\n\nThe wrap-grid slot model takes after [dnd-kit](https://dndkit.com/)'s rect sorting strategy, the placement grid after [react-grid-layout](https://github.com/react-grid-layout/react-grid-layout)'s reflow, and the canvas interaction defaults after Figma. All three are first-party implementations; credit to those projects for showing what good feels like.\n\n## License\n\nMIT © [Miha Mulec](https://github.com/mihajm)\n","readmeFilename":"README.md"}