{"_id":"@amritk/mini","_rev":"11-342070f987a675e5eb8085382760e539","name":"@amritk/mini","dist-tags":{"latest":"0.7.1"},"versions":{"0.0.0":{"name":"@amritk/mini","version":"0.0.0","keywords":["signals","reactive","jsx","dom","ui","typescript","mjst"],"author":{"name":"amritk"},"license":"MIT","_id":"@amritk/mini@0.0.0","maintainers":[{"name":"amritk","email":"amrit+spam@hockey-community.com"}],"homepage":"https://github.com/amritk/mjst/tree/main/packages/mini#readme","bugs":{"url":"https://github.com/amritk/mjst/issues"},"dist":{"shasum":"9ce5b5a43f560781ca783488c5afb0561e04c53a","tarball":"https://registry.npmjs.org/@amritk/mini/-/mini-0.0.0.tgz","fileCount":11,"integrity":"sha512-G8SJpEJTnYIxiLRu+BQoj8TRuzirjnarEIIm7m8t4snYlgcWG7FzNehHzPLZ09qRokVKDPjA72YDPXhzStxD+A==","signatures":[{"sig":"MEUCIFImeSE7uv25JpXyTAGomqvVEW8VcduPmqcZ/LqbBuXsAiEAlTVwtMO0bZTvH+6MbHZYns8l/3QVKoDgmKHJvXxhOko=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":32686},"type":"module","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js","development":"./src/index.ts"},"./jsx-runtime":{"types":"./dist/jsx-runtime.d.ts","import":"./dist/jsx-runtime.js","default":"./dist/jsx-runtime.js","development":"./src/jsx-runtime.ts"},"./package.json":"./package.json","./jsx-dev-runtime":{"types":"./dist/jsx-dev-runtime.d.ts","import":"./dist/jsx-dev-runtime.js","default":"./dist/jsx-dev-runtime.js","development":"./src/jsx-dev-runtime.ts"}},"gitHead":"508aafec11eccb3ae837523b91f7e885c1e618a4","scripts":{"test":"NODE_ENV=production vitest run --root ../.. mini","build":"tsgo -p tsconfig.build.json && tsc-alias -p tsconfig.build.json -f && node ../../scripts/strip-comments.mjs","types:check":"tsgo -p . --noEmit"},"_npmUser":{"name":"amritk","email":"amrit+spam@hockey-community.com"},"repository":{"url":"git+https://github.com/amritk/mjst.git","type":"git","directory":"packages/mini"},"_npmVersion":"11.16.0","description":"A deliberately tiny signals-based UI layer: reactive DOM bindings plus a compilerless JSX runtime.","directories":{},"_nodeVersion":"26.3.0","dependencies":{"alien-signals":"catalog:"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/mini_0.0.0_1784616384285_0.8827588689604016","host":"s3://npm-registry-packages-npm-production"}},"0.1.0":{"name":"@amritk/mini","version":"0.1.0","keywords":["signals","reactive","jsx","dom","ui","typescript","mjst"],"author":{"name":"amritk"},"license":"MIT","_id":"@amritk/mini@0.1.0","maintainers":[{"name":"amritk","email":"amrit+spam@hockey-community.com"}],"homepage":"https://github.com/amritk/mjst/tree/main/packages/mini#readme","bugs":{"url":"https://github.com/amritk/mjst/issues"},"dist":{"shasum":"10b080bac9ef164400fac1dc870744b4ea42eaa1","tarball":"https://registry.npmjs.org/@amritk/mini/-/mini-0.1.0.tgz","fileCount":93,"integrity":"sha512-GYHlX9gaujqJg+u3uUcFHLeofhJCg/Spua1HRSu4Z3Fh9VqqsQ8k15hgMFacCvn3M87Qc8+oyOVoUKlEQbP2Xw==","signatures":[{"sig":"MEUCIQDRfZDBwiTe4sU5zqgZJ54+tOk3NoBCIVlzTcSI0djk+AIgZXKQs+WsC7gUip7wSOYPhWWo+b7PyajtFO7vyKLZyyw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@amritk%2fmini@0.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":146056},"type":"module","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./flow":{"types":"./dist/flow/index.d.ts","import":"./dist/flow/index.js","default":"./dist/flow/index.js"},"./forms":{"types":"./dist/forms/index.d.ts","import":"./dist/forms/index.js","default":"./dist/forms/index.js"},"./query":{"types":"./dist/query/index.d.ts","import":"./dist/query/index.js","default":"./dist/query/index.js"},"./router":{"types":"./dist/router/index.d.ts","import":"./dist/router/index.js","default":"./dist/router/index.js"},"./jsx-runtime":{"types":"./dist/jsx-runtime.d.ts","import":"./dist/jsx-runtime.js","default":"./dist/jsx-runtime.js"},"./package.json":"./package.json","./jsx-dev-runtime":{"types":"./dist/jsx-dev-runtime.d.ts","import":"./dist/jsx-dev-runtime.js","default":"./dist/jsx-dev-runtime.js"}},"gitHead":"ffae0ea7b890071fbb29072cb5e33e9ea513c66b","scripts":{"test":"NODE_ENV=production vitest run --root ../.. mini","build":"tsgo -p tsconfig.build.json && tsc-alias -p tsconfig.build.json -f && node ../../scripts/strip-comments.mjs","types:check":"tsgo -p . --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e9f627d1-e5fd-4db0-8dc3-395e61040d50"}},"repository":{"url":"git+https://github.com/amritk/mjst.git","type":"git","directory":"packages/mini"},"_npmVersion":"12.0.1","description":"A deliberately tiny signals-based UI layer: reactive DOM bindings plus a compilerless JSX runtime.","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{"alien-signals":"3.2.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@tanstack/query-core":"^5.101.2","@amritk/runtime-validators":"0.7.3"},"peerDependencies":{"@tanstack/query-core":"^5","@amritk/runtime-validators":"0.7.3"},"peerDependenciesMeta":{"@tanstack/query-core":{"optional":true},"@amritk/runtime-validators":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/mini_0.1.0_1784628926050_0.5226701420750652","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@amritk/mini","version":"0.2.0","keywords":["signals","reactive","jsx","dom","ui","typescript","mjst"],"author":{"name":"amritk"},"license":"MIT","_id":"@amritk/mini@0.2.0","maintainers":[{"name":"amritk","email":"amrit+spam@hockey-community.com"}],"homepage":"https://github.com/amritk/mjst/tree/main/packages/mini#readme","bugs":{"url":"https://github.com/amritk/mjst/issues"},"dist":{"shasum":"a3bd6c9853a9701a8e761eb5f1efa368a30e6868","tarball":"https://registry.npmjs.org/@amritk/mini/-/mini-0.2.0.tgz","fileCount":99,"integrity":"sha512-Gmh9Gyy8vDh3RlLxPpuzDuVMJqP/OQ4JzI5SMAxz8z4fj7d3fb1eOOO1ZrJV7OY2QBBzabOsp8zaOFhyWrlYMA==","signatures":[{"sig":"MEYCIQDSUM1QfcQ08eaOuPPbIlkrCTRgmCtj+jVHaZx6DsxPnwIhAMMQJO2ESKFm/5CvdVJ9Mis08S490pW2NRIG6W69l47C","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@amritk%2fmini@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":181399},"type":"module","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./flow":{"types":"./dist/flow/index.d.ts","import":"./dist/flow/index.js","default":"./dist/flow/index.js"},"./forms":{"types":"./dist/forms/index.d.ts","import":"./dist/forms/index.js","default":"./dist/forms/index.js"},"./query":{"types":"./dist/query/index.d.ts","import":"./dist/query/index.js","default":"./dist/query/index.js"},"./router":{"types":"./dist/router/index.d.ts","import":"./dist/router/index.js","default":"./dist/router/index.js"},"./jsx-runtime":{"types":"./dist/jsx-runtime.d.ts","import":"./dist/jsx-runtime.js","default":"./dist/jsx-runtime.js"},"./package.json":"./package.json","./jsx-dev-runtime":{"types":"./dist/jsx-dev-runtime.d.ts","import":"./dist/jsx-dev-runtime.js","default":"./dist/jsx-dev-runtime.js"}},"gitHead":"422339cbd45946cd2ab126a80de8532e39cb5872","scripts":{"test":"NODE_ENV=production vitest run --root ../.. mini","build":"tsgo -p tsconfig.build.json && tsc-alias -p tsconfig.build.json -f && node ../../scripts/strip-comments.mjs","types:check":"tsgo -p . --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e9f627d1-e5fd-4db0-8dc3-395e61040d50"}},"repository":{"url":"git+https://github.com/amritk/mjst.git","type":"git","directory":"packages/mini"},"_npmVersion":"12.0.1","description":"A deliberately tiny signals-based UI layer: reactive DOM bindings plus a compilerless JSX runtime.","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{"alien-signals":"3.2.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@tanstack/query-core":"^5.101.2","@amritk/runtime-validators":"0.7.3"},"peerDependencies":{"@tanstack/query-core":"^5","@amritk/runtime-validators":"0.7.3"},"peerDependenciesMeta":{"@tanstack/query-core":{"optional":true},"@amritk/runtime-validators":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/mini_0.2.0_1784665069126_0.008980771596777348","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@amritk/mini","version":"0.3.0","keywords":["signals","reactive","jsx","dom","ui","typescript","mjst"],"author":{"name":"amritk"},"license":"MIT","_id":"@amritk/mini@0.3.0","maintainers":[{"name":"amritk","email":"amrit+spam@hockey-community.com"}],"homepage":"https://github.com/amritk/mjst/tree/main/packages/mini#readme","bugs":{"url":"https://github.com/amritk/mjst/issues"},"dist":{"shasum":"8fe86bdd36be34db44391f7e702e1e4cafc4db75","tarball":"https://registry.npmjs.org/@amritk/mini/-/mini-0.3.0.tgz","fileCount":99,"integrity":"sha512-GOav4HAn3ClBHUV+5o8CPTfvQVAJrOoELJW+PIFfl3nwTqmw4v7bJE/ADZA5ZKaBm086lMOgQYoLnlZct4329w==","signatures":[{"sig":"MEYCIQCPv8HLyTU+vslJRt1ANIZ1P6exphCRCbr0mjGWfhLO/AIhAOAz+0N4NZGRZQg59mkahGWfFZCb7eAaG0ggamfQ3XHn","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@amritk%2fmini@0.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":186122},"type":"module","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./flow":{"types":"./dist/flow/index.d.ts","import":"./dist/flow/index.js","default":"./dist/flow/index.js"},"./forms":{"types":"./dist/forms/index.d.ts","import":"./dist/forms/index.js","default":"./dist/forms/index.js"},"./query":{"types":"./dist/query/index.d.ts","import":"./dist/query/index.js","default":"./dist/query/index.js"},"./router":{"types":"./dist/router/index.d.ts","import":"./dist/router/index.js","default":"./dist/router/index.js"},"./jsx-runtime":{"types":"./dist/jsx-runtime.d.ts","import":"./dist/jsx-runtime.js","default":"./dist/jsx-runtime.js"},"./package.json":"./package.json","./jsx-dev-runtime":{"types":"./dist/jsx-dev-runtime.d.ts","import":"./dist/jsx-dev-runtime.js","default":"./dist/jsx-dev-runtime.js"}},"gitHead":"1c1f15aea5102f6657b0808dc20db868badb6459","scripts":{"test":"NODE_ENV=production vitest run --root ../.. mini","build":"tsgo -p tsconfig.build.json && tsc-alias -p tsconfig.build.json -f && node ../../scripts/strip-comments.mjs","types:check":"tsgo -p . --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e9f627d1-e5fd-4db0-8dc3-395e61040d50"}},"repository":{"url":"git+https://github.com/amritk/mjst.git","type":"git","directory":"packages/mini"},"_npmVersion":"12.0.1","description":"A deliberately tiny signals-based UI layer: reactive DOM bindings plus a compilerless JSX runtime.","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{"alien-signals":"3.2.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@tanstack/query-core":"^5.101.2","@amritk/runtime-validators":"0.7.3"},"peerDependencies":{"@tanstack/query-core":"^5","@amritk/runtime-validators":"0.7.3"},"peerDependenciesMeta":{"@tanstack/query-core":{"optional":true},"@amritk/runtime-validators":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/mini_0.3.0_1784676201249_0.2194219830281332","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"@amritk/mini","version":"0.4.1","keywords":["signals","reactive","jsx","dom","ui","typescript","mjst"],"author":{"name":"amritk"},"license":"MIT","_id":"@amritk/mini@0.4.1","maintainers":[{"name":"amritk","email":"amrit+spam@hockey-community.com"}],"homepage":"https://github.com/amritk/mjst/tree/main/packages/mini#readme","bugs":{"url":"https://github.com/amritk/mjst/issues"},"dist":{"shasum":"4d4e236b56cd6defc7ebb7cafa5b77d3685e7266","tarball":"https://registry.npmjs.org/@amritk/mini/-/mini-0.4.1.tgz","fileCount":109,"integrity":"sha512-U8ui63M+Brgl8+q8GaXWMqstcEeMqJN4on5YMQQixNVPmdRNkS0z8HapwMRoMiKhdntCUx4hgcX6BO+vJLS7tw==","signatures":[{"sig":"MEYCIQDiD5C2fAodnmlpGlTjJBzhlrw8apWLxAIMwEXtNvIr/QIhAOG6pz6aXbg3kgIGnTSb+nbMoxkaR0Pbbh5NsWQid3kI","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@amritk%2fmini@0.4.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":221434},"type":"module","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./flow":{"types":"./dist/flow/index.d.ts","import":"./dist/flow/index.js","default":"./dist/flow/index.js"},"./vite":{"types":"./dist/vite/index.d.ts","import":"./dist/vite/index.js","default":"./dist/vite/index.js"},"./forms":{"types":"./dist/forms/index.d.ts","import":"./dist/forms/index.js","default":"./dist/forms/index.js"},"./query":{"types":"./dist/query/index.d.ts","import":"./dist/query/index.js","default":"./dist/query/index.js"},"./router":{"types":"./dist/router/index.d.ts","import":"./dist/router/index.js","default":"./dist/router/index.js"},"./jsx-runtime":{"types":"./dist/jsx-runtime.d.ts","import":"./dist/jsx-runtime.js","default":"./dist/jsx-runtime.js"},"./package.json":"./package.json","./jsx-dev-runtime":{"types":"./dist/jsx-dev-runtime.d.ts","import":"./dist/jsx-dev-runtime.js","default":"./dist/jsx-dev-runtime.js"}},"gitHead":"5c8f56932fa2b7660cd811582d7d975f0d5e729f","scripts":{"test":"NODE_ENV=production vitest run --root ../.. mini","build":"tsgo -p tsconfig.build.json && tsc-alias -p tsconfig.build.json -f && node ../../scripts/strip-comments.mjs","types:check":"tsgo -p . --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e9f627d1-e5fd-4db0-8dc3-395e61040d50"}},"repository":{"url":"git+https://github.com/amritk/mjst.git","type":"git","directory":"packages/mini"},"_npmVersion":"12.0.1","description":"A deliberately tiny signals-based UI layer: reactive DOM bindings plus a compilerless JSX runtime.","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{"alien-signals":"3.2.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8","typescript":"^5","@tanstack/query-core":"^5.101.2","@amritk/runtime-validators":"0.8.0"},"peerDependencies":{"vite":"^5 || ^6 || ^7 || ^8","typescript":"^5","@tanstack/query-core":"^5","@amritk/runtime-validators":">=0.8.0"},"peerDependenciesMeta":{"vite":{"optional":true},"typescript":{"optional":true},"@tanstack/query-core":{"optional":true},"@amritk/runtime-validators":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/mini_0.4.1_1784738673585_0.8770929082035519","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@amritk/mini","version":"0.5.0","keywords":["signals","reactive","jsx","dom","ui","typescript","mjst"],"author":{"name":"amritk"},"license":"MIT","_id":"@amritk/mini@0.5.0","maintainers":[{"name":"amritk","email":"amrit+spam@hockey-community.com"}],"homepage":"https://github.com/amritk/mjst/tree/main/packages/mini#readme","bugs":{"url":"https://github.com/amritk/mjst/issues"},"dist":{"shasum":"109975e2cc291263acbe57df89b87d1b771fbba9","tarball":"https://registry.npmjs.org/@amritk/mini/-/mini-0.5.0.tgz","fileCount":118,"integrity":"sha512-zUHhPf0IgQuw78PKCqbNmXtx+kwCNxkp94/FGaMEAM6J0wcvNtKAq3RFSn8DBcMiZ4QHEIAQOo9MRxY3ulIVUw==","signatures":[{"sig":"MEYCIQCNwGnJ4Qw0xvMxPd3auE6UgZ/AY3nMPhWiILPam1jkDgIhAOBqJVCmzpf8/ymKaxzKakLx/ITTPNQWBb0vDcdUriTE","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@amritk%2fmini@0.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":266278},"type":"module","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./flow":{"types":"./dist/flow/index.d.ts","import":"./dist/flow/index.js","default":"./dist/flow/index.js"},"./vite":{"types":"./dist/vite/index.d.ts","import":"./dist/vite/index.js","default":"./dist/vite/index.js"},"./forms":{"types":"./dist/forms/index.d.ts","import":"./dist/forms/index.js","default":"./dist/forms/index.js"},"./query":{"types":"./dist/query/index.d.ts","import":"./dist/query/index.js","default":"./dist/query/index.js"},"./router":{"types":"./dist/router/index.d.ts","import":"./dist/router/index.js","default":"./dist/router/index.js"},"./jsx-runtime":{"types":"./dist/jsx-runtime.d.ts","import":"./dist/jsx-runtime.js","default":"./dist/jsx-runtime.js"},"./package.json":"./package.json","./jsx-dev-runtime":{"types":"./dist/jsx-dev-runtime.d.ts","import":"./dist/jsx-dev-runtime.js","default":"./dist/jsx-dev-runtime.js"}},"gitHead":"4008a1da41512933f7d05206b0d7bc6563cea4ce","scripts":{"test":"NODE_ENV=production vitest run --root ../.. mini","build":"tsgo -p tsconfig.build.json && tsc-alias -p tsconfig.build.json -f && node ../../scripts/strip-comments.mjs","types:check":"tsgo -p . --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e9f627d1-e5fd-4db0-8dc3-395e61040d50"}},"repository":{"url":"git+https://github.com/amritk/mjst.git","type":"git","directory":"packages/mini"},"_npmVersion":"12.0.1","description":"A deliberately tiny signals-based UI layer: reactive DOM bindings plus a compilerless JSX runtime.","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{"alien-signals":"3.2.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8","typescript":"^5","@tanstack/query-core":"^5.101.2","@amritk/runtime-validators":"0.9.0"},"peerDependencies":{"vite":"^5 || ^6 || ^7 || ^8","typescript":"^5","@tanstack/query-core":"^5","@amritk/runtime-validators":">=0.8.0"},"peerDependenciesMeta":{"vite":{"optional":true},"typescript":{"optional":true},"@tanstack/query-core":{"optional":true},"@amritk/runtime-validators":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/mini_0.5.0_1784875833157_0.04276904271926685","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@amritk/mini","version":"0.6.0","keywords":["signals","reactive","jsx","dom","ui","typescript","mjst"],"author":{"name":"amritk"},"license":"MIT","_id":"@amritk/mini@0.6.0","maintainers":[{"name":"amritk","email":"amrit+spam@hockey-community.com"}],"homepage":"https://github.com/amritk/mini/tree/main/packages/mini#readme","bugs":{"url":"https://github.com/amritk/mini/issues"},"dist":{"shasum":"b8405a185d72cb4fe59f3ef2bf6f7584af69f345","tarball":"https://registry.npmjs.org/@amritk/mini/-/mini-0.6.0.tgz","fileCount":121,"integrity":"sha512-yoJatxF37Xu9hx7ITT7NatysQrOS0X4oPCeciNvbQkyTa81/XUEqH+qKcqq8zBrNI1hum2ktggjGsMoPAV3D0w==","signatures":[{"sig":"MEQCIHJwW7z6IlfAkq8arGF+jfPKtp16BCFjPDRTLnwR8DVnAiA5hMOLHyZ6eXYfCmjCkf6I6zPQyqMGtz9Qip9pIOtwVQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@amritk%2fmini@0.6.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":306477},"type":"module","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./hot":{"types":"./dist/hot/index.d.ts","import":"./dist/hot/index.js","default":"./dist/hot/index.js"},"./flow":{"types":"./dist/flow/index.d.ts","import":"./dist/flow/index.js","default":"./dist/flow/index.js"},"./vite":{"types":"./dist/vite/index.d.ts","import":"./dist/vite/index.js","default":"./dist/vite/index.js"},"./forms":{"types":"./dist/forms/index.d.ts","import":"./dist/forms/index.js","default":"./dist/forms/index.js"},"./query":{"types":"./dist/query/index.d.ts","import":"./dist/query/index.js","default":"./dist/query/index.js"},"./router":{"types":"./dist/router/index.d.ts","import":"./dist/router/index.js","default":"./dist/router/index.js"},"./jsx-runtime":{"types":"./dist/jsx-runtime.d.ts","import":"./dist/jsx-runtime.js","default":"./dist/jsx-runtime.js"},"./package.json":"./package.json","./jsx-dev-runtime":{"types":"./dist/jsx-dev-runtime.d.ts","import":"./dist/jsx-dev-runtime.js","default":"./dist/jsx-dev-runtime.js"}},"gitHead":"f54a9de1987e2804c290bd70745b58db074caeca","scripts":{"test":"NODE_ENV=production vitest run --root ../.. packages/mini/","build":"tsgo -p tsconfig.build.json && tsc-alias -p tsconfig.build.json -f && node ../../scripts/strip-comments.mjs","types:check":"tsgo -p . --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:54c8edef-27ab-42d2-8560-084ce3bb6260"}},"repository":{"url":"git+https://github.com/amritk/mini.git","type":"git","directory":"packages/mini"},"_npmVersion":"12.0.1","description":"A deliberately tiny signals-based UI layer: reactive DOM bindings plus a compilerless JSX runtime.","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{"alien-signals":"3.2.1","@amritk/mini-helpers":"0.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8","typescript":"^5","@tanstack/query-core":"^5.101.2","@amritk/runtime-validators":"^0.9.0"},"peerDependencies":{"vite":"^5 || ^6 || ^7 || ^8","typescript":"^5","@tanstack/query-core":"^5","@amritk/runtime-validators":">=0.8.0"},"peerDependenciesMeta":{"vite":{"optional":true},"typescript":{"optional":true},"@tanstack/query-core":{"optional":true},"@amritk/runtime-validators":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/mini_0.6.0_1785226637625_0.01358090730379291","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@amritk/mini","version":"0.7.0","keywords":["signals","reactive","jsx","dom","ui","typescript","mjst"],"author":{"name":"amritk"},"license":"MIT","_id":"@amritk/mini@0.7.0","maintainers":[{"name":"amritk","email":"amrit+spam@hockey-community.com"}],"homepage":"https://github.com/amritk/mini/tree/main/packages/mini#readme","bugs":{"url":"https://github.com/amritk/mini/issues"},"dist":{"shasum":"bb6ed5989d00e729a1003d173fc2255440be4dde","tarball":"https://registry.npmjs.org/@amritk/mini/-/mini-0.7.0.tgz","fileCount":118,"integrity":"sha512-LG68g87HySEXVIycbv3rCI8j9LV+0BWquGnJCGDTZqCLyR+0G+MNdURxeBGizZdFLWYcZpbZUl2nykWj5hy7mA==","signatures":[{"sig":"MEUCIHPGBiyD0IYHcZewNRAgEYAZL9Txo44CVumUBtmXUW9MAiEAqn+92X3LS19zuch0rgs5i6sTJanGDbIltuqgtYRRamc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@amritk%2fmini@0.7.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":309333},"type":"module","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./hot":{"types":"./dist/hot/index.d.ts","import":"./dist/hot/index.js","default":"./dist/hot/index.js"},"./flow":{"types":"./dist/flow/index.d.ts","import":"./dist/flow/index.js","default":"./dist/flow/index.js"},"./vite":{"types":"./dist/vite/index.d.ts","import":"./dist/vite/index.js","default":"./dist/vite/index.js"},"./forms":{"types":"./dist/forms/index.d.ts","import":"./dist/forms/index.js","default":"./dist/forms/index.js"},"./query":{"types":"./dist/query/index.d.ts","import":"./dist/query/index.js","default":"./dist/query/index.js"},"./router":{"types":"./dist/router/index.d.ts","import":"./dist/router/index.js","default":"./dist/router/index.js"},"./jsx-runtime":{"types":"./dist/jsx-runtime.d.ts","import":"./dist/jsx-runtime.js","default":"./dist/jsx-runtime.js"},"./package.json":"./package.json","./jsx-dev-runtime":{"types":"./dist/jsx-dev-runtime.d.ts","import":"./dist/jsx-dev-runtime.js","default":"./dist/jsx-dev-runtime.js"}},"gitHead":"9c6b6bc96beba6a5f106f5e1bf5d7d0ab3b762c1","scripts":{"test":"NODE_ENV=production vitest run --root ../.. packages/mini/","build":"tsgo -p tsconfig.build.json && tsc-alias -p tsconfig.build.json -f && node ../../scripts/strip-comments.mjs","types:check":"tsgo -p . --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:54c8edef-27ab-42d2-8560-084ce3bb6260"}},"repository":{"url":"git+https://github.com/amritk/mini.git","type":"git","directory":"packages/mini"},"_npmVersion":"12.0.2","description":"A deliberately tiny signals-based UI layer: reactive DOM bindings plus a compilerless JSX runtime.","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{"alien-signals":"3.2.1","@amritk/mini-helpers":"0.2.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8","typescript":"^5","@tanstack/query-core":"^5.101.2","@amritk/runtime-validators":"^0.9.0"},"peerDependencies":{"vite":"^5 || ^6 || ^7 || ^8","typescript":"^5","@tanstack/query-core":"^5","@amritk/runtime-validators":">=0.8.0"},"peerDependenciesMeta":{"vite":{"optional":true},"typescript":{"optional":true},"@tanstack/query-core":{"optional":true},"@amritk/runtime-validators":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/mini_0.7.0_1785905546087_0.9712514483533594","host":"s3://npm-registry-packages-npm-production"}},"0.7.1":{"name":"@amritk/mini","version":"0.7.1","description":"A deliberately tiny signals-based UI layer: reactive DOM bindings plus a compilerless JSX runtime.","type":"module","license":"MIT","author":{"name":"amritk"},"sideEffects":false,"keywords":["signals","reactive","jsx","dom","ui","typescript","mjst"],"repository":{"type":"git","url":"git+https://github.com/amritk/mini.git","directory":"packages/mini"},"homepage":"https://github.com/amritk/mini/tree/main/packages/mini#readme","bugs":{"url":"https://github.com/amritk/mini/issues"},"publishConfig":{"access":"public"},"scripts":{"build":"tsgo -p tsconfig.build.json && tsc-alias -p tsconfig.build.json -f && node ../../scripts/strip-comments.mjs","prepublishOnly":"node ../../scripts/check-publishable.mjs","types:check":"tsgo -p . --noEmit","test":"NODE_ENV=production vitest run --root ../.. packages/mini/"},"dependencies":{"@amritk/mini-helpers":"0.2.0","alien-signals":"3.2.1"},"exports":{"./package.json":"./package.json",".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./jsx-runtime":{"types":"./dist/jsx-runtime.d.ts","import":"./dist/jsx-runtime.js","default":"./dist/jsx-runtime.js"},"./jsx-dev-runtime":{"types":"./dist/jsx-dev-runtime.d.ts","import":"./dist/jsx-dev-runtime.js","default":"./dist/jsx-dev-runtime.js"},"./router":{"types":"./dist/router/index.d.ts","import":"./dist/router/index.js","default":"./dist/router/index.js"},"./flow":{"types":"./dist/flow/index.d.ts","import":"./dist/flow/index.js","default":"./dist/flow/index.js"},"./forms":{"types":"./dist/forms/index.d.ts","import":"./dist/forms/index.js","default":"./dist/forms/index.js"},"./query":{"types":"./dist/query/index.d.ts","import":"./dist/query/index.js","default":"./dist/query/index.js"},"./hot":{"types":"./dist/hot/index.d.ts","import":"./dist/hot/index.js","default":"./dist/hot/index.js"},"./vite":{"types":"./dist/vite/index.d.ts","import":"./dist/vite/index.js","default":"./dist/vite/index.js"}},"peerDependencies":{"@amritk/runtime-validators":">=0.8.0","@tanstack/query-core":"^5","typescript":"^5","vite":"^5 || ^6 || ^7 || ^8"},"peerDependenciesMeta":{"@amritk/runtime-validators":{"optional":true},"@tanstack/query-core":{"optional":true},"typescript":{"optional":true},"vite":{"optional":true}},"devDependencies":{"@amritk/runtime-validators":"^0.9.0","@tanstack/query-core":"^5.101.2","typescript":"^5","vite":"^8"},"gitHead":"c2516a9f0a935e9e8e1eda316d651ac48e0ccc71","_id":"@amritk/mini@0.7.1","_nodeVersion":"24.19.0","_npmVersion":"12.0.2","dist":{"integrity":"sha512-HgpmnA6Hkp8mpmy2mBq4lcsUt6OqX+P0m70qMQDENy5LdQAxbff6vLCHP5rXT6xMadmH8x+9PwRRUs9gg8Irtg==","shasum":"a279257c491b2447d4c617cba117a19c27bb655b","tarball":"https://registry.npmjs.org/@amritk/mini/-/mini-0.7.1.tgz","fileCount":118,"unpackedSize":311489,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@amritk%2fmini@0.7.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCICrr4vhc6klzOR1nCwGdYnoKvQP8mSd5ypk5Gp6KaFrwAiEAjfpMAiuExzgbxBpne1xTmQl5yXVQNAhoL/uNzFfAKHM="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:54c8edef-27ab-42d2-8560-084ce3bb6260"}},"directories":{},"maintainers":[{"name":"amritk","email":"amrit+spam@hockey-community.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/mini_0.7.1_1787351375702_0.027376797100961747"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-21T06:46:24.064Z","modified":"2026-08-21T22:29:36.147Z","0.0.0":"2026-07-21T06:46:24.423Z","0.1.0":"2026-07-21T10:15:26.207Z","0.2.0":"2026-07-21T20:17:49.325Z","0.3.0":"2026-07-21T23:23:21.408Z","1.0.0":"2026-07-22T06:45:54.952Z","0.4.1":"2026-07-22T16:44:33.728Z","0.5.0":"2026-07-24T06:50:33.287Z","0.6.0":"2026-07-28T08:17:17.757Z","0.7.0":"2026-08-05T04:52:26.220Z","0.7.1":"2026-08-21T22:29:35.853Z"},"bugs":{"url":"https://github.com/amritk/mini/issues"},"author":{"name":"amritk"},"license":"MIT","homepage":"https://github.com/amritk/mini/tree/main/packages/mini#readme","keywords":["signals","reactive","jsx","dom","ui","typescript","mjst"],"repository":{"type":"git","url":"git+https://github.com/amritk/mini.git","directory":"packages/mini"},"description":"A deliberately tiny signals-based UI layer: reactive DOM bindings plus a compilerless JSX runtime.","maintainers":[{"name":"amritk","email":"amrit+spam@hockey-community.com"}],"readme":"<div align=\"center\">\n\n# @amritk/mini\n\n**A deliberately tiny signals-based UI layer: reactive DOM bindings plus a compilerless JSX runtime.**\n\n![status](https://img.shields.io/badge/status-pre--alpha-ef4444?style=flat-square)&nbsp;\n![version](https://img.shields.io/npm/v/@amritk/mini?style=flat-square&logo=npm&logoColor=white&label=version&color=6366f1)&nbsp;\n![license](https://img.shields.io/badge/license-MIT-22c55e?style=flat-square)&nbsp;\n![size](https://img.shields.io/badge/deps-1%20(alien--signals)-f97316?style=flat-square)&nbsp;\n![vibe coded](https://img.shields.io/badge/vibe-coded-a855f7?style=flat-square)\n\n</div>\n\n---\n\n## Overview\n\n`@amritk/mini` is a minimal UI layer built on [alien-signals](https://github.com/stackblitz/alien-signals): fine-grained reactivity plus a small, capped set of DOM helpers and a compilerless JSX runtime. It ships from the [mini](../../README.md) monorepo, alongside its native sibling [`@amritk/mini-lynx`](../mini-lynx).\n\n**The cap is the design.** There is no virtual DOM, no diffing, and no re-render. JSX (or `template`) builds real DOM **once**; dynamic values flow through the bind helpers or function-valued props; and repetition goes through `list`. A component function runs a single time and returns the `HTMLElement` it built. If a feature seems to be missing here, the correct next step is usually a real framework (Preact or Solid), not a new helper.\n\n---\n\n## Installation\n\n```bash\nnpm install @amritk/mini\n# or\npnpm add @amritk/mini\n# or\nyarn add @amritk/mini\n# or\nbun add @amritk/mini\n```\n\n---\n\n## The reactivity rule\n\nThere is no compiler analysing your expressions, so reactivity is decided by **value shape at runtime**:\n\n- A **function-valued** attribute, child, or `show` is reactive — the runtime wraps it in an effect and re-applies it whenever the signals it reads change.\n- Any **other value** is static — applied once at creation, never again.\n\nSignals are zero-argument functions, so passing one **without calling it** is already a live binding:\n\n```tsx\n<button disabled={streaming}>      {/* reactive — tracks forever          */}\n<button disabled={streaming()}>    {/* STATIC — frozen at creation!       */}\n<span>{() => count() * 2}</span>   {/* reactive derived text              */}\n```\n\n---\n\n## API\n\n### Reactivity (`@amritk/mini`)\n\n| Export | Purpose |\n|:---|:---|\n| `signal(initial?)` | A writable signal. Call with no argument to read, with one to write. |\n| `computed(fn)` | A derived, read-only signal. |\n| `effect(fn)` | Run `fn` and re-run it whenever the signals it reads change. Returns a stop function. |\n| `effectScope(fn)` | Group effects so a single dispose tears them all down. |\n| `batch(fn)` | Coalesce several writes into one propagation pass. |\n| `watch(get, cb, opts?)` | Fire `cb(value, previous)` on change, **skipping** the initial run — mini's `watch`. Pass `{ immediate: true }` to also run once on setup (with `previous` as `undefined`). |\n| `onCleanup(fn)` | Register teardown to run when the enclosing `effectScope` is disposed. |\n| `mount(container, component)` | Run `component` in an owning `effectScope`, append its node, and return a `dispose` that removes the node and tears the scope down. The application root — use it so top-level bindings and `onCleanup` have an owner. |\n| `Signal<T>`, `ReadonlySignal<T>` | Types for the two halves of a signal. |\n\n### DOM bindings (`@amritk/mini`)\n\nEach binding ties one node property to a signal-reading getter and returns the effect's stop function. They write through `textContent`, attributes, and `classList` — never `innerHTML` — so bound data cannot inject markup.\n\n| Export | Purpose |\n|:---|:---|\n| `bindText(node, get)` | Keep `node.textContent` in sync. |\n| `bindAttr(node, name, get)` | Keep an attribute in sync (`false`/`null` removes it, `true` sets it bare). |\n| `bindClass(node, name, get)` | Toggle a single class. |\n| `bindShow(node, get)` | Show/hide via inline `display`. |\n| `bindValue(node, model)` | Two-way bind a text input/textarea to a string signal — mini's `v-model`. Holds writes during IME composition and commits on `compositionend`. |\n| `bindChecked(node, model)` | Two-way bind a checkbox/radio to a boolean signal — the `.checked` analogue of `bindValue`. |\n| `bindSelect(node, model)` | Two-way bind a `<select>` to a string signal — sets `.value` (the property, so the option selects) and writes back on `change`. |\n| `bindHtml(node, sanitize, get)` | The **one** sanctioned `innerHTML` sink; the sanitizer is a required argument at every call site. |\n\n### Structure (`@amritk/mini`)\n\n| Export | Purpose |\n|:---|:---|\n| `template(html)` | Parse a static HTML string once; returns a clone factory that also collects `data-ref` nodes. |\n| `list(container, items, key, create)` | Keyed reactive list: one node per key, disposed when its key leaves. |\n\n### JSX runtime (`@amritk/mini/jsx-runtime`, `@amritk/mini/jsx-dev-runtime`)\n\nThe automatic runtime TypeScript targets when a package sets `\"jsx\": \"react-jsx\"` and `\"jsxImportSource\": \"@amritk/mini\"`. Exposes `jsx`, `jsxs`, `jsxDEV`, and the `JSX` namespace, plus the `Component`, `MaybeReactive`, `MiniChild`, `MiniChildren`, `ClassValue`, `StyleValue`, and `TargetedEvent` types.\n\nSVG tags are created in the SVG namespace, so `<svg>`/`<path>`/… render as real SVG. `class` accepts a string, a (nestable) array with falsy entries dropped, or a `{ name: boolean }` toggle map; `style` accepts a cssText string or a property object (camelCase keys are kebab-cased) — each still static-or-reactive by the value-shape rule.\n\nIn a style object a **bare number means pixels**, as it does in React, Preact, and Solid: `style={{ width: 100 }}` is `100px`. The properties CSS treats as unitless (`opacity`, `zIndex`, `flex`, `lineHeight`, …) and custom `--*` properties are passed through untouched, and a string is always taken verbatim, so reach for one whenever you want a different unit.\n\n`show` and `style` can be used on the same element without fighting over `display`: hiding wins while it is in effect, and showing the element again restores whatever its own style asked for.\n\n`value`, `checked`, and `selected` are written through the DOM **property**, not the attribute, and applied after the element's children exist. The attribute only seeds a control's default, so an attribute write stops reaching the field the moment the user types in it — and on a `<select>` it never selects anything at all. Writing the property means `<input value={draft} />` keeps tracking after the first keystroke and `<select value={picked}>…</select>` selects the matching `<option>`. Two-way binding is still `bindValue`/`bindChecked`/`bindSelect`; these props are the one-way half.\n\n---\n\n## Layered modules (subpath exports)\n\nThe `.` entry above is the whole story for the bundle-size-sensitive embed widget: its only runtime dependency is `alien-signals`, and it imports **no** subpath module. The dashboards — which are not bundle-constrained — opt into more through tree-shakeable subpath exports. Each is its own module graph with its own README section below; importing one pulls in **none** of the others, and the widget that imports only `.` pays zero bytes for any of them. Two tests enforce this: a core import-boundary walk (`src/import-boundary.test.ts`) and a gzipped size budget (`src/core-size-budget.test.ts`) on the bundled `.` entry — and on `.` plus `/jsx-runtime` together, which is what a JSX app really ships once the transform's own import is counted.\n\nComposition is by **explicit import** in the consuming app — there is no runtime plugin registry and no `mini.use()`, because a registry would defeat tree-shaking. Dependencies are prop-drilled, not injected through a context.\n\n### Client router (`@amritk/mini/router`)\n\nA small client-side router for the dashboards, in history or hash mode.\n\n| Export | Purpose |\n|:---|:---|\n| `createRouter({ routes, mode?, base? })` | Matches the URL against a route table into a reactive `route` signal; returns `{ route, navigate, stop }`. Attaches its location listener immediately. The `route` state includes a parsed `query` record alongside the raw `search`. |\n| `matchRoute(pattern, path)` | Matches a `/users/:id` pattern (with an optional trailing `*` catch-all) against a pathname, returning captured params or `null`. Typed from the pattern when it is a literal: `matchRoute('/users/:id', path)` gives `{ id: string } \\| null`. |\n| `buildPath(pattern, params)` | The inverse — `buildPath('/users/:id', { id })` → `/users/42`, with values encoded so they round-trip back through `matchRoute`. The params argument is typed from the pattern, so a forgotten or misspelt one does not compile. |\n| `Link` | An `<a href>` that intercepts a plain left-click and calls `navigate` — modified clicks, non-primary buttons, and `preventDefault`ed events are left to the browser. Takes `navigate` as a prop (`navigate={router.navigate}`); `to` may be reactive. Pass `active` to mark the current link — it sets `aria-current=\"page\"`, and appends `activeClass` on top of `class` when you supply one — and `target`/`rel`/`title`/`id`/`style` pass through to the anchor. |\n| `RouterView` | Renders the matched route's view (the `view` key by default) and swaps it on navigation — the outlet that replaces a hand-written `route().route?.['view']` cast. Takes `router={router}`. |\n| `Route`, `RouterMode`, `RouterOptions`, `RouteState`, `Router`, `NavigateOptions`, `RouteParams`, `PathParams`, `LinkProps`, `RouterViewProps` | Exported types. |\n\n```tsx\nimport { createRouter, RouterView } from '@amritk/mini/router'\n\nconst router = createRouter({\n  routes: [\n    { path: '/', view: Home },\n    { path: '/users/:id', view: User },\n    { path: '*', view: NotFound },\n  ],\n})\n\n// RouterView reads the matched route's `view` and swaps it on navigation.\nconst app = <RouterView router={router} fallback={NotFound} />\n```\n\n### Control flow (`@amritk/mini/flow`)\n\nThe ergonomic control-flow components the core deliberately omits — each reuses a core primitive and adds nothing to `.`. Because mini has no compiler, JSX children are built eagerly; pass a **function** child to defer construction to when a branch is shown (and rebuild on re-entry), or a **node** to reuse and preserve its state.\n\n| Export | Purpose |\n|:---|:---|\n| `Show` | `<Show when={cond} fallback={…}>` — mounts one branch, tears down the other (bindings included). Truthiness drives it, so `when={user}` works. A function child receives the narrowed value as a getter — `{(user) => <b>{() => user().name}</b>}` — with `null`/`undefined` removed from its type; the getter updates reactively without rebuilding the branch. |\n| `For` | `<For each={items} key={…}>{(item, i) => …}</For>` — keyed list backed by the core `list`. `key` defaults to an object `id` / primitive value / index; supply it for reordering lists. Pass `fallback` to render an empty state while the list has no items, and `as` (with `class`/`style`/`ref`) to render into a real element instead of the default `display: contents` host — needed when the container itself is styled, e.g. a `divide-y` list whose separators only match direct children: `<For each={rows} as=\"ul\" class=\"divide-y\">`. |\n| `Switch` / `Match` | `<Switch fallback>…<Match when={…}>…</Match></Switch>` — renders the first truthy branch; only the winner is built. |\n| `Dynamic` | `<Dynamic component={tag} {...props}/>` — renders a tag or component chosen at runtime (`component` is a tag string or a getter/signal returning the tag/component). |\n| `ShowProps`, `ForProps`, `SwitchProps`, `MatchProps`, `DynamicProps`, `DynamicComponent`, `ChildFactory` | Exported types. |\n\n```tsx\nimport { For, Show } from '@amritk/mini/flow'\n\nconst Todos = (todos: () => readonly Todo[]): HTMLElement => (\n  <ul>\n    <Show when={() => todos().length} fallback={() => <li>nothing yet</li>}>\n      {() => <For each={todos} key={(t) => t.id}>{(t) => <li>{t.title}</li>}</For>}\n    </Show>\n  </ul>\n)\n```\n\n### Forms (`@amritk/mini/forms`)\n\nField state (value / dirty / touched / errors as signals), submit handling, and validation. Inputs wire up through the core `bindValue`.\n\n| Export | Purpose |\n|:---|:---|\n| `createForm({ initialValues, validate?, onSubmit? })` | Returns `{ values, errors, isValid, isDirty, isSubmitting, submitted, submitError, field, bind, setValue, setError, reset, handleSubmit }`. Errors recompute reactively; each field withholds its message until blurred or the form is submitted. A field's type follows its initial value (`string`, `number`, or `boolean`), and `bind` wires the matching control — `.checked` for checkbox/radio, a coerced number for number/range, `<select>` on change, `.value` otherwise. `setError(name, msg)` layers a server-side error (auto-cleared on edit); a rejected `onSubmit` is captured in `submitError` instead of rejecting. |\n| `Field` | `<Field form={form} name=\"email\" label=\"Email\" type=\"email\" />` — a component that renders a label, control, and live error message wired to a field in one element (`as=\"textarea\"`/`\"select\"`, plus `class`/`labelClass`/`inputClass`/`errorClass`). |\n| `schemaToValidator(schema)` | Compiles a JSON Schema into a `(values) => errors` function via `@amritk/runtime-validators`. |\n| `FieldState`, `FieldProps`, `FieldControl`, `FieldValue`, `FieldValues`, `FormConfig`, `Form`, `FormValidate`, `FormErrors` | Exported types. |\n\nValidation accepts **either** a plain `(values) => errors` function **or** a JSON Schema, which is validated through [`@amritk/runtime-validators`](https://github.com/amritk/mjst/tree/main/packages/runtime-validators) (eval-free, CSP-safe) — an optional peer, so a schema-validated form costs nothing to a form that does not use one:\n\n```tsx\nimport { createForm, Field } from '@amritk/mini/forms'\n\nconst form = createForm({\n  initialValues: { email: '' },\n  validate: { type: 'object', properties: { email: { type: 'string', minLength: 1 } }, required: ['email'] },\n  onSubmit: (values) => save(values),\n})\n\n// <Field> renders the label, control, and live error message in one element.\nconst view = () => (\n  <form onSubmit={form.handleSubmit}>\n    <Field form={form} name=\"email\" label=\"Email\" type=\"email\" />\n    <button type=\"submit\" disabled={form.isSubmitting}>Save</button>\n  </form>\n)\n\n// …or wire the pieces by hand with `form.bind` when you need full control:\n//   <input ref={form.bind('email')} />\n//   <span show={() => Boolean(form.field('email').error())}>{() => form.field('email').error()}</span>\n```\n\n`@amritk/runtime-validators` is an **optional peer dependency** — install it only if you validate with schemas.\n\n### Data (`@amritk/mini/query`)\n\nA thin adapter that bridges [`@tanstack/query-core`](https://tanstack.com/query) observers to mini signals — so caching, deduplication, retries, and invalidation come from TanStack Query rather than a bespoke resource primitive (mirroring how `solid-query` wraps query-core).\n\n| Export | Purpose |\n|:---|:---|\n| `createQuery(client, options)` | Subscribes a `QueryObserver` and exposes `{ result, data, error, status, isPending, isLoading, isFetching, isSuccess, isError, refetch }` as signals. Call it inside a component/`effectScope` — the subscription is cleaned up with the scope. `options` may be a getter, so the query key can depend on signals (`() => ({ queryKey: ['user', id()] })`) and refetch when they change. |\n| `QueryResult` | Exported type. |\n\n`@tanstack/query-core` is an **optional peer dependency** — install it only if you use `/query`.\n\n### Hot reload (`@amritk/mini/hot`)\n\nOne line at the entry point that turns the dev server's full page reload into a tree swap. Vite hot-updates a module only if something **accepts** the update; a mini app accepts nothing, so an edit walks up the import graph to the entry, finds no boundary, and reloads the page. This subpath makes the entry that boundary.\n\n| Export | Purpose |\n|:---|:---|\n| `hotMount(container, component, hot)` | `mount` plus the hot-module wiring: it hands the runtime the mount's `dispose` as the module's teardown, so an edit anywhere below the entry tears the old tree down — every effect and `onCleanup` fires — before the updated entry mounts the new one. Pass `import.meta.hot` straight through: in a production build it is `undefined` and the call is exactly `mount`, so one call site covers both modes. It also accepts at runtime **before** mounting, so a component that throws mid-render leaves an accept callback behind and its fix still arrives as a hot update. |\n| `HotContext` | Exported type — the structural `accept`/`dispose` pair the helper needs. Vite's `import.meta.hot` satisfies it, and this subpath imports no `vite` types of its own. |\n\nIt takes both halves: [`acceptHotUpdates()`](#build-plugins-amritkminivite) marks the module as the boundary — only a source transform can, since Vite looks for the literal `import.meta.hot.accept(` in the module text and never sees a runtime call made through a helper.\n\n```ts\n// vite.config.ts\nimport { defineConfig } from 'vite'\n\nimport { acceptHotUpdates } from '@amritk/mini/vite'\n\nexport default defineConfig({ plugins: [acceptHotUpdates()] })\n```\n\n```tsx\n// main.tsx — the entry module. Keep it thin: it re-runs on every edit below it.\nimport { hotMount } from '@amritk/mini/hot'\n\nimport { App } from './app'\n\nhotMount(document.body, App, import.meta.hot)\n```\n\nTwo things to know. **Signal state resets on every reload** — mini has no compiler and no component identity, so there is nothing to map an old component's signals onto in the new one, and a clean remount is the honest behaviour; state that should survive edits belongs in a separate store module, which keeps its instance across an update because it is not the module that changed. And **do not register your own `hot.dispose()`** — the runtime keeps one disposer per module, so a second registration silently replaces mini's and leaks the old tree; extra teardown goes in an `onCleanup` inside the root component, where the mount scope already owns it.\n\nThis lives in a subpath rather than in `mount` because the `.` entry is byte-budgeted for the embed widget, which ships one static bundle and has no dev server to hot-update.\n\n### Build plugins (`@amritk/mini/vite`)\n\nTwo Vite plugins, both here for the same reason: in a compilerless runtime some things can only be settled by reading the source, because neither the type checker nor the runtime can see them.\n\n`catchCalledSignals` catches the one footgun of the [reactivity rule](#the-reactivity-rule): calling a signal in a binding (`disabled={streaming()}`) freezes its value at creation instead of tracking it, and the call happens before `jsx()` ever runs. `acceptHotUpdates` is the build-time half of [hot reloading](#hot-reload-amritkminihot) — Vite reads a module's text for `import.meta.hot.accept(` to decide whether it can stop an update there, so the call has to be *in* the source.\n\n| Export | Purpose |\n|:---|:---|\n| `acceptHotUpdates()` | A Vite plugin. Appends `import.meta.hot?.accept()` to any first-party module that calls `hotMount`, making it the app's hot-update boundary — without it the dev server finds nothing to accept the update and reloads the whole page. Only modules that mount are touched, the line is appended (so no existing line moves and positions stay honest), and a module that already writes its own `import.meta.hot.accept` is left alone. `apply: 'serve'`, so nothing is injected into a production build. |\n| `catchCalledSignals(options?)` | A Vite plugin. Walks the TypeScript AST of each `.tsx` module on every edit and flags a **signal called inside a binding** — `disabled={streaming()}`, a child `<span>{count()}</span>`, and also sub-expression freezes like `class={active() ? 'on' : 'off'}`, `disabled={busy() || locked}`, `style={{ width: w() }}`, and `` title={`${count()} left`} `` (anywhere in a value that is not itself a getter). It only flags names it can see are signals (`signal()`/`computed()`, or a `Signal<…>`/`ReadonlySignal<…>` type), so one-shot helpers like `id={makeId()}` are left alone, and a call inside an arrow/`.map` callback is the correct reactive form and never flagged. In dev it **warns** in the terminal and shows the findings in Vite's **error overlay** (non-blocking — the module still loads, and the overlay clears on the next clean edit); during `vite build` it **fails** the build — one plugin for both the editor loop and the CI gate. Bare getters and thunks never match; a `// mini-static-ok` comment (same line or the line above) opts out a deliberate case. Pass `{ failOnError }` to force the severity, or `{ overlay: false }` to keep dev feedback in the terminal only. |\n| `findCalledSignalBindings(source)` | The underlying scanner (returns `CalledSignalBinding[]`), for a bespoke lint command or editor integration. |\n| `CatchCalledSignalsOptions`, `CalledSignalBinding` | Exported types. |\n\n```ts\nimport { defineConfig } from 'vite'\n\nimport { acceptHotUpdates, catchCalledSignals } from '@amritk/mini/vite'\n\nexport default defineConfig({\n  plugins: [catchCalledSignals(), acceptHotUpdates()],\n})\n```\n\n`vite` and `typescript` are **optional peer dependencies** — needed only by this subpath, so the `.` core stays dependency-free.\n\n---\n\n## Usage\n\nPoint your compiler at mini's JSX runtime — either per file or in `tsconfig.json`:\n\n```jsonc\n{\n  \"compilerOptions\": {\n    \"jsx\": \"react-jsx\",\n    \"jsxImportSource\": \"@amritk/mini\"\n  }\n}\n```\n\nThen build UI from signals:\n\n```tsx\nimport { signal, list } from '@amritk/mini'\n\nconst Counter = (): HTMLElement => {\n  const count = signal(0)\n  return (\n    <button type=\"button\" onClick={() => count(count() + 1)}>\n      clicked {() => count()} times\n    </button>\n  )\n}\n\ndocument.body.appendChild(Counter())\n```\n\nEach module has its own colocated test file (`*.test.ts` / `*.test.tsx`) — read those for canonical examples.\n\n---\n\n## License\n\n[MIT](../../LICENSE)\n","readmeFilename":"README.md"}