{"_id":"@a11y-oracle/cypress-plugin","_rev":"10-8affc2d6ed6c2376c712e14108d0de36","name":"@a11y-oracle/cypress-plugin","dist-tags":{"latest":"1.3.2"},"versions":{"1.0.0":{"name":"@a11y-oracle/cypress-plugin","version":"1.0.0","keywords":["accessibility","a11y","cypress","screen-reader","wcag","testing","e2e"],"author":{"name":"a11y-oracle"},"license":"MIT","_id":"@a11y-oracle/cypress-plugin@1.0.0","maintainers":[{"name":"pjlamb12","email":"preston.j.lamb@gmail.com"}],"homepage":"https://github.com/a11y-oracle/a11y-oracle/tree/main/libs/cypress-plugin","bugs":{"url":"https://github.com/a11y-oracle/a11y-oracle/issues"},"dist":{"shasum":"cb92921848a6113d8cb3969308a980336b073de7","tarball":"https://registry.npmjs.org/@a11y-oracle/cypress-plugin/-/cypress-plugin-1.0.0.tgz","fileCount":14,"integrity":"sha512-VQpPtIC7Rq6GrD94u5SDVeiBbLPrpoPT2wHIb61qN2/FA//FXKZ/BdZDas49/5xZkjMsjUIvD3PgGQoh6wbhBQ==","signatures":[{"sig":"MEYCIQDTCgEu70YjDdaFbwlAXJTBu6UpwKRBw/BT97D/VhXFQwIhAMPoNqwFDXyTjjsY2fz7a6KJy0cIyFF8aOh5en8xZoQy","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":46109},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./package.json":"./package.json"},"gitHead":"04ad8c1a2a9a6335892d5c992fcfa209e6a7bb6f","_npmUser":{"name":"pjlamb12","email":"preston.j.lamb@gmail.com"},"repository":{"url":"git+https://github.com/a11y-oracle/a11y-oracle.git","type":"git","directory":"libs/cypress-plugin"},"_npmVersion":"11.6.0","description":"Cypress custom commands for accessibility speech assertions with iframe-aware CDP routing","directories":{},"_nodeVersion":"24.10.0","dependencies":{"tslib":"^2.3.0","@a11y-oracle/core-engine":"1.0.0","@a11y-oracle/audit-formatter":"1.0.0","@a11y-oracle/keyboard-engine":"1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"cypress":">=12.0.0"},"_npmOperationalInternal":{"tmp":"tmp/cypress-plugin_1.0.0_1772652312312_0.2976452475388427","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@a11y-oracle/cypress-plugin","version":"1.1.0","keywords":["accessibility","a11y","cypress","screen-reader","wcag","testing","e2e"],"author":{"name":"a11y-oracle"},"license":"MIT","_id":"@a11y-oracle/cypress-plugin@1.1.0","maintainers":[{"name":"pjlamb12","email":"preston.j.lamb@gmail.com"}],"homepage":"https://github.com/a11y-oracle/a11y-oracle/tree/main/libs/cypress-plugin","bugs":{"url":"https://github.com/a11y-oracle/a11y-oracle/issues"},"dist":{"shasum":"39f4c7ee7629346511eb2e968faba8f4c70f7e51","tarball":"https://registry.npmjs.org/@a11y-oracle/cypress-plugin/-/cypress-plugin-1.1.0.tgz","fileCount":14,"integrity":"sha512-fpHeMCTbZeLCLvsbIKcY/zfUItzzV+Cd/SS0QEAjPoAWhOFCCb+3/JsuAV/OLL/erL6McP5uqLqD2xo0OnGhLA==","signatures":[{"sig":"MEYCIQD9qVLvjVaF9VQueljrhUq+eSI/1wBVNjfAQzZF3C7JZgIhAPqP0CnEH/Bn2qidBj4nYvY7BHk80gWKa6khqsJe7pkU","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":46109},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./package.json":"./package.json"},"gitHead":"47a95777878b177bbe3fc88cb760a2b295296555","_npmUser":{"name":"pjlamb12","email":"preston.j.lamb@gmail.com"},"repository":{"url":"git+https://github.com/a11y-oracle/a11y-oracle.git","type":"git","directory":"libs/cypress-plugin"},"_npmVersion":"11.6.0","description":"Cypress custom commands for accessibility speech assertions with iframe-aware CDP routing","directories":{},"_nodeVersion":"24.10.0","dependencies":{"tslib":"^2.3.0","@a11y-oracle/core-engine":"1.1.0","@a11y-oracle/audit-formatter":"1.1.0","@a11y-oracle/keyboard-engine":"1.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"cypress":">=12.0.0"},"_npmOperationalInternal":{"tmp":"tmp/cypress-plugin_1.1.0_1772686083787_0.20258201505202345","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"@a11y-oracle/cypress-plugin","version":"1.1.1","keywords":["accessibility","a11y","cypress","screen-reader","wcag","testing","e2e"],"author":{"name":"a11y-oracle"},"license":"MIT","_id":"@a11y-oracle/cypress-plugin@1.1.1","maintainers":[{"name":"pjlamb12","email":"preston.j.lamb@gmail.com"}],"homepage":"https://github.com/a11y-oracle/a11y-oracle/tree/main/libs/cypress-plugin","bugs":{"url":"https://github.com/a11y-oracle/a11y-oracle/issues"},"dist":{"shasum":"a38114c72c7b099ea6b7d522ec504a998edf0ac2","tarball":"https://registry.npmjs.org/@a11y-oracle/cypress-plugin/-/cypress-plugin-1.1.1.tgz","fileCount":14,"integrity":"sha512-7roCvADkZ0lVd9UoV18uhdRh7447A+PcPGtFLewTywH/WffQvz1qpWH/pumI1zxxasbewX17IF/+PLHepSCrxA==","signatures":[{"sig":"MEUCIGtd4/OdAd7a0ENZ1rlyKfB3ILWOgVPXnwgQGJjSPU/+AiEA6udArmbQ7Ohtf9lq+QV0DGlbI75zAcrcwaYnYUiQ5bE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":46109},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./package.json":"./package.json"},"gitHead":"555a54f42e89930cf78efd3b4d47055f8a9ca62e","_npmUser":{"name":"pjlamb12","email":"preston.j.lamb@gmail.com"},"repository":{"url":"git+https://github.com/a11y-oracle/a11y-oracle.git","type":"git","directory":"libs/cypress-plugin"},"_npmVersion":"11.6.0","description":"Cypress custom commands for accessibility speech assertions with iframe-aware CDP routing","directories":{},"_nodeVersion":"24.10.0","dependencies":{"tslib":"^2.3.0","@a11y-oracle/core-engine":"1.1.1","@a11y-oracle/audit-formatter":"1.1.1","@a11y-oracle/keyboard-engine":"1.1.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"cypress":">=12.0.0"},"_npmOperationalInternal":{"tmp":"tmp/cypress-plugin_1.1.1_1772690067187_0.5906402321647397","host":"s3://npm-registry-packages-npm-production"}},"1.1.2":{"name":"@a11y-oracle/cypress-plugin","version":"1.1.2","keywords":["accessibility","a11y","cypress","screen-reader","wcag","testing","e2e"],"author":{"name":"a11y-oracle"},"license":"MIT","_id":"@a11y-oracle/cypress-plugin@1.1.2","maintainers":[{"name":"pjlamb12","email":"preston.j.lamb@gmail.com"}],"homepage":"https://github.com/a11y-oracle/a11y-oracle/tree/main/libs/cypress-plugin","bugs":{"url":"https://github.com/a11y-oracle/a11y-oracle/issues"},"dist":{"shasum":"dc067aab9f6e6514120caab9956b9b6fa9a5f4f2","tarball":"https://registry.npmjs.org/@a11y-oracle/cypress-plugin/-/cypress-plugin-1.1.2.tgz","fileCount":14,"integrity":"sha512-yKJBsTPYAvhSd3DuMVJiDrxX1o3QXiPdfUzQlaj+O4ClkjhqCaak1uoANPv78//25j3qs5gF0/asw4ueC3r4hQ==","signatures":[{"sig":"MEUCIQDgggJ4epb5PTE1wzhgIoJmyaOJou9iuNgIx56wO4HXCgIgeVQk+HXadokB/2TkOcHs7WsAepIQSLA6Hb0fcdmihSg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":46109},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./package.json":"./package.json"},"gitHead":"0e3e6b7fb933fe4ec494e85abe5c056eff06eaef","_npmUser":{"name":"pjlamb12","email":"preston.j.lamb@gmail.com"},"repository":{"url":"git+https://github.com/a11y-oracle/a11y-oracle.git","type":"git","directory":"libs/cypress-plugin"},"_npmVersion":"11.6.0","description":"Cypress custom commands for accessibility speech assertions with iframe-aware CDP routing","directories":{},"_nodeVersion":"24.10.0","dependencies":{"tslib":"^2.3.0","@a11y-oracle/core-engine":"1.1.2","@a11y-oracle/audit-formatter":"1.1.2","@a11y-oracle/keyboard-engine":"1.1.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"cypress":">=12.0.0"},"_npmOperationalInternal":{"tmp":"tmp/cypress-plugin_1.1.2_1772725940268_0.576825860569687","host":"s3://npm-registry-packages-npm-production"}},"1.1.3":{"name":"@a11y-oracle/cypress-plugin","version":"1.1.3","keywords":["accessibility","a11y","cypress","screen-reader","wcag","testing","e2e"],"author":{"name":"a11y-oracle"},"license":"MIT","_id":"@a11y-oracle/cypress-plugin@1.1.3","maintainers":[{"name":"pjlamb12","email":"preston.j.lamb@gmail.com"}],"homepage":"https://github.com/a11y-oracle/a11y-oracle/tree/main/libs/cypress-plugin","bugs":{"url":"https://github.com/a11y-oracle/a11y-oracle/issues"},"dist":{"shasum":"bb60837c67a3f96b459cbd3ed4b3df8032dfaeb3","tarball":"https://registry.npmjs.org/@a11y-oracle/cypress-plugin/-/cypress-plugin-1.1.3.tgz","fileCount":14,"integrity":"sha512-KZIFZnDZDS2A5qbampUPrmvsrdZR58U02eqZp763M1o2roM9qa5rBsamZB6XudlLGNquXynQP56tS3H5vWEogQ==","signatures":[{"sig":"MEUCIEL/l8XuiTtwhMlUhuV491xgcYFXtDzgSt2vdwkrNQ5dAiEA77e+tbrT5q7GwoMUQsk76kNKT8FicodK6bD7y7iexS4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":48092},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./package.json":"./package.json"},"gitHead":"3fb17cb54b310cb99259d6b25de170f2a09c22f9","_npmUser":{"name":"pjlamb12","email":"preston.j.lamb@gmail.com"},"repository":{"url":"git+https://github.com/a11y-oracle/a11y-oracle.git","type":"git","directory":"libs/cypress-plugin"},"_npmVersion":"11.6.0","description":"Cypress custom commands for accessibility speech assertions with iframe-aware CDP routing","directories":{},"_nodeVersion":"24.10.0","dependencies":{"tslib":"^2.3.0","@a11y-oracle/core-engine":"1.1.3","@a11y-oracle/audit-formatter":"1.1.3","@a11y-oracle/keyboard-engine":"1.1.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"cypress":">=12.0.0"},"_npmOperationalInternal":{"tmp":"tmp/cypress-plugin_1.1.3_1772729088095_0.2360968009128701","host":"s3://npm-registry-packages-npm-production"}},"1.1.4":{"name":"@a11y-oracle/cypress-plugin","version":"1.1.4","keywords":["accessibility","a11y","cypress","screen-reader","wcag","testing","e2e"],"author":{"name":"a11y-oracle"},"license":"MIT","_id":"@a11y-oracle/cypress-plugin@1.1.4","maintainers":[{"name":"pjlamb12","email":"preston.j.lamb@gmail.com"}],"homepage":"https://github.com/a11y-oracle/a11y-oracle/tree/main/libs/cypress-plugin","bugs":{"url":"https://github.com/a11y-oracle/a11y-oracle/issues"},"dist":{"shasum":"6532507a3a7fded7fc658262a92bc0c198a22612","tarball":"https://registry.npmjs.org/@a11y-oracle/cypress-plugin/-/cypress-plugin-1.1.4.tgz","fileCount":14,"integrity":"sha512-jHoyuwZQd1kTwmoWQOIn0tCaCUwPPu3hdVcLz15ugmNrvPqxYs9abVufGvST5j/BbbQW9VFKqO1rmjqq73IRBQ==","signatures":[{"sig":"MEYCIQC6aGb4q2y9bFXQp2wGCmA9JjRn8bJAHgWvpdK6a525lQIhAL2xRW8XX196M4rmwbycnhzKEFO0uA/MHyHH1LZgD2wV","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":48092},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./package.json":"./package.json"},"gitHead":"2e2f62c8fd8a54c1bb0f9b709647ff4fe8557c27","_npmUser":{"name":"pjlamb12","email":"preston.j.lamb@gmail.com"},"repository":{"url":"git+https://github.com/a11y-oracle/a11y-oracle.git","type":"git","directory":"libs/cypress-plugin"},"_npmVersion":"11.6.0","description":"Cypress custom commands for accessibility speech assertions with iframe-aware CDP routing","directories":{},"_nodeVersion":"24.10.0","dependencies":{"tslib":"^2.3.0","@a11y-oracle/core-engine":"1.1.4","@a11y-oracle/audit-formatter":"1.1.4","@a11y-oracle/keyboard-engine":"1.1.4"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"cypress":">=12.0.0"},"_npmOperationalInternal":{"tmp":"tmp/cypress-plugin_1.1.4_1772745614919_0.5582377463231747","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@a11y-oracle/cypress-plugin","version":"1.2.0","keywords":["accessibility","a11y","cypress","screen-reader","wcag","testing","e2e"],"author":{"name":"a11y-oracle"},"license":"MIT","_id":"@a11y-oracle/cypress-plugin@1.2.0","maintainers":[{"name":"pjlamb12","email":"preston.j.lamb@gmail.com"}],"homepage":"https://github.com/a11y-oracle/a11y-oracle/tree/main/libs/cypress-plugin","bugs":{"url":"https://github.com/a11y-oracle/a11y-oracle/issues"},"dist":{"shasum":"8b8ccf172c2874f5d702063d744cbd558cfe78c3","tarball":"https://registry.npmjs.org/@a11y-oracle/cypress-plugin/-/cypress-plugin-1.2.0.tgz","fileCount":14,"integrity":"sha512-QugDD4m0xnXU714WTbPTnXx7C+oD86hGNJc6n4a8wtS80x+8MhenAFOweuMDonn+gtYCS2/Iy8pECbjn3zRpig==","signatures":[{"sig":"MEYCIQDcXBA/3t99HYPznSAGVxxrHEUTzbu6l9I4EFBr2EnmdQIhAPHu5CUlLXh7iYIcsU0Bm5MhBnW/pQRbxr7z3BqiJKJf","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":48518},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./package.json":"./package.json"},"gitHead":"43adb7fc2be7245cbb136e07b24200d68cba1744","_npmUser":{"name":"pjlamb12","email":"preston.j.lamb@gmail.com"},"repository":{"url":"git+https://github.com/a11y-oracle/a11y-oracle.git","type":"git","directory":"libs/cypress-plugin"},"_npmVersion":"11.6.0","description":"Cypress custom commands for accessibility speech assertions with iframe-aware CDP routing","directories":{},"_nodeVersion":"24.10.0","dependencies":{"tslib":"^2.3.0","@a11y-oracle/core-engine":"1.2.0","@a11y-oracle/audit-formatter":"1.2.0","@a11y-oracle/keyboard-engine":"1.2.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"cypress":">=12.0.0"},"_npmOperationalInternal":{"tmp":"tmp/cypress-plugin_1.2.0_1772753727612_0.7775723194937538","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@a11y-oracle/cypress-plugin","version":"1.3.0","keywords":["accessibility","a11y","cypress","screen-reader","wcag","testing","e2e"],"author":{"name":"a11y-oracle"},"license":"MIT","_id":"@a11y-oracle/cypress-plugin@1.3.0","maintainers":[{"name":"pjlamb12","email":"preston.j.lamb@gmail.com"}],"homepage":"https://github.com/a11y-oracle/a11y-oracle/tree/main/libs/cypress-plugin","bugs":{"url":"https://github.com/a11y-oracle/a11y-oracle/issues"},"dist":{"shasum":"e698ff85a9fa108be5c19cedf53b85e14fe292aa","tarball":"https://registry.npmjs.org/@a11y-oracle/cypress-plugin/-/cypress-plugin-1.3.0.tgz","fileCount":14,"integrity":"sha512-/5tR4MgNoE9FtKYwvNnE4DpSBChZwzB9WgZJFBLG5TrriV8aoGB+lhPgliPc9+YvNqL/3IGJ4ErMZuZkt/VIZA==","signatures":[{"sig":"MEQCIDxXX8/hxlApEjhktlK3vFQQJZmT8W1zxJj+q/kQooQrAiB/AJhzdAR/iFPdcMY/XxZP+ZWI3ghGBsHtDVr5qjU35A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":54449},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./package.json":"./package.json"},"gitHead":"4295fc44cee8a657989d667355836590231cf754","_npmUser":{"name":"pjlamb12","email":"preston.j.lamb@gmail.com"},"repository":{"url":"git+https://github.com/a11y-oracle/a11y-oracle.git","type":"git","directory":"libs/cypress-plugin"},"_npmVersion":"11.6.0","description":"Cypress custom commands for accessibility speech assertions with iframe-aware CDP routing","directories":{},"_nodeVersion":"24.10.0","dependencies":{"tslib":"^2.3.0","@a11y-oracle/core-engine":"1.3.0","@a11y-oracle/audit-formatter":"1.3.0","@a11y-oracle/keyboard-engine":"1.3.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"cypress":">=12.0.0"},"_npmOperationalInternal":{"tmp":"tmp/cypress-plugin_1.3.0_1772769830269_0.7756623187901996","host":"s3://npm-registry-packages-npm-production"}},"1.3.1":{"name":"@a11y-oracle/cypress-plugin","version":"1.3.1","keywords":["accessibility","a11y","cypress","screen-reader","wcag","testing","e2e"],"author":{"name":"a11y-oracle"},"license":"MIT","_id":"@a11y-oracle/cypress-plugin@1.3.1","maintainers":[{"name":"pjlamb12","email":"preston.j.lamb@gmail.com"}],"homepage":"https://github.com/a11y-oracle/a11y-oracle/tree/main/libs/cypress-plugin","bugs":{"url":"https://github.com/a11y-oracle/a11y-oracle/issues"},"dist":{"shasum":"3f6c97e13948c65d18834ed8d426acd02b2a2e92","tarball":"https://registry.npmjs.org/@a11y-oracle/cypress-plugin/-/cypress-plugin-1.3.1.tgz","fileCount":14,"integrity":"sha512-AlvveV1pJq9Y+TnBWHBmCb/2uWp63jJBuz4H3pEpr3TdIRqAtRNJnQpEamNcZYEbsGFq+LcRDSQNo8Ak++JAhQ==","signatures":[{"sig":"MEUCIBBBTUm5RpLEKI2zv6fYVfBxI3kqFJ0j69QPNtp2GcKoAiEAqUKCmuie89f3A5iOOBC6kz4VOY6mm4JliyoWbNrN1ps=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":57169},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./package.json":"./package.json"},"gitHead":"1cdf8cb41af6392ea299d37eed4bf536788a802f","_npmUser":{"name":"pjlamb12","email":"preston.j.lamb@gmail.com"},"repository":{"url":"git+https://github.com/a11y-oracle/a11y-oracle.git","type":"git","directory":"libs/cypress-plugin"},"_npmVersion":"11.6.0","description":"Cypress custom commands for accessibility speech assertions with iframe-aware CDP routing","directories":{},"_nodeVersion":"24.10.0","dependencies":{"tslib":"^2.3.0","@a11y-oracle/core-engine":"1.3.1","@a11y-oracle/audit-formatter":"1.3.1","@a11y-oracle/keyboard-engine":"1.3.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"cypress":">=12.0.0"},"_npmOperationalInternal":{"tmp":"tmp/cypress-plugin_1.3.1_1773187244371_0.5604856262961879","host":"s3://npm-registry-packages-npm-production"}},"1.3.2":{"name":"@a11y-oracle/cypress-plugin","version":"1.3.2","description":"Cypress custom commands for accessibility speech assertions with iframe-aware CDP routing","license":"MIT","author":{"name":"a11y-oracle"},"repository":{"type":"git","url":"git+https://github.com/a11y-oracle/a11y-oracle.git","directory":"libs/cypress-plugin"},"bugs":{"url":"https://github.com/a11y-oracle/a11y-oracle/issues"},"homepage":"https://github.com/a11y-oracle/a11y-oracle/tree/main/libs/cypress-plugin","keywords":["accessibility","a11y","cypress","screen-reader","wcag","testing","e2e"],"publishConfig":{"access":"public"},"type":"module","main":"./dist/index.js","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{"./package.json":"./package.json",".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"}},"peerDependencies":{"cypress":">=12.0.0"},"dependencies":{"@a11y-oracle/core-engine":"1.3.2","@a11y-oracle/keyboard-engine":"1.3.2","@a11y-oracle/audit-formatter":"1.3.2","tslib":"^2.3.0"},"_id":"@a11y-oracle/cypress-plugin@1.3.2","gitHead":"58b2a6611a5150328c96c3d8695e0b14bc5d2d27","_nodeVersion":"24.10.0","_npmVersion":"11.6.0","dist":{"integrity":"sha512-gcVr7F8gmh3tD0qdEV620yvGpnfYppoHKD3pxEPenNyJl9wBfPZYHTvtG2yPKZDJNbwaK5xKTYwNFrnFqT7Gfw==","shasum":"edddab081a16c8ff393bd9ec2a3d0b7853f5b251","tarball":"https://registry.npmjs.org/@a11y-oracle/cypress-plugin/-/cypress-plugin-1.3.2.tgz","fileCount":14,"unpackedSize":59264,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIFsVFy8k9t4szZ5IYt0DjaRnpuDQush9dM4h6ZEL0CH3AiEA9DFGb5m72KVC41aIbatX0oCZYygxITOvaDe1VPNsuLg="}]},"_npmUser":{"name":"pjlamb12","email":"preston.j.lamb@gmail.com"},"directories":{},"maintainers":[{"name":"pjlamb12","email":"preston.j.lamb@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/cypress-plugin_1.3.2_1773294444449_0.5984527630299314"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-04T19:25:12.262Z","modified":"2026-03-12T05:47:24.708Z","1.0.0":"2026-03-04T19:25:12.476Z","1.1.0":"2026-03-05T04:48:03.940Z","1.1.1":"2026-03-05T05:54:27.326Z","1.1.2":"2026-03-05T15:52:20.418Z","1.1.3":"2026-03-05T16:44:48.230Z","1.1.4":"2026-03-05T21:20:15.087Z","1.2.0":"2026-03-05T23:35:27.766Z","1.3.0":"2026-03-06T04:03:50.439Z","1.3.1":"2026-03-11T00:00:44.523Z","1.3.2":"2026-03-12T05:47:24.578Z"},"bugs":{"url":"https://github.com/a11y-oracle/a11y-oracle/issues"},"author":{"name":"a11y-oracle"},"license":"MIT","homepage":"https://github.com/a11y-oracle/a11y-oracle/tree/main/libs/cypress-plugin","keywords":["accessibility","a11y","cypress","screen-reader","wcag","testing","e2e"],"repository":{"type":"git","url":"git+https://github.com/a11y-oracle/a11y-oracle.git","directory":"libs/cypress-plugin"},"description":"Cypress custom commands for accessibility speech assertions with iframe-aware CDP routing","maintainers":[{"name":"pjlamb12","email":"preston.j.lamb@gmail.com"}],"readme":"# @a11y-oracle/cypress-plugin\n\nCypress integration for A11y-Oracle. Provides custom commands that read the browser's Accessibility Tree via Chrome DevTools Protocol, dispatch native keyboard events, and analyze visual focus indicators.\n\n```typescript\ndescribe('Navigation', () => {\n  beforeEach(() => {\n    cy.visit('/dropdown-nav.html');\n    cy.initA11yOracle();\n  });\n\n  afterEach(() => {\n    cy.disposeA11yOracle();\n  });\n\n  it('Tab to button announces name and role', () => {\n    cy.a11yPress('Tab')\n      .should('contain', 'Home')\n      .and('contain', 'menu item');\n  });\n});\n```\n\n## Installation\n\n```bash\nnpm install -D @a11y-oracle/cypress-plugin @a11y-oracle/core-engine cypress\n```\n\n> **Chrome/Chromium only.** The plugin uses CDP, which is only available in Chrome-family browsers.\n\n> **⚠️ Stability Notice — Playwright recommended.** The Cypress plugin is functional but has known stability constraints with large test suites. We recommend using [`@a11y-oracle/playwright-plugin`](../playwright-plugin/README.md) for the most reliable experience. See [Known Limitations](#known-limitations) below for details.\n\n## Setup\n\n### 1. Import Commands\n\nAdd the plugin to your Cypress support file:\n\n```typescript\n// cypress/support/e2e.ts (or cypress/support/e2e.js)\nimport '@a11y-oracle/cypress-plugin';\n```\n\nThat's it. Importing the package registers all custom commands automatically.\n\n### 2. Configure Browser\n\nEnsure your Cypress config runs tests in Chrome:\n\n```typescript\n// cypress.config.ts\nimport { defineConfig } from 'cypress';\n\nexport default defineConfig({\n  e2e: {\n    baseUrl: 'http://localhost:4200',\n    specPattern: 'cypress/e2e/**/*.cy.ts',\n    supportFile: 'cypress/support/e2e.ts',\n  },\n});\n```\n\nRun with Chrome:\n\n```bash\nnpx cypress run --browser chrome\n```\n\n## Usage\n\n### Speech Assertions\n\n```typescript\ndescribe('My Form', () => {\n  beforeEach(() => {\n    cy.visit('/form.html');\n    cy.initA11yOracle();\n  });\n\n  afterEach(() => {\n    cy.disposeA11yOracle();\n  });\n\n  it('Tab navigates to submit button', () => {\n    cy.a11yPress('Tab');\n    cy.a11yPress('Tab');\n    cy.a11yPress('Tab')\n      .should('equal', 'Submit, button');\n  });\n\n  it('checkbox announces checked state', () => {\n    cy.a11yPress('Tab');\n    cy.a11yPress('Space')\n      .should('contain', 'checkbox')\n      .should('contain', 'checked');\n  });\n});\n```\n\n### Unified State (Speech + Focus + Indicator)\n\n```typescript\nit('Tab returns unified accessibility state', () => {\n  cy.a11yPressKey('Tab').then((state) => {\n    // Speech\n    expect(state.speech).to.contain('Submit');\n    expect(state.speechResult?.role).to.equal('button');\n\n    // Focused element\n    expect(state.focusedElement?.tag).to.equal('BUTTON');\n    expect(state.focusedElement?.id).to.equal('submit-btn');\n\n    // Focus indicator (WCAG 2.4.12 AA)\n    expect(state.focusIndicator.isVisible).to.be.true;\n    expect(state.focusIndicator.meetsWCAG_AA).to.be.true;\n  });\n});\n\nit('Shift+Tab navigates backward', () => {\n  cy.a11yPressKey('Tab');\n  cy.a11yPressKey('Tab');\n  cy.a11yPressKey('Tab', { shift: true }).then((state) => {\n    expect(state.focusedElement).to.not.be.null;\n  });\n});\n```\n\n### Tab Order and Keyboard Trap Detection\n\n```typescript\nit('page has correct tab order', () => {\n  cy.a11yTraverseTabOrder().then((report) => {\n    expect(report.totalCount).to.be.greaterThan(0);\n    expect(report.entries[0].tag).to.equal('A');\n  });\n});\n\nit('modal does not trap keyboard focus', () => {\n  cy.a11yTraverseSubTree('#modal-container', 20).then((result) => {\n    expect(result.isTrapped).to.be.false;\n    expect(result.escapeElement).to.not.be.null;\n  });\n});\n```\n\n### Issue Reporting\n\nCheck focus indicators and keyboard traps with automatic issue reporting. Issues are accumulated via `cy.task('logOracleIssues')` and can be written to a JSON report at the end of the run.\n\n```typescript\ndescribe('Accessibility audit', () => {\n  beforeEach(() => {\n    cy.visit('/my-page.html');\n    cy.initA11yOracle();\n  });\n\n  afterEach(() => {\n    cy.disposeA11yOracle();\n  });\n\n  it('focus indicators pass oracle rules', () => {\n    cy.a11yPressKey('Tab');\n    cy.a11yCheckFocusAndReport();   // checks + reports issues\n\n    cy.a11yPressKey('Tab');\n    cy.a11yCheckFocusAndReport();   // check each focused element\n  });\n\n  it('modal is not a keyboard trap', () => {\n    cy.get('#open-modal').click();\n    cy.a11yCheckTrapAndReport('#modal-dialog', 10);\n  });\n});\n```\n\n#### WCAG Level and Rule Configuration\n\nFilter issues by WCAG conformance level or disable specific rules via Cypress env:\n\n```typescript\n// cypress.config.ts\nexport default defineConfig({\n  e2e: {\n    env: {\n      wcagLevel: 'wcag21aa',                       // WCAG 2.1 Level AA (default: 'wcag22aa')\n      disabledRules: ['oracle/positive-tabindex'],  // Suppress specific rules\n    },\n  },\n});\n```\n\nSupported `wcagLevel` values (matching axe-core tag format):\n- `'wcag2a'` / `'wcag2aa'` — WCAG 2.0\n- `'wcag21a'` / `'wcag21aa'` — WCAG 2.1\n- `'wcag22a'` / `'wcag22aa'` — WCAG 2.2 (default)\n\nOr override per-command:\n\n```typescript\ncy.a11yCheckFocusAndReport({ wcagLevel: 'wcag22a' });\ncy.a11yCheckFocusAndReport({ disabledRules: ['oracle/focus-low-contrast'] });\n```\n\nSet `Cypress.env('failOnErrors')` to `true` to fail the test immediately when issues are found:\n\n```typescript\n// cypress.config.ts\nexport default defineConfig({\n  e2e: {\n    env: { failOnErrors: true },\n  },\n});\n```\n\nFor detailed remediation guidance on each rule, see the [Remediation Guide](../../docs/REMEDIATION.md).\n\n### Node-Side Reporting Setup\n\nTo accumulate issues across all specs and write a JSON report file, call `setupOracleReporting()` in your Cypress config:\n\n```typescript\n// cypress.config.ts\nimport { defineConfig } from 'cypress';\nimport { setupOracleReporting } from '@a11y-oracle/cypress-plugin';\n\nexport default defineConfig({\n  e2e: {\n    setupNodeEvents(on, config) {\n      setupOracleReporting(on, config);\n    },\n    env: { projectName: 'my-app' },\n  },\n});\n```\n\nThis registers the `logOracleIssues` task and writes `oracle-results-{projectName}.json` after the run completes.\n\n**Combining with axe-core violations:** If you want oracle issues in the same array as your axe-core violations (for a single upload to Beacon), add the task handler manually:\n\n```typescript\nsetupNodeEvents(on, config) {\n  const allViolations: any[] = [];\n\n  on('task', {\n    logAxeViolations(violations) { allViolations.push(...violations); return null; },\n    logOracleIssues(issues) { allViolations.push(...issues); return null; },\n  });\n\n  on('after:run', () => {\n    if (allViolations.length > 0) {\n      fs.writeFileSync('a11y-results.json', JSON.stringify(allViolations, null, 2));\n    }\n  });\n},\n```\n\n### Asserting on Landmarks and Structure\n\nUse `getA11yFullTreeSpeech()` to inspect elements that don't have focus:\n\n```typescript\nit('navigation landmark exists', () => {\n  cy.getA11yFullTreeSpeech().then((tree) => {\n    const nav = tree.find(r => r.speech.includes('navigation landmark'));\n    expect(nav).to.exist;\n    expect(nav.speech).to.contain('Main');\n  });\n});\n```\n\n### Structured Speech Results\n\nUse `getA11ySpeechResult()` to access individual parts of the speech output:\n\n```typescript\nit('returns structured data', () => {\n  cy.a11yPress('Tab');\n  cy.getA11ySpeechResult().then((result) => {\n    expect(result).to.not.be.null;\n    expect(result.name).to.equal('Home');\n    expect(result.role).to.contain('menu item');\n    expect(result.states).to.be.an('array');\n    expect(result.rawNode).to.exist;\n  });\n});\n```\n\n### Configuration Options\n\nPass options to `initA11yOracle()` to customize behavior:\n\n```typescript\n// Include descriptions from aria-describedby\ncy.initA11yOracle({ includeDescription: true });\n\n// Disable \"landmark\" suffix on landmark roles\ncy.initA11yOracle({ includeLandmarks: false });\n\n// Adjust focus settle delay for slow CSS transitions\ncy.initA11yOracle({ focusSettleMs: 100 });\n```\n\n| Option | Type | Default | Description |\n|--------|------|---------|-------------|\n| `includeLandmarks` | `boolean` | `true` | Append \"landmark\" to landmark roles |\n| `includeDescription` | `boolean` | `false` | Include `aria-describedby` text in output |\n| `focusSettleMs` | `number` | `50` | Delay (ms) after key press for focus/CSS to settle |\n\n## API Reference\n\n### Speech Commands\n\n#### `cy.initA11yOracle(options?)`\n\nInitialize the plugin. Must be called after `cy.visit()` and before other A11y-Oracle commands. Typically called in `beforeEach()`.\n\nEnables CDP domains, discovers the AUT iframe, creates the speech engine and orchestrator.\n\n#### `cy.a11yPress(key)`\n\nPress a keyboard key via CDP and return the speech for the newly focused element. Yields a string.\n\n```typescript\ncy.a11yPress('Tab').should('contain', 'button');\ncy.a11yPress('Enter').should('contain', 'expanded');\ncy.a11yPress('Escape').should('contain', 'collapsed');\n```\n\nSupported keys: `Tab`, `Enter`, `Space`, `Escape`, `ArrowUp`, `ArrowDown`, `ArrowLeft`, `ArrowRight`, `Home`, `End`, `Backspace`, `Delete`.\n\n#### `cy.getA11ySpeech()`\n\nGet the speech string for the currently focused element without pressing a key. Yields a string.\n\n#### `cy.getA11ySpeechResult()`\n\nGet the full structured result for the focused element. Yields `SpeechResult | null`.\n\n#### `cy.getA11yFullTreeSpeech()`\n\nGet speech for all non-ignored nodes in the accessibility tree. Yields `SpeechResult[]`.\n\n### Unified State Commands\n\n#### `cy.a11yPressKey(key, modifiers?)`\n\nPress a key via native CDP dispatch and return the unified accessibility state. Yields `A11yState`.\n\n```typescript\ncy.a11yPressKey('Tab').then((state) => {\n  expect(state.speech).to.contain('button');\n  expect(state.focusIndicator.meetsWCAG_AA).to.be.true;\n});\n\n// With modifier keys\ncy.a11yPressKey('Tab', { shift: true }).then((state) => {\n  expect(state.focusedElement).to.not.be.null;\n});\n```\n\n#### `cy.a11yState()`\n\nGet the current unified accessibility state without pressing a key. Yields `A11yState`.\n\n```typescript\ncy.get('#my-button').focus();\ncy.a11yState().then((state) => {\n  expect(state.speech).to.contain('Submit');\n});\n```\n\n#### `cy.a11yTraverseTabOrder()`\n\nExtract all tabbable elements in DOM tab order. Yields `TabOrderReport`.\n\n```typescript\ncy.a11yTraverseTabOrder().then((report) => {\n  expect(report.totalCount).to.be.greaterThan(0);\n});\n```\n\n#### `cy.a11yTraverseSubTree(selector, maxTabs?)`\n\nDetect whether a container traps keyboard focus (WCAG 2.1.2). Yields `TraversalResult`.\n\n```typescript\ncy.a11yTraverseSubTree('#modal', 20).then((result) => {\n  expect(result.isTrapped).to.be.false;\n});\n```\n\n### Reporting Commands\n\n#### `cy.a11yCheckFocusAndReport(context?)`\n\nCheck the current focused element and report any issues via `cy.task('logOracleIssues')`. Runs all state-based rules: `oracle/focus-not-visible`, `oracle/focus-low-contrast`, `oracle/focus-missing-name`, `oracle/focus-generic-role`, and `oracle/positive-tabindex`.\n\n- `context` — Optional `Partial<AuditContext>`. Defaults to `{ project: Cypress.env('projectName'), specName: Cypress.spec.name, wcagLevel: Cypress.env('wcagLevel'), disabledRules: Cypress.env('disabledRules') }`.\n\n#### `cy.a11yCheckTrapAndReport(selector, maxTabs?, context?)`\n\nCheck a container for keyboard traps and report any issues via `cy.task('logOracleIssues')`.\n\n- `selector` — CSS selector for the container to test.\n- `maxTabs` — Maximum Tab presses before declaring a trap. Default `50`.\n- `context` — Optional `Partial<AuditContext>`.\n\n#### `setupOracleReporting(on, config)`\n\nNode-side function (not a Cypress command). Call inside `setupNodeEvents()` to register the `logOracleIssues` task and write a JSON report in `after:run`. See [Node-Side Reporting Setup](#node-side-reporting-setup).\n\n```typescript\nimport { setupOracleReporting } from '@a11y-oracle/cypress-plugin';\n```\n\n### CDP Adapter\n\n#### `createCypressCDPAdapter()`\n\nCreate a ready-to-use `CDPSessionLike` adapter for custom integrations. This is useful when you need to call `@a11y-oracle/axe-bridge`'s `resolveAllIncomplete()` directly instead of using the built-in Cypress commands.\n\nThe function encapsulates all the CDP plumbing:\n- Enables `DOM.enable` and `Page.enable` CDP domains\n- Discovers the AUT frame ID from `Page.getFrameTree`\n- Creates an isolated world execution context in the AUT frame\n- Detects iframe position and CSS transform scale\n- Returns a `CDPSessionLike` adapter with scale-aware `Page.captureScreenshot` coordinate translation\n\n```typescript\nimport { createCypressCDPAdapter } from '@a11y-oracle/cypress-plugin';\nimport { resolveAllIncomplete } from '@a11y-oracle/axe-bridge';\n\n// In your custom Cypress command:\ncy.wrap(null).then(async () => {\n  const cdp = await createCypressCDPAdapter();\n  const resolved = await resolveAllIncomplete(cdp, axeResults, options);\n});\n```\n\n### Lifecycle\n\n#### `cy.disposeA11yOracle()`\n\nDispose the plugin and release CDP resources. Typically called in `afterEach()`.\n\n### Types\n\nTypes are re-exported from `@a11y-oracle/core-engine` and `@a11y-oracle/audit-formatter`:\n\n```typescript\nimport type {\n  // Core engine types\n  CDPSessionLike,\n  SpeechResult,\n  A11yState,\n  A11yFocusedElement,\n  A11yFocusIndicator,\n  A11yOrchestratorOptions,\n  ModifierKeys,\n  TabOrderReport,\n  TabOrderEntry,\n  TraversalResult,\n  FocusIndicator,\n  // Audit formatter types\n  OracleIssue,\n  OracleNode,\n  OracleCheck,\n  OracleImpact,\n  OracleResultType,\n  AuditContext,\n} from '@a11y-oracle/cypress-plugin';\n```\n\n## How It Works\n\nThe Cypress plugin uses a browser-side CDP approach through `Cypress.automation('remote:debugger:protocol')` — the same pattern used by [cypress-real-events](https://github.com/dmtrKovalenko/cypress-real-events). No Node-side tasks or external libraries are required.\n\n### Cypress Iframe Architecture\n\nCypress runs the app under test (AUT) inside an iframe within its runner page. This creates a challenge: CDP commands target the runner page by default, not the AUT. The plugin handles this transparently:\n\n1. **Frame discovery** — On `initA11yOracle()`, the plugin calls `Page.getFrameTree()` to enumerate all frames. It identifies the AUT frame by filtering out Cypress internal frames (`/__/`, `__cypress`, `about:blank`).\n\n2. **Frame-scoped accessibility queries** — A CDP adapter injects the AUT `frameId` into every `Accessibility.getFullAXTree()` call, ensuring the accessibility tree is scoped to the app, not the runner UI.\n\n3. **Isolated execution context** — For `Runtime.evaluate` calls (focus indicator analysis, tab order, trap detection), the plugin creates an isolated world in the AUT frame via `Page.createIsolatedWorld`. This isolated world shares the same DOM (including `document.activeElement`, computed styles, etc.) but has its own JavaScript scope, ensuring evaluations target the AUT content.\n\n4. **Screenshot coordinate translation** — `getBoundingClientRect()` inside the AUT iframe returns iframe-relative coordinates, but `Page.captureScreenshot` clips from the top-level browser viewport. The plugin queries the AUT iframe's position in the viewport and offsets all screenshot clip coordinates accordingly. It also detects the CSS transform scale that Cypress applies to the AUT iframe wrapper (typically ~0.66x in headless Electron), and applies it to coordinates, dimensions, and the clip's `scale` property. This ensures pixel-level analysis (color contrast, focus indicator diffing) captures the correct region even when the AUT is rendered at a scaled size.\n\n5. **Focus management** — Before each keyboard event, the plugin uses `DOM.focus()` on the AUT iframe element so that `Input.dispatchKeyEvent` reaches the correct frame.\n\n### CDP Flow\n\n```\ncy.a11yPressKey('Tab')\n  │\n  ├─ DOM.focus() on AUT iframe\n  ├─ Input.dispatchKeyEvent (keyDown + keyUp)\n  ├─ 50ms delay for focus/ARIA state updates\n  ├─ Accessibility.getFullAXTree({ frameId: autFrameId })\n  ├─ Runtime.evaluate({ contextId: autContextId }) — focused element\n  ├─ Runtime.evaluate({ contextId: autContextId }) — focus indicator CSS\n  ├─ Find focused node in AXTree → speech string\n  └─ Assemble A11yState { speech, focusedElement, focusIndicator }\n```\n\n## TypeScript\n\nThe plugin augments the `Cypress.Chainable` interface. TypeScript will pick up the command types automatically when you import the plugin in your support file.\n\nIf you need types in your test files without importing the support file:\n\n```typescript\n/// <reference types=\"@a11y-oracle/cypress-plugin\" />\n```\n\n## Known Limitations\n\n### CDP Resource Accumulation in Long Test Suites\n\nCypress runs the application under test (AUT) inside an iframe within its runner page. To interact with the AUT's accessibility tree, the plugin must create an **isolated execution world** in the AUT frame via `Page.createIsolatedWorld` on every `initA11yOracle()` call. Unlike Playwright — which provides native, first-class CDP sessions — Cypress's iframe architecture means these isolated worlds accumulate browser-side resources that Chrome does not fully reclaim, even after `disposeA11yOracle()` cleans up its own references.\n\n**What this means in practice:**\n\n- Test suites with many spec files or many tests per file may experience increasing memory pressure over the course of a run.\n- In v1.3.0 and earlier, this caused a deterministic hang after approximately 16 `init`/`dispose` cycles, because `Accessibility.getFullAXTree` would stall when traversing nodes across all accumulated contexts ([#14](https://github.com/a11y-oracle/a11y-oracle/issues/14)).\n- v1.3.1 mitigated the hang by properly destroying isolated worlds on dispose, but the underlying architectural constraint — that Cypress proxies all CDP calls through its runner and manages frame contexts differently than Playwright — remains.\n\n**Recommendation:** If you are starting a new project or have the flexibility to choose your E2E framework, use [`@a11y-oracle/playwright-plugin`](../playwright-plugin/README.md). Playwright provides direct CDP session access without iframe indirection, making it inherently more stable and performant for A11y-Oracle's CDP-heavy workflow.\n\nIf you need to stay on Cypress, the plugin is fully functional — just be aware of these constraints for very large suites.\n\n## Troubleshooting\n\n### \"Could not find the AUT iframe\"\n\nThis error means `initA11yOracle()` was called before `cy.visit()`. The AUT iframe doesn't exist until Cypress loads a page.\n\n```typescript\n// Wrong\ncy.initA11yOracle();\ncy.visit('/page.html');\n\n// Correct\ncy.visit('/page.html');\ncy.initA11yOracle();\n```\n\n### Speech output contains Cypress UI elements\n\nIf assertions match Cypress runner elements (like \"Stop, button\" or \"Options, button\"), the frame-scoping may have failed. Ensure:\n\n- You're running in Chrome (`--browser chrome`)\n- `cy.visit()` completed before `cy.initA11yOracle()`\n- The AUT URL is not `about:blank`\n\n### Empty speech string\n\n`a11yPress()` returns an empty string when no element has focus after the key press. This can happen if:\n\n- The key press moved focus outside the page (e.g., Tab past the last element)\n- The focused element has `role=\"presentation\"` or `role=\"none\"`\n- The focused element is the `RootWebArea` (document body)\n\n### Focus indicator shows `contrastRatio: null`\n\nThis happens when the focus indicator color cannot be reliably parsed. Common causes:\n\n- Complex CSS color functions (`color-mix()`, `hsl()`, named colors)\n- Multi-layer gradients as focus indicators\n- `currentColor` as outline color\n\nFor the full list of role and state mappings, see the [@a11y-oracle/core-engine README](../core-engine/README.md).\n","readmeFilename":"README.md"}