{"_id":"@affino/menu-core","_rev":"19-63abcd8aadc78b2284c0c455244963f1","name":"@affino/menu-core","dist-tags":{"alpha":"1.0.0-alpha.9","latest":"1.1.0"},"versions":{"1.0.0-alpha.0":{"name":"@affino/menu-core","version":"1.0.0-alpha.0","_id":"@affino/menu-core@1.0.0-alpha.0","maintainers":[{"name":"affino","email":"anton.pavlov.personal@gmail.com"}],"dist":{"shasum":"e38e8b29635776096c5f71a9dc8b2dcc8eb61459","tarball":"https://registry.npmjs.org/@affino/menu-core/-/menu-core-1.0.0-alpha.0.tgz","fileCount":36,"integrity":"sha512-wBPdh23mv7Z6fNmjAhspSP9b5d99aFIRJno66xFFAqUvL4dY181ElelYXq0LQttj1U697WA1WzAz3QQ3XiUYNQ==","signatures":[{"sig":"MEUCIDM7FDuKvENAyR7v+vJigTsRhCASlyF2BdGPs4NQpLNzAiEAuIgDGQcLcPXeRj6BQ0xCoMdE+j2HvmZbEA/+zIZuB/I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":102295},"main":"dist/index.js","_from":"file:affino-menu-core-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/65a6213d332d4cb63237d0e3298d7c36/affino-menu-core-1.0.0-alpha.0.tgz","_integrity":"sha512-wBPdh23mv7Z6fNmjAhspSP9b5d99aFIRJno66xFFAqUvL4dY181ElelYXq0LQttj1U697WA1WzAz3QQ3XiUYNQ==","_npmVersion":"10.8.2","description":"Headless menu engine for Affino UI","directories":{},"_nodeVersion":"20.19.6","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/menu-core_1.0.0-alpha.0_1765576693454_0.004491811916076616","host":"s3://npm-registry-packages-npm-production"}},"1.0.0-alpha.1":{"name":"@affino/menu-core","version":"1.0.0-alpha.1","keywords":["menu","dropdown","context-menu","headless","core","engine","framework-agnostic","ui-core","accessibility","aria","keyboard-navigation","state-machine","positioning","mouse-prediction"],"_id":"@affino/menu-core@1.0.0-alpha.1","maintainers":[{"name":"affino","email":"anton.pavlov.personal@gmail.com"}],"dist":{"shasum":"4a5a48151628b83cfd469b99f040a9dd7baeec5d","tarball":"https://registry.npmjs.org/@affino/menu-core/-/menu-core-1.0.0-alpha.1.tgz","fileCount":36,"integrity":"sha512-K7RztVJk+RmS2Qr0livQZstgmMt40hFeyVmOeT8F72vuU/I/xXSf52dA0l5Y1TJwIpfrXk1+dpJrhZyVrJ0tdw==","signatures":[{"sig":"MEYCIQCOak/gFJytavtWuJoLgFIkvRJ38ysIsYXj+xmvSzWVzwIhAJfg5xHTW/lM1QTHCNODATnTfhJ5ejr0SH4uSSX/jgUf","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":102645},"main":"dist/index.js","_from":"file:affino-menu-core-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/b7ffeab080c3038f9d8ed27149d9049e/affino-menu-core-1.0.0-alpha.1.tgz","_integrity":"sha512-K7RztVJk+RmS2Qr0livQZstgmMt40hFeyVmOeT8F72vuU/I/xXSf52dA0l5Y1TJwIpfrXk1+dpJrhZyVrJ0tdw==","_npmVersion":"10.8.2","description":"Framework-agnostic headless menu engine with smart mouse prediction, keyboard navigation, and nested submenus","directories":{},"_nodeVersion":"20.19.6","_hasShrinkwrap":false,"readmeFilename":"README.md","_npmOperationalInternal":{"tmp":"tmp/menu-core_1.0.0-alpha.1_1765577740779_0.15156348433746492","host":"s3://npm-registry-packages-npm-production"}},"1.0.0-alpha.2":{"name":"@affino/menu-core","version":"1.0.0-alpha.2","keywords":["menu","dropdown","context-menu","headless","core","engine","framework-agnostic","ui-core","accessibility","aria","keyboard-navigation","state-machine","positioning","mouse-prediction","submenu","intent","floating-ui","radix","headless-ui"],"_id":"@affino/menu-core@1.0.0-alpha.2","maintainers":[{"name":"affino","email":"anton.pavlov.personal@gmail.com"}],"dist":{"shasum":"1d0a2542848aaa2b5552fe67f9bb9bfe47bf6a69","tarball":"https://registry.npmjs.org/@affino/menu-core/-/menu-core-1.0.0-alpha.2.tgz","fileCount":36,"integrity":"sha512-iLeryXMR3jkBhgYv+Eedg0h+R3+SCI0M+JhmRt+Pc0ATFE7PkgzMF6wzsk3WziKVCTfE+2hM18zvW7pOVEQAtA==","signatures":[{"sig":"MEYCIQDEbojvPRDrBJCuEixIbOJhwhLBc98Mg+dGz5Eo/anyFAIhAICXgT/1unrnOVm25srRW4w9pIyLKESXWFUjs+LpaHNa","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":102846},"main":"dist/index.js","type":"module","_from":"file:affino-menu-core-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/981faab871f83dd8959d23c121f48a66/affino-menu-core-1.0.0-alpha.2.tgz","_integrity":"sha512-iLeryXMR3jkBhgYv+Eedg0h+R3+SCI0M+JhmRt+Pc0ATFE7PkgzMF6wzsk3WziKVCTfE+2hM18zvW7pOVEQAtA==","_npmVersion":"10.8.2","description":"Framework-agnostic headless menu engine with smart mouse prediction, keyboard navigation, and nested submenus","directories":{},"sideEffects":false,"_nodeVersion":"20.19.6","_hasShrinkwrap":false,"readmeFilename":"README.md","_npmOperationalInternal":{"tmp":"tmp/menu-core_1.0.0-alpha.2_1765582590054_0.2802629229260194","host":"s3://npm-registry-packages-npm-production"}},"1.0.0-alpha.3":{"name":"@affino/menu-core","version":"1.0.0-alpha.3","keywords":["menu","dropdown","context-menu","headless","core","engine","framework-agnostic","ui-core","accessibility","aria","keyboard-navigation","state-machine","positioning","mouse-prediction","submenu","intent","floating-ui","radix","headless-ui"],"author":{"name":"Anton Pavlov","email":"pavlov@myyahho.com"},"license":"MIT","_id":"@affino/menu-core@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":"e0d227b94d9851233cca3c5685171b16ae9fd49e","tarball":"https://registry.npmjs.org/@affino/menu-core/-/menu-core-1.0.0-alpha.3.tgz","fileCount":42,"integrity":"sha512-RcWPdkT0Y4drnLUBTbe3/5tnC/i1fMurnRgk2ZzGRl/WljiBgIO/EQe9i6Bfei7+otOevF9PuUHN43lUW6j2/Q==","signatures":[{"sig":"MEQCIGwMnd1gaAHEEW1gnkxqPQtBP/qhhteLXo1jznX7ynrmAiAd/qXCAQV0AwGlV5hBgDX5fB++1tkOVMxOEpA0KlUvOw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":87412},"main":"dist/index.js","type":"module","_from":"file:affino-menu-core-1.0.0-alpha.3.tgz","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsc -p tsconfig.json"},"_npmUser":{"name":"affino","email":"anton.pavlov.personal@gmail.com"},"_resolved":"/tmp/28029384a658340afe11369db2d24033/affino-menu-core-1.0.0-alpha.3.tgz","_integrity":"sha512-RcWPdkT0Y4drnLUBTbe3/5tnC/i1fMurnRgk2ZzGRl/WljiBgIO/EQe9i6Bfei7+otOevF9PuUHN43lUW6j2/Q==","repository":{"url":"git+https://github.com/affinio/affinio.git","type":"git"},"_npmVersion":"10.8.2","description":"Framework-agnostic headless menu engine with smart mouse prediction, keyboard navigation, and nested submenus","directories":{},"sideEffects":false,"_nodeVersion":"20.19.6","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"vitest":"^4.0.15","@vitest/coverage-v8":"^4.0.15"},"_npmOperationalInternal":{"tmp":"tmp/menu-core_1.0.0-alpha.3_1765750946828_0.9205014391373569","host":"s3://npm-registry-packages-npm-production"}},"1.0.0-alpha.4":{"name":"@affino/menu-core","version":"1.0.0-alpha.4","keywords":["menu","dropdown","context-menu","headless","core","engine","framework-agnostic","ui-core","accessibility","aria","keyboard-navigation","state-machine","positioning","mouse-prediction","submenu","intent","floating-ui","radix","headless-ui"],"author":{"name":"Anton Pavlov","email":"pavlov@myyahho.com"},"license":"MIT","_id":"@affino/menu-core@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":"ded1a9dc05f3cd63e1c95b5d239d3bf75919ca15","tarball":"https://registry.npmjs.org/@affino/menu-core/-/menu-core-1.0.0-alpha.4.tgz","fileCount":42,"integrity":"sha512-6NbrAlUAxhSyhXbQowQe6G3jKEs9aI0y6bAh5CLs+AANz+ZgSz77TjN0j6aG14gQJ39q2WiuSeKofOEQ9gwAjg==","signatures":[{"sig":"MEUCIQDbOIsqHLtXUu2njff8wq9DqIEx4kHHKHbUqYkiyoxQsgIgAL2XPWE8dBybkPPOfCIS+GBQtDPVl/sQugtTKWArJpg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":88339},"main":"dist/index.js","type":"module","_from":"file:affino-menu-core-1.0.0-alpha.4.tgz","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsc -p tsconfig.json"},"_npmUser":{"name":"affino","email":"anton.pavlov.personal@gmail.com"},"_resolved":"/tmp/1a20659a91f5f97018ccc5f746435fee/affino-menu-core-1.0.0-alpha.4.tgz","_integrity":"sha512-6NbrAlUAxhSyhXbQowQe6G3jKEs9aI0y6bAh5CLs+AANz+ZgSz77TjN0j6aG14gQJ39q2WiuSeKofOEQ9gwAjg==","repository":{"url":"git+https://github.com/affinio/affinio.git","type":"git"},"_npmVersion":"10.8.2","description":"Framework-agnostic headless menu engine with smart mouse prediction, keyboard navigation, and nested submenus","directories":{},"sideEffects":false,"_nodeVersion":"20.19.6","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"vitest":"^4.0.15","@vitest/coverage-v8":"^4.0.15"},"_npmOperationalInternal":{"tmp":"tmp/menu-core_1.0.0-alpha.4_1765805562925_0.4244518651734792","host":"s3://npm-registry-packages-npm-production"}},"1.0.0-alpha.5":{"name":"@affino/menu-core","version":"1.0.0-alpha.5","keywords":["menu","dropdown","context-menu","headless","core","engine","framework-agnostic","ui-core","accessibility","aria","keyboard-navigation","state-machine","positioning","mouse-prediction","submenu","intent","floating-ui","radix","headless-ui"],"author":{"name":"Anton Pavlov","email":"pavlov@myyahho.com"},"license":"MIT","_id":"@affino/menu-core@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":"6691f4fdf70acff7a9566c6166b54fbb3842f524","tarball":"https://registry.npmjs.org/@affino/menu-core/-/menu-core-1.0.0-alpha.5.tgz","fileCount":42,"integrity":"sha512-9ZU3FLdFOd+UCfX3RxPGS1hBy4ZcvICaB+vTUT5dBbVffJn1HBKgPcc1srvv1GRcAjP70TKtsf1W6EyASSgmeQ==","signatures":[{"sig":"MEUCIGf1hVMrEtdxKs+4x6scEsyY8+VlSnzKkHLj6JVs2RNuAiEAkxr4c3pQWhjQMYp+IiNKPNyAbdR2QKNpohSUC2Tmk/k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":91577},"main":"dist/index.js","type":"module","_from":"file:affino-menu-core-1.0.0-alpha.5.tgz","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsc -p tsconfig.json"},"_npmUser":{"name":"affino","email":"anton.pavlov.personal@gmail.com"},"_resolved":"/tmp/a2843234282f982cd6a6fee6f4801b36/affino-menu-core-1.0.0-alpha.5.tgz","_integrity":"sha512-9ZU3FLdFOd+UCfX3RxPGS1hBy4ZcvICaB+vTUT5dBbVffJn1HBKgPcc1srvv1GRcAjP70TKtsf1W6EyASSgmeQ==","repository":{"url":"git+https://github.com/affinio/affinio.git","type":"git"},"_npmVersion":"10.8.2","description":"Framework-agnostic headless menu engine with smart mouse prediction, keyboard navigation, and nested submenus","directories":{},"sideEffects":false,"_nodeVersion":"20.19.6","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"vitest":"^4.0.15","@vitest/coverage-v8":"^4.0.15"},"_npmOperationalInternal":{"tmp":"tmp/menu-core_1.0.0-alpha.5_1765919528479_0.7945277103077417","host":"s3://npm-registry-packages-npm-production"}},"1.0.0-alpha.6":{"name":"@affino/menu-core","version":"1.0.0-alpha.6","keywords":["menu","dropdown","context-menu","headless","core","engine","framework-agnostic","ui-core","accessibility","aria","keyboard-navigation","state-machine","positioning","mouse-prediction","submenu","intent","floating-ui","radix","headless-ui"],"author":{"name":"Anton Pavlov","email":"pavlov@myyahho.com"},"license":"MIT","_id":"@affino/menu-core@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":"d413436ec54988dd2016e417236d5656a26831bf","tarball":"https://registry.npmjs.org/@affino/menu-core/-/menu-core-1.0.0-alpha.6.tgz","fileCount":42,"integrity":"sha512-hU89rsyXZxZmGjLgM/oFSM+OXgY0/uS9Afe7McDQ7i0U4ZF1Bc/01tB4Xwgi3dIiMRdtO60iMYI6DwTYcyuL1w==","signatures":[{"sig":"MEUCIAcv7Aska3voEJ8HwOsSyscztNPTcGrt2b7g3qD4gK2sAiEAiwWeqzEjowkdoZ/1kxgtGzHbQrB8rta/l9bE/vPfjWg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":95158},"main":"dist/index.js","type":"module","_from":"file:affino-menu-core-1.0.0-alpha.6.tgz","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsc -p tsconfig.json"},"_npmUser":{"name":"affino","email":"anton.pavlov.personal@gmail.com"},"_resolved":"/tmp/d7a67453ba46683bd7a955bdf40dd5c6/affino-menu-core-1.0.0-alpha.6.tgz","_integrity":"sha512-hU89rsyXZxZmGjLgM/oFSM+OXgY0/uS9Afe7McDQ7i0U4ZF1Bc/01tB4Xwgi3dIiMRdtO60iMYI6DwTYcyuL1w==","repository":{"url":"git+https://github.com/affinio/affinio.git","type":"git"},"_npmVersion":"10.8.2","description":"Framework-agnostic headless menu engine with smart mouse prediction, keyboard navigation, and nested submenus","directories":{},"sideEffects":false,"_nodeVersion":"20.19.6","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"vitest":"^4.0.15","@vitest/coverage-v8":"^4.0.15"},"_npmOperationalInternal":{"tmp":"tmp/menu-core_1.0.0-alpha.6_1765923962281_0.16831477836965036","host":"s3://npm-registry-packages-npm-production"}},"1.0.0-alpha.7":{"name":"@affino/menu-core","version":"1.0.0-alpha.7","keywords":["menu","dropdown","context-menu","headless","core","engine","framework-agnostic","ui-core","accessibility","aria","keyboard-navigation","state-machine","positioning","mouse-prediction","submenu","intent","floating-ui","radix","headless-ui"],"author":{"name":"Anton Pavlov","email":"pavlov@myyahho.com"},"license":"MIT","_id":"@affino/menu-core@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":"ee4c7b5f7d8118e836a16aa9e81a11e7913e346b","tarball":"https://registry.npmjs.org/@affino/menu-core/-/menu-core-1.0.0-alpha.7.tgz","fileCount":42,"integrity":"sha512-2RXt6P+1JC1X6uRFsPtVnKwhO9PesHkbT5duJKlj4z4QY4GpEYNe9d8spVOZTQ05YIn9MZx6x7phLz1SXMfzNw==","signatures":[{"sig":"MEUCIQCEgoetxF8LrN57uwPb0640DoF1WpYfPhvhEDJIERGYXwIgIpbCq/DxktJ+m9UAwuRnqgKUuYkHTDXK4YxWQzxmmZU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":95183},"main":"dist/index.js","type":"module","_from":"file:affino-menu-core-1.0.0-alpha.7.tgz","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsc -p tsconfig.json"},"_npmUser":{"name":"affino","email":"anton.pavlov.personal@gmail.com"},"_resolved":"/tmp/2aee921d7efea12c8473a35d1d99cb83/affino-menu-core-1.0.0-alpha.7.tgz","_integrity":"sha512-2RXt6P+1JC1X6uRFsPtVnKwhO9PesHkbT5duJKlj4z4QY4GpEYNe9d8spVOZTQ05YIn9MZx6x7phLz1SXMfzNw==","repository":{"url":"git+https://github.com/affinio/affinio.git#main","type":"git"},"_npmVersion":"10.8.2","description":"Framework-agnostic headless menu engine with smart mouse prediction, keyboard navigation, and nested submenus","directories":{},"sideEffects":false,"_nodeVersion":"20.19.6","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"vitest":"^4.0.15","@vitest/coverage-v8":"^4.0.15"},"_npmOperationalInternal":{"tmp":"tmp/menu-core_1.0.0-alpha.7_1765925245011_0.5606442056266958","host":"s3://npm-registry-packages-npm-production"}},"1.0.0-alpha.8":{"name":"@affino/menu-core","version":"1.0.0-alpha.8","keywords":["menu","dropdown","context-menu","headless","core","engine","framework-agnostic","ui-core","accessibility","aria","keyboard-navigation","state-machine","positioning","mouse-prediction","submenu","intent","floating-ui","radix","headless-ui"],"author":{"name":"Anton Pavlov","email":"a.pavlov@affino.dev"},"license":"MIT","_id":"@affino/menu-core@1.0.0-alpha.8","maintainers":[{"name":"affino","email":"anton.pavlov.personal@gmail.com"}],"homepage":"https://affino.dev","bugs":{"url":"https://github.com/affinio/affinio/issues"},"dist":{"shasum":"9fce339c9decb7947e106aca98c042babd5e94d7","tarball":"https://registry.npmjs.org/@affino/menu-core/-/menu-core-1.0.0-alpha.8.tgz","fileCount":42,"integrity":"sha512-Qo3u7RJDDSpjra4gCwZ3p6MjsQ3N3FZgngQpOeTcTncXITASRUdQrf34pCd5re9eesN3a0d/pk+hmc/hGnaNfQ==","signatures":[{"sig":"MEUCIBIojksXplwIJ8DY8S3piC1XWCAot6rfl3hWAdiZe34xAiEA/xlSFs12BjyiFPiz//7HfOMxdoPLK68s6vqCe+8Tc88=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":95181},"main":"dist/index.js","type":"module","_from":"file:affino-menu-core-1.0.0-alpha.8.tgz","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsc -p tsconfig.json"},"_npmUser":{"name":"affino","email":"anton.pavlov.personal@gmail.com"},"_resolved":"/tmp/5f91542b5f95b29f84d30fefbc570bae/affino-menu-core-1.0.0-alpha.8.tgz","_integrity":"sha512-Qo3u7RJDDSpjra4gCwZ3p6MjsQ3N3FZgngQpOeTcTncXITASRUdQrf34pCd5re9eesN3a0d/pk+hmc/hGnaNfQ==","repository":{"url":"git+https://github.com/affinio/affinio.git#main","type":"git"},"_npmVersion":"10.8.2","description":"Framework-agnostic headless menu engine with smart mouse prediction, keyboard navigation, and nested submenus","directories":{},"sideEffects":false,"_nodeVersion":"20.19.6","_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.0.15","@vitest/coverage-v8":"^4.0.15"},"_npmOperationalInternal":{"tmp":"tmp/menu-core_1.0.0-alpha.8_1765983920339_0.3145304961334625","host":"s3://npm-registry-packages-npm-production"}},"1.0.0-alpha.9":{"name":"@affino/menu-core","version":"1.0.0-alpha.9","keywords":["menu","dropdown","context-menu","headless","core","engine","framework-agnostic","ui-core","accessibility","aria","keyboard-navigation","state-machine","positioning","mouse-prediction","submenu","intent","floating-ui","radix","headless-ui"],"author":{"name":"Anton Pavlov","email":"a.pavlov@affino.dev"},"license":"MIT","_id":"@affino/menu-core@1.0.0-alpha.9","maintainers":[{"name":"affino","email":"anton.pavlov.personal@gmail.com"}],"homepage":"https://affino.dev","bugs":{"url":"https://github.com/affinio/affinio/issues"},"dist":{"shasum":"cbb1848815401c83d34e155ba631b85917110a64","tarball":"https://registry.npmjs.org/@affino/menu-core/-/menu-core-1.0.0-alpha.9.tgz","fileCount":42,"integrity":"sha512-d+qDeKiBYP3JStNGIlFsLFJXLKxIpeiVMnz5L67q/aNSC+OCuvrOby9Lm1aFDLibZXG7v71dujkXxSjfi3AAWQ==","signatures":[{"sig":"MEUCIDxs9+4ngf4cvKGE5TLc0Q2lOq2VCZK9yRtQj34wEjSCAiEAw9UyRhg6f86EKIhlBVVeldRIW4DDGgETRJE6aT6lY0U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":87449},"main":"dist/index.js","type":"module","_from":"file:affino-menu-core-1.0.0-alpha.9.tgz","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsc -p tsconfig.json"},"_npmUser":{"name":"affino","email":"anton.pavlov.personal@gmail.com"},"_resolved":"/tmp/3e706e59f0bbaa51087bf619ee9ca2d4/affino-menu-core-1.0.0-alpha.9.tgz","_integrity":"sha512-d+qDeKiBYP3JStNGIlFsLFJXLKxIpeiVMnz5L67q/aNSC+OCuvrOby9Lm1aFDLibZXG7v71dujkXxSjfi3AAWQ==","repository":{"url":"git+https://github.com/affinio/affinio.git#main","type":"git"},"_npmVersion":"10.8.2","description":"Framework-agnostic headless menu engine with smart mouse prediction, keyboard navigation, and nested submenus","directories":{},"sideEffects":false,"_nodeVersion":"20.19.6","dependencies":{"@affino/surface-core":"^1.0.0-alpha.1"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"vitest":"^4.0.15","@vitest/coverage-v8":"^4.0.15"},"_npmOperationalInternal":{"tmp":"tmp/menu-core_1.0.0-alpha.9_1768945454412_0.5569258472521268","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"@affino/menu-core","version":"1.0.0","keywords":["menu","dropdown","context-menu","headless","core","engine","framework-agnostic","ui-core","accessibility","aria","keyboard-navigation","state-machine","positioning","mouse-prediction","submenu","intent","floating-ui","radix","headless-ui"],"author":{"name":"Anton Pavlov","email":"a.pavlov@affino.dev"},"license":"MIT","_id":"@affino/menu-core@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":"bd4424fe5d198ff8ebc78fb5d415c1f8e27d8d4f","tarball":"https://registry.npmjs.org/@affino/menu-core/-/menu-core-1.0.0.tgz","fileCount":45,"integrity":"sha512-+A6pskl9f8NwkMY6LYFDj4zWhXtCu53C5bsNMr2ZXKwAbfD693F/3TunQd7EG0uYK42Xz2TuoctXWOlYnprW2A==","signatures":[{"sig":"MEUCIBDul0Lcem1X+m84VAViRhsVRtW/jIUNEZT+uGll2VpCAiEAyPe1OWBM7uUNkmecbwKP9V8j9vHiBv+OoxF7MD3hvoI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":104637},"main":"dist/index.js","type":"module","_from":"file:affino-menu-core-1.0.0.tgz","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsc -p tsconfig.json"},"_npmUser":{"name":"affino","email":"anton.pavlov.personal@gmail.com"},"_resolved":"/tmp/96002167358dbfa2487136baa657a9bd/affino-menu-core-1.0.0.tgz","_integrity":"sha512-+A6pskl9f8NwkMY6LYFDj4zWhXtCu53C5bsNMr2ZXKwAbfD693F/3TunQd7EG0uYK42Xz2TuoctXWOlYnprW2A==","repository":{"url":"git+https://github.com/affinio/affinio.git#main","type":"git"},"_npmVersion":"10.8.2","description":"Framework-agnostic headless menu engine with smart mouse prediction, keyboard navigation, and nested submenus","directories":{},"sideEffects":false,"_nodeVersion":"20.19.6","dependencies":{"@affino/surface-core":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.0.15","@vitest/coverage-v8":"^4.0.15"},"_npmOperationalInternal":{"tmp":"tmp/menu-core_1.0.0_1769943325461_0.6247966356839287","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@affino/menu-core","version":"1.1.0","author":{"name":"Anton Pavlov","email":"a.pavlov@affino.dev"},"type":"module","description":"Framework-agnostic headless menu engine with smart mouse prediction, keyboard navigation, and nested submenus","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"main":"dist/index.js","types":"dist/index.d.ts","sideEffects":false,"dependencies":{"@affino/overlay-kernel":"^0.2.0","@affino/surface-core":"^1.1.0"},"repository":{"type":"git","url":"git+https://github.com/affinio/affinio.git#main"},"homepage":"https://affino.dev","keywords":["menu","dropdown","context-menu","headless","core","engine","framework-agnostic","ui-core","accessibility","aria","keyboard-navigation","state-machine","positioning","mouse-prediction","submenu","intent","floating-ui","radix","headless-ui"],"license":"MIT","devDependencies":{"@vitest/coverage-v8":"^4.0.15","vitest":"^4.0.15"},"bugs":{"url":"https://github.com/affinio/affinio/issues"},"module":"dist/index.js","scripts":{"build":"tsc -p tsconfig.json","test":"vitest run"},"_id":"@affino/menu-core@1.1.0","_integrity":"sha512-8kXmr/ryhzXSSCF/ew813IhBr2LKztW4+hdpQzKptZnAO3oh8TIB2bY/nFpweVb4Nbl7GZtw+ZXKdKHLTKWpBw==","_resolved":"/tmp/25bb86fd6713afffd10136e4464b7810/affino-menu-core-1.1.0.tgz","_from":"file:affino-menu-core-1.1.0.tgz","_nodeVersion":"20.20.0","_npmVersion":"10.8.2","dist":{"integrity":"sha512-8kXmr/ryhzXSSCF/ew813IhBr2LKztW4+hdpQzKptZnAO3oh8TIB2bY/nFpweVb4Nbl7GZtw+ZXKdKHLTKWpBw==","shasum":"f2e340c8bff034ff37a76605c94270a509c2f130","tarball":"https://registry.npmjs.org/@affino/menu-core/-/menu-core-1.1.0.tgz","fileCount":45,"unpackedSize":101270,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCct1RgKcyVk1HU/XPmvo28aQTubtbrDVyKUPUjmOT9rAIhAMVbWfaPIzML4JkH8DnUf4cKa3W/MtSI3UPD+dwAn0Dp"}]},"_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-core_1.1.0_1771584464281_0.7704746745021454"},"_hasShrinkwrap":false}},"time":{"created":"2025-12-12T21:58:13.393Z","modified":"2026-02-20T10:47:44.519Z","1.0.0-alpha.0":"2025-12-12T21:58:13.637Z","1.0.0-alpha.1":"2025-12-12T22:15:40.942Z","1.0.0-alpha.2":"2025-12-12T23:36:30.205Z","1.0.0-alpha.3":"2025-12-14T22:22:26.980Z","1.0.0-alpha.4":"2025-12-15T13:32:43.055Z","1.0.0-alpha.5":"2025-12-16T21:12:08.603Z","1.0.0-alpha.6":"2025-12-16T22:26:02.408Z","1.0.0-alpha.7":"2025-12-16T22:47:25.241Z","1.0.0-alpha.8":"2025-12-17T15:05:20.484Z","1.0.0-alpha.9":"2026-01-20T21:44:14.541Z","1.0.0":"2026-02-01T10:55:25.594Z","1.1.0":"2026-02-20T10:47:44.414Z"},"bugs":{"url":"https://github.com/affinio/affinio/issues"},"author":{"name":"Anton Pavlov","email":"a.pavlov@affino.dev"},"license":"MIT","homepage":"https://affino.dev","keywords":["menu","dropdown","context-menu","headless","core","engine","framework-agnostic","ui-core","accessibility","aria","keyboard-navigation","state-machine","positioning","mouse-prediction","submenu","intent","floating-ui","radix","headless-ui"],"repository":{"type":"git","url":"git+https://github.com/affinio/affinio.git#main"},"description":"Framework-agnostic headless menu engine with smart mouse prediction, keyboard navigation, and nested submenus","maintainers":[{"name":"affino","email":"anton.pavlov.personal@gmail.com"}],"readme":"# @affino/menu-core\n\nHeadless menu engine for deterministic open/close state, keyboard navigation, submenu intent handling, and ARIA props.\n\nUse this package when you need menu behavior without framework lock-in.\n\n## Installation\n\n```bash\npnpm add @affino/menu-core\n```\n\n## Public exports\n\n```ts\nimport {\n  MenuCore,\n  SubmenuCore,\n  createMenuTree,\n  computePosition,\n  MousePrediction,\n  predictMouseDirection,\n} from \"@affino/menu-core\"\n```\n\n## Core contracts\n\n### `MenuCore`\n\n```ts\nconst menu = new MenuCore(\n  {\n    id: \"file-menu\",\n    closeOnSelect: true,\n    loopFocus: true,\n    openDelay: 80,\n    closeDelay: 120,\n  },\n  {\n    onSelect: (itemId, menuId) => {},\n    onHighlight: (itemId, menuId) => {},\n  },\n)\n```\n\nPrimary methods:\n\n- `open(reason?)`\n- `close(reason?)`\n- `requestClose(reason?)`\n- `toggle()`\n- `subscribe(listener)`\n- `getSnapshot()`\n- `registerItem(id, { disabled? })`\n- `getTriggerProps()`\n- `getPanelProps()`\n- `getItemProps(id)`\n- `highlight(id | null)`\n- `moveFocus(1 | -1)`\n- `select(id)`\n- `destroy()`\n\n### `SubmenuCore`\n\n```ts\nconst submenu = new SubmenuCore(menu, {\n  parentItemId: \"file-export\",\n  closeOnSelect: true,\n})\n```\n\nAdditional submenu methods:\n\n- `setTriggerRect(rect | null)`\n- `setPanelRect(rect | null)`\n- `recordPointer({ x, y })`\n\n`SubmenuCore` coordinates with parent menu tree and pointer-intent prediction.\n\n### `createMenuTree`\n\n```ts\nconst tree = createMenuTree({ options: { id: \"root-menu\" } })\n\nconst root = tree.root\nroot.registerItem(\"file\")\n\nconst fileSubmenu = tree.createSubmenu({\n  parent: root,\n  parentItemId: \"file\",\n})\n\nconst release = root.subscribe((state) => {\n  // render\n})\n\nrelease.unsubscribe()\ntree.destroy()\n```\n\nBranch wrapper (`MenuTreeBranch`) exposes a stable facade:\n\n- `getSnapshot()`, `subscribe(...)`\n- `getTriggerProps()`, `getPanelProps()`, `getItemProps(id)`\n- `registerItem(id, options?)`\n- `open/close/toggle/highlight/moveFocus/select`\n- `geometry` / `pointer` adapters for submenu branches\n- `destroy()`\n\nFailure contract:\n\n- `createSubmenu({ parentItemId })` throws if `parentItemId` is not registered in parent menu.\n- Expected error: `Cannot create submenu for unregistered parent item \"<id>\". Register the parent item before calling createSubmenu().`\n\n## Adapter responsibilities\n\n`menu-core` owns:\n\n- state transitions (open/close/highlight/select),\n- keyboard semantics,\n- ARIA prop contracts,\n- submenu intent logic.\n\nAdapter owns:\n\n- DOM/render lifecycle,\n- element measurement and positioning application,\n- styling/animation,\n- cleanup on unmount.\n\n## Guardrails (anti-misuse)\n\n- Keep one canonical menu state source (`subscribe` -> adapter state).\n- Register items with stable ids and call unregister callbacks on unmount.\n- Bind returned props as-is; avoid mixing conflicting custom key handlers in the same phase.\n- For submenus, register parent item id before `createSubmenu(...)` call.\n- Feed `recordPointer` + geometry only for submenu contexts; root menus do not need it.\n- Always call `destroy()` for every `MenuCore`/`SubmenuCore`/tree branch.\n\n## Positioning\n\n`computePosition` is re-exported from `@affino/surface-core`:\n\n```ts\nconst position = computePosition(anchorRect, panelRect, {\n  placement: \"bottom\",\n  align: \"start\",\n  gutter: 8,\n  viewportPadding: 12,\n})\n```\n\n## Overlay integration\n\n`MenuCore` can integrate with `@affino/overlay-kernel` via:\n\n- `overlayManager`\n- `getOverlayManager`\n- `overlayKind`\n- `overlayEntryTraits`\n\nWhen using overlay kernel, pointer/keyboard close reasons are mediated through overlay manager before local close.\n\n## Related packages\n\n- `@affino/menu-laravel`\n- `@affino/menu-vue`\n- `@affino/menu-react`\n","readmeFilename":"README.md"}