{"_id":"@bernierllc/validators-a11y-focus-order","_rev":"7-39c6b9fff6d35587851c3d816f6669e0","name":"@bernierllc/validators-a11y-focus-order","dist-tags":{"latest":"0.6.0"},"versions":{"0.1.1":{"name":"@bernierllc/validators-a11y-focus-order","version":"0.1.1","keywords":["validation","validators","accessibility","a11y","wcag","focus","keyboard","tabindex","primitive"],"author":{"name":"Bernier LLC"},"license":"UNLICENSED","_id":"@bernierllc/validators-a11y-focus-order@0.1.1","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernierllc/tools#readme","bugs":{"url":"https://github.com/bernierllc/tools/issues"},"dist":{"shasum":"df9f354afc5cf8ee4541fae8be4620dc78bb33ca","tarball":"https://registry.npmjs.org/@bernierllc/validators-a11y-focus-order/-/validators-a11y-focus-order-0.1.1.tgz","fileCount":15,"integrity":"sha512-u0pEGO2m1+zyMa3LGhFUyxcl6r9lPV88HFxL3jc83hJlCMhebMcyxS4q0jwvcC/aCNXyzSU1QJ7s5f8stE/JMA==","signatures":[{"sig":"MEUCIQDakqHYcOS+rsVZD+eXskgRtL+F2DquO8gvv/0ZmSMXbwIgF9SJsy6qYH/uGuOMp84J8Dm1fwsE9rrvWVxnw/PgngI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":47455},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"391045f9d8cda761304c883d74b6af7895498698","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rm -rf dist coverage","lint:fix":"eslint src --ext .ts --fix","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"mkbernier","email":"mkbernier@gmail.com"},"repository":{"url":"git+https://github.com/bernierllc/tools.git","type":"git","directory":"packages/validators/validators-a11y-focus-order"},"_npmVersion":"11.4.2","description":"Accessibility focus order validation for the BernierLLC validators ecosystem - validates keyboard navigation, tab order, and focus visibility","directories":{},"_nodeVersion":"24.4.1","dependencies":{"@bernierllc/validators-core":"^0.1.0","@bernierllc/validators-utils":"^0.1.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^8.37.0","ts-jest":"^29.0.5","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^18.15.0","@typescript-eslint/parser":"^5.57.0","@typescript-eslint/eslint-plugin":"^5.57.0"},"_npmOperationalInternal":{"tmp":"tmp/validators-a11y-focus-order_0.1.1_1760222423969_0.1184484328882851","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@bernierllc/validators-a11y-focus-order","version":"0.3.0","keywords":["validation","validators","accessibility","a11y","wcag","focus","keyboard","tabindex","primitive"],"author":{"name":"Bernier LLC"},"license":"UNLICENSED","_id":"@bernierllc/validators-a11y-focus-order@0.3.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernierllc/tools#readme","bugs":{"url":"https://github.com/bernierllc/tools/issues"},"dist":{"shasum":"3aceb4efa0e38683e94abb943ec55c8329994e4a","tarball":"https://registry.npmjs.org/@bernierllc/validators-a11y-focus-order/-/validators-a11y-focus-order-0.3.0.tgz","fileCount":15,"integrity":"sha512-aHTW0O8Dp4cVKFP4EYGcPJcOG9Ttev8jJmFstuH0WjF86J8ZktEzPL6J2aWrShQyFqgR8Lv1OvOjBE1wQB7/yA==","signatures":[{"sig":"MEUCIHbA6YT2RiLIYdB0rLTJ/QHU1oZ0wTR3uMlpjk2O3SxYAiEAvTvALWs2TED5TMZiyh03TI0IuJzbYzHO7K27tXjvz1s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":47557},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"af7e74b3715d56d3a193e1bb6743b337c2b0df6d","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rm -rf dist coverage","lint:fix":"eslint src --ext .ts --fix","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:32bddf06-723d-4802-a7a0-ca1cde0d9424"}},"repository":{"url":"git+https://github.com/bernierllc/tools.git","type":"git","directory":"packages/validators/validators-a11y-focus-order"},"_npmVersion":"lerna/9.0.3/node@v20.19.6+x64 (linux)","description":"Accessibility focus order validation for the BernierLLC validators ecosystem - validates keyboard navigation, tab order, and focus visibility","directories":{},"_nodeVersion":"20.19.6","dependencies":{"@bernierllc/validators-core":"0.1.2","@bernierllc/validators-utils":"0.1.2"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^8.37.0","ts-jest":"^29.0.5","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^18.15.0","@typescript-eslint/parser":"^5.57.0","@typescript-eslint/eslint-plugin":"^5.57.0"},"_npmOperationalInternal":{"tmp":"tmp/validators-a11y-focus-order_0.3.0_1767642357500_0.5986192678391351","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@bernierllc/validators-a11y-focus-order","version":"0.3.1","keywords":["validation","validators","accessibility","a11y","wcag","focus","keyboard","tabindex","primitive"],"author":{"name":"Bernier LLC"},"license":"UNLICENSED","_id":"@bernierllc/validators-a11y-focus-order@0.3.1","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernierllc/tools#readme","bugs":{"url":"https://github.com/bernierllc/tools/issues"},"dist":{"shasum":"322b32dddc15c5b54fb1df2da0d46132edb7dea9","tarball":"https://registry.npmjs.org/@bernierllc/validators-a11y-focus-order/-/validators-a11y-focus-order-0.3.1.tgz","fileCount":15,"integrity":"sha512-c9V6615NB2a3KofLVQrSKXVspiDeMd2YEeACl1aHjcOzRXIy9slHLE0PStCVU0cJzVqmdsrAqoPSxmKAoi8ddQ==","signatures":[{"sig":"MEQCIBdWKoFI/DezuoDt50xez77v2TlhlKyQyTAiLbz2dvGRAiAqPh//wW7YSPFgqdgT+fdvV15TLWKGIIunw6qByYfSnw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":47499},"main":"dist/index.js","_from":"file:bernierllc-validators-a11y-focus-order-0.3.1.tgz","types":"dist/index.d.ts","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rm -rf dist coverage","lint:fix":"eslint src --ext .ts --fix","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:32bddf06-723d-4802-a7a0-ca1cde0d9424"}},"_resolved":"/tmp/cd673ab1ee2319b2b43cc6d92382bccf/bernierllc-validators-a11y-focus-order-0.3.1.tgz","_integrity":"sha512-c9V6615NB2a3KofLVQrSKXVspiDeMd2YEeACl1aHjcOzRXIy9slHLE0PStCVU0cJzVqmdsrAqoPSxmKAoi8ddQ==","repository":{"url":"git+https://github.com/bernierllc/tools.git","type":"git","directory":"packages/validators/validators-a11y-focus-order"},"_npmVersion":"11.11.0","description":"Accessibility focus order validation for the BernierLLC validators ecosystem - validates keyboard navigation, tab order, and focus visibility","directories":{},"_nodeVersion":"20.20.0","dependencies":{"@bernierllc/validators-core":"0.1.3","@bernierllc/validators-utils":"0.1.3"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^8.37.0","ts-jest":"^29.0.5","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^18.15.0","@typescript-eslint/parser":"^5.57.0","@typescript-eslint/eslint-plugin":"^5.57.0"},"_npmOperationalInternal":{"tmp":"tmp/validators-a11y-focus-order_0.3.1_1773078259346_0.39161690813711614","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"name":"@bernierllc/validators-a11y-focus-order","version":"0.3.2","keywords":["validation","validators","accessibility","a11y","wcag","focus","keyboard","tabindex","primitive"],"author":{"name":"Bernier LLC"},"license":"UNLICENSED","_id":"@bernierllc/validators-a11y-focus-order@0.3.2","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernierllc/tools#readme","bugs":{"url":"https://github.com/bernierllc/tools/issues"},"dist":{"shasum":"df782c7d14d7908e7d590d20d2aa010d38544dd2","tarball":"https://registry.npmjs.org/@bernierllc/validators-a11y-focus-order/-/validators-a11y-focus-order-0.3.2.tgz","fileCount":15,"integrity":"sha512-bPeVrT+4Zj48KS5na/62kOYdMeuIaXrP+lVgEwqHDszz8eN/fgajipVycS4HKEJ+hxM8DZYEzZ9L0UeIGAJcLQ==","signatures":[{"sig":"MEYCIQDltY2Edn7ua2vssphQ9vBzKYCG18tjyodA4sWUCv3hBwIhANGlKBbIySP6J1nP+OgsOEK3kf29cTLtmB5KPcFplfRx","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":47499},"main":"dist/index.js","_from":"file:bernierllc-validators-a11y-focus-order-0.3.2.tgz","types":"dist/index.d.ts","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rm -rf dist coverage","lint:fix":"eslint src --ext .ts --fix","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:32bddf06-723d-4802-a7a0-ca1cde0d9424"}},"_resolved":"/home/runner/work/tools/tools/packages/validators/validators-a11y-focus-order/bernierllc-validators-a11y-focus-order-0.3.2.tgz","_integrity":"sha512-bPeVrT+4Zj48KS5na/62kOYdMeuIaXrP+lVgEwqHDszz8eN/fgajipVycS4HKEJ+hxM8DZYEzZ9L0UeIGAJcLQ==","repository":{"url":"git+https://github.com/bernierllc/tools.git","type":"git","directory":"packages/validators/validators-a11y-focus-order"},"_npmVersion":"11.11.0","description":"Accessibility focus order validation for the BernierLLC validators ecosystem - validates keyboard navigation, tab order, and focus visibility","directories":{},"_nodeVersion":"20.20.0","dependencies":{"@bernierllc/validators-core":"0.1.4","@bernierllc/validators-utils":"0.1.4"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^8.37.0","ts-jest":"^29.0.5","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^18.15.0","@typescript-eslint/parser":"^5.57.0","@typescript-eslint/eslint-plugin":"^5.57.0"},"_npmOperationalInternal":{"tmp":"tmp/validators-a11y-focus-order_0.3.2_1773163866840_0.4438439165881163","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@bernierllc/validators-a11y-focus-order","version":"0.4.0","keywords":["validation","validators","accessibility","a11y","wcag","focus","keyboard","tabindex","primitive"],"author":{"name":"Bernier LLC"},"license":"UNLICENSED","_id":"@bernierllc/validators-a11y-focus-order@0.4.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernierllc/tools#readme","bugs":{"url":"https://github.com/bernierllc/tools/issues"},"dist":{"shasum":"72efe4d56c443641a5634b1b862bdd3123b408b8","tarball":"https://registry.npmjs.org/@bernierllc/validators-a11y-focus-order/-/validators-a11y-focus-order-0.4.0.tgz","fileCount":15,"integrity":"sha512-era/kapPTZz0ynG+etKmmt5+av2vb+SUVq1qPRD2c3+UyFGF/CQcIjYdHFsr9KRVu0wBS/xcjx7M4P/19B0+Bw==","signatures":[{"sig":"MEQCIGG+gvQeSe2WW/EXFaYKJZ+hc3K5rEz5l7y2aO9r8tLZAiA0/DOdA4eidh5zLcPW5A9Tm67j/yHslT8P9qNBSft42g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":47499},"main":"dist/index.js","_from":"file:bernierllc-validators-a11y-focus-order-0.4.0.tgz","types":"dist/index.d.ts","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rm -rf dist coverage","lint:fix":"eslint src --ext .ts --fix","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:32bddf06-723d-4802-a7a0-ca1cde0d9424"}},"_resolved":"/home/runner/work/tools/tools/packages/validators/validators-a11y-focus-order/bernierllc-validators-a11y-focus-order-0.4.0.tgz","_integrity":"sha512-era/kapPTZz0ynG+etKmmt5+av2vb+SUVq1qPRD2c3+UyFGF/CQcIjYdHFsr9KRVu0wBS/xcjx7M4P/19B0+Bw==","repository":{"url":"git+https://github.com/bernierllc/tools.git","type":"git","directory":"packages/validators/validators-a11y-focus-order"},"_npmVersion":"11.14.1","description":"Accessibility focus order validation for the BernierLLC validators ecosystem - validates keyboard navigation, tab order, and focus visibility","directories":{},"_nodeVersion":"20.20.2","dependencies":{"@bernierllc/validators-core":"0.2.0","@bernierllc/validators-utils":"0.2.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^8.37.0","ts-jest":"^29.0.5","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^18.15.0","@typescript-eslint/parser":"^5.57.0","@typescript-eslint/eslint-plugin":"^5.57.0"},"_npmOperationalInternal":{"tmp":"tmp/validators-a11y-focus-order_0.4.0_1779242097950_0.5884920029297194","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@bernierllc/validators-a11y-focus-order","version":"0.5.0","keywords":["validation","validators","accessibility","a11y","wcag","focus","keyboard","tabindex","primitive"],"author":{"name":"Bernier LLC"},"license":"UNLICENSED","_id":"@bernierllc/validators-a11y-focus-order@0.5.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernierllc/tools#readme","bugs":{"url":"https://github.com/bernierllc/tools/issues"},"dist":{"shasum":"2bf37eb4d0c868c79b99de57ee8733d2187a21ac","tarball":"https://registry.npmjs.org/@bernierllc/validators-a11y-focus-order/-/validators-a11y-focus-order-0.5.0.tgz","fileCount":15,"integrity":"sha512-ATjYTkAZFgqKpC4gCd1imzC96TIEV4Lz/fGXqfqbwMs644LJk8VID/akfOGNRK2OJgZ4nI751PSILVjhBfn8pg==","signatures":[{"sig":"MEUCIQDPGIh77M1zRwmgbICW57+u+iZJZGd0AR3WioiCqkQ4vQIgTSA+wlrNxGPv2BY1SU1XcXdvJBXb23/rLkU8TJeLAVA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":47499},"main":"dist/index.js","_from":"file:bernierllc-validators-a11y-focus-order-0.5.0.tgz","types":"dist/index.d.ts","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rm -rf dist coverage","lint:fix":"eslint src --ext .ts --fix","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:32bddf06-723d-4802-a7a0-ca1cde0d9424"}},"_resolved":"/home/runner/work/tools/tools/packages/validators/validators-a11y-focus-order/bernierllc-validators-a11y-focus-order-0.5.0.tgz","_integrity":"sha512-ATjYTkAZFgqKpC4gCd1imzC96TIEV4Lz/fGXqfqbwMs644LJk8VID/akfOGNRK2OJgZ4nI751PSILVjhBfn8pg==","repository":{"url":"git+https://github.com/bernierllc/tools.git","type":"git","directory":"packages/validators/validators-a11y-focus-order"},"_npmVersion":"11.14.1","description":"Accessibility focus order validation for the BernierLLC validators ecosystem - validates keyboard navigation, tab order, and focus visibility","directories":{},"_nodeVersion":"20.20.2","dependencies":{"@bernierllc/validators-core":"0.3.0","@bernierllc/validators-utils":"0.3.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^8.37.0","ts-jest":"^29.0.5","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^18.15.0","@typescript-eslint/parser":"^5.57.0","@typescript-eslint/eslint-plugin":"^5.57.0"},"_npmOperationalInternal":{"tmp":"tmp/validators-a11y-focus-order_0.5.0_1779250853269_0.9541095107623414","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@bernierllc/validators-a11y-focus-order","version":"0.6.0","description":"Accessibility focus order validation for the BernierLLC validators ecosystem - validates keyboard navigation, tab order, and focus visibility","main":"dist/index.js","types":"dist/index.d.ts","keywords":["validation","validators","accessibility","a11y","wcag","focus","keyboard","tabindex","primitive"],"author":{"name":"Bernier LLC"},"license":"UNLICENSED","dependencies":{"@bernierllc/validators-utils":"0.5.0","@bernierllc/validators-core":"0.4.0"},"devDependencies":{"@types/jest":"^29.5.0","@types/node":"^18.15.0","@typescript-eslint/eslint-plugin":"^5.57.0","@typescript-eslint/parser":"^5.57.0","eslint":"^8.37.0","jest":"^29.5.0","ts-jest":"^29.0.5","typescript":"^5.0.0"},"repository":{"type":"git","url":"git+https://github.com/bernierllc/tools.git","directory":"packages/validators/validators-a11y-focus-order"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"scripts":{"build":"tsc","dev":"tsc --watch","test":"jest","test:watch":"jest --watch","test:coverage":"jest --coverage","lint":"eslint src --ext .ts","lint:fix":"eslint src --ext .ts --fix","clean":"rm -rf dist coverage"},"_id":"@bernierllc/validators-a11y-focus-order@0.6.0","bugs":{"url":"https://github.com/bernierllc/tools/issues"},"homepage":"https://github.com/bernierllc/tools#readme","_integrity":"sha512-gbIbQ3Dt4RI8NeYeI9mc4f86EspGeEcsVy530fo2NvNtXn8AsKSfUq6k+VctRKItnt/Y1XYbx+RWfD9dcAboEw==","_resolved":"/home/runner/work/tools/tools/packages/validators/validators-a11y-focus-order/bernierllc-validators-a11y-focus-order-0.6.0.tgz","_from":"file:bernierllc-validators-a11y-focus-order-0.6.0.tgz","_nodeVersion":"20.20.2","_npmVersion":"11.14.1","dist":{"integrity":"sha512-gbIbQ3Dt4RI8NeYeI9mc4f86EspGeEcsVy530fo2NvNtXn8AsKSfUq6k+VctRKItnt/Y1XYbx+RWfD9dcAboEw==","shasum":"7532b0b30eab349dd649ddd49091cfa5ca1bf244","tarball":"https://registry.npmjs.org/@bernierllc/validators-a11y-focus-order/-/validators-a11y-focus-order-0.6.0.tgz","fileCount":17,"unpackedSize":49423,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIBDSOavIUDFsl92my96kUgf/xWIlLsSRvblYXSWrqekoAiEAh2mJ0GMQ0jYqoUNSt05uo45bNWcEx5pMu5OrxLaNZ+8="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:32bddf06-723d-4802-a7a0-ca1cde0d9424"}},"directories":{},"maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/validators-a11y-focus-order_0.6.0_1779252145229_0.013698577304038118"},"_hasShrinkwrap":false}},"time":{"created":"2025-10-11T22:40:23.871Z","modified":"2026-05-20T04:42:25.794Z","0.1.1":"2025-10-11T22:40:24.186Z","0.3.0":"2026-01-05T19:45:57.645Z","0.3.1":"2026-03-09T17:44:19.479Z","0.3.2":"2026-03-10T17:31:07.014Z","0.4.0":"2026-05-20T01:54:58.066Z","0.5.0":"2026-05-20T04:20:53.415Z","0.6.0":"2026-05-20T04:42:25.373Z"},"bugs":{"url":"https://github.com/bernierllc/tools/issues"},"author":{"name":"Bernier LLC"},"license":"UNLICENSED","homepage":"https://github.com/bernierllc/tools#readme","keywords":["validation","validators","accessibility","a11y","wcag","focus","keyboard","tabindex","primitive"],"repository":{"type":"git","url":"git+https://github.com/bernierllc/tools.git","directory":"packages/validators/validators-a11y-focus-order"},"description":"Accessibility focus order validation for the BernierLLC validators ecosystem - validates keyboard navigation, tab order, and focus visibility","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"readme":"# @bernierllc/validators-a11y-focus-order\n\nAccessibility focus order validation for keyboard navigation and WCAG compliance. Part of the BernierLLC validators ecosystem.\n\n## Overview\n\nThis validator ensures proper keyboard navigation and focus management in HTML by checking:\n\n- **Tab Index Validation** - Detects positive tabindex values that disrupt natural tab order\n- **Focus Visibility** - Ensures focusable elements have visible focus indicators\n- **Keyboard Trap Detection** - Identifies potential keyboard traps where focus cannot escape\n- **Skip Link Validation** - Validates skip link targets and implementation\n\n## Installation\n\n```bash\nnpm install @bernierllc/validators-a11y-focus-order\n```\n\n## Quick Start\n\n```typescript\nimport { validateA11yFocusOrder } from '@bernierllc/validators-a11y-focus-order';\n\n// Validate HTML for focus order issues\nconst problems = await validateA11yFocusOrder({\n  html: '<button tabindex=\"5\">Click me</button>',\n  validateTabIndex: true,\n  validateFocusVisibility: true,\n  validateKeyboardTraps: true,\n  validateSkipLinks: true\n});\n\nproblems.forEach(problem => {\n  console.log(`${problem.severity}: ${problem.message}`);\n  console.log(`Suggestion: ${problem.suggestion}`);\n});\n```\n\n## Usage\n\n### Basic Validation\n\n```typescript\nimport { validateA11yFocusOrder } from '@bernierllc/validators-a11y-focus-order';\n\nconst html = `\n  <nav>\n    <a href=\"#main\">Skip to main content</a>\n    <button tabindex=\"3\">Bad practice</button>\n  </nav>\n  <main id=\"main\">Content</main>\n`;\n\nconst problems = await validateA11yFocusOrder({ html });\n\n// Output:\n// error: Element has positive tabindex=\"3\" which disrupts natural keyboard navigation order\n```\n\n### Detailed Analysis\n\n```typescript\nimport { checkFocusOrder } from '@bernierllc/validators-a11y-focus-order';\n\nconst result = checkFocusOrder({\n  html: document.body.innerHTML,\n  validateTabIndex: true,\n  validateFocusVisibility: true,\n  validateKeyboardTraps: true,\n  validateSkipLinks: true\n});\n\nconsole.log(`Total focusable elements: ${result.totalFocusableElements}`);\nconsole.log(`Elements with positive tabindex: ${result.positiveTabIndices.length}`);\nconsole.log(`Missing focus indicators: ${result.missingFocusVisibility.length}`);\nconsole.log(`Potential keyboard traps: ${result.keyboardTraps.length}`);\nconsole.log(`Skip link issues: ${result.skipLinkIssues.length}`);\nconsole.log(`All checks pass: ${result.passes}`);\n```\n\n### Selective Validation\n\n```typescript\n// Only validate tab index usage\nconst problems = await validateA11yFocusOrder({\n  html,\n  validateTabIndex: true,\n  validateFocusVisibility: false,\n  validateKeyboardTraps: false,\n  validateSkipLinks: false\n});\n\n// Only validate skip links\nconst skipLinkProblems = await validateA11yFocusOrder({\n  html,\n  validateTabIndex: false,\n  validateSkipLinks: true\n});\n```\n\n### Custom Tab Index Tolerance\n\n```typescript\n// Allow positive tabindex up to 3\nconst problems = await validateA11yFocusOrder({\n  html,\n  validateTabIndex: true,\n  maxPositiveTabIndex: 3\n});\n```\n\n## Validation Rules\n\n### 1. Positive Tab Index (a11y-focus-order/positive-tabindex)\n\n**WCAG Reference**: 2.4.3 Focus Order\n\nPositive tabindex values (tabindex=\"1\", tabindex=\"2\", etc.) disrupt the natural document flow and create confusing navigation patterns for keyboard users.\n\n**Bad Practice:**\n```html\n<button tabindex=\"5\">First button</button>\n<button tabindex=\"1\">Second button (focused first!)</button>\n<button>Third button (focused last)</button>\n```\n\n**Best Practice:**\n```html\n<!-- Natural tab order follows DOM order -->\n<button>First button</button>\n<button>Second button</button>\n<button>Third button</button>\n\n<!-- Use tabindex=\"0\" to make non-focusable elements focusable -->\n<div tabindex=\"0\" role=\"button\">Custom button</div>\n\n<!-- Use tabindex=\"-1\" for programmatic focus only -->\n<div tabindex=\"-1\" id=\"error-message\">Error: form invalid</div>\n```\n\n### 2. Missing Focus Visibility (a11y-focus-order/missing-focus-visibility)\n\n**WCAG Reference**: 2.4.7 Focus Visible\n\nAll focusable elements must have visible focus indicators so keyboard users can see which element has focus.\n\n**Bad Practice:**\n```html\n<button style=\"outline:none\">No visible focus indicator</button>\n<a href=\"#\" style=\"outline:0\">Link without focus indicator</a>\n```\n\n**Best Practice:**\n```html\n<!-- Use default focus outline -->\n<button>Default focus outline</button>\n\n<!-- Custom focus styles with :focus or :focus-visible -->\n<button class=\"custom-focus\">Custom focus indicator</button>\n\n<style>\n.custom-focus:focus {\n  outline: 2px solid blue;\n  outline-offset: 2px;\n}\n\n/* Modern approach with :focus-visible */\n.custom-focus:focus-visible {\n  box-shadow: 0 0 0 3px rgba(0, 100, 255, 0.5);\n}\n</style>\n```\n\n### 3. Keyboard Trap Detection (a11y-focus-order/keyboard-trap)\n\n**WCAG Reference**: 2.1.2 No Keyboard Trap\n\nUsers must be able to navigate away from any component using only the keyboard. Trapping focus violates accessibility requirements.\n\n**Bad Practice:**\n```html\n<div onkeydown=\"if(event.key === 'Tab') event.preventDefault()\">\n  Trapped content\n</div>\n```\n\n**Best Practice:**\n```html\n<!-- Modal with proper escape mechanism -->\n<div role=\"dialog\" aria-labelledby=\"modal-title\">\n  <h2 id=\"modal-title\">Modal Dialog</h2>\n  <button>Action</button>\n  <button onclick=\"closeModal()\">Close</button>\n</div>\n\n<script>\nfunction setupModal() {\n  document.addEventListener('keydown', (event) => {\n    if (event.key === 'Escape') {\n      closeModal();\n    }\n  });\n}\n</script>\n```\n\n### 4. Invalid Skip Links (a11y-focus-order/invalid-skip-link)\n\n**WCAG Reference**: 2.4.1 Bypass Blocks\n\nSkip links must point to valid targets within the page to help keyboard users bypass repetitive navigation.\n\n**Bad Practice:**\n```html\n<!-- Target doesn't exist -->\n<a href=\"#main-content\">Skip to main content</a>\n<main id=\"content\">Content here</main>\n\n<!-- Not a fragment identifier -->\n<a href=\"/main\">Skip to main</a>\n```\n\n**Best Practice:**\n```html\n<!-- Valid skip link with matching target -->\n<a href=\"#main-content\" class=\"skip-link\">Skip to main content</a>\n<main id=\"main-content\">\n  <h1>Main Content</h1>\n  <p>Content here...</p>\n</main>\n\n<style>\n/* Visually hidden but available to screen readers and keyboard users */\n.skip-link {\n  position: absolute;\n  left: -10000px;\n  top: auto;\n  width: 1px;\n  height: 1px;\n  overflow: hidden;\n}\n\n.skip-link:focus {\n  position: static;\n  width: auto;\n  height: auto;\n}\n</style>\n```\n\n## API Reference\n\n### `validateA11yFocusOrder(input, utils?)`\n\nMain validation function that checks all focus order rules.\n\n**Parameters:**\n- `input: FocusOrderCheckInput` - Configuration object\n  - `html: string` - HTML content to validate (required)\n  - `validateTabIndex?: boolean` - Check for positive tabindex values (default: true)\n  - `validateFocusVisibility?: boolean` - Check for missing focus indicators (default: true)\n  - `validateKeyboardTraps?: boolean` - Check for keyboard traps (default: true)\n  - `validateSkipLinks?: boolean` - Validate skip link targets (default: true)\n  - `maxPositiveTabIndex?: number` - Maximum allowed positive tabindex (default: 0)\n- `utils?: SharedUtils` - Optional shared utilities\n\n**Returns:** `Promise<Problem[]>` - Array of validation problems\n\n### `checkFocusOrder(input)`\n\nAnalyzes HTML and returns detailed focus order metrics.\n\n**Parameters:**\n- `input: FocusOrderCheckInput` - Configuration object\n\n**Returns:** `FocusOrderCheckResult`\n- `passes: boolean` - Whether all checks pass\n- `positiveTabIndices: FocusableElement[]` - Elements with positive tabindex\n- `missingFocusVisibility: FocusableElement[]` - Elements without focus indicators\n- `keyboardTraps: FocusableElement[]` - Potential keyboard traps\n- `skipLinkIssues: FocusableElement[]` - Invalid skip links\n- `totalFocusableElements: number` - Total focusable elements found\n\n### Individual Rules\n\nEach rule can be imported and used separately:\n\n```typescript\nimport {\n  positiveTabindex,\n  missingFocusVisibility,\n  keyboardTrap,\n  invalidSkipLink\n} from '@bernierllc/validators-a11y-focus-order';\n```\n\n## Integration with BernierLLC Ecosystem\n\n### With Validators Runner\n\n```typescript\nimport { createRunner } from '@bernierllc/validators-runner';\nimport { a11yFocusOrderValidator } from '@bernierllc/validators-a11y-focus-order';\n\nconst runner = createRunner({\n  validators: [a11yFocusOrderValidator]\n});\n\nconst results = await runner.validate({\n  html: document.body.innerHTML\n});\n```\n\n### With Custom Reporters\n\n```typescript\nimport { createConsoleReporter } from '@bernierllc/validators-reporters';\nimport { validateA11yFocusOrder } from '@bernierllc/validators-a11y-focus-order';\n\nconst problems = await validateA11yFocusOrder({ html });\nconst reporter = createConsoleReporter();\nreporter.report(problems);\n```\n\n## Real-World Examples\n\n### Navigation with Skip Link\n\n```typescript\nconst html = `\n  <body>\n    <a href=\"#main\" class=\"skip-link\">Skip to main content</a>\n    <nav>\n      <ul>\n        <li><a href=\"/\">Home</a></li>\n        <li><a href=\"/about\">About</a></li>\n      </ul>\n    </nav>\n    <main id=\"main\">\n      <h1>Welcome</h1>\n    </main>\n  </body>\n`;\n\nconst result = checkFocusOrder({ html, validateSkipLinks: true });\n// result.passes === true\n// result.skipLinkIssues.length === 0\n```\n\n### Form with Proper Focus Management\n\n```typescript\nconst html = `\n  <form>\n    <label for=\"username\">Username:</label>\n    <input id=\"username\" type=\"text\" />\n\n    <label for=\"password\">Password:</label>\n    <input id=\"password\" type=\"password\" />\n\n    <button type=\"submit\">Log In</button>\n    <button type=\"button\" tabindex=\"-1\" id=\"hidden-helper\">\n      Helper (programmatic focus only)\n    </button>\n  </form>\n`;\n\nconst result = checkFocusOrder({ html });\n// result.passes === true\n// result.totalFocusableElements === 4\n// result.positiveTabIndices.length === 0\n```\n\n### Modal Dialog with Escape Handling\n\n```typescript\nconst html = `\n  <div role=\"dialog\" aria-labelledby=\"dialog-title\" aria-modal=\"true\">\n    <h2 id=\"dialog-title\">Confirm Action</h2>\n    <p>Are you sure?</p>\n    <button onclick=\"confirm()\">Yes</button>\n    <button onclick=\"cancel()\">No</button>\n  </div>\n`;\n\nconst problems = await validateA11yFocusOrder({\n  html,\n  validateKeyboardTraps: true\n});\n// Should not flag properly implemented modals\n```\n\n## WCAG Compliance\n\nThis validator helps ensure compliance with:\n\n- **WCAG 2.1.2**: No Keyboard Trap (Level A)\n- **WCAG 2.4.1**: Bypass Blocks (Level A)\n- **WCAG 2.4.3**: Focus Order (Level A)\n- **WCAG 2.4.7**: Focus Visible (Level AA)\n\n## Best Practices\n\n1. **Avoid Positive Tab Index**: Never use positive tabindex values. Use DOM order for natural tab sequence.\n\n2. **Always Provide Focus Indicators**: Ensure all interactive elements have visible focus states.\n\n3. **Test with Keyboard Only**: Verify your site is fully navigable using only the keyboard.\n\n4. **Implement Skip Links**: Provide skip links to bypass repetitive navigation.\n\n5. **Avoid Keyboard Traps**: Ensure users can always escape from modals and components.\n\n6. **Use Semantic HTML**: Prefer native focusable elements (button, a, input) over custom implementations.\n\n## Integration Status\n\n### Logger Integration\nNot applicable for primitive validators. This package provides pure validation functions without side effects. Logging is handled by the calling application or validators-runner.\n\n### Docs-Suite Integration\nReady - Complete markdown documentation and API documentation available via TypeDoc. All functions are fully documented with JSDoc comments for automatic documentation generation.\n\n### NeverHub Integration\nNot applicable for primitive validators. NeverHub integration is handled at the runner/orchestrator level. This package is designed to be framework-agnostic and can be used standalone or through validators-runner with NeverHub support.\n\n## License\n\nCopyright (c) 2025 Bernier LLC. All rights reserved.\n\nThis package is part of the BernierLLC validators ecosystem for accessibility and WCAG compliance validation.\n\n## See Also\n\n- [@bernierllc/validators-core](../validators-core) - Core validation framework\n- [@bernierllc/validators-utils](../validators-utils) - Shared validator utilities\n- [@bernierllc/validators-a11y-contrast](../validators-a11y-contrast) - Color contrast validation\n- [@bernierllc/validators-html-syntax](../validators-html-syntax) - HTML syntax validation\n","readmeFilename":"README.md"}