{"_id":"@1game/solid-popover","_rev":"10-93ee8ef54473b77945b2651181d08230","name":"@1game/solid-popover","dist-tags":{"latest":"1.21.0"},"versions":{"1.15.0":{"name":"@1game/solid-popover","version":"1.15.0","author":"linlinfaxin@163.com","license":"MIT","_id":"@1game/solid-popover@1.15.0","maintainers":[{"name":"linfaxin","email":"linlinfaxin@163.com"}],"dist":{"shasum":"98d82c96d1bd70a323010855f0f39a56cadaa649","tarball":"https://registry.npmjs.org/@1game/solid-popover/-/solid-popover-1.15.0.tgz","fileCount":21,"integrity":"sha512-Pg1yzgAHxZfY4aIlHAGZB8/FJPM7O6Iq2Qj9s823y01Kx/CdGfLdwmOhcihf6zKVtE+dh66GCbeRgOUMuCy3bg==","signatures":[{"sig":"MEUCICiQCzPFrUxTmeoizNm9JCP/MxVojt3+NdqDA0okTvJMAiEAgjz+cDpzyBcYWpIbN4XoKz60GVsybrGTSihVmcOSK0I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":39774},"main":"lib/index.js","type":"module","types":"lib/index.d.ts","exports":{".":{"types":"./lib/index.d.ts","default":"./lib/index.js"}},"scripts":{"test":"vitest run","build":"pnpm run clean && tsc","clean":"rimraf lib","prepublish":"pnpm run build","test:watch":"vitest"},"_npmUser":{"name":"linfaxin","email":"linlinfaxin@163.com"},"description":"Controlled Popover / Modal overlay for 1Game Engine (OverlayOutlet)","directories":{},"_nodeVersion":"22.14.0","dependencies":{"@1game/engine-bundle":"1.15.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.1.2","vitest":"^1.0.0","solid-js":"^1.9.0","typescript":"^5.9.3","@1game/solid-dsl":"1.0.0","vite-plugin-solid":"^2.11.11","@1game/render-data":"1.0.0"},"peerDependencies":{"solid-js":"^1.9.0"},"_npmOperationalInternal":{"tmp":"tmp/solid-popover_1.15.0_1785865782075_0.19437721656016338","host":"s3://npm-registry-packages-npm-production"}},"1.15.1":{"name":"@1game/solid-popover","version":"1.15.1","author":"linlinfaxin@163.com","license":"MIT","_id":"@1game/solid-popover@1.15.1","maintainers":[{"name":"linfaxin","email":"linlinfaxin@163.com"}],"dist":{"shasum":"e7d979e978a2fb0088891ec20817daf038a5406a","tarball":"https://registry.npmjs.org/@1game/solid-popover/-/solid-popover-1.15.1.tgz","fileCount":21,"integrity":"sha512-P2nNnhRO450X766fX2R6wuEguPOo3zssGRY/udrHQjEuahLcSdIOMxdicfZ3ayQOldkrEnzfOfZLAmD4zMBaFw==","signatures":[{"sig":"MEQCIH8tCK8vsHyGn59OcDb5ULhvsegDjR2PenX/ZSqm93ImAiBXnpShVXC5GL2L2Pe/ud6g4bYr58hEQD4Mc3PGpg33zg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":39774},"main":"lib/index.js","type":"module","types":"lib/index.d.ts","exports":{".":{"types":"./lib/index.d.ts","default":"./lib/index.js"}},"scripts":{"test":"vitest run","build":"pnpm run clean && tsc","clean":"rimraf lib","prepublish":"pnpm run build","test:watch":"vitest"},"_npmUser":{"name":"linfaxin","email":"linlinfaxin@163.com"},"description":"Controlled Popover / Modal overlay for 1Game Engine (OverlayOutlet)","directories":{},"_nodeVersion":"22.14.0","dependencies":{"@1game/engine-bundle":"1.15.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.1.2","vitest":"^1.0.0","solid-js":"^1.9.0","typescript":"^5.9.3","@1game/solid-dsl":"1.0.0","vite-plugin-solid":"^2.11.11","@1game/render-data":"1.0.0"},"peerDependencies":{"solid-js":"^1.9.0"},"_npmOperationalInternal":{"tmp":"tmp/solid-popover_1.15.1_1785866036585_0.9993994919861497","host":"s3://npm-registry-packages-npm-production"}},"1.16.0":{"name":"@1game/solid-popover","version":"1.16.0","author":"linlinfaxin@163.com","license":"MIT","_id":"@1game/solid-popover@1.16.0","maintainers":[{"name":"linfaxin","email":"linlinfaxin@163.com"}],"dist":{"shasum":"5f13d0b746ba76c435b7b5b9bfcfde1ccd9d0acd","tarball":"https://registry.npmjs.org/@1game/solid-popover/-/solid-popover-1.16.0.tgz","fileCount":24,"integrity":"sha512-FEGfeEwC9U7UytnkDreqsPun8uTn3UGmzOdYCl/Ev37odTgqsGmTYO8j9TtNl/o2G5UXsqfCH7y2iqLGa4Gisg==","signatures":[{"sig":"MEQCIEUye00Y/qzgn4fUyKDJH3jJDF3LLLyKwSXs+N8YKVS8AiBDqS2u1ad8g9r8NuRYc240RQJ8p9xXSO3pAzOOSKB9Iw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":69113},"main":"lib/index.js","type":"module","types":"lib/index.d.ts","exports":{".":{"types":"./lib/index.d.ts","default":"./lib/index.js"}},"scripts":{"test":"vitest run","build":"pnpm run clean && tsc","clean":"rimraf lib","prepublish":"pnpm run build","test:watch":"vitest"},"_npmUser":{"name":"linfaxin","email":"linlinfaxin@163.com"},"description":"Controlled Popover / Modal / Menu-preset overlays for 1Game Engine (OverlayOutlet + placement flip/shift)","directories":{},"_nodeVersion":"22.14.0","dependencies":{"@1game/engine-bundle":"1.16.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.1.2","vitest":"^1.0.0","solid-js":"^1.9.0","typescript":"^5.9.3","@1game/solid-dsl":"1.0.0","vite-plugin-solid":"^2.11.11","@1game/render-data":"1.0.0"},"peerDependencies":{"solid-js":"^1.9.0"},"_npmOperationalInternal":{"tmp":"tmp/solid-popover_1.16.0_1786025545223_0.628504962031043","host":"s3://npm-registry-packages-npm-production"}},"1.17.0":{"name":"@1game/solid-popover","version":"1.17.0","author":"linlinfaxin@163.com","license":"MIT","_id":"@1game/solid-popover@1.17.0","maintainers":[{"name":"linfaxin","email":"linlinfaxin@163.com"}],"dist":{"shasum":"ea1142fe67f6ded7a9c6a225ce3cbf0e35112fda","tarball":"https://registry.npmjs.org/@1game/solid-popover/-/solid-popover-1.17.0.tgz","fileCount":24,"integrity":"sha512-G0PFgt365BEaEa8X55JHBdDtAWXXNxcvcetNn/4f3ufpByx3aqbQUDygQM+wn/ztOv6N7Jq19ZOh9tUbQQEO2A==","signatures":[{"sig":"MEUCIES4rQP9PIk3GfrzZiynsmsOG7IbvLCAXj1T4NWQbQMmAiEAlEJOcsv11WtX0ksngRERX7xFvtx0KoLF9hohKdrqtVg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":70438},"main":"lib/index.js","type":"module","types":"lib/index.d.ts","exports":{".":{"types":"./lib/index.d.ts","default":"./lib/index.js"}},"scripts":{"test":"vitest run","build":"pnpm run clean && tsc","clean":"rimraf lib","prepublish":"pnpm run build","test:watch":"vitest"},"_npmUser":{"name":"linfaxin","email":"linlinfaxin@163.com"},"description":"Controlled Popover / Modal / Menu-preset overlays for 1Game Engine (OverlayOutlet + placement flip/shift)","directories":{},"_nodeVersion":"22.14.0","dependencies":{"@1game/engine-bundle":"1.17.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.1.2","vitest":"^1.0.0","solid-js":"^1.9.0","typescript":"^5.9.3","@1game/solid-dsl":"1.0.0","vite-plugin-solid":"^2.11.11","@1game/render-data":"1.0.0"},"peerDependencies":{"solid-js":"^1.9.0"},"_npmOperationalInternal":{"tmp":"tmp/solid-popover_1.17.0_1786464854310_0.905216020985421","host":"s3://npm-registry-packages-npm-production"}},"1.17.1":{"name":"@1game/solid-popover","version":"1.17.1","author":"linlinfaxin@163.com","license":"MIT","_id":"@1game/solid-popover@1.17.1","maintainers":[{"name":"linfaxin","email":"linlinfaxin@163.com"}],"dist":{"shasum":"b11929bfe56b85a188202daff9ecb0bd5a7c01ee","tarball":"https://registry.npmjs.org/@1game/solid-popover/-/solid-popover-1.17.1.tgz","fileCount":24,"integrity":"sha512-am37R7iwHLAnkAIc3RQEM6oIKxqSWRaBalgf2dRCsvXksjdkPNpCTBkFplsALqb5836zGNc/+c8uVHTSv7ZYzQ==","signatures":[{"sig":"MEYCIQDoqpPTg3FikvgVjw2ArwVqaSsMS9T/y9xOIxB2bz6aKAIhAP58vXEgu9PyyLv7w9zc/ljezsiM97jlKsgtzZkktkiF","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":70438},"main":"lib/index.js","type":"module","types":"lib/index.d.ts","exports":{".":{"types":"./lib/index.d.ts","default":"./lib/index.js"}},"scripts":{"test":"vitest run","build":"pnpm run clean && tsc","clean":"rimraf lib","prepublish":"pnpm run build","test:watch":"vitest"},"_npmUser":{"name":"linfaxin","email":"linlinfaxin@163.com"},"description":"Controlled Popover / Modal / Menu-preset overlays for 1Game Engine (OverlayOutlet + placement flip/shift)","directories":{},"_nodeVersion":"22.14.0","dependencies":{"@1game/engine-bundle":"1.17.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.1.2","vitest":"^1.0.0","solid-js":"^1.9.0","typescript":"^5.9.3","@1game/solid-dsl":"1.0.0","vite-plugin-solid":"^2.11.11","@1game/render-data":"1.0.0"},"peerDependencies":{"solid-js":"^1.9.0"},"_npmOperationalInternal":{"tmp":"tmp/solid-popover_1.17.1_1786465264594_0.9337872988082669","host":"s3://npm-registry-packages-npm-production"}},"1.17.2":{"name":"@1game/solid-popover","version":"1.17.2","author":"linlinfaxin@163.com","license":"MIT","_id":"@1game/solid-popover@1.17.2","maintainers":[{"name":"linfaxin","email":"linlinfaxin@163.com"}],"dist":{"shasum":"d06763f9e2afa5c9d96ae8ae92ccb8f3c67a8254","tarball":"https://registry.npmjs.org/@1game/solid-popover/-/solid-popover-1.17.2.tgz","fileCount":24,"integrity":"sha512-Zu4D52Pu1VR4RbjBFqyJhx3+aZJMQMJKwJl6WLUgGu4rMEJpkeimuGXk9OuWyxvkm/LET5QbxiranOj7JT1d2Q==","signatures":[{"sig":"MEUCIQCDViNSjmqj2hj2+X2GzjUkS6I37TiB+fd4B25uX/WuywIgOKDf+oUKIy5W6JoT+kIVnjgQy0buYORGjZpVecLoc9A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":70438},"main":"lib/index.js","type":"module","types":"lib/index.d.ts","exports":{".":{"types":"./lib/index.d.ts","default":"./lib/index.js"}},"scripts":{"test":"vitest run","build":"pnpm run clean && tsc","clean":"rimraf lib","prepublish":"pnpm run build","test:watch":"vitest"},"_npmUser":{"name":"linfaxin","email":"linlinfaxin@163.com"},"description":"Controlled Popover / Modal / Menu-preset overlays for 1Game Engine (OverlayOutlet + placement flip/shift)","directories":{},"_nodeVersion":"22.14.0","dependencies":{"@1game/engine-bundle":"1.17.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.1.2","vitest":"^1.0.0","solid-js":"^1.9.0","typescript":"^5.9.3","@1game/solid-dsl":"1.0.0","vite-plugin-solid":"^2.11.11","@1game/render-data":"1.0.0"},"peerDependencies":{"solid-js":"^1.9.0"},"_npmOperationalInternal":{"tmp":"tmp/solid-popover_1.17.2_1786500651234_0.8010318418908464","host":"s3://npm-registry-packages-npm-production"}},"1.18.0":{"name":"@1game/solid-popover","version":"1.18.0","author":"linlinfaxin@163.com","license":"MIT","_id":"@1game/solid-popover@1.18.0","maintainers":[{"name":"linfaxin","email":"linlinfaxin@163.com"}],"dist":{"shasum":"a974ad4e86bdc42708d336e9c3642501c0c559f4","tarball":"https://registry.npmjs.org/@1game/solid-popover/-/solid-popover-1.18.0.tgz","fileCount":24,"integrity":"sha512-GL3D7z3f43/f9L1OSb+PBrqt6TvoAgzlrdH2B8kjmR0lGrlfgoaE56zIqVvk8tCqR/bnFrft2FEBvsZV8hPVnQ==","signatures":[{"sig":"MEYCIQCIxGDHcON5zs9QZ98i+QjCsNwjsfcMQcDepv33eCGo4gIhAN3afhwR/YK6P1KBw3Cwr07pnlA07GnSRJAPPKvUfo3M","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":70565},"main":"lib/index.js","type":"module","types":"lib/index.d.ts","exports":{".":{"types":"./lib/index.d.ts","default":"./lib/index.js"}},"scripts":{"test":"vitest run","build":"pnpm run clean && tsc","clean":"rimraf lib","prepublish":"pnpm run build","test:watch":"vitest"},"_npmUser":{"name":"linfaxin","email":"linlinfaxin@163.com"},"description":"Controlled Popover / Modal / Menu-preset overlays for 1Game Engine (OverlayOutlet + placement flip/shift)","directories":{},"_nodeVersion":"22.14.0","dependencies":{"@1game/engine-bundle":"1.18.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.1.2","vitest":"^1.0.0","solid-js":"^1.9.0","typescript":"^5.9.3","@1game/solid-dsl":"1.0.0","vite-plugin-solid":"^2.11.11","@1game/render-data":"1.0.0"},"peerDependencies":{"solid-js":"^1.9.0"},"_npmOperationalInternal":{"tmp":"tmp/solid-popover_1.18.0_1786988108750_0.9701298247544952","host":"s3://npm-registry-packages-npm-production"}},"1.19.0":{"name":"@1game/solid-popover","version":"1.19.0","author":"linlinfaxin@163.com","license":"MIT","_id":"@1game/solid-popover@1.19.0","maintainers":[{"name":"linfaxin","email":"linlinfaxin@163.com"}],"dist":{"shasum":"9b822193de4b52221b1f82b5ebd10602ecdcfe10","tarball":"https://registry.npmjs.org/@1game/solid-popover/-/solid-popover-1.19.0.tgz","fileCount":24,"integrity":"sha512-EdKjXi2PmQ1gz6nOcQYSYo6ux3+731u3S20cEx9ozqf8hAPQ+qByZsK7yEqhuM6Rb5/EduZz3tTW4D5Pg3Burw==","signatures":[{"sig":"MEQCIDYadgPVrpJAtuVcZlTXLQTHLqt5DF+MgYAmWAVXQy83AiAXaYCJ8U4BPVJy0waPKw6EEOztpjl88HlZPkpmInblZg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":70451},"main":"lib/index.js","type":"module","types":"lib/index.d.ts","exports":{".":{"types":"./lib/index.d.ts","default":"./lib/index.js"}},"scripts":{"test":"vitest run","build":"pnpm run clean && tsc","clean":"rimraf lib","prepublish":"pnpm run build","test:watch":"vitest"},"_npmUser":{"name":"linfaxin","email":"linlinfaxin@163.com"},"description":"Controlled Popover / Modal / Menu-preset overlays for 1Game Engine (OverlayOutlet + placement flip/shift)","directories":{},"_nodeVersion":"22.14.0","dependencies":{"@1game/engine-bundle":"1.19.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.1.2","vitest":"^1.0.0","solid-js":"^1.9.0","typescript":"^5.9.3","vite-plugin-solid":"^2.11.11","@1game/render-data":"1.0.0","@1game/solid-runtime":"1.0.0"},"peerDependencies":{"solid-js":"^1.9.0"},"_npmOperationalInternal":{"tmp":"tmp/solid-popover_1.19.0_1787246457745_0.7375721403900226","host":"s3://npm-registry-packages-npm-production"}},"1.20.0":{"name":"@1game/solid-popover","version":"1.20.0","author":"linlinfaxin@163.com","license":"MIT","_id":"@1game/solid-popover@1.20.0","maintainers":[{"name":"linfaxin","email":"linlinfaxin@163.com"}],"dist":{"shasum":"1400795d939392b656677ff3c35d6e3b3a2148aa","tarball":"https://registry.npmjs.org/@1game/solid-popover/-/solid-popover-1.20.0.tgz","fileCount":24,"integrity":"sha512-HojGW/50nr9OPCFQrWy0ONqkiQhIha88hL5EubaPycFqRY+2qrOYZY4R5HJHTIqJXQCN9y2rNbdUUHFq9gDC1A==","signatures":[{"sig":"MEUCICuf3v+zJ8y74k8WurtcwLYJoS7LWElhDZIWfO/zWt46AiEA6Z94uSg3EEDCiYLuuhq2UTB4bAkNr//gIxvWRDaOOLA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":70451},"main":"lib/index.js","type":"module","types":"lib/index.d.ts","exports":{".":{"types":"./lib/index.d.ts","default":"./lib/index.js"}},"scripts":{"test":"vitest run","build":"pnpm run clean && tsc","clean":"rimraf lib","prepublish":"pnpm run build","test:watch":"vitest"},"_npmUser":{"name":"linfaxin","email":"linlinfaxin@163.com"},"description":"Controlled Popover / Modal / Menu-preset overlays for 1Game Engine (OverlayOutlet + placement flip/shift)","directories":{},"_nodeVersion":"22.14.0","dependencies":{"@1game/engine-bundle":"1.20.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.1.2","vitest":"^1.0.0","solid-js":"^1.9.0","typescript":"^5.9.3","vite-plugin-solid":"^2.11.11","@1game/render-data":"1.0.0","@1game/solid-runtime":"1.0.0"},"peerDependencies":{"solid-js":"^1.9.0"},"_npmOperationalInternal":{"tmp":"tmp/solid-popover_1.20.0_1787844429234_0.9766611548420678","host":"s3://npm-registry-packages-npm-production"}},"1.21.0":{"name":"@1game/solid-popover","description":"Controlled Popover / Modal / Menu-preset overlays for 1Game Engine (OverlayOutlet + placement flip/shift)","version":"1.21.0","license":"MIT","author":"linlinfaxin@163.com","type":"module","publishConfig":{"access":"public"},"main":"lib/index.js","types":"lib/index.d.ts","exports":{".":{"types":"./lib/index.d.ts","default":"./lib/index.js"}},"dependencies":{"@1game/engine-bundle":"1.21.0"},"devDependencies":{"rimraf":"^6.1.2","solid-js":"^1.9.0","typescript":"^5.9.3","vite-plugin-solid":"^2.11.11","vitest":"^1.0.0","@1game/render-data":"1.0.0","@1game/solid-runtime":"1.0.0"},"peerDependencies":{"solid-js":"^1.9.0"},"scripts":{"clean":"rimraf lib","prepublish":"pnpm run build","build":"pnpm run clean && tsc","test":"vitest run","test:watch":"vitest"},"_nodeVersion":"22.14.0","_id":"@1game/solid-popover@1.21.0","dist":{"integrity":"sha512-WZNvtJzA7VJSQz733Xnz9uDGZNIKHQCHIikn4uMnx0FbnKzB0Oe/HQPZ16ef6MfUcH2bzQZUii3v6zR85GMNaA==","shasum":"342e76e8778eea9041ef8cfd8b0028ec24e8f15a","tarball":"https://registry.npmjs.org/@1game/solid-popover/-/solid-popover-1.21.0.tgz","fileCount":24,"unpackedSize":70451,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCICK6fqv/XEBJhlILQvLczCKT2puTsmlhjeRTOzYlYTCcAiEAk/6/Rvp7afpDPRuj14LbOPUN878/sqvMKvzHvTRaTZU="}]},"_npmUser":{"name":"linfaxin","email":"linlinfaxin@163.com"},"directories":{},"maintainers":[{"name":"linfaxin","email":"linlinfaxin@163.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/solid-popover_1.21.0_1788340344365_0.514421601776367"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-04T17:49:41.817Z","modified":"2026-09-02T09:12:24.788Z","1.15.0":"2026-08-04T17:49:42.220Z","1.15.1":"2026-08-04T17:53:56.731Z","1.16.0":"2026-08-06T14:12:25.362Z","1.17.0":"2026-08-11T16:14:14.444Z","1.17.1":"2026-08-11T16:21:04.747Z","1.17.2":"2026-08-12T02:10:51.391Z","1.18.0":"2026-08-17T17:35:08.898Z","1.19.0":"2026-08-20T17:20:57.910Z","1.20.0":"2026-08-27T15:27:09.368Z","1.21.0":"2026-09-02T09:12:24.522Z"},"author":"linlinfaxin@163.com","license":"MIT","description":"Controlled Popover / Modal / Menu-preset overlays for 1Game Engine (OverlayOutlet + placement flip/shift)","maintainers":[{"name":"linfaxin","email":"linlinfaxin@163.com"}],"readme":"# @1game/solid-popover\n\nControlled **Popover** / **Modal** for 1Game Engine, built on solid-runtime\n[`OverlayOutlet`](../../packages/solid-runtime/src/overlay/outlet.ts).\n\n- Registers into the per-runtime overlay registry (`registerOverlay` / `unregisterOverlay`)\n- `renderGame` stays on `@1game/engine-bundle/runtime/worker` — this package does not mount Outlet\n- Open state is **controlled** (`open` + `onOpenChange`) so Public Store / replay can own visibility\n\nFull contract (defaults, dismiss matrix, Escape A3, placement P1, Menu preset, sid rules, out of scope):\n[`docs/overlay-popover-contract.md`](../../docs/overlay-popover-contract.md).\n\nScene-level pointer/keyboard passthrough background:\n[`packages/solid-runtime/README.md`](../../packages/solid-runtime/README.md).\n\n## Install\n\n```bash\npnpm add @1game/solid-popover solid-js\n```\n\nPeer: `solid-js`. Depends on `@1game/engine-bundle` (Worker registry + JSX runtime exports).\n\n## Basic usage\n\n```tsx\nimport { renderGame, createGameStore } from '@1game/engine-bundle/runtime/worker';\nimport { Popover, Modal } from '@1game/solid-popover';\n\nconst { store, commitChange, storeHistory } = createGameStore({ menuOpen: false, dialogOpen: false });\n\nfunction App() {\n  return (\n    <scene name=\"main\" width={640} height={480} backgroundColor=\"#0f0f1a\">\n      {/* overlayKey required when multiple Popover/Modal hosts share one scene */}\n      <Popover\n        overlayKey=\"menu\"\n        open={store.menuOpen}\n        onOpenChange={(v) =>\n          commitChange('menu', (d) => {\n            d.menuOpen = v;\n          })\n        }\n      >\n        <Popover.Trigger>\n          <node x={40} y={40} width={100} height={36} shape=\"rect\" backgroundColor=\"#7c6aef\" />\n        </Popover.Trigger>\n        <Popover.Content x={40} y={90} width={180} height={100}>\n          {/* Panel group is clickable (blocks Modal absorb). Decorative children need no clickable. */}\n          <node width={180} height={100} shape=\"rect\" backgroundColor=\"#1e1e3a\" />\n          <Popover.Close>\n            <node x={120} y={60} width={48} height={28} shape=\"rect\" backgroundColor=\"#4a9d6e\" />\n          </Popover.Close>\n        </Popover.Content>\n      </Popover>\n\n      <Modal\n        overlayKey=\"dialog\"\n        open={store.dialogOpen}\n        onOpenChange={(v) =>\n          commitChange('dialog', (d) => {\n            d.dialogOpen = v;\n          })\n        }\n      >\n        <Popover.Trigger>\n          <node x={200} y={40} width={100} height={36} shape=\"rect\" backgroundColor=\"#4a9d6e\" />\n        </Popover.Trigger>\n        <Popover.Content x={170} y={140} width={300} height={160}>\n          <node width={300} height={160} shape=\"rect\" backgroundColor=\"#1e1e3a\" />\n        </Popover.Content>\n      </Modal>\n    </scene>\n  );\n}\n\nrenderGame(() => <App />, { bindStore: storeHistory });\n```\n\nThe worker-path showcase is `apps/cli-demos/dropdown-showcase/`.\n\n## Defaults (summary)\n\n|                       | Popover | Modal | Menu (`menu`) |\n| --------------------- | ------- | ----- | ------------- |\n| `pointerPassThrough`  | true    | false | false         |\n| `closeOnOutside`      | true    | false | true          |\n| `keyboardPassThrough` | true    | false | false         |\n| `closeOnEscape`       | true    | true  | true          |\n\n**No general Focus:** `keyboardPassThrough: false` only means the overlay scene claims keys\n(Escape A3 + scene pick). There is no Tab trap or focus restore. Menu highlight / Arrow keys\nbelong in store state (`highlightIndex` + `onKeyDown`), not the engine. Use Root `menu` or\nspread `MENU_DEFAULTS`:\n\n```tsx\n<Popover\n  menu\n  overlayKey=\"file-menu\"\n  open={store.menuOpen}\n  onOpenChange={(v) =>\n    commitChange('menu', (d) => {\n      d.menuOpen = v;\n    })\n  }\n>\n  ...\n</Popover>\n```\n\n## Multi-instance + panel hits\n\n- Pass distinct `overlayKey` on each Root when more than one Popover/Modal shares a scene\n  (avoids `E_STABLE_UID_COLLISION` on reserved host `__sid`).\n- Outlet content layer is non-clickable fall-through; the Popover Content **panel** is\n  clickable so interior clicks do not hit the dismiss/block absorb layer.\n\n## Anchored placement (P1)\n\nPass a laid-out host-scene node as `anchorNode` (the Trigger’s visible child, via\n`virtualNodeRef` — not the 0×0 Trigger group). Hold it in a Solid `createSignal` so\nplacement recomputes when the ref binds. Engine `getNodeSceneRect` / `VirtualNode.getSceneRect`\nmeasures the scene AABB; Content `placement` / `align` / `offset` write panel `x`/`y` via\n`computePlacementWithAuto` (preferred → **flip** → **shift** into the overlay viewport).\nPanel `width`/`height` are required for this path. Without `anchorNode` (or if measure/size is\nincomplete), manual `x`/`y` still work and do **not** run flip/shift.\n\nAnchored defaults: `flip` and `shift` are on. Pass `flip={false}` / `shift={false}` for\npreferred-only (P0) positioning. Optional `collisionPadding`, `shift={{ padding }}`,\n`flip={{ fallbackPlacements: [...] }}`.\n\n```tsx\nimport { createSignal } from 'solid-js';\nimport type { VirtualNode } from '@1game/engine-bundle/runtime/worker';\n\nconst [btn, setBtn] = createSignal<VirtualNode | undefined>();\n\n<Popover.Trigger>\n  <node x={40} y={40} width={100} height={36} virtualNodeRef={setBtn} />\n</Popover.Trigger>\n<Popover.Content\n  anchorNode={btn()}\n  placement=\"bottom\"\n  offset={8}\n  width={180}\n  height={100}\n  // flip / shift default true — panel stays inside overlay scene\n>\n  ...\n</Popover.Content>\n```\n\nPure helpers (also exported): `computePlacement`, `computePlacementWithAuto`.\n\n## Scripts\n\n```bash\npnpm --filter @1game/solid-popover run build\npnpm --filter @1game/solid-popover run test\n```\n","readmeFilename":""}