{"_id":"@affino/menu-vue","_rev":"22-9d85c9d51d5a4a4b6ecc069a9dc6a89e","name":"@affino/menu-vue","dist-tags":{"alpha":"1.0.0-alpha.12","latest":"2.1.1"},"versions":{"1.0.0-alpha.0":{"name":"@affino/menu-vue","version":"1.0.0-alpha.0","_id":"@affino/menu-vue@1.0.0-alpha.0","maintainers":[{"name":"affino","email":"anton.pavlov.personal@gmail.com"}],"dist":{"shasum":"afaed72ba8c5a35d0a29208cf04adf580de554f0","tarball":"https://registry.npmjs.org/@affino/menu-vue/-/menu-vue-1.0.0-alpha.0.tgz","fileCount":33,"integrity":"sha512-mMy+ta6jQSrQ3pauEkr6rARAcCgAgHmgWFjmHIUcjAEt76RlSVuERQy7XzFuh+GcqZRwnEb8eX1vHdoPh3kxrA==","signatures":[{"sig":"MEYCIQCAcco/Uc5ETi1ZifOFE2n0GANIspiOAY5UrdVFwbL7sgIhAMgFwTh1gzxJ3g25p31elytceN46hE+vGjPvI8yVxImM","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":41476},"main":"dist/index.js","_from":"file:affino-menu-vue-1.0.0-alpha.0.tgz","types":"dist/index.d.ts","module":"dist/index.mjs","scripts":{"build":"tsc -p tsconfig.json"},"_npmUser":{"name":"affino","email":"anton.pavlov.personal@gmail.com"},"_resolved":"/tmp/882200902e40cdf75d27e6f809e64b0d/affino-menu-vue-1.0.0-alpha.0.tgz","_integrity":"sha512-mMy+ta6jQSrQ3pauEkr6rARAcCgAgHmgWFjmHIUcjAEt76RlSVuERQy7XzFuh+GcqZRwnEb8eX1vHdoPh3kxrA==","_npmVersion":"10.8.2","description":"Vue adapter for @affino/menu-core","directories":{},"_nodeVersion":"20.19.6","dependencies":{"@affino/menu-core":"^1.0.0-alpha.0"},"_hasShrinkwrap":false,"peerDependencies":{"vue":"^3.3.0"},"_npmOperationalInternal":{"tmp":"tmp/menu-vue_1.0.0-alpha.0_1765576929701_0.5640861471351757","host":"s3://npm-registry-packages-npm-production"}},"1.0.0-alpha.1":{"name":"@affino/menu-vue","version":"1.0.0-alpha.1","keywords":["vue","vue3","menu","dropdown","context-menu","headless","ui","component","accessibility","aria","keyboard","submenu","design-system","radix","headless-ui"],"_id":"@affino/menu-vue@1.0.0-alpha.1","maintainers":[{"name":"affino","email":"anton.pavlov.personal@gmail.com"}],"dist":{"shasum":"73bd7baf715191b5cfd17bfb966889c57b985c8d","tarball":"https://registry.npmjs.org/@affino/menu-vue/-/menu-vue-1.0.0-alpha.1.tgz","fileCount":33,"integrity":"sha512-5W2nX7xyeahjI+N8+b2Es0HNMBKlJKscljhP3g7sPw41CmNIr/i9FsMzCkjY+oSLPkGXurpBm7694J8UL7Mkhg==","signatures":[{"sig":"MEUCIQDtgOVfTC5qlrFF9/UmYZukS1fp2lJkPXNivFdxkLM6lAIgRcNNHqddSczUxiUdCe3dv1NHk4rfe3A5hjwtOc9eKsE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":41717},"main":"dist/index.js","_from":"file:affino-menu-vue-1.0.0-alpha.1.tgz","types":"dist/index.d.ts","module":"dist/index.mjs","scripts":{"build":"tsc -p tsconfig.json"},"_npmUser":{"name":"affino","email":"anton.pavlov.personal@gmail.com"},"_resolved":"/tmp/c64218d97e8fdb609416bb25d120352d/affino-menu-vue-1.0.0-alpha.1.tgz","_integrity":"sha512-5W2nX7xyeahjI+N8+b2Es0HNMBKlJKscljhP3g7sPw41CmNIr/i9FsMzCkjY+oSLPkGXurpBm7694J8UL7Mkhg==","_npmVersion":"10.8.2","description":"Headless Vue 3 menu components with smart mouse prediction and full keyboard accessibility","directories":{},"_nodeVersion":"20.19.6","_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"vue":"^3.3.0"},"_npmOperationalInternal":{"tmp":"tmp/menu-vue_1.0.0-alpha.1_1765577827169_0.9261347974565415","host":"s3://npm-registry-packages-npm-production"}},"1.0.0-alpha.2":{"name":"@affino/menu-vue","version":"1.0.0-alpha.2","keywords":["vue","vue3","menu","dropdown","context-menu","headless","ui","component","accessibility","aria","keyboard","submenu","design-system","radix","headless-ui"],"_id":"@affino/menu-vue@1.0.0-alpha.2","maintainers":[{"name":"affino","email":"anton.pavlov.personal@gmail.com"}],"dist":{"shasum":"28af6603de2ad7b67a3b37adbf774689924d747f","tarball":"https://registry.npmjs.org/@affino/menu-vue/-/menu-vue-1.0.0-alpha.2.tgz","fileCount":33,"integrity":"sha512-khQLOXYbFihkRnzUXqcgvkgUAZWpbzFNDjRd4PvsSyFaNboQ0oharx23sRK2fjRvFJjYtcuwBKRgrI1ODQR3mg==","signatures":[{"sig":"MEQCIGkBoO887qDzGsMbHGf0E0w8ehkx3svhGtBG6GbC0kq7AiBR3rbMDueCqwAuQMUGYbMMBxHm2hWaSHLBwMt+lkBRIw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":41881},"main":"dist/index.js","type":"module","_from":"file:affino-menu-vue-1.0.0-alpha.2.tgz","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"build":"tsc -p tsconfig.json"},"_npmUser":{"name":"affino","email":"anton.pavlov.personal@gmail.com"},"_resolved":"/tmp/4f0af9681d4dbca427f057323fef98c3/affino-menu-vue-1.0.0-alpha.2.tgz","_integrity":"sha512-khQLOXYbFihkRnzUXqcgvkgUAZWpbzFNDjRd4PvsSyFaNboQ0oharx23sRK2fjRvFJjYtcuwBKRgrI1ODQR3mg==","_npmVersion":"10.8.2","description":"Headless Vue 3 menu components with smart mouse prediction and full keyboard accessibility","directories":{},"_nodeVersion":"20.19.6","dependencies":{"@affino/menu-core":"^1.0.0-alpha.2"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"vue":"^3.3.0"},"_npmOperationalInternal":{"tmp":"tmp/menu-vue_1.0.0-alpha.2_1765582631613_0.7774244407439719","host":"s3://npm-registry-packages-npm-production"}},"1.0.0-alpha.3":{"name":"@affino/menu-vue","version":"1.0.0-alpha.3","keywords":["vue","vue3","menu","dropdown","context-menu","headless","ui","component","accessibility","aria","keyboard","submenu","design-system","radix","headless-ui"],"author":{"name":"Anton Pavlov","email":"pavlov@myyahho.com"},"license":"MIT","_id":"@affino/menu-vue@1.0.0-alpha.3","maintainers":[{"name":"affino","email":"anton.pavlov.personal@gmail.com"}],"homepage":"https://ui.unitlab.io","bugs":{"url":"https://github.com/affinio/affinio/issues"},"dist":{"shasum":"07cb9634405696ac6966cb2cfc8b89e3986c1df2","tarball":"https://registry.npmjs.org/@affino/menu-vue/-/menu-vue-1.0.0-alpha.3.tgz","fileCount":31,"integrity":"sha512-mzvu04MmrOzqbp1KkX5aX7dl03KZ3mkY5uNHSpAh0H4vZoJCT3NLeVoHja68qMYINxLlBlO9d0Ktqs2i2zcNTg==","signatures":[{"sig":"MEUCIDD8IAeblDLYypH1fUzJ8KNk1fjbbKToo9IV29hSu1TJAiEAqjigYsMGnt4faPuoZ5gxLWoH3ICDJ9q+Py7wH+AGZ7c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":56986},"type":"module","_from":"file:affino-menu-vue-1.0.0-alpha.3.tgz","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./styles.css":"./dist/styles.css"},"scripts":{"build":"pnpm run clean && vite build && pnpm run build:types","clean":"rm -rf dist","build:types":"vue-tsc -p tsconfig.build.json"},"_npmUser":{"name":"affino","email":"anton.pavlov.personal@gmail.com"},"_resolved":"/tmp/c78c05a609eadffb2a0086ba5ca2dc64/affino-menu-vue-1.0.0-alpha.3.tgz","_integrity":"sha512-mzvu04MmrOzqbp1KkX5aX7dl03KZ3mkY5uNHSpAh0H4vZoJCT3NLeVoHja68qMYINxLlBlO9d0Ktqs2i2zcNTg==","repository":{"url":"git+https://github.com/affinio/affinio.git","type":"git"},"_npmVersion":"10.8.2","description":"Headless Vue 3 menu components with smart mouse prediction and full keyboard accessibility","directories":{},"_nodeVersion":"20.19.6","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"@types/node":"^25.0.1"},"peerDependencies":{"vue":"^3.3.0","@affino/menu-core":"^1.0.0-alpha.2"},"_npmOperationalInternal":{"tmp":"tmp/menu-vue_1.0.0-alpha.3_1765588476145_0.29741125224769416","host":"s3://npm-registry-packages-npm-production"}},"1.0.0-alpha.4":{"name":"@affino/menu-vue","version":"1.0.0-alpha.4","keywords":["vue","vue3","menu","dropdown","context-menu","headless","ui","component","accessibility","aria","keyboard","submenu","design-system","radix","headless-ui"],"author":{"name":"Anton Pavlov","email":"pavlov@myyahho.com"},"license":"MIT","_id":"@affino/menu-vue@1.0.0-alpha.4","maintainers":[{"name":"affino","email":"anton.pavlov.personal@gmail.com"}],"homepage":"https://ui.unitlab.io","bugs":{"url":"https://github.com/affinio/affinio/issues"},"dist":{"shasum":"ccf2d3c053c47162d71372123cd6d42622ed0c5f","tarball":"https://registry.npmjs.org/@affino/menu-vue/-/menu-vue-1.0.0-alpha.4.tgz","fileCount":31,"integrity":"sha512-eQ/VlHXJkVtGlvb5eJC1HE/4FH742M5kSFoD/PY7m53VSBoVzXyUepZnsmGcJCWwxg3bBEz8U92E8Rq88D6vNA==","signatures":[{"sig":"MEUCIQDBlEn0qRcXnAGvAOlFmTxhicpC1bG205DAC2vw/a6HYAIgR8agWZQv1VH6axJeuU5iKZwEyqzbZcDOJz6EzpKTs6M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":57117},"type":"module","_from":"file:affino-menu-vue-1.0.0-alpha.4.tgz","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./styles.css":"./dist/styles.css"},"scripts":{"build":"pnpm run clean && vite build && pnpm run build:types","clean":"rm -rf dist","build:types":"vue-tsc -p tsconfig.build.json"},"_npmUser":{"name":"affino","email":"anton.pavlov.personal@gmail.com"},"_resolved":"/tmp/9ff908ab67fabf9bf429d0c915c13085/affino-menu-vue-1.0.0-alpha.4.tgz","_integrity":"sha512-eQ/VlHXJkVtGlvb5eJC1HE/4FH742M5kSFoD/PY7m53VSBoVzXyUepZnsmGcJCWwxg3bBEz8U92E8Rq88D6vNA==","repository":{"url":"git+https://github.com/affinio/affinio.git","type":"git"},"_npmVersion":"10.8.2","description":"Headless Vue 3 menu components with smart mouse prediction and full keyboard accessibility","directories":{},"_nodeVersion":"20.19.6","_hasShrinkwrap":false,"peerDependencies":{"vue":"^3.3.0","@affino/menu-core":"^1.0.0-alpha.2"},"_npmOperationalInternal":{"tmp":"tmp/menu-vue_1.0.0-alpha.4_1765590454388_0.748082701860505","host":"s3://npm-registry-packages-npm-production"}},"1.0.0-alpha.5":{"name":"@affino/menu-vue","version":"1.0.0-alpha.5","keywords":["vue","vue3","menu","dropdown","context-menu","headless","ui","component","accessibility","aria","keyboard","submenu","design-system","radix","headless-ui"],"author":{"name":"Anton Pavlov","email":"pavlov@myyahho.com"},"license":"MIT","_id":"@affino/menu-vue@1.0.0-alpha.5","maintainers":[{"name":"affino","email":"anton.pavlov.personal@gmail.com"}],"homepage":"https://ui.unitlab.io","bugs":{"url":"https://github.com/affinio/affinio/issues"},"dist":{"shasum":"841105ff30379cff1939f1eb2c463d96466f7aa0","tarball":"https://registry.npmjs.org/@affino/menu-vue/-/menu-vue-1.0.0-alpha.5.tgz","fileCount":31,"integrity":"sha512-folVbyucuMjtrbFhCxlhSLZkSAuQ5cRY1DZWBnzMwE/4xO+VzX2I2KIyZpKhseRkhxJ1ddLDaO3VGgJKV3Zg7Q==","signatures":[{"sig":"MEUCIQDaGnlS9wMqbFHP3x0s7scHkXvpH3+EnL7rEaOaTeplIAIgHXZ1ukvycBgjjSCpYGi0K7Cx5bcHI/S6pJnCwY6Q4QE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":58705},"type":"module","_from":"file:affino-menu-vue-1.0.0-alpha.5.tgz","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./styles.css":"./dist/styles.css"},"scripts":{"test":"vitest run","build":"pnpm run clean && vite build && pnpm run build:types","clean":"rm -rf dist","build:types":"vue-tsc -p tsconfig.build.json"},"_npmUser":{"name":"affino","email":"anton.pavlov.personal@gmail.com"},"_resolved":"/tmp/e99beff8d841ee26f800ba333bee26a4/affino-menu-vue-1.0.0-alpha.5.tgz","_integrity":"sha512-folVbyucuMjtrbFhCxlhSLZkSAuQ5cRY1DZWBnzMwE/4xO+VzX2I2KIyZpKhseRkhxJ1ddLDaO3VGgJKV3Zg7Q==","repository":{"url":"git+https://github.com/affinio/affinio.git","type":"git"},"_npmVersion":"10.8.2","description":"Headless Vue 3 menu components with smart mouse prediction and full keyboard accessibility","directories":{},"_nodeVersion":"20.19.6","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdom":"^27.3.0","vitest":"^4.0.15","@vue/test-utils":"^2.4.6","@affino/menu-core":"^1.0.0-alpha.3","@vitejs/plugin-vue":"^6.0.3","@vitest/coverage-v8":"^4.0.15","@testing-library/vue":"^8.1.0"},"peerDependencies":{"vue":"^3.3.0","@affino/menu-core":"^1.0.0-alpha.3"},"_npmOperationalInternal":{"tmp":"tmp/menu-vue_1.0.0-alpha.5_1765750976727_0.8026301377401293","host":"s3://npm-registry-packages-npm-production"}},"1.0.0-alpha.6":{"name":"@affino/menu-vue","version":"1.0.0-alpha.6","keywords":["vue","vue3","menu","dropdown","context-menu","headless","ui","component","accessibility","aria","keyboard","submenu","design-system","radix","headless-ui"],"author":{"name":"Anton Pavlov","email":"pavlov@myyahho.com"},"license":"MIT","_id":"@affino/menu-vue@1.0.0-alpha.6","maintainers":[{"name":"affino","email":"anton.pavlov.personal@gmail.com"}],"homepage":"https://ui.unitlab.io","bugs":{"url":"https://github.com/affinio/affinio/issues"},"dist":{"shasum":"09638a29938f47410d31a05714c4a419b22c7df3","tarball":"https://registry.npmjs.org/@affino/menu-vue/-/menu-vue-1.0.0-alpha.6.tgz","fileCount":31,"integrity":"sha512-PtUR3WdBjXXgiIDtHPQT0bRom/2nIHIW12lkv/uOWt6CBjTvfW5Ekl9A5iVuYtgYZmgEJGQtGvLDesf1EB/2+g==","signatures":[{"sig":"MEYCIQD3hZJUXLQ19+sXH++X+ih97uUXcJFpgF+Ypgm6N7xyHwIhAJejlOTETRp+OhTOY4P3G0/2ytI9obbUAWBATcyuCrih","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":59885},"type":"module","_from":"file:affino-menu-vue-1.0.0-alpha.6.tgz","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./styles.css":"./dist/styles.css"},"scripts":{"test":"vitest run","build":"pnpm run clean && vite build && pnpm run build:types","clean":"rm -rf dist","build:types":"vue-tsc -p tsconfig.build.json"},"_npmUser":{"name":"affino","email":"anton.pavlov.personal@gmail.com"},"_resolved":"/tmp/5588fa1953bd08415cc15e45f4b53b72/affino-menu-vue-1.0.0-alpha.6.tgz","_integrity":"sha512-PtUR3WdBjXXgiIDtHPQT0bRom/2nIHIW12lkv/uOWt6CBjTvfW5Ekl9A5iVuYtgYZmgEJGQtGvLDesf1EB/2+g==","repository":{"url":"git+https://github.com/affinio/affinio.git","type":"git"},"_npmVersion":"10.8.2","description":"Headless Vue 3 menu components with smart mouse prediction and full keyboard accessibility","directories":{},"_nodeVersion":"20.19.6","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdom":"^27.3.0","vitest":"^4.0.15","@vue/test-utils":"^2.4.6","@affino/menu-core":"^1.0.0-alpha.4","@vitejs/plugin-vue":"^6.0.3","@vitest/coverage-v8":"^4.0.15","@testing-library/vue":"^8.1.0"},"peerDependencies":{"vue":"^3.3.0","@affino/menu-core":"^1.0.0-alpha.4"},"_npmOperationalInternal":{"tmp":"tmp/menu-vue_1.0.0-alpha.6_1765805585601_0.2565912032506419","host":"s3://npm-registry-packages-npm-production"}},"1.0.0-alpha.7":{"name":"@affino/menu-vue","version":"1.0.0-alpha.7","keywords":["vue","vue3","menu","dropdown","context-menu","headless","ui","component","accessibility","aria","keyboard","submenu","design-system","radix","headless-ui"],"author":{"name":"Anton Pavlov","email":"pavlov@myyahho.com"},"license":"MIT","_id":"@affino/menu-vue@1.0.0-alpha.7","maintainers":[{"name":"affino","email":"anton.pavlov.personal@gmail.com"}],"homepage":"https://ui.unitlab.io","bugs":{"url":"https://github.com/affinio/affinio/issues"},"dist":{"shasum":"a98f7613fed1e8474f73d13cc6f111baece9ae3a","tarball":"https://registry.npmjs.org/@affino/menu-vue/-/menu-vue-1.0.0-alpha.7.tgz","fileCount":31,"integrity":"sha512-hWfy2X8TowvNQvT7M6WkMQDrGSqewT6ikzti03N78Yoe6J4JVAGWKGBqM6TusMPNAYjz3yyRFnZXRAbJCeGVKQ==","signatures":[{"sig":"MEYCIQDwXns7iZzza3yToCTKWR5VUwnb0YETcNFKOvCcs9DfcQIhAMcHTyDNKzWdmLX1wZD/VdTQtbq+OwFqZYY3Qupa8IZa","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":59571},"type":"module","_from":"file:affino-menu-vue-1.0.0-alpha.7.tgz","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./styles.css":"./dist/styles.css"},"scripts":{"test":"vitest run","build":"pnpm run clean && vite build && pnpm run build:types","clean":"rm -rf dist","build:types":"vue-tsc -p tsconfig.build.json"},"_npmUser":{"name":"affino","email":"anton.pavlov.personal@gmail.com"},"_resolved":"/tmp/924be10672dd7a60fe2931ac30e5fa1a/affino-menu-vue-1.0.0-alpha.7.tgz","_integrity":"sha512-hWfy2X8TowvNQvT7M6WkMQDrGSqewT6ikzti03N78Yoe6J4JVAGWKGBqM6TusMPNAYjz3yyRFnZXRAbJCeGVKQ==","repository":{"url":"git+https://github.com/affinio/affinio.git","type":"git"},"_npmVersion":"10.8.2","description":"Headless Vue 3 menu components with smart mouse prediction and full keyboard accessibility","directories":{},"_nodeVersion":"20.19.6","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdom":"^27.3.0","vitest":"^4.0.15","@vue/test-utils":"^2.4.6","@affino/menu-core":"^1.0.0-alpha.5","@vitejs/plugin-vue":"^6.0.3","@vitest/coverage-v8":"^4.0.15","@testing-library/vue":"^8.1.0"},"peerDependencies":{"vue":"^3.3.0","@affino/menu-core":"^1.0.0-alpha.5"},"_npmOperationalInternal":{"tmp":"tmp/menu-vue_1.0.0-alpha.7_1765919737253_0.45550011715655603","host":"s3://npm-registry-packages-npm-production"}},"1.0.0-alpha.9":{"name":"@affino/menu-vue","version":"1.0.0-alpha.9","keywords":["vue","vue3","menu","dropdown","context-menu","headless","ui","component","accessibility","aria","keyboard","submenu","design-system","radix","headless-ui"],"author":{"name":"Anton Pavlov","email":"pavlov@myyahho.com"},"license":"MIT","_id":"@affino/menu-vue@1.0.0-alpha.9","maintainers":[{"name":"affino","email":"anton.pavlov.personal@gmail.com"}],"homepage":"https://ui.unitlab.io","bugs":{"url":"https://github.com/affinio/affinio/issues"},"dist":{"shasum":"76c1045b4c349d29712f818686090d7e40dd3790","tarball":"https://registry.npmjs.org/@affino/menu-vue/-/menu-vue-1.0.0-alpha.9.tgz","fileCount":31,"integrity":"sha512-YwE8rKfHtcWF6wHApdnSYamxbkJk7q3n4oVCKe8Q/LyEWHFsBG+3Dcg/SWHR5B+6EnpBNzwiwFixwJOSGyJm7A==","signatures":[{"sig":"MEQCICM4QZ1cZ2ZZkJ8SPF3IyuZKD+bbTLgCnh8vnNhB0nIBAiA19Zt6SvrMYrLUfq+TnqYxGxvec5OIlo0vepOpsGu4TQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":59595},"type":"module","_from":"file:affino-menu-vue-1.0.0-alpha.9.tgz","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./styles.css":"./dist/styles.css"},"scripts":{"test":"vitest run","build":"pnpm run clean && vite build && pnpm run build:types","clean":"rm -rf dist","build:types":"vue-tsc -p tsconfig.build.json"},"_npmUser":{"name":"affino","email":"anton.pavlov.personal@gmail.com"},"_resolved":"/tmp/f97ed4474ca6f041c9468dad6a003e6b/affino-menu-vue-1.0.0-alpha.9.tgz","_integrity":"sha512-YwE8rKfHtcWF6wHApdnSYamxbkJk7q3n4oVCKe8Q/LyEWHFsBG+3Dcg/SWHR5B+6EnpBNzwiwFixwJOSGyJm7A==","repository":{"url":"git+https://github.com/affinio/affinio.git#main","type":"git"},"_npmVersion":"10.8.2","description":"Headless Vue 3 menu components with smart mouse prediction and full keyboard accessibility","directories":{},"_nodeVersion":"20.19.6","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdom":"^27.3.0","vitest":"^4.0.15","@vue/test-utils":"^2.4.6","@affino/menu-core":"^1.0.0-alpha.7","@vitejs/plugin-vue":"^6.0.3","@vitest/coverage-v8":"^4.0.15","@testing-library/vue":"^8.1.0"},"peerDependencies":{"vue":"^3.3.0","@affino/menu-core":"^1.0.0-alpha.7"},"_npmOperationalInternal":{"tmp":"tmp/menu-vue_1.0.0-alpha.9_1765925276033_0.9518509496087071","host":"s3://npm-registry-packages-npm-production"}},"1.0.0-alpha.10":{"name":"@affino/menu-vue","version":"1.0.0-alpha.10","keywords":["vue","vue3","menu","dropdown","context-menu","headless","ui","component","accessibility","aria","keyboard","submenu","design-system","radix","headless-ui"],"author":{"name":"Anton Pavlov","email":"a.pavlov@affino.dev"},"license":"MIT","_id":"@affino/menu-vue@1.0.0-alpha.10","maintainers":[{"name":"affino","email":"anton.pavlov.personal@gmail.com"}],"homepage":"https://affino.dev","bugs":{"url":"https://github.com/affinio/affinio/issues"},"dist":{"shasum":"802425104e4874f2140b97b9cb82f942bf65c94d","tarball":"https://registry.npmjs.org/@affino/menu-vue/-/menu-vue-1.0.0-alpha.10.tgz","fileCount":31,"integrity":"sha512-N+bTTNRJbc2LGZ5T3wnMp2NanE2VpaVFLaCR5MwnJMmzgNyhYi20xHUK1+v6tEELXQvkNW3S1D9q+rU0yy0y4w==","signatures":[{"sig":"MEUCIQDaWQc3oWmq9n6nOqpl+xqmU2DJrvQygFrCp+0hSN5Y5QIgQgOvhZCyiTbc6gSAxk+6NsAvv2sAWbSkJCOIgtj1X9A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":59594},"type":"module","_from":"file:affino-menu-vue-1.0.0-alpha.10.tgz","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./styles.css":"./dist/styles.css"},"scripts":{"test":"vitest run","build":"pnpm run clean && vite build && pnpm run build:types","clean":"rm -rf dist","build:types":"vue-tsc -p tsconfig.build.json"},"_npmUser":{"name":"affino","email":"anton.pavlov.personal@gmail.com"},"_resolved":"/tmp/33247e5a928a34741fbec7df422a0042/affino-menu-vue-1.0.0-alpha.10.tgz","_integrity":"sha512-N+bTTNRJbc2LGZ5T3wnMp2NanE2VpaVFLaCR5MwnJMmzgNyhYi20xHUK1+v6tEELXQvkNW3S1D9q+rU0yy0y4w==","repository":{"url":"git+https://github.com/affinio/affinio.git#main","type":"git"},"_npmVersion":"10.8.2","description":"Headless Vue 3 menu components with smart mouse prediction and full keyboard accessibility","directories":{},"_nodeVersion":"20.19.6","_hasShrinkwrap":false,"devDependencies":{"jsdom":"^27.3.0","vitest":"^4.0.15","@vue/test-utils":"^2.4.6","@affino/menu-core":"^1.0.0-alpha.8","@vitejs/plugin-vue":"^6.0.3","@vitest/coverage-v8":"^4.0.15","@testing-library/vue":"^8.1.0"},"peerDependencies":{"vue":"^3.3.0","@affino/menu-core":"^1.0.0-alpha.8"},"_npmOperationalInternal":{"tmp":"tmp/menu-vue_1.0.0-alpha.10_1765984002090_0.20699161527476306","host":"s3://npm-registry-packages-npm-production"}},"1.0.0-alpha.11":{"name":"@affino/menu-vue","version":"1.0.0-alpha.11","keywords":["vue","vue3","menu","dropdown","context-menu","headless","ui","component","accessibility","aria","keyboard","submenu","design-system","radix","headless-ui"],"author":{"name":"Anton Pavlov","email":"a.pavlov@affino.dev"},"license":"MIT","_id":"@affino/menu-vue@1.0.0-alpha.11","maintainers":[{"name":"affino","email":"anton.pavlov.personal@gmail.com"}],"homepage":"https://affino.dev","bugs":{"url":"https://github.com/affinio/affinio/issues"},"dist":{"shasum":"03f2049f821b4218f8b92bf3fcdef178eeea1be8","tarball":"https://registry.npmjs.org/@affino/menu-vue/-/menu-vue-1.0.0-alpha.11.tgz","fileCount":31,"integrity":"sha512-ZVJAj8p9WnwRpg9sNX/fpfQ1uZdQ6oxg6GrVC3pDv+qN59PQpucq2G+B1WG/xlhIjaJxvjGZtaFYBv01vK3y6g==","signatures":[{"sig":"MEQCIGFHIa+mCo3kL130c2TPYsCvK/Q5tHTjPFZbP1ie7ke3AiAv7P1QOYNO9YqbM+Yc9osaCKKXYG7dbyn9kdav4gAxmQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":59700},"type":"module","_from":"file:affino-menu-vue-1.0.0-alpha.11.tgz","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./styles.css":"./dist/styles.css"},"scripts":{"test":"vitest run","build":"pnpm run clean && vite build && pnpm run build:types","clean":"rm -rf dist","build:types":"vue-tsc -p tsconfig.build.json"},"_npmUser":{"name":"affino","email":"anton.pavlov.personal@gmail.com"},"_resolved":"/tmp/f09abf2cc1e60efa2878b4d6e7945cee/affino-menu-vue-1.0.0-alpha.11.tgz","_integrity":"sha512-ZVJAj8p9WnwRpg9sNX/fpfQ1uZdQ6oxg6GrVC3pDv+qN59PQpucq2G+B1WG/xlhIjaJxvjGZtaFYBv01vK3y6g==","repository":{"url":"git+https://github.com/affinio/affinio.git#main","type":"git"},"_npmVersion":"10.8.2","description":"Headless Vue 3 menu components with smart mouse prediction and full keyboard accessibility","directories":{},"_nodeVersion":"20.19.6","_hasShrinkwrap":false,"devDependencies":{"jsdom":"^27.3.0","vitest":"^4.0.15","@vue/test-utils":"^2.4.6","@affino/menu-core":"^1.0.0-alpha.8","@vitejs/plugin-vue":"^6.0.3","@vitest/coverage-v8":"^4.0.15","@testing-library/vue":"^8.1.0"},"peerDependencies":{"vue":"^3.3.0","@affino/menu-core":"^1.0.0-alpha.8"},"_npmOperationalInternal":{"tmp":"tmp/menu-vue_1.0.0-alpha.11_1765990331306_0.7517922692133618","host":"s3://npm-registry-packages-npm-production"}},"1.0.0-alpha.12":{"name":"@affino/menu-vue","version":"1.0.0-alpha.12","keywords":["vue","vue3","menu","dropdown","context-menu","headless","ui","component","accessibility","aria","keyboard","submenu","design-system","radix","headless-ui"],"author":{"name":"Anton Pavlov","email":"a.pavlov@affino.dev"},"license":"MIT","_id":"@affino/menu-vue@1.0.0-alpha.12","maintainers":[{"name":"affino","email":"anton.pavlov.personal@gmail.com"}],"homepage":"https://affino.dev","bugs":{"url":"https://github.com/affinio/affinio/issues"},"dist":{"shasum":"9d9bfa74d3b502cc976b29f61b1a03f05a88a656","tarball":"https://registry.npmjs.org/@affino/menu-vue/-/menu-vue-1.0.0-alpha.12.tgz","fileCount":31,"integrity":"sha512-i6j1czXDNArc44iEMsOFG4gT2Ewn5Nj+JA49EC1Kphk9hRP4wkeS8OdgIrK90hjPLjSqgGtNY12KpPds1gZUvA==","signatures":[{"sig":"MEUCIQDLKEI58nLW3+QWm4dEs9y92q+avz42LLbEmTrAvZL78AIgGIVxoP5yWV7QPpwzXrVgzBah8CRU3H8xbltg6MqCs40=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":59700},"type":"module","_from":"file:affino-menu-vue-1.0.0-alpha.12.tgz","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./styles.css":"./dist/styles.css"},"scripts":{"test":"vitest run","build":"pnpm run clean && vite build && pnpm run build:types","clean":"rm -rf dist","build:types":"vue-tsc -p tsconfig.build.json"},"_npmUser":{"name":"affino","email":"anton.pavlov.personal@gmail.com"},"_resolved":"/tmp/1d7de3e87837c2f64d39ae812261cd1d/affino-menu-vue-1.0.0-alpha.12.tgz","_integrity":"sha512-i6j1czXDNArc44iEMsOFG4gT2Ewn5Nj+JA49EC1Kphk9hRP4wkeS8OdgIrK90hjPLjSqgGtNY12KpPds1gZUvA==","repository":{"url":"git+https://github.com/affinio/affinio.git#main","type":"git"},"_npmVersion":"10.8.2","description":"Headless Vue 3 menu components with smart mouse prediction and full keyboard accessibility","directories":{},"_nodeVersion":"20.19.6","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdom":"^27.3.0","vitest":"^4.0.15","@vue/test-utils":"^2.4.6","@affino/menu-core":"^1.0.0-alpha.9","@vitejs/plugin-vue":"^6.0.3","@vitest/coverage-v8":"^4.0.15","@testing-library/vue":"^8.1.0"},"peerDependencies":{"vue":"^3.3.0","@affino/menu-core":"^1.0.0-alpha.9"},"_npmOperationalInternal":{"tmp":"tmp/menu-vue_1.0.0-alpha.12_1768945489057_0.44304078648649003","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"@affino/menu-vue","version":"1.0.0","keywords":["vue","vue3","menu","dropdown","context-menu","headless","ui","component","accessibility","aria","keyboard","submenu","design-system","radix","headless-ui"],"author":{"name":"Anton Pavlov","email":"a.pavlov@affino.dev"},"license":"MIT","_id":"@affino/menu-vue@1.0.0","maintainers":[{"name":"affino","email":"anton.pavlov.personal@gmail.com"}],"homepage":"https://affino.dev","bugs":{"url":"https://github.com/affinio/affinio/issues"},"dist":{"shasum":"5abc345a87a7975bb8a29833dc4afec306a4bc78","tarball":"https://registry.npmjs.org/@affino/menu-vue/-/menu-vue-1.0.0.tgz","fileCount":58,"integrity":"sha512-FRBS4gXoGF+aZdksZKlcTaZ5sOc6EietlGRKn2Yuhy/pUZKXy9gJlMGQnGOYypl0BWfVXfPU7rf4MEm7jhD5lA==","signatures":[{"sig":"MEUCIQDfPVgRYf7YrETXfpHj+kLEZnVr4h2sDBPbfrJlwWsvBgIgO/EunKuitPFgPPwipzuh6MWfJ4xxVRkMSD2IvBIPS/Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":100708},"type":"module","_from":"file:affino-menu-vue-1.0.0.tgz","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./styles.css":"./dist/styles.css"},"scripts":{"test":"vitest run","build":"pnpm run clean && vite build && pnpm run build:types","clean":"rm -rf dist","build:types":"vue-tsc --build tsconfig.build.json"},"_npmUser":{"name":"affino","email":"anton.pavlov.personal@gmail.com"},"_resolved":"/tmp/71309b78e011a8beba839f84514f0f8e/affino-menu-vue-1.0.0.tgz","_integrity":"sha512-FRBS4gXoGF+aZdksZKlcTaZ5sOc6EietlGRKn2Yuhy/pUZKXy9gJlMGQnGOYypl0BWfVXfPU7rf4MEm7jhD5lA==","repository":{"url":"git+https://github.com/affinio/affinio.git#main","type":"git"},"_npmVersion":"10.8.2","description":"Headless Vue 3 menu components with smart mouse prediction and full keyboard accessibility","directories":{},"_nodeVersion":"20.19.6","dependencies":{"@affino/focus-utils":"^1.0.0","@affino/overlay-host":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^27.3.0","vitest":"^4.0.15","@vue/test-utils":"^2.4.6","@affino/menu-core":"^1.0.0","@vitejs/plugin-vue":"^6.0.3","@vitest/coverage-v8":"^4.0.15","@testing-library/vue":"^8.1.0"},"peerDependencies":{"vue":"^3.3.0","@affino/menu-core":"^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/menu-vue_1.0.0_1769943353184_0.8512242302857043","host":"s3://npm-registry-packages-npm-production"}},"2.1.0":{"name":"@affino/menu-vue","version":"2.1.0","keywords":["vue","vue3","menu","dropdown","context-menu","headless","ui","component","accessibility","aria","keyboard","submenu","design-system","radix","headless-ui"],"author":{"name":"Anton Pavlov","email":"a.pavlov@affino.dev"},"license":"MIT","_id":"@affino/menu-vue@2.1.0","maintainers":[{"name":"affino","email":"anton.pavlov.personal@gmail.com"}],"homepage":"https://affino.dev","bugs":{"url":"https://github.com/affinio/affinio/issues"},"dist":{"shasum":"727acd71081689ef14f0f8a3c1c4f27f13c8bc99","tarball":"https://registry.npmjs.org/@affino/menu-vue/-/menu-vue-2.1.0.tgz","fileCount":58,"integrity":"sha512-GgKnPma6A6Sfs2DZGEaSStorEaJH991bW5Udoynr5iVnTWrT529NHQSQcoHSG+4PSk4HWgUnhDgH//r1o1G/Gw==","signatures":[{"sig":"MEUCIQC9owc6kOAIDy5mRE3hAkBpjFSyPcSODZCcz9LMtyGVDgIgEl4O6tXDSjL0hESamoj4WX0Zf3+OUmTBz1nOU4EIRnM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":112802},"main":"dist/index.js","type":"module","_from":"file:affino-menu-vue-2.1.0.tgz","types":"dist/index.d.ts","module":"dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./styles.css":"./dist/styles.css"},"scripts":{"test":"vitest run","build":"pnpm run clean && vite build && pnpm run build:types","clean":"rm -rf dist","build:types":"vue-tsc --build tsconfig.build.json"},"_npmUser":{"name":"affino","email":"anton.pavlov.personal@gmail.com"},"_resolved":"/tmp/4435aded49fefbcf9d739f79909e557d/affino-menu-vue-2.1.0.tgz","_integrity":"sha512-GgKnPma6A6Sfs2DZGEaSStorEaJH991bW5Udoynr5iVnTWrT529NHQSQcoHSG+4PSk4HWgUnhDgH//r1o1G/Gw==","repository":{"url":"git+https://github.com/affinio/affinio.git#main","type":"git"},"_npmVersion":"10.8.2","description":"Headless Vue 3 menu components with smart mouse prediction and full keyboard accessibility","directories":{},"_nodeVersion":"20.20.0","dependencies":{"@affino/focus-utils":"^1.1.0","@affino/overlay-host":"^1.1.0","@affino/overlay-kernel":"^0.2.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^27.3.0","vitest":"^4.0.15","@vue/test-utils":"^2.4.6","@affino/menu-core":"^1.1.0","@vitejs/plugin-vue":"^6.0.3","@vitest/coverage-v8":"^4.0.15","@testing-library/vue":"^8.1.0"},"peerDependencies":{"vue":"^3.3.0","@affino/menu-core":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/menu-vue_2.1.0_1771583954307_0.8263073835980381","host":"s3://npm-registry-packages-npm-production"}},"2.1.1":{"name":"@affino/menu-vue","version":"2.1.1","author":{"name":"Anton Pavlov","email":"a.pavlov@affino.dev"},"type":"module","description":"Headless Vue 3 menu components with smart mouse prediction and full keyboard accessibility","exports":{".":{"import":"./dist/index.js","types":"./dist/index.d.ts"},"./styles.css":"./dist/styles.css"},"peerDependencies":{"@affino/menu-core":"^1.1.0","vue":"^3.3.0"},"dependencies":{"@affino/overlay-kernel":"^0.2.0","@affino/overlay-host":"^1.1.0","@affino/focus-utils":"^1.1.0"},"devDependencies":{"@testing-library/vue":"^8.1.0","@vitejs/plugin-vue":"^6.0.3","@vitest/coverage-v8":"^4.0.15","@vue/test-utils":"^2.4.6","jsdom":"^27.3.0","vite":"^7.3.1","vitest":"^4.0.15","@affino/menu-core":"^1.1.0"},"repository":{"type":"git","url":"git+https://github.com/affinio/affinio.git#main"},"homepage":"https://affino.dev","keywords":["vue","vue3","menu","dropdown","context-menu","headless","ui","component","accessibility","aria","keyboard","submenu","design-system","radix","headless-ui"],"license":"MIT","bugs":{"url":"https://github.com/affinio/affinio/issues"},"types":"dist/index.d.ts","main":"dist/index.js","module":"dist/index.js","scripts":{"clean":"rm -rf dist","build":"pnpm run clean && vite build && pnpm run build:types","build:types":"vue-tsc --build tsconfig.build.json","test":"vitest run"},"_id":"@affino/menu-vue@2.1.1","_integrity":"sha512-83fDTTpdJC8spvtFst6wz6nodKYOawFNxGb4OB2FG7K+qElMxqD/3PJhaiRktM7qtJgwCk0+PguCuMJSAQGgSQ==","_resolved":"/tmp/71a429ec1e4cf867acdcf5f6436fe46d/affino-menu-vue-2.1.1.tgz","_from":"file:affino-menu-vue-2.1.1.tgz","_nodeVersion":"20.20.0","_npmVersion":"10.8.2","dist":{"integrity":"sha512-83fDTTpdJC8spvtFst6wz6nodKYOawFNxGb4OB2FG7K+qElMxqD/3PJhaiRktM7qtJgwCk0+PguCuMJSAQGgSQ==","shasum":"be44d6dfbf909f4ad26cafdbc18b873de0df6c6a","tarball":"https://registry.npmjs.org/@affino/menu-vue/-/menu-vue-2.1.1.tgz","fileCount":57,"unpackedSize":93004,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIG9/csCY0/FXlo2MVcxIQcKj7gRU/DJ4hZ5n33/A/Z/fAiEAx3URJ/jHVF21eOeH38QZHY+0rUdDATEjiKuFL0wGppE="}]},"_npmUser":{"name":"affino","email":"anton.pavlov.personal@gmail.com"},"directories":{},"maintainers":[{"name":"affino","email":"anton.pavlov.personal@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/menu-vue_2.1.1_1771764841180_0.2852764145619"},"_hasShrinkwrap":false}},"time":{"created":"2025-12-12T22:02:09.611Z","modified":"2026-02-22T12:54:01.427Z","1.0.0-alpha.0":"2025-12-12T22:02:09.856Z","1.0.0-alpha.1":"2025-12-12T22:17:07.310Z","1.0.0-alpha.2":"2025-12-12T23:37:11.769Z","1.0.0-alpha.3":"2025-12-13T01:14:36.308Z","1.0.0-alpha.4":"2025-12-13T01:47:34.535Z","1.0.0-alpha.5":"2025-12-14T22:22:56.878Z","1.0.0-alpha.6":"2025-12-15T13:33:05.752Z","1.0.0-alpha.7":"2025-12-16T21:15:37.411Z","1.0.0-alpha.9":"2025-12-16T22:47:56.176Z","1.0.0-alpha.10":"2025-12-17T15:06:42.224Z","1.0.0-alpha.11":"2025-12-17T16:52:11.466Z","1.0.0-alpha.12":"2026-01-20T21:44:49.209Z","1.0.0":"2026-02-01T10:55:53.335Z","2.1.0":"2026-02-20T10:39:14.467Z","2.1.1":"2026-02-22T12:54:01.305Z"},"bugs":{"url":"https://github.com/affinio/affinio/issues"},"author":{"name":"Anton Pavlov","email":"a.pavlov@affino.dev"},"license":"MIT","homepage":"https://affino.dev","keywords":["vue","vue3","menu","dropdown","context-menu","headless","ui","component","accessibility","aria","keyboard","submenu","design-system","radix","headless-ui"],"repository":{"type":"git","url":"git+https://github.com/affinio/affinio.git#main"},"description":"Headless Vue 3 menu components with smart mouse prediction and full keyboard accessibility","maintainers":[{"name":"affino","email":"anton.pavlov.personal@gmail.com"}],"readme":"# @affino/menu-vue\n\n> Vue's most advanced headless menu system — instant accessibility, diagonal mouse prediction, and zero lock-in.\n\n```vue\n<script setup lang=\"ts\">\nimport { UiMenu, UiMenuTrigger, UiMenuContent, UiMenuItem } from '@affino/menu-vue'\nconst actions = ['Edit', 'Duplicate', 'Archive']\n</script>\n\n<template>\n  <UiMenu>\n    <UiMenuTrigger>Actions</UiMenuTrigger>\n    <UiMenuContent>\n      <UiMenuItem v-for=\"action in actions\" :key=\"action\" @select=\"() => console.log(action)\">\n        {{ action }}\n      </UiMenuItem>\n    </UiMenuContent>\n  </UiMenu>\n</template>\n```\n\n```bash\nnpm install @affino/menu-vue\n```\n\n## Core Features\n\n- Headless Vue 3 components powered by `@affino/menu-core`\n- WAI-ARIA compliant keyboard and pointer handling out of the box\n- Smart mouse prediction keeps submenus open during diagonal travel\n- Unlimited submenu depth with shared tree state and focus safety\n- `asChild` pattern lets you keep native elements and design systems\n- Built-in context menu + click menu support with unified API\n- Auto positioning and viewport collision handling without extra deps\n- Snapshot-driven state subscriptions for zero wasted renders\n- Programmatic controller for imperative open/close/highlight flows\n- CSS variable theme surface for light/dark/brand combos\n- First-class TypeScript types for every prop, event, and controller method\n- Works with virtualization strategies for 1000+ items\n\nDocs → [./docs/index.md](./docs/index.md)\n\n## Why this library exists\n\n- **HeadlessUI** couples logic to Tailwind-era assumptions, lacks mouse prediction, and breaks under deep submenu trees.\n- **Radix Vue** mirrors React APIs but still ties you to their opinionated slot structure and no framework-agnostic core.\n- **Naive UI** ships batteries-included menus, but styling + behavior are inseparable, making custom UX nearly impossible.\n- Designers demanded diagonal hover intent, perf on 1000-row tables, and context menus that feel native — so we built it.\n\n## Highlights of architecture\n\n- Shared observable menu tree keeps open/active paths in sync across levels.\n- Pointer heuristics run outside Vue render cycle for predictable 60fps intent detection.\n- Adapter layer returns ready-to-spread props so DOM stays under your control.\n- Controller API exposes `open/close/highlight/select` hooks for automation.\n- Positioner computes anchor/panel geometry with gutter + viewport padding inputs.\n- `asChild` cloning ensures ARIA + event wiring survive custom elements.\n- Core is framework-agnostic, so Menu Vue stays tiny and future-proof.\n\n## Feature Comparison Table\n\n| Feature | @affino/menu-vue |\n|---------|---------------------|\n| Smart mouse prediction | ✅ |\n| Unlimited nested submenus | ✅ |\n| Auto positioning | ✅ |\n| `asChild` pattern | ✅ |\n| Framework-agnostic core | ✅ |\n| Context + click menus | ✅ |\n| Programmatic controller | ✅ |\n| Bundle size (min+gzip) | ~8 KB |\n| Virtualization ready | ✅ |\n| TypeScript coverage | 100% |\n\n## Getting Started\n\n1. `npm install @affino/menu-vue`\n2. Import your global CSS followed by the menu styles in your app entry (usually `main.ts`) so the design tokens are available everywhere:\n\n```ts\nimport '@affino/menu-vue/styles.css'\n```\n\n3. Wrap your trigger + content with `<UiMenu>` / `<UiMenuTrigger>` / `<UiMenuContent>`\n4. Spread controller props onto your DOM via `asChild` when customizing\n5. Add nested `<UiSubMenu>` components for multi-level trees (level 3+ supported)\n6. Dive deeper in [docs/getting-started.md](./docs/getting-started.md)\n\n## Positioning API\n\n`UiMenu` and `UiMenuContent` now expose public positioning controls so teams can avoid local geometry hacks.\n\n```vue\n<UiMenu placement=\"bottom\" align=\"start\" :gutter=\"8\" :viewport-padding=\"12\">\n  <UiMenuTrigger>Open</UiMenuTrigger>\n  <UiMenuContent>\n    <UiMenuItem id=\"edit\">Edit</UiMenuItem>\n  </UiMenuContent>\n</UiMenu>\n```\n\nAvailable props:\n\n- `placement?: \"top\" | \"bottom\" | \"left\" | \"right\" | \"auto\"`\n- `align?: \"start\" | \"center\" | \"end\" | \"auto\"`\n- `gutter?: number`\n- `viewportPadding?: number`\n\nBehavior and compatibility:\n\n- Defaults are preserved (`bottom` for root content, `right` for submenu content).\n- `UiMenuContent` / `UiSubMenuContent` can override values passed from `UiMenu` / `UiSubMenu`.\n- Props are forwarded to `useMenuPositioning` and then to `@affino/menu-core` positioning.\n\n\n## Controller Surface\n\n`useMenuController` is backed by `createMenuTree`, so every controller now exposes the same pointer + geometry helpers that power the core package. That means you can sync layout data or inject custom pointer samples without casting to `SubmenuCore`.\n\n```ts\nconst controller = useMenuController({ kind: \"root\", options, callbacks })\n\nwatchEffect(() => {\n  if (controller.state.value.open) {\n    console.log(\"Active item\", controller.state.value.activeItemId)\n  }\n})\n\n// Optional helpers become available automatically for submenus\ncontroller.recordPointer?.({ x: event.clientX, y: event.clientY })\ncontroller.setTriggerRect?.(triggerRect)\ncontroller.setPanelRect?.(panelRect)\n\n// Anchors work for both context menus and custom positioning flows\ncontroller.setAnchor(triggerRect)\n```\n\n- `recordPointer` feeds the diagonal intent heuristic so you can pipe in your own pointer stream (desktop, stylus, remote input, etc.).\n- `setTriggerRect` / `setPanelRect` keep submenu geometry in sync after ResizeObserver updates or layout transitions.\n- `setAnchor` lets you open at arbitrary coordinates (context menus, palettes, inspector panes) without writing glue code.\n\n## Overlay kernel integration\n\n`useMenuController` (and the components built on top of it) automatically register each menu surface with the shared `@affino/overlay-kernel` manager when `document` exists. Override stacking metadata via `:options=\"{ overlayKind, overlayEntryTraits }\"`, or provide custom managers with `overlayManager` / `getOverlayManager`. During SSR the hook simply defers registration until hydration, so servers never touch the DOM and client-side managers stay in sync once mounted.\n\n\n## Headless usage with createMenuTree\n\nNeed to integrate the Affino core into another renderer? Instantiate the helper directly — it returns the same branch objects the Vue controller now uses internally.\n\n```ts\nimport { createMenuTree } from \"@affino/menu-core\"\n\nconst tree = createMenuTree({ options: { openDelay: 60, closeDelay: 90 } })\n\ntree.root.registerItem(\"file\")\n\nconst submenu = tree.createSubmenu({\n  parent: tree.root,\n  parentItemId: \"file\",\n})\n\nsubmenu.geometry?.sync({\n  trigger: document.querySelector(\"[data-file]\")?.getBoundingClientRect() ?? null,\n  panel: document.querySelector(\"[data-file-panel]\")?.getBoundingClientRect() ?? null,\n})\n\nwindow.addEventListener(\"pointermove\", (event) => {\n  submenu.pointer?.record({ x: event.clientX, y: event.clientY })\n})\n\n// Tear everything down when the view unmounts\ntree.destroy()\n```\n\nThis flow works in design systems, custom runtimes, or tests where you want the raw controller surface without Vue components.\n\n\n## Live Examples\n\n**Try it yourself in under 30 seconds:**\n\n- 🚀 **[Demos →](https://affino.dev)**\n\n\n## FAQ\n\n- **Does it work with Nuxt / SSR?** Yes. Components render on the server and hydrate with zero config.\n- **Can I disable mouse prediction?** Pass `:options=\"{ mousePrediction: null }\"` on `UiMenu`.\n- **How do I run context menus?** Use `trigger=\"contextmenu\"` or open the controller at pointer coordinates (see `guide/context-menu.md`).\n- **What about huge data sets?** Pair `<UiMenuContent>` with `vue-virtual-scroller` (recipe in `guide/virtualization.md`).\n\n## Browser Support\n\n- Evergreen Chromium, Firefox, Safari (ES2020+)\n- Vue 3.4+\n- TypeScript 5+\n\n## License\n\nMIT © affino OSS\n","readmeFilename":"README.md"}