{"_id":"@remix-run/component","_rev":"12-7dcd0ea9b366d02c9f9f957fc96bc2fd","name":"@remix-run/component","dist-tags":{"latest":"1.1.0"},"versions":{"0.1.0":{"name":"@remix-run/component","version":"0.1.0","author":{"name":"Ryan Florence","email":"rpflorence@gmail.com"},"license":"MIT","_id":"@remix-run/component@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/component#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"dist":{"shasum":"8c4f0c86e943f623cabc0a4a89cd74a708f8aa00","tarball":"https://registry.npmjs.org/@remix-run/component/-/component-0.1.0.tgz","fileCount":64,"integrity":"sha512-RVposBR4V0wCre1rQc4/LSHamOOPZoMcg4jmM02sq6TlsvVV8+6e1xh2+S111xWBjkyjt/BxPNBhVLx/k/4Z2Q==","signatures":[{"sig":"MEYCIQCb+wYiB3f388qrz/NDYPWiEA6mbBfd/4+BL+H6/XuxpQIhAKnCcqaI5vR0al/MmgN3Jl6NXp7oYGSE/A5DO3BcaAZi","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":524879},"type":"module","_from":"file:remix-run-component-0.1.0.tgz","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./jsx-runtime":{"types":"./dist/jsx-runtime.d.ts","default":"./dist/jsx-runtime.js"},"./package.json":"./package.json","./jsx-dev-runtime":{"types":"./dist/jsx-dev-runtime.d.ts","default":"./dist/jsx-dev-runtime.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":"git clean -fdX","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"mjackson","email":"mjijackson+npm@gmail.com"},"_resolved":"/private/var/folders/n5/1lxhnzk56hg6b7vnl558364m0000gn/T/593d77ebc2bab7296dc179da02aa6916/remix-run-component-0.1.0.tgz","_integrity":"sha512-RVposBR4V0wCre1rQc4/LSHamOOPZoMcg4jmM02sq6TlsvVV8+6e1xh2+S111xWBjkyjt/BxPNBhVLx/k/4Z2Q==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/component"},"_npmVersion":"11.3.0","description":"Web components for Remix","directories":{},"_nodeVersion":"24.2.0","dependencies":{"@remix-run/interaction":"^0.3.0"},"_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/component_0.1.0_1766079684486_0.09275851039279548","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@remix-run/component","version":"0.2.0","author":{"name":"Ryan Florence","email":"rpflorence@gmail.com"},"license":"MIT","_id":"@remix-run/component@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/component#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"dist":{"shasum":"eb5ed660e7624294e6c9672489ee5cc2277c2c57","tarball":"https://registry.npmjs.org/@remix-run/component/-/component-0.2.0.tgz","fileCount":64,"integrity":"sha512-5z6U4Av7FlLBT5dhPmqbjWJKgB5aAakrlS6h8qDsBOCWy7FqpRKaqyZSlYnCylcdFEdDHM76EsRL2qSifT20aA==","signatures":[{"sig":"MEYCIQC2A5zEHQhPdSl3IXVpFTa53+DRCHtlTs2dy+v1eg1V8wIhAMi7yftJdGcpMPoyDo4fR6sgfF7I9v5INZ2kwtzSAgAt","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@remix-run%2fcomponent@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":524879},"type":"module","_from":"file:remix-run-component-0.2.0.tgz","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./jsx-runtime":{"types":"./dist/jsx-runtime.d.ts","default":"./dist/jsx-runtime.js"},"./package.json":"./package.json","./jsx-dev-runtime":{"types":"./dist/jsx-dev-runtime.d.ts","default":"./dist/jsx-dev-runtime.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":"git clean -fdX","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2ab936a3-be93-4398-a808-68e8969ae453"}},"_resolved":"/tmp/c8d39e848d60fd9778d08c7a1c1106c5/remix-run-component-0.2.0.tgz","_integrity":"sha512-5z6U4Av7FlLBT5dhPmqbjWJKgB5aAakrlS6h8qDsBOCWy7FqpRKaqyZSlYnCylcdFEdDHM76EsRL2qSifT20aA==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/component"},"_npmVersion":"11.6.2","description":"Web components for Remix","directories":{},"_nodeVersion":"24.12.0","dependencies":{"@remix-run/interaction":"^0.3.0"},"_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/component_0.2.0_1766081240597_0.9698012363875164","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@remix-run/component","version":"0.2.1","author":{"name":"Ryan Florence","email":"rpflorence@gmail.com"},"license":"MIT","_id":"@remix-run/component@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/component#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"dist":{"shasum":"90649a3152c36ba1b308387b44157a0660bb57e4","tarball":"https://registry.npmjs.org/@remix-run/component/-/component-0.2.1.tgz","fileCount":64,"integrity":"sha512-RkSqAFxlkQhISKZR7cR0ULyTNXrEXQNxSrg5m2e2AnByO7Ix5mQ1g71VLwArhCRshUxOv20cUBto2Tq1MrGBJw==","signatures":[{"sig":"MEUCIDY2CN5buWfq205rjjwpvshZqXDD4L57WDSXkEyxaOYEAiEApbRLNwe5iq3yAlfT3I/r05wsD1rAidW5jj/iPrMbWDg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@remix-run%2fcomponent@0.2.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":526800},"type":"module","_from":"file:remix-run-component-0.2.1.tgz","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./jsx-runtime":{"types":"./dist/jsx-runtime.d.ts","default":"./dist/jsx-runtime.js"},"./package.json":"./package.json","./jsx-dev-runtime":{"types":"./dist/jsx-dev-runtime.d.ts","default":"./dist/jsx-dev-runtime.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":"git clean -fdX","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2ab936a3-be93-4398-a808-68e8969ae453"}},"_resolved":"/tmp/bbcdc0ba4c925c58cae52e37914663f7/remix-run-component-0.2.1.tgz","_integrity":"sha512-RkSqAFxlkQhISKZR7cR0ULyTNXrEXQNxSrg5m2e2AnByO7Ix5mQ1g71VLwArhCRshUxOv20cUBto2Tq1MrGBJw==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/component"},"_npmVersion":"11.6.2","description":"Web components for Remix","directories":{},"_nodeVersion":"24.12.0","dependencies":{"@remix-run/interaction":"^0.3.0"},"_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/component_0.2.1_1766109477863_0.25258296800679036","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@remix-run/component","version":"0.3.0","author":{"name":"Ryan Florence","email":"rpflorence@gmail.com"},"license":"MIT","_id":"@remix-run/component@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/component#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"dist":{"shasum":"652c261e2200095f66ffc46ccf0c5e9722d78647","tarball":"https://registry.npmjs.org/@remix-run/component/-/component-0.3.0.tgz","fileCount":64,"integrity":"sha512-Cq+izA+IzcE0/+1soho7ZMwkEvuU3jNnj4tV9nrt0UI6zqXN68QU5G497uXD4qXCeNCQaghdAAxK01/wdac4nA==","signatures":[{"sig":"MEQCID8Sb0iPmQ0KHflVdkryUESs9+h8LwxgwDVwPLMK4zhNAiBIbSwb5O6mACMMUIS4Xemy+BD2zu5Dy9fXPPJnSghCTg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@remix-run%2fcomponent@0.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":574740},"type":"module","_from":"file:remix-run-component-0.3.0.tgz","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./jsx-runtime":{"types":"./dist/jsx-runtime.d.ts","default":"./dist/jsx-runtime.js"},"./package.json":"./package.json","./jsx-dev-runtime":{"types":"./dist/jsx-dev-runtime.d.ts","default":"./dist/jsx-dev-runtime.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":"git clean -fdX","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2ab936a3-be93-4398-a808-68e8969ae453"}},"_resolved":"/tmp/43d0da0b6ded74d72ff3b41d1352369c/remix-run-component-0.3.0.tgz","_integrity":"sha512-Cq+izA+IzcE0/+1soho7ZMwkEvuU3jNnj4tV9nrt0UI6zqXN68QU5G497uXD4qXCeNCQaghdAAxK01/wdac4nA==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/component"},"_npmVersion":"11.6.2","description":"Web components for Remix","directories":{},"_nodeVersion":"24.12.0","dependencies":{"@remix-run/interaction":"^0.4.0"},"_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/component_0.3.0_1768948088338_0.06586709608703378","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@remix-run/component","version":"0.4.0","author":{"name":"Ryan Florence","email":"rpflorence@gmail.com"},"license":"MIT","_id":"@remix-run/component@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/component#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"dist":{"shasum":"6ad0b302136addf289640245a8a0607275d5d7bb","tarball":"https://registry.npmjs.org/@remix-run/component/-/component-0.4.0.tgz","fileCount":80,"integrity":"sha512-5xJLIrlH1Tcx6+h+ZG6BEpNkpt8upK4l82exE107Elw2QyToHf69v1aGlaTPQ8fpGr6Ke7gHta7s3fypJwaIsg==","signatures":[{"sig":"MEUCIEjbtxEhAxWs/hR4JvxLRTjeX9I3FvE2tctGAOnWe5mcAiEAlJHeSjaOMLCboVgKczydk8TDRQL3PKS6EEr6OSHo4w4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@remix-run%2fcomponent@0.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":718472},"type":"module","_from":"file:remix-run-component-0.4.0.tgz","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./jsx-runtime":{"types":"./dist/jsx-runtime.d.ts","default":"./dist/jsx-runtime.js"},"./package.json":"./package.json","./jsx-dev-runtime":{"types":"./dist/jsx-dev-runtime.d.ts","default":"./dist/jsx-dev-runtime.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":"git clean -fdX","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2ab936a3-be93-4398-a808-68e8969ae453"}},"_resolved":"/tmp/be2378332987930a77e18a269552f51d/remix-run-component-0.4.0.tgz","_integrity":"sha512-5xJLIrlH1Tcx6+h+ZG6BEpNkpt8upK4l82exE107Elw2QyToHf69v1aGlaTPQ8fpGr6Ke7gHta7s3fypJwaIsg==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/component"},"_npmVersion":"11.6.2","description":"Web components for Remix","directories":{},"_nodeVersion":"24.13.0","dependencies":{"@remix-run/interaction":"^0.5.0"},"_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/component_0.4.0_1769566388778_0.7323993537561195","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@remix-run/component","version":"0.5.0","author":{"name":"Ryan Florence","email":"rpflorence@gmail.com"},"license":"MIT","_id":"@remix-run/component@0.5.0","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"}],"homepage":"https://github.com/remix-run/remix/tree/main/packages/component#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"dist":{"shasum":"f759f7fdcae0bf4eeef1af198ee2bf69745c39ee","tarball":"https://registry.npmjs.org/@remix-run/component/-/component-0.5.0.tgz","fileCount":161,"integrity":"sha512-xRLOcgwWKZxFdj63bWi3/snC2uxkm978B49EGEv1/G43iBFksYjS4ADanfYxREvQjMlaCqSUH0ZTZsJbGsz3PQ==","signatures":[{"sig":"MEUCIFLbT7IkPcg1NhSyP9IMSq1qdc3JrvFV3SG3dLR0ZxREAiEAs7/B5NzADcLlPVSraSW3n2pLJwoGXhZj1KI6JrX6fCQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@remix-run%2fcomponent@0.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1294189},"type":"module","_from":"file:remix-run-component-0.5.0.tgz","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./server":{"types":"./dist/server.d.ts","default":"./dist/server.js"},"./jsx-runtime":{"types":"./dist/jsx-runtime.d.ts","default":"./dist/jsx-runtime.js"},"./package.json":"./package.json","./jsx-dev-runtime":{"types":"./dist/jsx-dev-runtime.d.ts","default":"./dist/jsx-dev-runtime.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":"git clean -fdX","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2ab936a3-be93-4398-a808-68e8969ae453"}},"_resolved":"/tmp/e558a26b401aaa65987c7d4f3e6b2360/remix-run-component-0.5.0.tgz","_integrity":"sha512-xRLOcgwWKZxFdj63bWi3/snC2uxkm978B49EGEv1/G43iBFksYjS4ADanfYxREvQjMlaCqSUH0ZTZsJbGsz3PQ==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/component"},"_npmVersion":"11.10.1","description":"Web components for Remix","directories":{},"_nodeVersion":"25.7.0","dependencies":{"@remix-run/interaction":"^0.5.0"},"_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/component_0.5.0_1772239276768_0.3122498373829208","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@remix-run/component","version":"0.6.0","author":{"name":"Ryan Florence","email":"rpflorence@gmail.com"},"license":"MIT","_id":"@remix-run/component@0.6.0","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"}],"homepage":"https://github.com/remix-run/remix/tree/main/packages/component#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"dist":{"shasum":"253a9991ca7041189c2a05d129243b77028c4630","tarball":"https://registry.npmjs.org/@remix-run/component/-/component-0.6.0.tgz","fileCount":215,"integrity":"sha512-hmIUdPnBtONeOH8bbLuOVGSgFD/MAUNvpH0Xwgo27GByBIjQhOm25Tt9R04HQslDhHAzwNVnWeQkr3j9eyXYhQ==","signatures":[{"sig":"MEYCIQCx1uNOV1fw8eHYhB7ZtZ+uN3Inz+H7nx6v4cNkltLyDwIhAL7RI4xE70k/j+XnOcOH6G9CHjQ9Bqvpk57mSJ/Q149g","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@remix-run%2fcomponent@0.6.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1678368},"type":"module","_from":"file:remix-run-component-0.6.0.tgz","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./server":{"types":"./dist/server.d.ts","default":"./dist/server.js"},"./jsx-runtime":{"types":"./dist/jsx-runtime.d.ts","default":"./dist/jsx-runtime.js"},"./package.json":"./package.json","./jsx-dev-runtime":{"types":"./dist/jsx-dev-runtime.d.ts","default":"./dist/jsx-dev-runtime.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":"git clean -fdX","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2ab936a3-be93-4398-a808-68e8969ae453"}},"_resolved":"/tmp/996712fdd8b468af3ad0779feafbbf99/remix-run-component-0.6.0.tgz","_integrity":"sha512-hmIUdPnBtONeOH8bbLuOVGSgFD/MAUNvpH0Xwgo27GByBIjQhOm25Tt9R04HQslDhHAzwNVnWeQkr3j9eyXYhQ==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/component"},"_npmVersion":"11.9.0","description":"UI components for Remix","directories":{},"_nodeVersion":"24.14.0","dependencies":{"@types/dom-navigation":"^1.0.7"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","esbuild":"^0.25.5","playwright":"^1.53.1","typescript":"^5.9.3","@vitest/browser":"^3.2.4","@vitest/coverage-v8":"^3.2.4"},"_npmOperationalInternal":{"tmp":"tmp/component_0.6.0_1774479797719_0.6041242181586619","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@remix-run/component","version":"0.7.0","author":{"name":"Ryan Florence","email":"rpflorence@gmail.com"},"license":"MIT","_id":"@remix-run/component@0.7.0","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"}],"homepage":"https://github.com/remix-run/remix/tree/main/packages/component#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"dist":{"shasum":"3cfacfa9b9859c088b8f6c30358b9a828d68390a","tarball":"https://registry.npmjs.org/@remix-run/component/-/component-0.7.0.tgz","fileCount":220,"integrity":"sha512-yiJlRP9rMaQC/m/AoByhMgG9GE8Q/1DQpzcjqZJom/C1aBggzPrfhTw/8id7Xar07SGyWpOwKCvAqnYUOUZ7RQ==","signatures":[{"sig":"MEQCIH78Yl380hIe0iUKfP9hdIuxQbINU/tGUQVosXF37X6KAiBbR4HmFCS7K2bU3scVbKv9GtKWJmQliFMtVRfdx25naA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@remix-run%2fcomponent@0.7.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1738492},"type":"module","_from":"file:remix-run-component-0.7.0.tgz","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./server":{"types":"./dist/server.d.ts","default":"./dist/server.js"},"./jsx-runtime":{"types":"./dist/jsx-runtime.d.ts","default":"./dist/jsx-runtime.js"},"./package.json":"./package.json","./jsx-dev-runtime":{"types":"./dist/jsx-dev-runtime.d.ts","default":"./dist/jsx-dev-runtime.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":"git clean -fdX","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2ab936a3-be93-4398-a808-68e8969ae453"}},"_resolved":"/tmp/05ee59cc3432f749606ec52ff86748c1/remix-run-component-0.7.0.tgz","_integrity":"sha512-yiJlRP9rMaQC/m/AoByhMgG9GE8Q/1DQpzcjqZJom/C1aBggzPrfhTw/8id7Xar07SGyWpOwKCvAqnYUOUZ7RQ==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/component"},"_npmVersion":"11.11.0","description":"UI components for Remix","directories":{},"_nodeVersion":"24.14.1","dependencies":{"@types/dom-navigation":"^1.0.7"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","esbuild":"^0.25.5","playwright":"^1.59.0","typescript":"^5.9.3","@vitest/browser":"^3.2.4","@vitest/coverage-v8":"^3.2.4"},"_npmOperationalInternal":{"tmp":"tmp/component_0.7.0_1776904495711_0.4395179770441564","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"@remix-run/component","version":"0.8.0","keywords":["remix","component","runtime","rendering","mixins"],"author":{"name":"Michael Jackson","email":"mjijackson@gmail.com"},"license":"MIT","_id":"@remix-run/component@0.8.0","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"}],"homepage":"https://github.com/remix-run/remix/tree/main/packages/component#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"dist":{"shasum":"a8f228338dee6315d233668b0c454edd47ff17bb","tarball":"https://registry.npmjs.org/@remix-run/component/-/component-0.8.0.tgz","fileCount":226,"integrity":"sha512-f3ubhqD3Ui2Qhgs+RlIpNX5Z4QNKEtBLRFeHN/WRYRqQw5tsFd6cFkz9R8Ss2T1H47Ry2VPUvm5RRcmCiZdcZA==","signatures":[{"sig":"MEUCIQDbb5QFqH76/NvU7jP9usHp1Wz/GBS2tybgJBXD+NphkQIgUonoWbBPEDHPaSgV06/c4Ga6mQHgb9pqZDN8CIJkfmw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIG72v4ABK6z+TKjl9eWcn+cM84rWaiEr8oy7wdH11y8+AiEAoEVOQoY3j9mgYIarjFm3fhDq7Hc19fxgySv3cdfiqEY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@remix-run%2fcomponent@0.8.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1555371},"type":"module","_from":"file:/tmp/remix-publish-component-W7vYmU/remix-run-component-0.8.0.tgz","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./test":{"types":"./dist/test.d.ts","default":"./dist/test.js"},"./server":{"types":"./dist/server.d.ts","default":"./dist/server.js"},"./dev/refresh":{"types":"./dist/dev/refresh.d.ts","default":"./dist/dev/refresh.js"},"./jsx-runtime":{"types":"./dist/jsx-runtime.d.ts","default":"./dist/jsx-runtime.js"},"./package.json":"./package.json","./jsx-dev-runtime":{"types":"./dist/jsx-runtime.d.ts","default":"./dist/jsx-runtime.js"}},"scripts":{"lint":"pnpm -w exec oxlint packages/component --max-warnings=0","test":"remix test","build":"tsc -p tsconfig.build.json","clean":"git clean -fdX","lint:fix":"pnpm -w exec oxlint packages/component --fix --max-warnings=0","typecheck":"tsc --noEmit","test:watch":"remix test --watch","test:coverage":"remix test --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"2ab936a3-be93-4398-a808-68e8969ae453"}},"_resolved":"/tmp/remix-publish-component-W7vYmU/remix-run-component-0.8.0.tgz","_integrity":"sha512-f3ubhqD3Ui2Qhgs+RlIpNX5Z4QNKEtBLRFeHN/WRYRqQw5tsFd6cFkz9R8Ss2T1H47Ry2VPUvm5RRcmCiZdcZA==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/component"},"_npmVersion":"11.19.0","description":"Component runtime with server rendering and browser hydration","directories":{},"sideEffects":false,"_nodeVersion":"24.21.0","dependencies":{"@types/dom-navigation":"^1.0.7"},"_hasShrinkwrap":false,"devDependencies":{"playwright":"^1.60.0","typescript":"^7.0.2","@types/node":"^24.6.0","@remix-run/test":"0.6.2","@remix-run/assert":"0.3.1"},"_npmOperationalInternal":{"tmp":"tmp/component_0.8.0_1790874651245_0.9149721057550033","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"@remix-run/component","version":"1.0.0","keywords":["remix","component","runtime","rendering","mixins"],"author":{"name":"Michael Jackson","email":"mjijackson@gmail.com"},"license":"MIT","_id":"@remix-run/component@1.0.0","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"}],"homepage":"https://github.com/remix-run/remix/tree/main/packages/component#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"dist":{"shasum":"08b743026b6600a6fa878905ab10388b7e803a0c","tarball":"https://registry.npmjs.org/@remix-run/component/-/component-1.0.0.tgz","fileCount":226,"integrity":"sha512-89stfiyRE+99sQDbX5Hu56ro44a15Mhh7OYev3lJ+7ZJgOLRjrjymahzS0p4A6J19e4U5rOBUqa8BJvUHm0eig==","signatures":[{"sig":"MEUCIQDKQL6uEVLvr/xXmZwarFK7UL711us8/apOPT/NE36MUwIgVpWRpWVfnOl9MwMsY/LJxUzSnnCznYHUZJYcCfks1Go=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIFSf/Umme+/ldS05k3K8xJHc7lBfCHxneLy/QXsG+TG5AiA8pPGNwn27w3dl2Qk9PhnL2wKvPn0wtwzg1FYvIv6rdQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@remix-run%2fcomponent@1.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1555371},"type":"module","_from":"file:/tmp/remix-publish-component-kZbOx9/remix-run-component-1.0.0.tgz","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./test":{"types":"./dist/test.d.ts","default":"./dist/test.js"},"./server":{"types":"./dist/server.d.ts","default":"./dist/server.js"},"./dev/refresh":{"types":"./dist/dev/refresh.d.ts","default":"./dist/dev/refresh.js"},"./jsx-runtime":{"types":"./dist/jsx-runtime.d.ts","default":"./dist/jsx-runtime.js"},"./package.json":"./package.json","./jsx-dev-runtime":{"types":"./dist/jsx-runtime.d.ts","default":"./dist/jsx-runtime.js"}},"scripts":{"lint":"pnpm -w exec oxlint packages/component --max-warnings=0","test":"remix test","build":"tsc -p tsconfig.build.json","clean":"git clean -fdX","lint:fix":"pnpm -w exec oxlint packages/component --fix --max-warnings=0","typecheck":"tsc --noEmit","test:watch":"remix test --watch","test:coverage":"remix test --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"2ab936a3-be93-4398-a808-68e8969ae453"}},"_resolved":"/tmp/remix-publish-component-kZbOx9/remix-run-component-1.0.0.tgz","_integrity":"sha512-89stfiyRE+99sQDbX5Hu56ro44a15Mhh7OYev3lJ+7ZJgOLRjrjymahzS0p4A6J19e4U5rOBUqa8BJvUHm0eig==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/component"},"_npmVersion":"11.19.0","description":"Component runtime with server rendering and browser hydration","directories":{},"sideEffects":false,"_nodeVersion":"24.21.0","dependencies":{"@types/dom-navigation":"^1.0.7"},"_hasShrinkwrap":false,"devDependencies":{"playwright":"^1.60.0","typescript":"^7.0.2","@types/node":"^24.6.0","@remix-run/test":"1.0.0","@remix-run/assert":"1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/component_1.0.0_1790895274867_0.06744677852178849","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"_id":"@remix-run/component@1.1.0","bugs":{"url":"https://github.com/remix-run/remix/issues"},"dist":{"shasum":"d0bff362f2b7eec2974ceac503bf8b9f7bcb7ebc","tarball":"https://registry.npmjs.org/@remix-run/component/-/component-1.1.0.tgz","fileCount":234,"integrity":"sha512-FHcYTeDGiIS3s5gyymEvUKfRDtyYkY5Wt/uXr3+kPRK6tbqbD9gD2979f3TlStbi2drwdUAnyuA8CS23JRFlXQ==","signatures":[{"sig":"MEUCIEJkzOnXzzZUYlYPBzVOHdwOcaDFYrKILtdcKb1OBzkiAiEAvLiGQUaULhNS/zQa2FSVpNzlJR2Z1gt0Rh/BM68hcD8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIB2Or7vdzm9UWUtglHcx8d5Pw5VQL07MTo+M8EPnxpG9AiAwjOWYfreEMyapC1OLqk0MGPvMTeDpMsNufhOZLyvaOg=="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@remix-run%2fcomponent@1.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1649356},"name":"@remix-run/component","type":"module","_from":"file:/tmp/remix-publish-component-ZGg21K/remix-run-component-1.1.0.tgz","author":{"name":"Michael Jackson","email":"mjijackson@gmail.com"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./test":{"types":"./dist/test.d.ts","default":"./dist/test.js"},"./server":{"types":"./dist/server.d.ts","default":"./dist/server.js"},"./dev/refresh":{"types":"./dist/dev/refresh.d.ts","default":"./dist/dev/refresh.js"},"./jsx-runtime":{"types":"./dist/jsx-runtime.d.ts","default":"./dist/jsx-runtime.js"},"./package.json":"./package.json","./jsx-dev-runtime":{"types":"./dist/jsx-runtime.d.ts","default":"./dist/jsx-runtime.js"}},"license":"MIT","scripts":{"lint":"pnpm -w exec oxlint packages/component --max-warnings=0","test":"remix test","build":"tsc -p tsconfig.build.json","clean":"git clean -fdX","lint:fix":"pnpm -w exec oxlint packages/component --fix --max-warnings=0","typecheck":"tsc --noEmit","test:watch":"remix test --watch","test:coverage":"remix test --coverage"},"version":"1.1.0","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"2ab936a3-be93-4398-a808-68e8969ae453"}},"homepage":"https://github.com/remix-run/remix/tree/main/packages/component#readme","keywords":["remix","component","runtime","rendering","mixins"],"_resolved":"/tmp/remix-publish-component-ZGg21K/remix-run-component-1.1.0.tgz","_integrity":"sha512-FHcYTeDGiIS3s5gyymEvUKfRDtyYkY5Wt/uXr3+kPRK6tbqbD9gD2979f3TlStbi2drwdUAnyuA8CS23JRFlXQ==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/component"},"_npmVersion":"11.19.0","description":"Component runtime with server rendering, browser hydration, mixins, and frame navigation","directories":{},"maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"}],"sideEffects":false,"_nodeVersion":"24.21.0","dependencies":{"@types/dom-navigation":"^1.0.7"},"_hasShrinkwrap":false,"devDependencies":{"playwright":"^1.60.0","typescript":"^7.0.2","@types/node":"^24.6.0","@remix-run/test":"1.0.0","@remix-run/assert":"1.0.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/component_1.1.0_1792780683981_0.017533620018512774"}}},"time":{"created":"2025-12-18T17:41:24.404Z","modified":"2026-10-23T18:38:04.586Z","0.1.0":"2025-12-18T17:41:24.788Z","0.2.0":"2025-12-18T18:07:20.759Z","0.2.1":"2025-12-19T01:57:58.006Z","0.3.0":"2026-01-20T22:28:08.504Z","0.4.0":"2026-01-28T02:13:09.028Z","0.5.0":"2026-02-28T00:41:17.028Z","0.6.0":"2026-03-25T23:03:17.970Z","0.7.0":"2026-04-23T00:34:55.864Z","0.8.0":"2026-10-01T17:10:51.395Z","1.0.0":"2026-10-01T22:54:34.981Z","1.1.0":"2026-10-23T18:38:04.153Z"},"bugs":{"url":"https://github.com/remix-run/remix/issues"},"author":{"name":"Michael Jackson","email":"mjijackson@gmail.com"},"license":"MIT","homepage":"https://github.com/remix-run/remix/tree/main/packages/component#readme","keywords":["remix","component","runtime","rendering","mixins"],"repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/component"},"description":"Component runtime with server rendering, browser hydration, mixins, and frame navigation","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"}],"readme":"# component\n\nA minimal component system built on JavaScript and DOM primitives. Write components that render on\nthe server, stream to the browser, and hydrate only where you need interactivity.\n\n## Features\n\n- Component runtime APIs for rendering, hydration, link and form frame navigation, and JSX\n- Server rendering APIs for streaming component trees and frames\n- `mix` composition with event, ref, and CSS helpers\n- Lower-level utilities for events, refs, attributes, and rendering lifecycle\n\n## Installation\n\n```sh\nnpm i remix\n```\n\n## Usage\n\nComponents receive a handle and return a render function. Local state stays in ordinary JavaScript\nvariables, and `handle.update()` explicitly schedules another render:\n\n```tsx\nimport { on } from 'remix/component'\nimport type { Handle } from 'remix/component'\n\nfunction Counter(handle: Handle<{ initialCount?: number }>) {\n  let count = handle.props.initialCount ?? 0\n\n  return () => (\n    <button\n      type=\"button\"\n      mix={on('click', () => {\n        count++\n        void handle.update()\n      })}\n    >\n      Count: {count}\n    </button>\n  )\n}\n```\n\n## Custom Mixins\n\nUse `createMixin(...)` to share host behavior, manage DOM resources, or provide default props. The [Mixins guide](https://github.com/remix-run/remix/blob/main/packages/component/docs/mixins.md) covers setup and render, `MixinHandle`, lifecycle events, and deferred removal with `beforeRemove` and `event.persistNode(...)`.\n\nFor behavior that does not affect server HTML, pass `{ ssr: false }` to skip setup and render on the server:\n\n```tsx\nimport { createMixin } from 'remix/component'\n\nconst focusOnInsert = createMixin<HTMLElement>(\n  (handle) => {\n    handle.addEventListener('insert', ({ node }) => node.focus())\n  },\n  { ssr: false },\n)\n```\n\n## Client Entry Loading\n\n`run()` hydrates client entries by calling `loadModule` for each component module:\n\n```tsx\nimport { run } from 'remix/component'\n\nlet app = run({\n  async loadModule(moduleUrl, exportName) {\n    let mod = await import(moduleUrl)\n    return mod[exportName]\n  },\n})\n\nawait app.ready()\n```\n\nClient entries introduced after the initial document may depend on import maps added at runtime.\nWhen targeting browsers without native support for multiple import maps, use\n`remix/multiple-import-maps-polyfill` to load these modules and process their preloads:\n\n```tsx\nimport {\n  detectMultipleImportMapSupport,\n  importModule,\n  preloadShim,\n} from 'remix/multiple-import-maps-polyfill'\n\nlet app = run({\n  async loadModule(moduleUrl, exportName) {\n    let module = await importModule(moduleUrl)\n    let Component = module[exportName]\n    if (typeof Component !== 'function') {\n      throw new Error(`Unknown component: ${moduleUrl}#${exportName}`)\n    }\n    return Component\n  },\n  async processClientEntryPreloads(preloads) {\n    if (await detectMultipleImportMapSupport()) return preloads\n\n    preloadShim(preloads)\n    return []\n  },\n})\n```\n\n## Frame Navigation\n\nThe same runtime represents the current document as `app.frames.top` and intercepts eligible\nsame-origin links and forms through the browser's Navigation API. Those navigations fetch HTML with\nthe frame resolver and update the existing document in place instead of loading a new document.\nThis soft-navigation behavior applies even when the page only uses `clientEntry()` and does not\nrender an explicit `<Frame>`.\n\nFrame navigation requires both `window.navigation` and `NavigateEvent.sourceElement`. Browsers\nmissing either capability use document navigation for links, forms, and `navigate()`. Hydration and\nexplicit frame reloads still work.\n\nThe default resolver sends `X-Remix-Frame: true` for every request, including top-frame navigation and reloads. Named frames also send `X-Remix-Target`; top-frame and unnamed frame requests omit the target. It only fetches same-origin sources and follows same-origin redirects.\n\nThe default browser resolver omits `X-Remix-Top-Frame-Src`. When `render()` middleware handles these requests, the server-rendered `handle.frames.top.src` defaults to the requested frame's URL.\n\nThe default resolver is equivalent to:\n\n```js\nasync function resolveFrame(src, options) {\n  let headers = new Headers({ Accept: 'text/html', 'X-Remix-Frame': 'true' })\n  if (options?.target != null) headers.set('X-Remix-Target', options.target)\n\n  let { body, encType } = getRequestBody(options)\n  if (encType) headers.set('Content-Type', encType)\n  let requestInit = {\n    body,\n    headers,\n    method: options?.method,\n    mode: 'same-origin',\n    signal: options?.signal,\n  }\n  let response = await fetch(src, requestInit)\n\n  let isHtml = response.headers.get('Content-Type')?.toLowerCase().includes('text/html')\n  if (response.status >= 500 || (response.status >= 300 && !isHtml)) {\n    throw new Error(`Failed to resolve frame: ${response.status} ${response.statusText}`.trimEnd())\n  }\n\n  return response\n}\n\nfunction getRequestBody(options) {\n  let formData = options?.formData\n  if (!formData) return {}\n  if (['get', 'head'].includes((options?.method ?? 'get').toLowerCase())) return {}\n\n  let encType = options?.encType?.toLowerCase()\n\n  if (encType === 'multipart/form-data') return { body: formData }\n\n  if (encType === 'text/plain') {\n    let body = ''\n    for (let [name, value] of formData) {\n      name = normalizeLineBreaks(name)\n      value = normalizeLineBreaks(typeof value === 'string' ? value : value.name)\n      body += `${name}=${value}\\r\\n`\n    }\n    return { body: new Blob([body], { type: 'text/plain' }), encType: 'text/plain' }\n  }\n\n  let body = new URLSearchParams()\n  for (let [name, value] of formData) {\n    body.append(\n      normalizeLineBreaks(name),\n      normalizeLineBreaks(typeof value === 'string' ? value : value.name),\n    )\n  }\n  return { body, encType: 'application/x-www-form-urlencoded' }\n}\n\nfunction normalizeLineBreaks(value) {\n  return value.replace(/\\r\\n|\\r|\\n/g, '\\r\\n')\n}\n```\n\nThe default resolver requests HTML. GET form values are already encoded in `src`;\n`application/x-www-form-urlencoded` submissions use `URLSearchParams`, `text/plain` submissions use\nCRLF-delimited text, and `multipart/form-data` submissions use `FormData`. Pass a custom\n`resolveFrame` when the server requires additional headers, another body encoding, or a different\nresponse policy.\n\nScroll and focus controls accept the Navigation API values `\"after-transition\"` (the default) and `\"manual\"`. Set `data-rmx-reset-scroll=\"manual\"` or `data-rmx-reset-focus=\"manual\"` on a link or form to disable the corresponding automatic behavior. The equivalent options for `navigate()` and `link()` are `resetScroll: 'manual'` and `resetFocus: 'manual'`:\n\n```tsx\n<a href=\"/search?page=2\" data-rmx-reset-scroll=\"manual\" data-rmx-reset-focus=\"manual\">\n  Next page\n</a>\n```\n\nExisting boolean options and `\"true\"` / `\"false\"` attribute values remain supported: `true` corresponds to `\"after-transition\"` and `false` to `\"manual\"`.\n\nAdd `data-rmx-document` to a link or form to leave that navigation to the browser. To keep all links\nand forms as document navigations while still hydrating client entries and using explicit frames,\nregister a listener before calling `run()`:\n\n```ts\nwindow.navigation?.addEventListener('navigate', (e) => e.stopImmediatePropagation())\n```\n\nThis prevents Remix from intercepting Navigation API events. Explicit frame reloads such as\n`handle.frame.reload()` continue to use the frame resolver.\n\nThe default resolver accepts `2xx` responses and `3xx` or `4xx` responses whose `Content-Type` includes `text/html`, ignoring case. It rejects other `3xx` or `4xx` responses and all `5xx` responses with an error containing their status and status text. A custom `resolveFrame` may return a `Response` with any status when it wants the component runtime to render the response body.\n\nLinks and forms remain ordinary HTML elements before the runtime starts. Use `data-rmx-target` to reload a named frame, `data-rmx-src` to fetch a different same-origin URL for that named frame while keeping `href` or `action` as the browser destination, or `data-rmx-document` to force a full-document navigation:\n\n```tsx\nimport { Frame } from 'remix/component'\n\nfunction AccountPage() {\n  return () => (\n    <>\n      <Frame name=\"account\" src=\"/account/edit\" />\n      <form action=\"/account/edit\" method=\"post\" data-rmx-target=\"account\">\n        <label for=\"display-name\">Display name</label>\n        <input id=\"display-name\" name=\"displayName\" required />\n        <button type=\"submit\">Save</button>\n      </form>\n    </>\n  )\n}\n```\n\nNative constraint validation and submitter overrides still apply. GET form values arrive in `src`; non-GET forms provide `formData`, `method`, and `encType` to the resolver. See [Frames](https://github.com/remix-run/remix/blob/main/packages/component/docs/frames.md#form-navigation) for targeting, history behavior, request encoding, opt-outs, and server response guidance.\n\nReload another source or send a request body without changing browser history:\n\n```tsx\nawait handle.frame.reload({ src: '/account/edit' })\n\nlet body = new FormData()\nbody.set('displayName', 'Ada')\nawait handle.frame.reload({\n  src: '/account/edit',\n  method: 'post',\n  body,\n})\n```\n\n`src` becomes the source for subsequent reloads. Pass `FormData` as `body` to submit fields. The method defaults to GET, which encodes the fields into the source query. POST defaults to `application/x-www-form-urlencoded`; use `encType` to select `multipart/form-data` or `text/plain`. Methods and encodings are case-insensitive; unsupported values use the defaults. See [Reload requests](https://github.com/remix-run/remix/blob/main/packages/component/docs/frames.md#reload-requests) for request and cancellation behavior.\n\nUse `data-rmx-history=\"push|replace\"` on an enhanced anchor or form to control how the navigation updates history. This can override the automatic replacement used for non-GET form submissions to the current URL.\n\nAdd `data-rmx-prefetch=\"intent\"` to a link to start loading its page when the visitor hovers, focuses, or presses it. Use `data-rmx-prefetch=\"viewport\"` to start loading when the link enters the viewport. Remix fetches its HTML to discover JavaScript, CSS, and explicit image and font preloads for asset prefetch hints. Navigation uses the default resolver and browser HTTP cache; even uncacheable HTML can reveal cacheable assets. See [Prefetching](https://github.com/remix-run/remix/blob/main/packages/component/docs/frames.md#prefetching) for trigger details, caching behavior, and custom strategies.\n\nNamed-frame links with `data-rmx-target` are supported, including `data-rmx-src` overrides. Prefetching uses the selected frame's source and sends its target, matching the eventual frame request.\n\nAutomatic link prefetching is skipped when the browser reports Save-Data or an effective connection type of `slow-2g` or `2g`. Imperative `prefetch()` calls remain available regardless of these settings.\n\nYou can implement other prefetch triggers in userland with the imperative `prefetch()` API from `remix/component`, such as prefetching a search result as the visitor types. Call `prefetch(src, { target: 'details' })` to prefetch content for a named frame.\n\n## Single-page Applications\n\nUse `render` and `run` from `remix/spa` when every route runs in the browser and returns a component\ntree instead of an HTTP response body. The render middleware keeps the router's standard `Request`\nto `Response` contract while associating the response with a node for the top frame to render:\n\n```tsx\nimport { createRouter } from 'remix/router'\nimport { render, run } from 'remix/spa'\n\nlet router = createRouter({ middleware: [render()] })\n\nrouter.get('/', ({ render }) => render(<h1>Home</h1>))\nrouter.get('/about', ({ render }) => render(<h1>About</h1>))\n\nfunction LoadingPage() {\n  return () => <p role=\"status\">Loading…</p>\n}\n\nlet app = run(router, { fallback: <LoadingPage /> })\nawait app.ready()\n```\n\nThe optional `fallback` is a live Remix node displayed while the initial route loads.\n`app.ready()` resolves after the initial URL has replaced it with the routed node. The runtime then\nreuses frame navigation for same-origin links, forms, history traversal, redirects, cancellation,\nand `rmx-target`.\n\n## Preserving Client-Owned DOM\n\nUse `data-rmx-preserve-dom` on the smallest element whose live DOM should belong to client code after initial render, such as a custom element or third-party widget:\n\n```tsx\n<pagefind-ui data-rmx-key=\"search\" data-rmx-preserve-dom>\n  <button type=\"button\">Search</button>\n</pagefind-ui>\n```\n\nThe component runtime still renders the element's children during SSR and still hydrates any initial client entries inside it. On later frame reloads, matched `data-rmx-preserve-dom` elements keep their current attributes and children instead of accepting incoming DOM updates. See [Preserving client-owned DOM](https://github.com/remix-run/remix/blob/main/packages/component/docs/frames.md#preserving-client-owned-dom) for guidance and caveats.\n\nUse `data-rmx-preserve-attrs` when client code owns only specific attributes, such as a theme set on `<html>`:\n\n```html\n<html lang=\"en\" data-rmx-preserve-attrs=\"data-theme\"></html>\n```\n\nOn frame reloads, the space-separated attribute names in the incoming HTML keep their live values or absence. Other attributes and children reconcile normally. An empty or omitted list uses normal attribute reconciliation. This works on any matched element; it does not prevent removal or replacement. See [Preserving client-owned attributes](https://github.com/remix-run/remix/blob/main/packages/component/docs/frames.md#preserving-client-owned-attributes) for examples and ownership rules.\n\n## Raw HTML with unsafeHTML\n\nHost raw-HTML props (`innerHTML` and iframe `srcDoc` / `srcdoc`) require an explicit value created with `unsafeHTML(...)`:\n\n```tsx\nimport { unsafeHTML } from 'remix/component'\nimport type { Handle } from 'remix/component'\n\nfunction ArticleBody(handle: Handle<{ html: string }>) {\n  return () => <article innerHTML={unsafeHTML(handle.props.html)} />\n}\n```\n\nWhen `innerHTML` is set, the element's `children` are ignored. `unsafeHTML()` is an authorization boundary and does not sanitize input; only pass trusted or already-sanitized HTML.\n\n## Cascade Layers\n\nThe component runtime emits generated `css(...)` rules under the `rmx` cascade layer. Unlayered CSS outranks layered CSS, so use explicit layer order when mixing generated styles with global styles.\n\nPut layers that should lose to generated styles before `rmx`:\n\n```css\n@layer base, rmx;\n\n@layer base {\n  button,\n  input,\n  textarea,\n  select {\n    font: inherit;\n    margin: 0;\n    padding: 0;\n  }\n}\n```\n\n## License\n\nSee [LICENSE](https://github.com/remix-run/remix/blob/main/LICENSE)\n","readmeFilename":"README.md"}