{"_id":"@remix-run/interaction","_rev":"8-63da132614457dcbeab8d94a75571f47","name":"@remix-run/interaction","dist-tags":{"latest":"0.5.0"},"versions":{"0.0.0":{"name":"@remix-run/interaction","version":"0.0.0","author":{"name":"Ryan Florence","email":"rpflorence@gmail.com"},"license":"MIT","_id":"@remix-run/interaction@0.0.0","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"},{"name":"ryanflorence","email":"rpflorence@gmail.com"}],"homepage":"https://github.com/remix-run/remix/tree/main/packages/events#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"dist":{"shasum":"dfee92cd2cf0b34dcc022afe3d3d68f11972bed9","tarball":"https://registry.npmjs.org/@remix-run/interaction/-/interaction-0.0.0.tgz","fileCount":29,"integrity":"sha512-d7qjxyAu1Wf82T7BM5ExxayeTJJnGKK5XI/qJOzhmcNXEHULPMy9UW/iDjwXmsHhn3VqDr9V/BG8+fYdoUul9A==","signatures":[{"sig":"MEQCIFmp4fmi9p5PdbrsJX7vAAxHsaKecetTxYbZA7DSm+2fAiAL688JTf6humN1KzpUPVbgNTVcy6r9xiwLQrufmJOVOw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":103440},"type":"module","_from":"file:remix-run-interaction-0.0.0.tgz","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./form":{"types":"./dist/lib/interactions/form.d.ts","default":"./dist/lib/interactions/form.js"},"./keys":{"types":"./dist/lib/interactions/keys.d.ts","default":"./dist/lib/interactions/keys.js"},"./press":{"types":"./dist/lib/interactions/press.d.ts","default":"./dist/lib/interactions/press.js"},"./popover":{"types":"./dist/lib/interactions/popover.d.ts","default":"./dist/lib/interactions/popover.js"}},"scripts":{"size":"esbuild src/index.ts --bundle --minify --outfile=.temp-bundle.js --format=esm && echo \"📦 Bundle sizes:\" && echo \"   Uncompressed: $(ls -lah .temp-bundle.js | awk '{print $5}')\" && echo \"   Gzipped: $(gzip -c .temp-bundle.js | wc -c | tr -d ' ') bytes\" && rm .temp-bundle.js","test":"vitest run","build":"tsc -p tsconfig.build.json","clean":"rm -rf dist","demos":"cd demos && pnpm start","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"mjackson","email":"mjijackson+npm@gmail.com"},"_resolved":"/private/var/folders/n5/1lxhnzk56hg6b7vnl558364m0000gn/T/79b81546ba41de37ebeeb01e7cd9c5bb/remix-run-interaction-0.0.0.tgz","_integrity":"sha512-d7qjxyAu1Wf82T7BM5ExxayeTJJnGKK5XI/qJOzhmcNXEHULPMy9UW/iDjwXmsHhn3VqDr9V/BG8+fYdoUul9A==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/events"},"_npmVersion":"11.3.0","description":"Like components but for events","directories":{},"_nodeVersion":"24.2.0","_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","esbuild":"^0.25.5","playwright":"^1.53.1","typescript":"^5.8.3","@vitest/browser":"^3.2.4"},"_npmOperationalInternal":{"tmp":"tmp/interaction_0.0.0_1762186660979_0.7654063198994232","host":"s3://npm-registry-packages-npm-production"}},"0.1.0":{"name":"@remix-run/interaction","version":"0.1.0","author":{"name":"Ryan Florence","email":"rpflorence@gmail.com"},"license":"MIT","_id":"@remix-run/interaction@0.1.0","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"},{"name":"ryanflorence","email":"rpflorence@gmail.com"}],"homepage":"https://github.com/remix-run/remix/tree/main/packages/events#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"dist":{"shasum":"2a37f8488323cabeabbc463d58decec7b1efc85e","tarball":"https://registry.npmjs.org/@remix-run/interaction/-/interaction-0.1.0.tgz","fileCount":29,"integrity":"sha512-5AoVEKPad9+ss/HqjaDEKNjG1uFp9FFdHaaCtxLz5Yw0+xdiJF+ur7r6D1TAUFIVNZToD1WyHurVRD3sjUZBbw==","signatures":[{"sig":"MEUCIGT2MnFNZCLxRNRPbQBXZq3DK5fOFN/UUj16p+Pjy2UlAiEAzl7YTK9Ef2V1Cj0uKsYlBmAUtZkXv2d/ruWfHE2U+L8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@remix-run%2finteraction@0.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":103440},"type":"module","_from":"file:remix-run-interaction-0.1.0.tgz","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./form":{"types":"./dist/lib/interactions/form.d.ts","default":"./dist/lib/interactions/form.js"},"./keys":{"types":"./dist/lib/interactions/keys.d.ts","default":"./dist/lib/interactions/keys.js"},"./press":{"types":"./dist/lib/interactions/press.d.ts","default":"./dist/lib/interactions/press.js"},"./popover":{"types":"./dist/lib/interactions/popover.d.ts","default":"./dist/lib/interactions/popover.js"}},"scripts":{"size":"esbuild src/index.ts --bundle --minify --outfile=.temp-bundle.js --format=esm && echo \"📦 Bundle sizes:\" && echo \"   Uncompressed: $(ls -lah .temp-bundle.js | awk '{print $5}')\" && echo \"   Gzipped: $(gzip -c .temp-bundle.js | wc -c | tr -d ' ') bytes\" && rm .temp-bundle.js","test":"vitest run","build":"tsc -p tsconfig.build.json","clean":"rm -rf dist","demos":"cd demos && pnpm start","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c3e877e1-51bd-4d51-ae5d-5b8f4d03e397"}},"_resolved":"/tmp/8966968d9e1d70a6fb5fcc84fcab2088/remix-run-interaction-0.1.0.tgz","_integrity":"sha512-5AoVEKPad9+ss/HqjaDEKNjG1uFp9FFdHaaCtxLz5Yw0+xdiJF+ur7r6D1TAUFIVNZToD1WyHurVRD3sjUZBbw==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/events"},"_npmVersion":"11.6.1","description":"Like components but for events","directories":{},"_nodeVersion":"24.11.0","_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","esbuild":"^0.25.5","playwright":"^1.53.1","typescript":"^5.8.3","@vitest/browser":"^3.2.4"},"_npmOperationalInternal":{"tmp":"tmp/interaction_0.1.0_1762188024736_0.3086717720225951","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@remix-run/interaction","version":"0.2.0","author":{"name":"Ryan Florence","email":"rpflorence@gmail.com"},"license":"MIT","_id":"@remix-run/interaction@0.2.0","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"},{"name":"ryanflorence","email":"rpflorence@gmail.com"}],"homepage":"https://github.com/remix-run/remix/tree/main/packages/events#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"dist":{"shasum":"6c45cdd66d09252f43d9846aaf88d6a941833525","tarball":"https://registry.npmjs.org/@remix-run/interaction/-/interaction-0.2.0.tgz","fileCount":29,"integrity":"sha512-VvBBO1+ejI5YzpnxtmdorNEEmsPyPpOASwWMvSWaZMfz4r0ImtmIh4rr4gblwmupMrmPB6BcqVbwW1XfMhaQ/g==","signatures":[{"sig":"MEYCIQCemmEWEq05yHU8l0YGLbus/YXS7HS3RrrVWa+Y8A4h7QIhAPrkAb6/mv0fyla+ScABWhI6eV4lrtuSfKiWOHSgDYGS","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@remix-run%2finteraction@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":114333},"type":"module","_from":"file:remix-run-interaction-0.2.0.tgz","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./form":{"types":"./dist/lib/interactions/form.d.ts","default":"./dist/lib/interactions/form.js"},"./keys":{"types":"./dist/lib/interactions/keys.d.ts","default":"./dist/lib/interactions/keys.js"},"./press":{"types":"./dist/lib/interactions/press.d.ts","default":"./dist/lib/interactions/press.js"},"./popover":{"types":"./dist/lib/interactions/popover.d.ts","default":"./dist/lib/interactions/popover.js"}},"scripts":{"size":"esbuild src/index.ts --bundle --minify --outfile=.temp-bundle.js --format=esm && echo \"📦 Bundle sizes:\" && echo \"   Uncompressed: $(ls -lah .temp-bundle.js | awk '{print $5}')\" && echo \"   Gzipped: $(gzip -c .temp-bundle.js | wc -c | tr -d ' ') bytes\" && rm .temp-bundle.js","test":"vitest run","build":"tsc -p tsconfig.build.json","clean":"rm -rf dist","demos":"cd demos && pnpm start","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c3e877e1-51bd-4d51-ae5d-5b8f4d03e397"}},"_resolved":"/tmp/34de7f5a1642a53d71158b5e5ea99011/remix-run-interaction-0.2.0.tgz","_integrity":"sha512-VvBBO1+ejI5YzpnxtmdorNEEmsPyPpOASwWMvSWaZMfz4r0ImtmIh4rr4gblwmupMrmPB6BcqVbwW1XfMhaQ/g==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/events"},"_npmVersion":"11.6.2","description":"Like components but for events","directories":{},"_nodeVersion":"24.11.1","_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","esbuild":"^0.25.5","playwright":"^1.53.1","typescript":"^5.9.3","@vitest/browser":"^3.2.4"},"_npmOperationalInternal":{"tmp":"tmp/interaction_0.2.0_1763429013979_0.07163162517741495","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@remix-run/interaction","version":"0.2.1","author":{"name":"Ryan Florence","email":"rpflorence@gmail.com"},"license":"MIT","_id":"@remix-run/interaction@0.2.1","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"},{"name":"ryanflorence","email":"rpflorence@gmail.com"}],"homepage":"https://github.com/remix-run/remix/tree/main/packages/events#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"dist":{"shasum":"cad14d767e95e2f6a185835e44abf38d94b7e34d","tarball":"https://registry.npmjs.org/@remix-run/interaction/-/interaction-0.2.1.tgz","fileCount":28,"integrity":"sha512-i/vFWIqLhEkMz5YDMsaolSfwpUtNgynO/ueYqf692G5Jva547jfq/Q5SvV//Yd8iTylH/mYuimfP9oCQ3+ep/Q==","signatures":[{"sig":"MEUCIEWeVXrzv6YVT3cl+hVukR0ktYL2t8Ag3WVnN9GoHIHPAiEA9vtW6DFIwWxrnP4b5s5nCtdX0HTYDy+0znL5u8mWeqE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@remix-run%2finteraction@0.2.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":103312},"type":"module","_from":"file:remix-run-interaction-0.2.1.tgz","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./form":{"types":"./dist/lib/interactions/form.d.ts","default":"./dist/lib/interactions/form.js"},"./keys":{"types":"./dist/lib/interactions/keys.d.ts","default":"./dist/lib/interactions/keys.js"},"./press":{"types":"./dist/lib/interactions/press.d.ts","default":"./dist/lib/interactions/press.js"},"./popover":{"types":"./dist/lib/interactions/popover.d.ts","default":"./dist/lib/interactions/popover.js"}},"scripts":{"size":"esbuild src/index.ts --bundle --minify --outfile=.temp-bundle.js --format=esm && echo \"📦 Bundle sizes:\" && echo \"   Uncompressed: $(ls -lah .temp-bundle.js | awk '{print $5}')\" && echo \"   Gzipped: $(gzip -c .temp-bundle.js | wc -c | tr -d ' ') bytes\" && rm .temp-bundle.js","test":"vitest run","build":"tsc -p tsconfig.build.json","clean":"rm -rf dist","demos":"cd demos && pnpm start","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c3e877e1-51bd-4d51-ae5d-5b8f4d03e397"}},"_resolved":"/tmp/24c9fb8a15bcf41fa6c6963faaa41c83/remix-run-interaction-0.2.1.tgz","_integrity":"sha512-i/vFWIqLhEkMz5YDMsaolSfwpUtNgynO/ueYqf692G5Jva547jfq/Q5SvV//Yd8iTylH/mYuimfP9oCQ3+ep/Q==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/events"},"_npmVersion":"11.6.2","description":"Like components but for events","directories":{},"_nodeVersion":"24.11.1","_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","esbuild":"^0.25.5","playwright":"^1.53.1","typescript":"^5.9.3","@vitest/browser":"^3.2.4"},"_npmOperationalInternal":{"tmp":"tmp/interaction_0.2.1_1763517992935_0.7285298251337953","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@remix-run/interaction","version":"0.3.0","author":{"name":"Ryan Florence","email":"rpflorence@gmail.com"},"license":"MIT","_id":"@remix-run/interaction@0.3.0","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"},{"name":"ryanflorence","email":"rpflorence@gmail.com"}],"homepage":"https://github.com/remix-run/remix/tree/main/packages/events#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"dist":{"shasum":"e9a175f43bf02cac01cedd41a90b2c9f5954303c","tarball":"https://registry.npmjs.org/@remix-run/interaction/-/interaction-0.3.0.tgz","fileCount":28,"integrity":"sha512-lJ/wOkXJOa6913j7x9LSfx7q+5b3FQCd+uzh36G3oUjL0/4AcI1Ch3LiJmHTNmrlHgKHlb3D9idHjpOrpbljyA==","signatures":[{"sig":"MEUCIQDRWn8DGPdA01tQhHTx5Ghn+v7mdOgOMyRlSaJSFbt3cwIgBCLefqGWDRaMSWLs0vL/YgPzF+QfSEjDu4w1vIYyiSc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@remix-run%2finteraction@0.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":102361},"type":"module","_from":"file:remix-run-interaction-0.3.0.tgz","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./form":{"types":"./dist/lib/interactions/form.d.ts","default":"./dist/lib/interactions/form.js"},"./keys":{"types":"./dist/lib/interactions/keys.d.ts","default":"./dist/lib/interactions/keys.js"},"./press":{"types":"./dist/lib/interactions/press.d.ts","default":"./dist/lib/interactions/press.js"},"./popover":{"types":"./dist/lib/interactions/popover.d.ts","default":"./dist/lib/interactions/popover.js"}},"scripts":{"size":"esbuild src/index.ts --bundle --minify --outfile=.temp-bundle.js --format=esm && echo \"📦 Bundle sizes:\" && echo \"   Uncompressed: $(ls -lah .temp-bundle.js | awk '{print $5}')\" && echo \"   Gzipped: $(gzip -c .temp-bundle.js | wc -c | tr -d ' ') bytes\" && rm .temp-bundle.js","test":"vitest run","build":"tsc -p tsconfig.build.json","clean":"rm -rf dist","demos":"cd demos && pnpm start","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c3e877e1-51bd-4d51-ae5d-5b8f4d03e397"}},"_resolved":"/tmp/78a9c6b8491da2313fd466a8853ab5eb/remix-run-interaction-0.3.0.tgz","_integrity":"sha512-lJ/wOkXJOa6913j7x9LSfx7q+5b3FQCd+uzh36G3oUjL0/4AcI1Ch3LiJmHTNmrlHgKHlb3D9idHjpOrpbljyA==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/events"},"_npmVersion":"11.6.2","description":"Like components but for events","directories":{},"_nodeVersion":"24.11.1","_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","esbuild":"^0.25.5","playwright":"^1.53.1","typescript":"^5.9.3","@vitest/browser":"^3.2.4"},"_npmOperationalInternal":{"tmp":"tmp/interaction_0.3.0_1763612010859_0.8811857646986994","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@remix-run/interaction","version":"0.4.0","author":{"name":"Ryan Florence","email":"rpflorence@gmail.com"},"license":"MIT","_id":"@remix-run/interaction@0.4.0","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"},{"name":"ryanflorence","email":"rpflorence@gmail.com"}],"homepage":"https://github.com/remix-run/remix/tree/main/packages/events#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"dist":{"shasum":"a0b253ca08eb3c9226ee735bc92d8b8e300ffa4b","tarball":"https://registry.npmjs.org/@remix-run/interaction/-/interaction-0.4.0.tgz","fileCount":28,"integrity":"sha512-eXPPLR4TfLWkLyQtVCyqgpmwPJy5ZF6tbyyTqYbPIq8BCZkcKuyUZXrJDlAkiBNkVv3wrSLqm0Yt/cfOKyJq4Q==","signatures":[{"sig":"MEUCIE1RcIzN3CWHWrM28324cdjUv/HY1Uw2o2KZGfhC/+j8AiEA6XQASDYMhNsYejqFFku2mUD/4fy4turXOLWsyE70Z7A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@remix-run%2finteraction@0.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":106858},"type":"module","_from":"file:remix-run-interaction-0.4.0.tgz","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./form":{"types":"./dist/lib/interactions/form.d.ts","default":"./dist/lib/interactions/form.js"},"./keys":{"types":"./dist/lib/interactions/keys.d.ts","default":"./dist/lib/interactions/keys.js"},"./press":{"types":"./dist/lib/interactions/press.d.ts","default":"./dist/lib/interactions/press.js"},"./popover":{"types":"./dist/lib/interactions/popover.d.ts","default":"./dist/lib/interactions/popover.js"}},"scripts":{"size":"esbuild src/index.ts --bundle --minify --outfile=.temp-bundle.js --format=esm && echo \"📦 Bundle sizes:\" && echo \"   Uncompressed: $(ls -lah .temp-bundle.js | awk '{print $5}')\" && echo \"   Gzipped: $(gzip -c .temp-bundle.js | wc -c | tr -d ' ') bytes\" && rm .temp-bundle.js","test":"vitest run","build":"tsgo -p tsconfig.build.json","clean":"git clean -fdX","demos":"cd demos && pnpm start","typecheck":"tsgo --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c3e877e1-51bd-4d51-ae5d-5b8f4d03e397"}},"_resolved":"/tmp/da6f557d31a489d4491c25b09e00b9cf/remix-run-interaction-0.4.0.tgz","_integrity":"sha512-eXPPLR4TfLWkLyQtVCyqgpmwPJy5ZF6tbyyTqYbPIq8BCZkcKuyUZXrJDlAkiBNkVv3wrSLqm0Yt/cfOKyJq4Q==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/events"},"_npmVersion":"11.6.2","description":"Like components but for events","directories":{},"_nodeVersion":"24.12.0","_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","esbuild":"^0.25.5","playwright":"^1.53.1","@vitest/browser":"^3.2.4","@typescript/native-preview":"7.0.0-dev.20251125.1"},"_npmOperationalInternal":{"tmp":"tmp/interaction_0.4.0_1768948073540_0.22426490395088639","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@remix-run/interaction","version":"0.5.0","author":{"name":"Ryan Florence","email":"rpflorence@gmail.com"},"license":"MIT","_id":"@remix-run/interaction@0.5.0","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"},{"name":"ryanflorence","email":"rpflorence@gmail.com"}],"homepage":"https://github.com/remix-run/remix/tree/main/packages/events#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"dist":{"shasum":"72e1ec5bf1ef764d28e460fffd0cdcabdb0a5938","tarball":"https://registry.npmjs.org/@remix-run/interaction/-/interaction-0.5.0.tgz","fileCount":28,"integrity":"sha512-Z2ja9/7TfMHt/wzWq425GI2xj6QxW4E3OHZ8In81uytZKIuWaI6Pn3v8qyMrInwnBEaLcfcbeQVCiExgHU8D4A==","signatures":[{"sig":"MEUCIQDjsZJqQTY03P7mxeP5oZRFQiToIsyGAhkBNnIp4ubW+gIgcx0gy+my+Ko0RHjVZjmQtEsQ2SpmDfXKS4dAKcJuOTA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@remix-run%2finteraction@0.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":106022},"type":"module","_from":"file:remix-run-interaction-0.5.0.tgz","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./form":{"types":"./dist/lib/interactions/form.d.ts","default":"./dist/lib/interactions/form.js"},"./keys":{"types":"./dist/lib/interactions/keys.d.ts","default":"./dist/lib/interactions/keys.js"},"./press":{"types":"./dist/lib/interactions/press.d.ts","default":"./dist/lib/interactions/press.js"},"./popover":{"types":"./dist/lib/interactions/popover.d.ts","default":"./dist/lib/interactions/popover.js"}},"scripts":{"size":"esbuild src/index.ts --bundle --minify --outfile=.temp-bundle.js --format=esm && echo \"📦 Bundle sizes:\" && echo \"   Uncompressed: $(ls -lah .temp-bundle.js | awk '{print $5}')\" && echo \"   Gzipped: $(gzip -c .temp-bundle.js | wc -c | tr -d ' ') bytes\" && rm .temp-bundle.js","test":"vitest run","build":"tsgo -p tsconfig.build.json","clean":"git clean -fdX","demos":"cd demos && pnpm start","typecheck":"tsgo --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c3e877e1-51bd-4d51-ae5d-5b8f4d03e397"}},"_resolved":"/tmp/c4d912e7d655fafa870f0ccdc8222423/remix-run-interaction-0.5.0.tgz","_integrity":"sha512-Z2ja9/7TfMHt/wzWq425GI2xj6QxW4E3OHZ8In81uytZKIuWaI6Pn3v8qyMrInwnBEaLcfcbeQVCiExgHU8D4A==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/events"},"_npmVersion":"11.6.2","description":"Like components but for events","directories":{},"_nodeVersion":"24.13.0","_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","esbuild":"^0.25.5","playwright":"^1.53.1","@vitest/browser":"^3.2.4","@typescript/native-preview":"7.0.0-dev.20251125.1"},"_npmOperationalInternal":{"tmp":"tmp/interaction_0.5.0_1769566379234_0.745556812492679","host":"s3://npm-registry-packages-npm-production"}}},"time":{"created":"2025-11-03T16:17:40.906Z","modified":"2026-02-12T01:11:49.684Z","0.0.0":"2025-11-03T16:17:41.161Z","0.1.0":"2025-11-03T16:40:24.941Z","0.2.0":"2025-11-18T01:23:34.201Z","0.2.1":"2025-11-19T02:06:33.146Z","0.3.0":"2025-11-20T04:13:31.035Z","0.4.0":"2026-01-20T22:27:53.690Z","0.5.0":"2026-01-28T02:12:59.383Z"},"bugs":{"url":"https://github.com/remix-run/remix/issues"},"author":{"name":"Ryan Florence","email":"rpflorence@gmail.com"},"license":"MIT","homepage":"https://github.com/remix-run/remix/tree/main/packages/events#readme","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/events"},"description":"Like components but for events","maintainers":[{"email":"mjijackson+npm@gmail.com","name":"mjackson"}],"readme":"# interaction\n\nEnhanced events and custom interactions for any [EventTarget](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget).\n\n## Features\n\n- **Declarative Bindings** - Event bindings with plain objects\n- **Semantic Interactions** - Reusable \"interactions\" like `longPress` and `arrowDown`\n- **Async Support** - Listeners with reentry protection via [AbortSignal](https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal)\n- **Type Safety** - Type-safe listeners and custom `EventTarget` subclasses with `TypedEventTarget`\n\n## Installation\n\n```sh\nnpm install @remix-run/interaction\n```\n\n## Getting Started\n\n### Adding event listeners\n\nUse `on(target, listeners)` to add one or more listeners. Each listener receives `(event, signal)` where `signal` is aborted on reentry.\n\n```ts\nimport { on } from '@remix-run/interaction'\n\nlet inputElement = document.createElement('input')\n\non(inputElement, {\n  input: (event, signal) => {\n    console.log('current value', event.currentTarget.value)\n  },\n})\n```\n\nListeners can be arrays. They run in order and preserve normal DOM semantics (including `stopImmediatePropagation`).\n\n```ts\nimport { on } from '@remix-run/interaction'\n\non(inputElement, {\n  input: [\n    (event) => {\n      console.log('first')\n    },\n    {\n      capture: true,\n      listener(event) {\n        // capture phase\n      },\n    },\n    {\n      once: true,\n      listener(event) {\n        console.log('only once')\n      },\n    },\n  ],\n})\n```\n\n### Built-in Interactions\n\nBuiltin interactions are higher‑level, semantic event types (e.g., `press`, `longPress`, arrow keys) exported as string constants. Consume them just like native events by using computed keys in your listener map. When you bind one, the necessary underlying host events are set up automatically.\n\n```tsx\nimport { on } from '@remix-run/interaction'\nimport { press, longPress } from '@remix-run/interaction/press'\n\non(listItem, {\n  [press](event) {\n    navigateTo(listItem.href)\n  },\n\n  [longPress](event) {\n    event.preventDefault() // prevents `press`\n    showActions()\n  },\n})\n```\n\nImport builtins from their modules (for example, `@remix-run/interaction/press`, `@remix-run/interaction/keys`). Some interactions may coordinate with others (for example, calling `event.preventDefault()` in one listener can prevent a related interaction from firing).\n\nYou can also [create your own interactions](#custom-interactions).\n\n### Async listeners and reentry protection\n\nThe `signal` is aborted when the same listener is re-entered (for example, a user types quickly and triggers `input` repeatedly). Pass it to async APIs or check it manually to avoid stale work.\n\n```ts\non(inputElement, {\n  async input(event, signal) {\n    showSearchSpinner()\n\n    // Abortable fetch\n    let res = await fetch(`/search?q=${event.currentTarget.value}`, { signal })\n    let results = await res.json()\n    updateResults(results)\n  },\n})\n```\n\nFor APIs that don't accept a signal:\n\n```ts\non(inputElement, {\n  async input(event, signal) {\n    showSearchSpinner()\n    let results = await someSearch(event.currentTarget.value)\n    if (signal.aborted) return\n    updateResults(results)\n  },\n})\n```\n\n### Event listener options\n\nAll DOM [`AddEventListenerOptions`](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#options) are supported via descriptors:\n\n```ts\nimport { on } from '@remix-run/interaction'\n\non(button, {\n  click: {\n    capture: true,\n    listener(event) {\n      console.log('capture phase')\n    },\n  },\n  focus: {\n    once: true,\n    listener(event) {\n      console.log('focused once')\n    },\n  },\n})\n```\n\n### Updating listeners efficiently\n\nUse `createContainer` when you need to update listeners in place (e.g., in a component system). The container diffs and updates existing bindings without unnecessary `removeEventListener`/`addEventListener` churn.\n\n```ts\nimport { createContainer } from '@remix-run/interaction'\n\nlet container = createContainer(form)\n\nlet formData = new FormData()\n\ncontainer.set({\n  change(event) {\n    formData = new FormData(event.currentTarget)\n  },\n  async submit(event, signal) {\n    event.preventDefault()\n    await fetch('/save', { method: 'POST', body: formData, signal })\n  },\n})\n\n// later – only the minimal necessary changes are rebound\ncontainer.set({\n  change(event) {\n    console.log('different listener')\n  },\n  submit(event, signal) {\n    console.log('different listener')\n  },\n})\n```\n\n### Disposing listeners\n\n`on` returns a dispose function. Containers expose `dispose()`. You can also pass an external `AbortSignal`.\n\n```ts\nimport { on, createContainer } from '@remix-run/interaction'\n\n// Using the function returned from on()\nlet dispose = on(button, { click: () => {} })\ndispose()\n\n// Containers\nlet container = createContainer(window)\ncontainer.set({ resize: () => {} })\ncontainer.dispose()\n\n// Use a signal\nlet eventsController = new AbortController()\nlet container = createContainer(window, {\n  signal: eventsController.signal,\n})\ncontainer.set({ resize: () => {} })\neventsController.abort()\n```\n\n### Stop propagation semantics\n\nAll DOM semantics are preserved.\n\n```ts\non(button, {\n  click: [\n    (event) => {\n      event.stopImmediatePropagation()\n    },\n    () => {\n      // not called\n    },\n  ],\n})\n```\n\n## Custom Interactions\n\nDefine semantic interactions that can dispatch custom events and be reused declaratively.\n\n```ts\nimport { defineInteraction, on, type Interaction } from '@remix-run/interaction'\n\n// Provide type safety for consumers\ndeclare global {\n  interface HTMLElementEventMap {\n    [keydownEnter]: KeyboardEvent\n  }\n}\n\nfunction KeydownEnter(handle: Interaction) {\n  if (!(handle.target instanceof HTMLElement)) return\n\n  handle.on(handle.target, {\n    keydown(event) {\n      if (event.key === 'Enter') {\n        handle.target.dispatchEvent(new KeyboardEvent(keydownEnter, { key: 'Enter' }))\n      }\n    },\n  })\n}\n\n// define the interaction type and setup function\nconst keydownEnter = defineInteraction('keydown:enter', KeydownEnter)\n\n// usage\nlet button = document.createElement('button')\non(button, {\n  [keydownEnter](event) {\n    console.log('Enter key pressed')\n  },\n})\n```\n\nNotes:\n\n- An interaction is initialized at most once per target, even if multiple listeners bind the same interaction type.\n\n## Typed Event Targets\n\nUse `TypedEventTarget<eventMap>` to get type-safe `addEventListener` and integrate with this library's `on` helpers.\n\n```ts\nimport { TypedEventTarget, on } from '@remix-run/interaction'\n\ninterface DrummerEventMap {\n  kick: DrummerEvent\n  snare: DrummerEvent\n  hat: DrummerEvent\n}\n\nclass DrummerEvent extends Event {\n  constructor(type: keyof DrummerEventMap) {\n    super(type)\n  }\n}\n\nclass Drummer extends TypedEventTarget<DrummerEventMap> {\n  kick() {\n    // ...\n    this.dispatchEvent(new DrummerEvent('kick'))\n  }\n}\n\nlet drummer = new Drummer()\n\n// native API is NOT typed\ndrummer.addEventListener('kick', (event) => {\n  // event is DrummerEvent\n})\n\n// type safe with on()\non(drummer, {\n  kick: (event) => {\n    // event is Dispatched<DrummerEvent, Drummer>\n  },\n})\n```\n\n## Demos\n\nTo run the demos:\n\n```sh\npnpm run demos\n```\n\nThe [`demos` directory](https://github.com/remix-run/remix/tree/main/packages/interaction/demos) contains working demos:\n\n- [`demos/async`](https://github.com/remix-run/remix/tree/main/packages/interaction/demos/async) - Async listeners with abort signal\n- [`demos/basic`](https://github.com/remix-run/remix/tree/main/packages/interaction/demos/basic) - Basic event handling\n- [`demos/form`](https://github.com/remix-run/remix/tree/main/packages/interaction/demos/form) - Form event handling\n- [`demos/keys`](https://github.com/remix-run/remix/tree/main/packages/interaction/demos/keys) - Keyboard interactions\n- [`demos/popover`](https://github.com/remix-run/remix/tree/main/packages/interaction/demos/popover) - Popover interactions\n- [`demos/press`](https://github.com/remix-run/remix/tree/main/packages/interaction/demos/press) - Press and long press interactions\n\n## License\n\nSee [LICENSE](https://github.com/remix-run/remix/blob/main/LICENSE)\n","readmeFilename":"README.md"}