{"_id":"@amritk/mini-lynx","_rev":"6-5b400b8b1df55bbbd2b6524b426338e7","name":"@amritk/mini-lynx","dist-tags":{"latest":"0.4.1"},"versions":{"0.0.0":{"name":"@amritk/mini-lynx","version":"0.0.0","keywords":["lynx","signals","reactive","jsx","native","ui","typescript","mjst"],"author":{"name":"amritk"},"license":"MIT","_id":"@amritk/mini-lynx@0.0.0","maintainers":[{"name":"amritk","email":"amrit+spam@hockey-community.com"}],"homepage":"https://github.com/amritk/mini/tree/main/packages/mini-lynx#readme","bugs":{"url":"https://github.com/amritk/mini/issues"},"dist":{"shasum":"c60edd106af4b61ce352ff9828b76905b7f9991f","tarball":"https://registry.npmjs.org/@amritk/mini-lynx/-/mini-lynx-0.0.0.tgz","fileCount":70,"integrity":"sha512-EwFjktlWZpjbo3XmP9RBllTTD86nvbsuDbM6WRHpOFtYbUlwFkiClk5+xpqiIOIbgnUbXExhLMqB6BlTnokNWg==","signatures":[{"sig":"MEUCIQDV29IAV3hGsvUttkiHvSWhn1aELIE4uY5T6qDhr5aN9QIgZr/3Py7gDVZVxOXiPwAmhBHT2Kfx7Ozx6RC5rfNVZ+k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":301953},"type":"module","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js","development":"./src/index.ts"},"./flow":{"types":"./dist/flow/index.d.ts","import":"./dist/flow/index.js","default":"./dist/flow/index.js","development":"./src/flow/index.ts"},"./forms":{"types":"./dist/forms/index.d.ts","import":"./dist/forms/index.js","default":"./dist/forms/index.js","development":"./src/forms/index.ts"},"./query":{"types":"./dist/query/index.d.ts","import":"./dist/query/index.js","default":"./dist/query/index.js","development":"./src/query/index.ts"},"./engine":{"types":"./dist/engine/index.d.ts","import":"./dist/engine/index.js","default":"./dist/engine/index.js","development":"./src/engine/index.ts"},"./router":{"types":"./dist/router/index.d.ts","import":"./dist/router/index.js","default":"./dist/router/index.js","development":"./src/router/index.ts"},"./testing":{"types":"./dist/testing/index.d.ts","import":"./dist/testing/index.js","default":"./dist/testing/index.js","development":"./src/testing/index.ts"},"./composition":{"types":"./dist/composition/index.d.ts","import":"./dist/composition/index.js","default":"./dist/composition/index.js","development":"./src/composition/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":"a38a601e3cbdd49eab39930835e8b06b76f21b6e","scripts":{"test":"NODE_ENV=production vitest run --root ../.. packages/mini-lynx/","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/mini.git","type":"git","directory":"packages/mini-lynx"},"_npmVersion":"11.16.0","description":"A signals runtime for Lynx: real elements created once and mutated forever, driving Lynx's Element PAPI directly, with no virtual tree.","directories":{},"sideEffects":false,"_nodeVersion":"26.3.0","dependencies":{"alien-signals":"catalog:","@amritk/mini-helpers":"workspace:*"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5","@lynx-js/types":"^4.0.0","@tanstack/query-core":"^5.101.2","@amritk/runtime-validators":"^0.9.0"},"peerDependencies":{"typescript":"^5","@lynx-js/types":">=4.0.0","@tanstack/query-core":"^5","@amritk/runtime-validators":">=0.8.0"},"peerDependenciesMeta":{"typescript":{"optional":true},"@lynx-js/types":{"optional":true},"@tanstack/query-core":{"optional":true},"@amritk/runtime-validators":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/mini-lynx_0.0.0_1785224640268_0.6042054680511912","host":"s3://npm-registry-packages-npm-production"}},"0.1.0":{"name":"@amritk/mini-lynx","version":"0.1.0","keywords":["lynx","signals","reactive","jsx","native","ui","typescript","mjst"],"author":{"name":"amritk"},"license":"MIT","_id":"@amritk/mini-lynx@0.1.0","maintainers":[{"name":"amritk","email":"amrit+spam@hockey-community.com"}],"homepage":"https://github.com/amritk/mini/tree/main/packages/mini-lynx#readme","bugs":{"url":"https://github.com/amritk/mini/issues"},"dist":{"shasum":"cf4a23dda4a82d9a5db14b699070af1329772fe4","tarball":"https://registry.npmjs.org/@amritk/mini-lynx/-/mini-lynx-0.1.0.tgz","fileCount":205,"integrity":"sha512-yTpaLpP2IRjWmQOp/eQI/BO6BUYe82vDlSpSQvg2Qz80LbiN9s6d1tBFejIVCLAjLaP86RMY2H38uuVQDDcKDw==","signatures":[{"sig":"MEQCIB7DzfP/5t+uDOKMEPqGfDL/G6csyYIQTR98kk/ZurLzAiAJnoHJQnQhzqKDEsLkWhmmNu9j1uPtgwFh/xhpGpQN1Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@amritk%2fmini-lynx@0.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":534129},"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"},"./engine":{"types":"./dist/engine/index.d.ts","import":"./dist/engine/index.js","default":"./dist/engine/index.js"},"./router":{"types":"./dist/router/index.d.ts","import":"./dist/router/index.js","default":"./dist/router/index.js"},"./testing":{"types":"./dist/testing/index.d.ts","import":"./dist/testing/index.js","default":"./dist/testing/index.js"},"./composition":{"types":"./dist/composition/index.d.ts","import":"./dist/composition/index.js","default":"./dist/composition/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-lynx/","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:b434c8ad-5e98-42d6-8a0a-bfc49d605fb5"}},"repository":{"url":"git+https://github.com/amritk/mini.git","type":"git","directory":"packages/mini-lynx"},"_npmVersion":"12.0.1","description":"A signals runtime for Lynx: real elements created once and mutated forever, driving Lynx's Element PAPI directly, with no virtual tree.","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":{"typescript":"^5","@lynx-js/types":"^4.0.0","@tanstack/query-core":"^5.101.2","@amritk/runtime-validators":"^0.9.0"},"peerDependencies":{"typescript":"^5","@lynx-js/types":">=4.0.0","@tanstack/query-core":"^5","@amritk/runtime-validators":">=0.8.0"},"peerDependenciesMeta":{"typescript":{"optional":true},"@lynx-js/types":{"optional":true},"@tanstack/query-core":{"optional":true},"@amritk/runtime-validators":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/mini-lynx_0.1.0_1785226637471_0.3322167628920272","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@amritk/mini-lynx","version":"0.2.0","keywords":["lynx","signals","reactive","jsx","native","ui","typescript","mjst"],"author":{"name":"amritk"},"license":"MIT","_id":"@amritk/mini-lynx@0.2.0","maintainers":[{"name":"amritk","email":"amrit+spam@hockey-community.com"}],"homepage":"https://github.com/amritk/mini/tree/main/packages/mini-lynx#readme","bugs":{"url":"https://github.com/amritk/mini/issues"},"dist":{"shasum":"ad6311413563c689e3813ad9c6a4a07fd07b7b8d","tarball":"https://registry.npmjs.org/@amritk/mini-lynx/-/mini-lynx-0.2.0.tgz","fileCount":244,"integrity":"sha512-IyJI9qdl/OXV5WLg1P6gGhn352ziNVOhJ72YiTWA/8aBmXnPap6uDHLXM3AFfuDwgLgFaFDG5W8TsXRmTAgrwg==","signatures":[{"sig":"MEUCIAm3Z5XP30/XF4AvzlR3pll6kZolOJaLvFeVbEWr7QPGAiEA5OMsoD6rhFLt3rsfnD374wXFSoxiiN8MFoxsUK+3W2g=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@amritk%2fmini-lynx@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":671950},"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"},"./bridge":{"types":"./dist/bridge/index.d.ts","import":"./dist/bridge/index.js","default":"./dist/bridge/index.js"},"./engine":{"types":"./dist/engine/index.d.ts","import":"./dist/engine/index.js","default":"./dist/engine/index.js"},"./router":{"types":"./dist/router/index.d.ts","import":"./dist/router/index.js","default":"./dist/router/index.js"},"./recycle":{"types":"./dist/recycle/index.d.ts","import":"./dist/recycle/index.js","default":"./dist/recycle/index.js"},"./testing":{"types":"./dist/testing/index.d.ts","import":"./dist/testing/index.js","default":"./dist/testing/index.js"},"./elements":{"types":"./dist/elements/index.d.ts","import":"./dist/elements/index.js","default":"./dist/elements/index.js"},"./gestures":{"types":"./dist/gestures/index.d.ts","import":"./dist/gestures/index.js","default":"./dist/gestures/index.js"},"./composition":{"types":"./dist/composition/index.d.ts","import":"./dist/composition/index.js","default":"./dist/composition/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":"665c77fff247babbaced7e8eca0ac23e85e52bae","scripts":{"test":"NODE_ENV=production vitest run --root ../.. packages/mini-lynx/","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:b434c8ad-5e98-42d6-8a0a-bfc49d605fb5"}},"repository":{"url":"git+https://github.com/amritk/mini.git","type":"git","directory":"packages/mini-lynx"},"_npmVersion":"12.0.1","description":"A signals runtime for Lynx: real elements created once and mutated forever, driving Lynx's Element PAPI directly, with no virtual tree.","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":{"typescript":"^5","@lynx-js/types":"^4.0.0","@tanstack/query-core":"^5.101.2","@amritk/runtime-validators":"^0.9.0"},"peerDependencies":{"typescript":"^5","@lynx-js/types":">=4.0.0","@tanstack/query-core":"^5","@amritk/runtime-validators":">=0.8.0"},"peerDependenciesMeta":{"typescript":{"optional":true},"@lynx-js/types":{"optional":true},"@tanstack/query-core":{"optional":true},"@amritk/runtime-validators":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/mini-lynx_0.2.0_1785265685727_0.9270846964642987","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@amritk/mini-lynx","version":"0.3.0","keywords":["lynx","signals","reactive","jsx","native","ui","typescript","mjst"],"author":{"name":"amritk"},"license":"MIT","_id":"@amritk/mini-lynx@0.3.0","maintainers":[{"name":"amritk","email":"amrit+spam@hockey-community.com"}],"homepage":"https://github.com/amritk/mini/tree/main/packages/mini-lynx#readme","bugs":{"url":"https://github.com/amritk/mini/issues"},"dist":{"shasum":"89535b594fcdbf4a525e54649fbf3bf0084ecdfc","tarball":"https://registry.npmjs.org/@amritk/mini-lynx/-/mini-lynx-0.3.0.tgz","fileCount":247,"integrity":"sha512-FkAB08GRHC1z0Bbt7LkSkTj9mU/X1PuN3F3uSve7Qf6K8rO3MgMv9ZuJnHvkWsEzT83SR/cq6Q2dKBsONKdn1Q==","signatures":[{"sig":"MEYCIQCvtkh6liLcJ4JEs7RUFlYznocXL23E4E19uduIiIpo8QIhAJgmclwAyzN3/RF23QQO7U9nzKqpjG+6BrYrJc2CHPRP","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@amritk%2fmini-lynx@0.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":677902},"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"},"./bridge":{"types":"./dist/bridge/index.d.ts","import":"./dist/bridge/index.js","default":"./dist/bridge/index.js"},"./engine":{"types":"./dist/engine/index.d.ts","import":"./dist/engine/index.js","default":"./dist/engine/index.js"},"./router":{"types":"./dist/router/index.d.ts","import":"./dist/router/index.js","default":"./dist/router/index.js"},"./recycle":{"types":"./dist/recycle/index.d.ts","import":"./dist/recycle/index.js","default":"./dist/recycle/index.js"},"./testing":{"types":"./dist/testing/index.d.ts","import":"./dist/testing/index.js","default":"./dist/testing/index.js"},"./elements":{"types":"./dist/elements/index.d.ts","import":"./dist/elements/index.js","default":"./dist/elements/index.js"},"./gestures":{"types":"./dist/gestures/index.d.ts","import":"./dist/gestures/index.js","default":"./dist/gestures/index.js"},"./composition":{"types":"./dist/composition/index.d.ts","import":"./dist/composition/index.js","default":"./dist/composition/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":"2dfdd2b58e489a2531ec3b40d2dcc5d6e290453e","scripts":{"test":"NODE_ENV=production vitest run --root ../.. packages/mini-lynx/","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:b434c8ad-5e98-42d6-8a0a-bfc49d605fb5"}},"repository":{"url":"git+https://github.com/amritk/mini.git","type":"git","directory":"packages/mini-lynx"},"_npmVersion":"12.0.2","description":"A signals runtime for Lynx: real elements created once and mutated forever, driving Lynx's Element PAPI directly, with no virtual tree.","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":{"typescript":"^5","@lynx-js/types":"^4.0.0","@tanstack/query-core":"^5.101.2","@amritk/runtime-validators":"^0.9.0"},"peerDependencies":{"typescript":"^5","@lynx-js/types":">=4.0.0","@tanstack/query-core":"^5","@amritk/runtime-validators":">=0.8.0"},"peerDependenciesMeta":{"typescript":{"optional":true},"@lynx-js/types":{"optional":true},"@tanstack/query-core":{"optional":true},"@amritk/runtime-validators":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/mini-lynx_0.3.0_1785471679940_0.7822009668780523","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@amritk/mini-lynx","version":"0.4.0","keywords":["lynx","signals","reactive","jsx","native","ui","typescript","mjst"],"author":{"name":"amritk"},"license":"MIT","_id":"@amritk/mini-lynx@0.4.0","maintainers":[{"name":"amritk","email":"amrit+spam@hockey-community.com"}],"homepage":"https://github.com/amritk/mini/tree/main/packages/mini-lynx#readme","bugs":{"url":"https://github.com/amritk/mini/issues"},"dist":{"shasum":"e56df18d4f3a100f69ff8cb621b0dd5a824e97fd","tarball":"https://registry.npmjs.org/@amritk/mini-lynx/-/mini-lynx-0.4.0.tgz","fileCount":280,"integrity":"sha512-UrFxt0NpDcNqVwinHl2bfP/TvOJbamCk3uZk0NfTDgtE7qZy6EaD8cFiMKx9A7dGUeQ1wh8VZNUcbtXDqZBjmg==","signatures":[{"sig":"MEYCIQDfvp85p23EYoMRiWVao503LtaHNXcPzBny0lSIAa4qbwIhAJUblcxM4/oyRixrUahSI3sYcIqUIhj8xjgLN+oWdsyG","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@amritk%2fmini-lynx@0.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":770225},"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"},"./bridge":{"types":"./dist/bridge/index.d.ts","import":"./dist/bridge/index.js","default":"./dist/bridge/index.js"},"./engine":{"types":"./dist/engine/index.d.ts","import":"./dist/engine/index.js","default":"./dist/engine/index.js"},"./router":{"types":"./dist/router/index.d.ts","import":"./dist/router/index.js","default":"./dist/router/index.js"},"./recycle":{"types":"./dist/recycle/index.d.ts","import":"./dist/recycle/index.js","default":"./dist/recycle/index.js"},"./testing":{"types":"./dist/testing/index.d.ts","import":"./dist/testing/index.js","default":"./dist/testing/index.js"},"./elements":{"types":"./dist/elements/index.d.ts","import":"./dist/elements/index.js","default":"./dist/elements/index.js"},"./gestures":{"types":"./dist/gestures/index.d.ts","import":"./dist/gestures/index.js","default":"./dist/gestures/index.js"},"./keyboard":{"types":"./dist/keyboard/index.d.ts","import":"./dist/keyboard/index.js","default":"./dist/keyboard/index.js"},"./composition":{"types":"./dist/composition/index.d.ts","import":"./dist/composition/index.js","default":"./dist/composition/index.js"},"./jsx-runtime":{"types":"./dist/jsx-runtime.d.ts","import":"./dist/jsx-runtime.js","default":"./dist/jsx-runtime.js"},"./package.json":"./package.json","./router/browser":{"types":"./dist/router/browser/index.d.ts","import":"./dist/router/browser/index.js","default":"./dist/router/browser/index.js"},"./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-lynx/","build":"tsgo -p tsconfig.build.json && tsgo -p tsconfig.dom.build.json && tsc-alias -p tsconfig.build.json -f && node ../../scripts/strip-comments.mjs","types:check":"tsgo -p . --noEmit && tsgo -p tsconfig.dom.json --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:b434c8ad-5e98-42d6-8a0a-bfc49d605fb5"}},"repository":{"url":"git+https://github.com/amritk/mini.git","type":"git","directory":"packages/mini-lynx"},"_npmVersion":"12.0.2","description":"A signals runtime for Lynx: real elements created once and mutated forever, driving Lynx's Element PAPI directly, with no virtual tree.","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":{"typescript":"^5","@lynx-js/types":"^4.0.0","@tanstack/query-core":"^5.101.2","@amritk/runtime-validators":"^0.9.0"},"peerDependencies":{"typescript":"^5","@lynx-js/types":">=4.0.0","@tanstack/query-core":"^5","@amritk/runtime-validators":">=0.8.0"},"peerDependenciesMeta":{"typescript":{"optional":true},"@lynx-js/types":{"optional":true},"@tanstack/query-core":{"optional":true},"@amritk/runtime-validators":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/mini-lynx_0.4.0_1785905545851_0.13285908291408166","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"@amritk/mini-lynx","version":"0.4.1","description":"A signals runtime for Lynx: real elements created once and mutated forever, driving Lynx's Element PAPI directly, with no virtual tree.","type":"module","license":"MIT","author":{"name":"amritk"},"sideEffects":false,"keywords":["lynx","signals","reactive","jsx","native","ui","typescript","mjst"],"repository":{"type":"git","url":"git+https://github.com/amritk/mini.git","directory":"packages/mini-lynx"},"homepage":"https://github.com/amritk/mini/tree/main/packages/mini-lynx#readme","bugs":{"url":"https://github.com/amritk/mini/issues"},"publishConfig":{"access":"public"},"scripts":{"build":"tsgo -p tsconfig.build.json && tsgo -p tsconfig.dom.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 && tsgo -p tsconfig.dom.json --noEmit","test":"NODE_ENV=production vitest run --root ../.. packages/mini-lynx/"},"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"},"./bridge":{"types":"./dist/bridge/index.d.ts","import":"./dist/bridge/index.js","default":"./dist/bridge/index.js"},"./engine":{"types":"./dist/engine/index.d.ts","import":"./dist/engine/index.js","default":"./dist/engine/index.js"},"./elements":{"types":"./dist/elements/index.d.ts","import":"./dist/elements/index.js","default":"./dist/elements/index.js"},"./gestures":{"types":"./dist/gestures/index.d.ts","import":"./dist/gestures/index.js","default":"./dist/gestures/index.js"},"./keyboard":{"types":"./dist/keyboard/index.d.ts","import":"./dist/keyboard/index.js","default":"./dist/keyboard/index.js"},"./recycle":{"types":"./dist/recycle/index.d.ts","import":"./dist/recycle/index.js","default":"./dist/recycle/index.js"},"./flow":{"types":"./dist/flow/index.d.ts","import":"./dist/flow/index.js","default":"./dist/flow/index.js"},"./composition":{"types":"./dist/composition/index.d.ts","import":"./dist/composition/index.js","default":"./dist/composition/index.js"},"./router":{"types":"./dist/router/index.d.ts","import":"./dist/router/index.js","default":"./dist/router/index.js"},"./router/browser":{"types":"./dist/router/browser/index.d.ts","import":"./dist/router/browser/index.js","default":"./dist/router/browser/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"},"./testing":{"types":"./dist/testing/index.d.ts","import":"./dist/testing/index.js","default":"./dist/testing/index.js"}},"peerDependencies":{"@amritk/runtime-validators":">=0.8.0","@lynx-js/types":">=4.0.0","@tanstack/query-core":"^5","typescript":"^5"},"peerDependenciesMeta":{"@amritk/runtime-validators":{"optional":true},"@lynx-js/types":{"optional":true},"@tanstack/query-core":{"optional":true},"typescript":{"optional":true}},"devDependencies":{"@amritk/runtime-validators":"^0.9.0","@lynx-js/types":"^4.0.0","@tanstack/query-core":"^5.101.2","typescript":"^5"},"gitHead":"c2516a9f0a935e9e8e1eda316d651ac48e0ccc71","_id":"@amritk/mini-lynx@0.4.1","_nodeVersion":"24.19.0","_npmVersion":"12.0.2","dist":{"integrity":"sha512-Y4hAfJ2a+07vl5zNkgvtvsK2koSn3n6ggOg5JkL8p1+69xtMZIkx0Pq9m1G07fqKu3w3schKSAvNfQGyBBgWag==","shasum":"6753e2bf07831df2499a472d6fcfc0c2b893cded","tarball":"https://registry.npmjs.org/@amritk/mini-lynx/-/mini-lynx-0.4.1.tgz","fileCount":280,"unpackedSize":778578,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@amritk%2fmini-lynx@0.4.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDA8ASNHDUVzTbk0swhUoWmow1SlvYG0tOIdp4VGNj3+wIhAOZcJHvcky/7uRLmYaamVKarYqNfJQ9l2OADtYVhh+Up"}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:b434c8ad-5e98-42d6-8a0a-bfc49d605fb5"}},"directories":{},"maintainers":[{"name":"amritk","email":"amrit+spam@hockey-community.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/mini-lynx_0.4.1_1787351375595_0.8924152003597294"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-28T07:44:00.150Z","modified":"2026-08-21T22:29:36.116Z","0.0.0":"2026-07-28T07:44:00.427Z","0.1.0":"2026-07-28T08:17:17.614Z","0.2.0":"2026-07-28T19:08:05.911Z","0.3.0":"2026-07-31T04:21:20.094Z","0.4.0":"2026-08-05T04:52:26.054Z","0.4.1":"2026-08-21T22:29:35.749Z"},"bugs":{"url":"https://github.com/amritk/mini/issues"},"author":{"name":"amritk"},"license":"MIT","homepage":"https://github.com/amritk/mini/tree/main/packages/mini-lynx#readme","keywords":["lynx","signals","reactive","jsx","native","ui","typescript","mjst"],"repository":{"type":"git","url":"git+https://github.com/amritk/mini.git","directory":"packages/mini-lynx"},"description":"A signals runtime for Lynx: real elements created once and mutated forever, driving Lynx's Element PAPI directly, with no virtual tree.","maintainers":[{"name":"amritk","email":"amrit+spam@hockey-community.com"}],"readme":"<div align=\"center\">\n\n# @amritk/mini-lynx\n\n**A signals runtime for Lynx. Real elements created once, mutated forever by signals — no virtual tree, no diffing, no re-render.**\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-lynx?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## What it is\n\n`@amritk/mini-lynx` drives [Lynx](https://lynxjs.org)'s Element PAPI directly.\nJSX builds a real Lynx element immediately, once; a function-valued prop or\nchild becomes a live binding; everything else is written once and never looked\nat again. A component function runs a single time, and the only reconciler in\nthe package is `list`.\n\nIt is [`@amritk/mini`](../mini)'s design pointed at a different target — same\nsignals, same compilerless JSX, same build-once-mutate-forever model. It ships\nfrom the [mini](../../README.md) monorepo.\n\n**No VDOM matters more here than it does on the web.** Lynx's element tree lives\non the main thread and every property write is a real mutation with a cost, so a\nruntime that writes only what actually changed is not shaving milliseconds off a\ndiff — it is the difference between one attribute write and a subtree commit.\nDriving the PAPI directly is also what puts this runtime on the main thread, so\na handler runs in the same frame as the gesture that triggered it, with no thread\nhop. That is what `main-thread:bindtap` buys a ReactLynx app by hand, one handler\nat a time, applied to everything by construction.\n\n## What it is not\n\n**It is not a cross-platform layer. Lynx is.** iOS, Android, Harmony and the web\nare the engine's problem, one layer down, and it solves them with a real engine\nrather than with a mapping table. This package therefore owns no vocabulary of\nits own: the tags are the engine's (`view`, `text`, `list`, `scroll-view`,\n`textarea`, `svg`, `overlay`, …), the attributes are spelled the way the engine\nspells them (`text-maxline`, `scroll-orientation`), the events are Lynx's own\n(`bindtap`, `catchtap`, `capture-bindtap`), and the JSX typings are derived from\n`@lynx-js/types` — the Lynx team's, tracking the engine version *you* pin rather\nthan this package's release schedule.\n\nThe consequence worth stating plainly: the ceiling is what the engine can do\nrather than what this package has named. Waterfall and sticky headers,\n`@keyframes`, CSS selectors and variables, grid, event interception, the devtool\nunderstanding the tree — all of it works without a release here.\n\nThe exceptions are the handful of places the engine calls the *framework* rather\nthan the other way round, because there is no attribute to write: cell recycling\n(`/recycle`), gesture arbitration (`/gestures`) and UI methods (`/elements`).\nThose needed code here, and now have it.\n\nIt is also not a component library, a design system, or a styling solution.\nLynx has real CSS; use it.\n\nIf you are rendering to the DOM, you want [`@amritk/mini`](../mini) instead.\nNeither package wraps the other.\n\n## Install\n\n```bash\nnpm install @amritk/mini-lynx\n# or: pnpm add / yarn add / bun add\n```\n\n```jsonc\n// tsconfig.json — this is not the React runtime\n{ \"compilerOptions\": { \"jsx\": \"react-jsx\", \"jsxImportSource\": \"@amritk/mini-lynx\" } }\n```\n\n`@lynx-js/types` is an optional, types-only peer. Install it to get the tag\ntypings; it ships nothing but `.d.ts`, so it costs your bundle nothing.\n\n## A minimal app\n\n```tsx\n// main-thread.tsx — the entry your bundler marks as the main-thread chunk\nimport { renderPage, signal } from '@amritk/mini-lynx'\n\nconst Counter = () => {\n  const count = signal(0)\n  return (\n    <view bindtap={() => count(count() + 1)} class=\"card\">\n      <text>{() => `tapped ${count()} times`}</text>\n    </view>\n  )\n}\n\nrenderPage(Counter)\n```\n\n`renderPage` installs the global the engine calls once at startup, mounts the\nroot when it fires, and emits the `firstScreen` lifecycle event the platform\nwaits for.\n\nThe reactivity rule is the whole API surface for state: **a function tracks,\nanything else is applied once.** Signals are zero-argument functions, so passing\none without calling it is already a live binding — `disabled={busy}` tracks\nforever, `disabled={busy()}` is frozen at creation. That last line is the one\nreal footgun of a compilerless JSX, and `@amritk/mini`'s scanner catches it\n(`catchCalledSignals` for a Vite build, `findCalledSignalBindings` for anything\nelse — Lynx builds with rspack).\n\n## Testing off-device\n\nThe platform boundary is one type and a handful of functions, and\n`@amritk/mini-lynx/testing` implements all of it in memory. A test against the\nfake is a test against the *real* target's API, so there is no second renderer\nto keep in step and no preview that can quietly disagree with the device.\n\n```ts\nimport { mount, setEngine } from '@amritk/mini-lynx'\nimport { createFakeEngine, serializeTree } from '@amritk/mini-lynx/testing'\n\nconst engine = createFakeEngine()\nsetEngine(engine.api)\nmount(engine.pageElement, Counter)\n\nengine.dispatch(engine.find('view')!, 'tap')\nexpect(serializeTree(engine.page)).toMatchInlineSnapshot()\n```\n\nIt records what it was asked to do; it does not lay anything out. Layout belongs\nto the engine.\n\n## Wiring it up for production\n\nFour lines, and each one covers something an app cannot add from outside.\n\n```ts\nimport { effect, globalProps, renderPage, setErrorHandler, setReducedMotion } from '@amritk/mini-lynx'\n\n// 1. Where errors go. Install it FIRST, so a failed first build is reported too.\nsetErrorHandler((error, source) => Sentry.captureException(error, { tags: { source } }))\n\n// 2. Platform values follow the signal, so this is the only place that reads them.\neffect(() => setReducedMotion(globalProps<{ reduceMotion?: boolean }>().reduceMotion === true))\n\n// 3. The entry. It claims `updateGlobalProps` and `removeComponents` on the way past.\nrenderPage(App)\n```\n\n**Errors after construction reach `setErrorHandler`, not the platform.**\n`ErrorBoundary` covers the build, which is all a component can throw during —\nit runs once and is done. Everything after that runs with this runtime as the\noutermost JavaScript frame and native code above it: a handler throws inside the\nengine's own dispatch, and the scheduled commit throws on the promise job queue\nwhere nothing is listening. Both are contained and reported instead, so one\nmisbehaving handler costs its own event rather than the frame, and a failed\ncommit does not wedge the scheduler — the next mutation queues a fresh one.\nWith no handler installed the report goes to `console.warn`, so a mistake is\nvisible in development with no setup at all.\n\n**A failed first build still hands over to the platform.** `firstScreen` is the\ncue to stop waiting, not a report of success, so `renderPage` emits it even when\nthe root component threw. A blank screen with a crash report beats a splash\nscreen that never dismisses and says nothing.\n\n**`globalProps()` is a signal.** Colour scheme, locale, flags and the\nreduced-motion preference arrive from native twice — once as `lynx.__globalProps`\nat startup and thereafter through the engine calling a global\n`updateGlobalProps`. The engine calls exactly one function for the second, so\nexactly one thing in the process may own it; `renderPage` claims it and turns it\ninto a signal a binding can read. That is what makes the reduced-motion line\nabove a one-off rather than a subscription the app has to maintain.\n\n## Subpaths\n\nEach is its own module graph, so importing one pulls in none of the others.\n\n| Import | Purpose |\n|---|---|\n| `@amritk/mini-lynx` | `renderPage`, signals, `mount`, `list`, the tree ops, the binds, JSX types |\n| `/engine` | `LynxElementApi`, `LynxElement`, `setEngine` — the platform boundary on its own |\n| `/bridge` | `namedHandlerTransport`, `dispatchNamedEvent` — the fallback event transport |\n| `/flow` | `Show`, `Switch`/`Match`, `Dynamic`, `For`, `Index` |\n| `/composition` | `createContext`, `Portal`, `ErrorBoundary` |\n| `/router` | `createRouter`, `route`, `createMemoryHistory`, `RouteView`, `RouteStack`, `RouteLink`, `matchRoute`, `buildPath` |\n| `/router/browser` | `createBrowserHistory` — the same route table driven by the address bar, for a web build |\n| `/forms` | `createForm`, `Field`, `bindField`, `schemaToValidator` |\n| `/query` | `createQuery` over `@tanstack/query-core` |\n| `/elements` | `querySelector`, `querySelectorAll`, `invoke` — the engine's UI methods |\n| `/gestures` | `setGestureDetector`, `GestureType` — recogniser composition |\n| `/keyboard` | `trackKeyboard`, `keyboardHeight`, `avoidKeyboard`, `KeyboardAvoiding` — keeping the soft keyboard off the focused field |\n| `/recycle` | `recycle` — `<list>`'s cell recycler |\n| `/testing` | `createFakeEngine`, `serializeTree` |\n\n## Known gaps\n\nThe ceiling is the engine's rather than this package's, so most of what an app\nmight want is a matter of writing the tag. These are the places where that is\nnot true — where the runtime itself is what is missing.\n\n**A recycled cell pool is per-shape, not per-row.** `recycle` pools cells by\n`reuseIdentifier`, and rows sharing one must be structurally interchangeable\nbecause they will be handed each other's elements. That is the engine's model\nrather than a simplification here, but it is worth stating: a `cell` function\nthat branches into genuinely different trees needs an identifier per branch, or\nthe pool will hand a header the elements of a row. Give the two different\nidentifiers and the problem is gone.\n\n**A move inside a recycling list is a remove plus an insert.** The\n`update-list-info` diff is keyed by `item-key`, so an unchanged row is left\nalone when its neighbours move; a row that genuinely moved is described as two\nedits rather than one. The engine re-queries either way and a cell is a pool\nentry rather than something with an identity to preserve, so this is correct —\nit is simply not minimal, and a list that reorders constantly does more work\nthan it strictly must.\n\n**Nothing about the background thread.** This runtime is main-thread, so\n`NativeModules`, `GlobalEventEmitter` events (the real `exposure`/`disexposure`,\nas distinct from the element-level `uiappear`) and the dual-thread bridge are the\napp's to reach for. `/query` is the sharp edge here: it wants `fetch` and timers,\nand whether those exist in the main-thread context is an engine-version question\nrather than a given. An app that cannot reach them should own its fetching on the\nbackground thread and push results in.\n\n**Reduced motion needs one line from the app.** `reducedMotion()` is consulted\nby `RouteStack` and is yours to consult anywhere else, but the runtime cannot\nread the preference: there is no reduced-motion field on `SystemInfo`, and Lynx\nhas no media queries, so no `prefers-reduced-motion` either. It reaches your\nhost app natively and you pass it in with `setReducedMotion` — usually from\n`globalProps()`, which is where the platform's other pushed values already live.\nEverything downstream of that is free.\n\n**Keyboard avoidance needs one line, and does not reach the web.** `<input>`\ndoes not avoid the keyboard on any Lynx target — the engine reports the keyboard\nthrough a single global event and the layout is the app's — so `/keyboard` turns\nthat event into a signal and the signal into a container that moves. Call\n`trackKeyboard()` once at startup, because nothing feeds the height until you\ndo. The event itself is Android, iOS, Harmony and Clay only: Lynx's own\ncompatibility data lists `keyboardstatuschanged` as unsupported on the web, so a\nweb build has to report the keyboard itself and pass an emitter in.\n`apps/playground-mini-lynx` does exactly that from `visualViewport`, in about\nfifteen lines.\n\n**A worklet-transport failure is recoverable, not fatal.** Event delivery rests\non one inference read from the engine's source rather than confirmed on\nhardware, and the symptom if it is wrong is total: the tree renders and nothing\nresponds to touch. That is why `setEventTransport` exists and why `/bridge`\nships the fallback the design note has always named — but the fallback is a\nthread hop, so a handler stops running in the gesture's own frame, and it needs\nthe app to carry events back from the background context. It is a working\nrecovery path, not a second first-class transport. See *Before you ship*.\n\nDeliberately absent, and not on this list: component lifecycle, datasets,\ntemplate parts, stylesheet adoption and lazy-bundle queries. None has a caller\nhere, and an unused function on the engine boundary is a porting cost paid for\nnothing.\n\n## Before you ship\n\nThree things in this package are written against contracts read from the engine's\nsource and from ReactLynx — the de-facto specification, since nothing upstream is\ndocumented for custom frameworks — rather than verified on hardware. They are the\nplaces where the engine calls *you*, which is exactly where a mistake is silent:\nthe tree renders, the tests pass, and the device does nothing.\n\n**Prototype all three on a device before committing to this package.**\n\n1. **Events are bound as worklet handles**, because Lynx does not usefully accept\n   a raw closure — it stores one and then never invokes it. This package hands\n   the engine a token of its own making and installs the `runWorklet` global that\n   resolves it, which is what keeps it compilerless. The engine never looks inside\n   the token, so a framework-defined one should round-trip; that has not been\n   confirmed on hardware. **If it does not, you do not have to fork the package.**\n   The listener form is a seam:\n\n   ```ts\n   import { setEventTransport } from '@amritk/mini-lynx'\n   import { dispatchNamedEvent, namedHandlerTransport } from '@amritk/mini-lynx/bridge'\n\n   setEventTransport(namedHandlerTransport) // before rendering\n   ```\n\n   That binds string handler names instead, which the engine routes to the\n   background thread — so the app owns the wire that carries the event back to\n   `dispatchNamedEvent`, because how that wire is spelled depends on your Lynx\n   version and on how your bundle is split. `/bridge` documents the usual\n   `lynxCoreInject.tt.publishEvent` wiring. The cost is the thread hop, and with\n   it the main-thread gift: a handler no longer runs in the gesture's own frame.\n2. **`/gestures` callbacks go through the same mechanism**, so they carry the same\n   caveat and will be resolved by the same prototype — though not by the same\n   fallback: `__SetGestureDetector` takes worklet callbacks and nothing else, so\n   there is no string form to swap to. `has-react-gesture` is set because the\n   engine gates its arbiter on that attribute name.\n3. **`/recycle` implements `componentAtIndex` and `enqueueComponent`.** The\n   protocol — the `update-list-info` inventory, and committing each cell with\n   `{ triggerLayout, operationID, elementID, listID }` so the engine can correlate\n   its request — is mirrored from ReactLynx's implementation and driven in the\n   suite through the same `enterListItemAtIndex` / `leaveListItem` pair Lynx's own\n   testing-library exposes. What a fake cannot tell you is whether the engine\n   agrees about layout, which is the half that only a device can answer.\n\nFull reasoning for every decision above, including what the old cross-platform\ndesign cost and why it was dropped:\n[`docs/mini-lynx-runtime.md`](../../docs/mini-lynx-runtime.md).\nAgents editing this package start at [`AGENTS.md`](./AGENTS.md); a shorter\nconsumer-facing brief for an LLM is in [`AI.md`](./AI.md).\n\n> **Pre-alpha.** Breaking changes can land in any 0.x release; they ride a minor\n> bump. This package also inherits Lynx's cadence — every JS-side Lynx package\n> is still 0.x — and nothing upstream is documented for custom frameworks, so\n> ReactLynx is the de-facto specification.\n\n## License\n\n[MIT](../../LICENSE)\n","readmeFilename":"README.md"}