{"_id":"@afixt/lexic-a11y","_rev":"6-84dd583c56be7131c2a24c2fde30c8ec","name":"@afixt/lexic-a11y","dist-tags":{"latest":"2.3.0"},"versions":{"1.0.1":{"name":"@afixt/lexic-a11y","version":"1.0.1","keywords":["react","lexical","editor","rich-text","a11y","accessibility","i18n"],"author":"","license":"MIT","_id":"@afixt/lexic-a11y@1.0.1","maintainers":[{"name":"macmilan","email":"marko.macmilan@gmail.com"},{"name":"jw1982","email":"john.watts@afixt.com"},{"name":"karlgroves","email":"karlgroves@gmail.com"}],"dist":{"shasum":"c7ed433e6cc2599c241aa0f072af05656aa84db7","tarball":"https://registry.npmjs.org/@afixt/lexic-a11y/-/lexic-a11y-1.0.1.tgz","fileCount":8,"integrity":"sha512-xa0nt+nUABbYx+gUaLGlHskBC+fOdrgWj21L1MNpbFwOF9PNPGzAughNhzPFlfdH0K0JV499mrPfbfqaZPXYaw==","signatures":[{"sig":"MEYCIQD5RclcAQKgOmYvaVWrsxw6+6agwyoosNFjrCwf0ogN8QIhAP5NMSMCluVlxDbGQM0cy0eceNGKf3gQS9NDqHsH871I","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5679143},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.esm.js","engines":{"npm":">=10.0.0","node":">=20.0.0"},"gitHead":"8d3aecfd42b82e60ee9175508d46c3c1afdb9000","scripts":{"ci":"npm run check:all","lint":"eslint .","size":"size-limit","test":"jest","build":"rollup -c","check":"npm-run-all -p lint lint:css lint:md format:check","dupes":"jscpd . --config .jscpd.json","links":"lychee --no-progress --max-retries 0 --timeout 10 --exclude-path node_modules --exclude-path dist --exclude-path build --exclude-path coverage '**/*.md'","start":"vite","format":"prettier --write .","example":"parcel serve examples/index.html --open","lint:md":"markdownlint-cli2 '**/*.md' '#node_modules' '#dist' '#build' '#coverage'","prepare":"husky","dupes:ci":"jscpd . --config .jscpd.json --threshold 5","lint:css":"stylelint 'src/**/*.css'","lint:fix":"eslint . --fix","security":"npm-run-all -p security:audit security:osv security:semgrep security:secrets","test:e2e":"playwright test","check:all":"npm-run-all -s check test build dupes size license:check security:audit security:secrets","build:demo":"vite build","test:watch":"jest --watch","codesandbox":"parcel serve sandbox.html","lint:md:fix":"markdownlint-cli2 --fix '**/*.md' '#node_modules' '#dist' '#build' '#coverage'","lint:strict":"eslint . --max-warnings=0","format:check":"prettier --check .","lint:css:fix":"stylelint 'src/**/*.css' --fix","preview:demo":"vite preview","security:osv":"osv-scanner --lockfile=package-lock.json","build:analyze":"ANALYZE=true rollup -c","license:check":"license-checker-rseidelsohn --production --onlyAllow 'MIT;ISC;Apache-2.0;BSD-2-Clause;BSD-3-Clause;0BSD;CC0-1.0;Unlicense;Python-2.0;WTFPL;BlueOak-1.0.0' --excludePrivatePackages --summary","license:report":"license-checker-rseidelsohn --production --csv --out reports/licenses.csv","security:audit":"npm audit --production --audit-level=high","lint:css:strict":"stylelint 'src/**/*.css' --max-warnings=0","test:e2e:headed":"playwright test --headed","security:secrets":"trufflehog git file://. --only-verified --fail","security:semgrep":"semgrep --config=p/javascript --config=p/react --config=p/owasp-top-ten --error --metrics=off"},"_npmUser":{"name":"karlgroves","email":"karlgroves@gmail.com"},"size-limit":[{"name":"ESM bundle","path":"dist/index.esm.js","limit":"100 KB"},{"name":"CJS bundle","path":"dist/index.js","limit":"100 KB"}],"_npmVersion":"11.12.1","description":"A fully featured, accessible, and internationalized rich text editor built with React and Lexical","directories":{},"_nodeVersion":"24.15.0","browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"dependencies":{"ajv":"^8.18.0","react":"^16.8.0 || ^17.0.0 || ^18.0.0","i18next":"^23.0.0","lexical":"^0.12.0","react-dom":"^16.8.0 || ^17.0.0 || ^18.0.0","@lexical/code":"0.12.6","@lexical/html":"^0.12.0","@lexical/link":"^0.12.0","@lexical/list":"^0.12.0","react-i18next":"^13.0.0","@lexical/react":"^0.12.0","@lexical/table":"^0.12.0","@lexical/markdown":"^0.12.0","@lexical/rich-text":"^0.12.0","@lexical/selection":"^0.12.6"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","vite":"^7.3.2","husky":"^9.1.7","jscpd":"^4.0.9","eslint":"9.39.4","parcel":"^2.14.4","rollup":"^2.80.0","globals":"15.15.0","prettier":"^3.8.3","stylelint":"^17.8.0","@eslint/js":"9.39.4","babel-jest":"^29.0.0","size-limit":"11.2.0","typescript":"5.9.3","@babel/core":"^7.29.0","lint-staged":"^16.4.0","npm-run-all":"4.1.5","ts-api-utils":"2.5.0","@commitlint/cli":"19.8.1","eslint-plugin-n":"17.24.0","@playwright/test":"1.60.0","@babel/preset-env":"^7.29.2","markdownlint-cli2":"0.18.1","@afixt/a11y-assert":"2.1.3","@babel/preset-react":"^7.22.0","eslint-plugin-jsdoc":"51.4.1","eslint-plugin-react":"7.37.5","@axe-core/playwright":"4.11.3","@rollup/plugin-babel":"^6.0.0","@vitejs/plugin-react":"^5.2.0","rollup-plugin-terser":"^7.0.0","eslint-plugin-promise":"7.2.1","eslint-plugin-sonarjs":"3.0.7","eslint-plugin-unicorn":"60.0.0","rollup-plugin-postcss":"^4.0.0","@testing-library/react":"^14.0.0","eslint-config-prettier":"9.1.2","eslint-plugin-import-x":"4.16.2","eslint-plugin-jsx-a11y":"6.10.2","eslint-plugin-security":"3.0.1","jest-environment-jsdom":"^29.0.0","@rollup/plugin-commonjs":"^25.0.0","eslint-plugin-no-secrets":"2.3.3","rollup-plugin-visualizer":"5.14.0","@testing-library/jest-dom":"^6.0.0","eslint-plugin-react-hooks":"5.2.0","stylelint-config-standard":"^40.0.0","@rollup/plugin-node-resolve":"^15.0.0","@testing-library/user-event":"^14.0.0","license-checker-rseidelsohn":"4.4.2","@double-great/stylelint-a11y":"3.4.10","@size-limit/preset-small-lib":"11.2.0","@commitlint/config-conventional":"19.8.1","prettier-plugin-organize-imports":"4.3.0","rollup-plugin-peer-deps-external":"^2.2.0","stylelint-declaration-strict-value":"1.11.1"},"peerDependencies":{"react":"^16.8.0 || ^17.0.0 || ^18.0.0","react-dom":"^16.8.0 || ^17.0.0 || ^18.0.0"},"_npmOperationalInternal":{"tmp":"tmp/lexic-a11y_1.0.1_1782418227351_0.5566984503416661","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@afixt/lexic-a11y","version":"1.1.0","keywords":["react","lexical","editor","rich-text","a11y","accessibility","i18n"],"author":"","license":"MIT","_id":"@afixt/lexic-a11y@1.1.0","maintainers":[{"name":"macmilan","email":"marko.macmilan@gmail.com"},{"name":"jw1982","email":"john.watts@afixt.com"},{"name":"karlgroves","email":"karlgroves@gmail.com"}],"dist":{"shasum":"aa10be1367be815133d1fc94305e25862236ed96","tarball":"https://registry.npmjs.org/@afixt/lexic-a11y/-/lexic-a11y-1.1.0.tgz","fileCount":8,"integrity":"sha512-XNj1CZjs03yvE9e9swIQ+PV43/BuX9IL4dn/t5/sxm5u5uOhgLmaWopGstqliONyCTckw18gg9NNCVxpDhRbkQ==","signatures":[{"sig":"MEYCIQCkRoja6zjwP1u7w1Yuebj4PelRwzm8x11IzxuPvLXEwAIhAMWc9Yiykqr+CrOBW6QIoXTbCK5uYXqJ6kdl1Ysw0p6/","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5677708},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.esm.js","engines":{"npm":">=10.0.0","node":">=20.0.0"},"gitHead":"f8533d0621aa80d724d0bc1e6618e083c0337e2c","scripts":{"ci":"npm run check:all","lint":"eslint .","size":"size-limit","test":"jest","build":"rollup -c","check":"npm-run-all -p lint lint:css lint:md format:check","dupes":"jscpd . --config .jscpd.json","links":"lychee --no-progress --max-retries 0 --timeout 10 --exclude-path node_modules --exclude-path dist --exclude-path build --exclude-path coverage '**/*.md'","start":"vite","format":"prettier --write .","example":"parcel serve examples/index.html --open","lint:md":"markdownlint-cli2 '**/*.md' '#node_modules' '#dist' '#build' '#coverage'","prepare":"husky","dupes:ci":"jscpd . --config .jscpd.json --threshold 5","lint:css":"stylelint 'src/**/*.css'","lint:fix":"eslint . --fix","security":"npm-run-all -p security:audit security:osv security:semgrep security:secrets","test:e2e":"playwright test","check:all":"npm-run-all -s check test build dupes size license:check security:audit security:secrets","build:demo":"vite build","test:watch":"jest --watch","codesandbox":"parcel serve sandbox.html","lint:md:fix":"markdownlint-cli2 --fix '**/*.md' '#node_modules' '#dist' '#build' '#coverage'","lint:strict":"eslint . --max-warnings=0","format:check":"prettier --check .","lint:css:fix":"stylelint 'src/**/*.css' --fix","preview:demo":"vite preview","security:osv":"osv-scanner --lockfile=package-lock.json","build:analyze":"ANALYZE=true rollup -c","license:check":"license-checker-rseidelsohn --production --onlyAllow 'MIT;ISC;Apache-2.0;BSD-2-Clause;BSD-3-Clause;0BSD;CC0-1.0;Unlicense;Python-2.0;WTFPL;BlueOak-1.0.0' --excludePrivatePackages --summary","license:report":"license-checker-rseidelsohn --production --csv --out reports/licenses.csv","security:audit":"npm audit --production --audit-level=high","lint:css:strict":"stylelint 'src/**/*.css' --max-warnings=0","test:e2e:headed":"playwright test --headed","security:secrets":"trufflehog git file://. --only-verified --fail","security:semgrep":"semgrep --config=p/javascript --config=p/react --config=p/owasp-top-ten --error --metrics=off"},"_npmUser":{"name":"karlgroves","email":"karlgroves@gmail.com"},"size-limit":[{"name":"ESM bundle","path":"dist/index.esm.js","limit":"105 KB"},{"name":"CJS bundle","path":"dist/index.js","limit":"105 KB"}],"_npmVersion":"11.12.1","description":"A fully featured, accessible, and internationalized rich text editor built with React and Lexical","directories":{},"_nodeVersion":"24.15.0","browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"dependencies":{"ajv":"^8.18.0","react":"^16.8.0 || ^17.0.0 || ^18.0.0","i18next":"^23.0.0","lexical":"^0.12.0","react-dom":"^16.8.0 || ^17.0.0 || ^18.0.0","@lexical/code":"0.12.6","@lexical/html":"^0.12.0","@lexical/link":"^0.12.0","@lexical/list":"^0.12.0","react-i18next":"^13.0.0","@lexical/react":"^0.12.0","@lexical/table":"^0.12.0","@lexical/markdown":"^0.12.0","@lexical/rich-text":"^0.12.0","@lexical/selection":"^0.12.6"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","vite":"^7.3.2","husky":"^9.1.7","jscpd":"^4.0.9","eslint":"9.39.4","parcel":"^2.14.4","rollup":"^2.80.0","globals":"15.15.0","prettier":"^3.8.3","stylelint":"^17.8.0","@eslint/js":"9.39.4","babel-jest":"^29.0.0","size-limit":"11.2.0","typescript":"5.9.3","@babel/core":"^7.29.0","lint-staged":"^16.4.0","npm-run-all":"4.1.5","ts-api-utils":"2.5.0","@commitlint/cli":"19.8.1","eslint-plugin-n":"17.24.0","@playwright/test":"1.60.0","@babel/preset-env":"^7.29.2","markdownlint-cli2":"0.18.1","@afixt/a11y-assert":"2.1.3","@babel/preset-react":"^7.22.0","eslint-plugin-jsdoc":"51.4.1","eslint-plugin-react":"7.37.5","@axe-core/playwright":"4.11.3","@rollup/plugin-babel":"^6.0.0","@vitejs/plugin-react":"^5.2.0","rollup-plugin-terser":"^7.0.0","eslint-plugin-promise":"7.2.1","eslint-plugin-sonarjs":"3.0.7","eslint-plugin-unicorn":"60.0.0","rollup-plugin-postcss":"^4.0.0","@testing-library/react":"^14.0.0","eslint-config-prettier":"9.1.2","eslint-plugin-import-x":"4.16.2","eslint-plugin-jsx-a11y":"6.10.2","eslint-plugin-security":"3.0.1","jest-environment-jsdom":"^29.0.0","@rollup/plugin-commonjs":"^25.0.0","eslint-plugin-no-secrets":"2.3.3","rollup-plugin-visualizer":"5.14.0","@testing-library/jest-dom":"^6.0.0","eslint-plugin-react-hooks":"5.2.0","stylelint-config-standard":"^40.0.0","@rollup/plugin-node-resolve":"^15.0.0","@testing-library/user-event":"^14.0.0","license-checker-rseidelsohn":"4.4.2","@double-great/stylelint-a11y":"3.4.10","@size-limit/preset-small-lib":"11.2.0","@commitlint/config-conventional":"19.8.1","prettier-plugin-organize-imports":"4.3.0","rollup-plugin-peer-deps-external":"^2.2.0","stylelint-declaration-strict-value":"1.11.1"},"peerDependencies":{"react":"^16.8.0 || ^17.0.0 || ^18.0.0","react-dom":"^16.8.0 || ^17.0.0 || ^18.0.0"},"_npmOperationalInternal":{"tmp":"tmp/lexic-a11y_1.1.0_1782528508699_0.7451500882557935","host":"s3://npm-registry-packages-npm-production"}},"1.1.2":{"name":"@afixt/lexic-a11y","version":"1.1.2","keywords":["react","lexical","editor","rich-text","a11y","accessibility","i18n"],"author":{"name":"Karl Groves","email":"karlgroves@gmail.com"},"license":"MIT","_id":"@afixt/lexic-a11y@1.1.2","maintainers":[{"name":"macmilan","email":"marko.macmilan@gmail.com"},{"name":"jw1982","email":"john.watts@afixt.com"},{"name":"karlgroves","email":"karlgroves@gmail.com"}],"homepage":"https://github.com/AFixt/lexic-a11y#readme","bugs":{"url":"https://github.com/AFixt/lexic-a11y/issues"},"dist":{"shasum":"e3395da432d5af9d9264e1a55a3677c9831af944","tarball":"https://registry.npmjs.org/@afixt/lexic-a11y/-/lexic-a11y-1.1.2.tgz","fileCount":9,"integrity":"sha512-TrPcT69XYacRF6hPKBKTZPeGPSc4vVaNlIH8gZ/YC3rpoFHV5NcMk5TCpF3k7XzU82n3n2kzNTzeS1nFFgsxOw==","signatures":[{"sig":"MEYCIQCDQo5ToG2Ed+KC05dQZ/VFwNssOVh4bVeeOUjSxA4YsgIhAP1/maL9Xh0M4Z8HVTjEQATd+UefYTVCoScyA4+jDxQe","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5681458},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.esm.js","engines":{"npm":">=10.0.0","node":">=20.0.0"},"gitHead":"e64fbc1df97c0fdc553c33cfcc1cef4ed07b72fd","scripts":{"ci":"npm run check:all","lint":"eslint .","size":"size-limit","test":"jest","build":"rollup -c","check":"npm-run-all -p lint lint:css lint:md format:check types:check","dupes":"jscpd . --config .jscpd.json","links":"lychee --no-progress --max-retries 0 --timeout 10 --exclude-path node_modules --exclude-path dist --exclude-path build --exclude-path coverage '**/*.md'","start":"vite","format":"prettier --write .","example":"vite --open /examples/index.html","lint:md":"markdownlint-cli2 '**/*.md' '#node_modules' '#dist' '#build' '#coverage'","prepare":"husky","dupes:ci":"jscpd . --config .jscpd.json --threshold 5","lint:css":"stylelint 'src/**/*.css'","lint:fix":"eslint . --fix","security":"npm-run-all -p security:audit security:osv security:semgrep security:secrets","test:e2e":"playwright test","check:all":"npm-run-all -s check test build dupes size license:check security:audit security:secrets","build:demo":"vite build","test:watch":"jest --watch","lint:md:fix":"markdownlint-cli2 --fix '**/*.md' '#node_modules' '#dist' '#build' '#coverage'","lint:strict":"eslint . --max-warnings=0","types:check":"tsc --noEmit --strict --skipLibCheck --moduleResolution bundler --module esnext --target es2020 --jsx react-jsx src/index.d.ts","format:check":"prettier --check .","lint:css:fix":"stylelint 'src/**/*.css' --fix","preview:demo":"vite preview","security:osv":"osv-scanner --lockfile=package-lock.json","build:analyze":"ANALYZE=true rollup -c","license:check":"license-checker-rseidelsohn --production --onlyAllow 'MIT;ISC;Apache-2.0;BSD-2-Clause;BSD-3-Clause;0BSD;CC0-1.0;Unlicense;Python-2.0;WTFPL;BlueOak-1.0.0' --excludePrivatePackages --summary","license:report":"license-checker-rseidelsohn --production --csv --out reports/licenses.csv","security:audit":"npm audit --production --audit-level=high","lint:css:strict":"stylelint 'src/**/*.css' --max-warnings=0","test:e2e:headed":"playwright test --headed","security:secrets":"trufflehog git file://. --only-verified --fail","security:semgrep":"semgrep --config=p/javascript --config=p/react --config=p/owasp-top-ten --error --metrics=off"},"_npmUser":{"name":"karlgroves","email":"karlgroves@gmail.com"},"repository":{"url":"git+https://github.com/AFixt/lexic-a11y.git","type":"git"},"size-limit":[{"name":"ESM bundle","path":"dist/index.esm.js","limit":"105 KB"},{"name":"CJS bundle","path":"dist/index.js","limit":"105 KB"}],"_npmVersion":"11.12.1","description":"A fully featured, accessible, and internationalized rich text editor built with React and Lexical","directories":{},"_nodeVersion":"24.15.0","browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"dependencies":{"i18next":"^23.0.0","lexical":"^0.12.0","@lexical/code":"0.12.6","@lexical/html":"^0.12.0","@lexical/link":"^0.12.0","@lexical/list":"^0.12.0","react-i18next":"^13.0.0","@lexical/react":"^0.12.0","@lexical/table":"^0.12.0","@lexical/markdown":"^0.12.0","@lexical/rich-text":"^0.12.0","@lexical/selection":"^0.12.6"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","vite":"^7.3.2","husky":"^9.1.7","jscpd":"^4.0.9","react":"19.2.7","eslint":"9.39.4","parcel":"^2.14.4","rollup":"^2.80.0","globals":"15.15.0","prettier":"^3.8.3","react-dom":"19.2.7","stylelint":"^17.8.0","@eslint/js":"9.39.4","babel-jest":"^29.0.0","size-limit":"11.2.0","typescript":"5.9.3","@babel/core":"^7.29.0","lint-staged":"^16.4.0","npm-run-all":"4.1.5","@types/react":"19.2.17","ts-api-utils":"2.5.0","@commitlint/cli":"19.8.1","eslint-plugin-n":"17.24.0","@playwright/test":"1.60.0","@babel/preset-env":"^7.29.2","markdownlint-cli2":"0.18.1","@afixt/a11y-assert":"2.1.3","@babel/preset-react":"^7.22.0","eslint-plugin-jsdoc":"51.4.1","eslint-plugin-react":"7.37.5","@axe-core/playwright":"4.11.3","@rollup/plugin-babel":"^6.0.0","@vitejs/plugin-react":"^5.2.0","rollup-plugin-terser":"^7.0.0","eslint-plugin-promise":"7.2.1","eslint-plugin-sonarjs":"3.0.7","eslint-plugin-unicorn":"60.0.0","rollup-plugin-postcss":"^4.0.0","@testing-library/react":"16.3.2","eslint-config-prettier":"9.1.2","eslint-plugin-import-x":"4.16.2","eslint-plugin-jsx-a11y":"6.10.2","eslint-plugin-security":"3.0.1","jest-environment-jsdom":"^29.0.0","@rollup/plugin-commonjs":"^25.0.0","eslint-plugin-no-secrets":"2.3.3","rollup-plugin-visualizer":"5.14.0","@testing-library/jest-dom":"^6.0.0","eslint-plugin-react-hooks":"5.2.0","stylelint-config-standard":"^40.0.0","@rollup/plugin-node-resolve":"^15.0.0","@testing-library/user-event":"^14.0.0","license-checker-rseidelsohn":"4.4.2","@double-great/stylelint-a11y":"3.4.10","@size-limit/preset-small-lib":"11.2.0","@commitlint/config-conventional":"19.8.1","prettier-plugin-organize-imports":"4.3.0","rollup-plugin-peer-deps-external":"^2.2.0","stylelint-declaration-strict-value":"1.11.1"},"peerDependencies":{"react":"^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0","react-dom":"^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/lexic-a11y_1.1.2_1784497990111_0.5671851453891974","host":"s3://npm-registry-packages-npm-production"}},"1.1.3":{"name":"@afixt/lexic-a11y","version":"1.1.3","keywords":["react","lexical","editor","rich-text","a11y","accessibility","i18n"],"author":{"name":"Karl Groves","email":"karlgroves@gmail.com"},"license":"MIT","_id":"@afixt/lexic-a11y@1.1.3","maintainers":[{"name":"macmilan","email":"marko.macmilan@gmail.com"},{"name":"jw1982","email":"john.watts@afixt.com"},{"name":"karlgroves","email":"karlgroves@gmail.com"}],"homepage":"https://github.com/AFixt/lexic-a11y#readme","bugs":{"url":"https://github.com/AFixt/lexic-a11y/issues"},"dist":{"shasum":"22442e35416d616af4f4a75e26d4433cca099059","tarball":"https://registry.npmjs.org/@afixt/lexic-a11y/-/lexic-a11y-1.1.3.tgz","fileCount":9,"integrity":"sha512-2q18NaGAU08Ow/IUrq2+YCrxn3CMb1JX7q+1MB0RbldBNfofZqQlzknwxIl3hgi8jZEr+6ZyQGm+SO9G8loNJg==","signatures":[{"sig":"MEUCIEJnrUgKE0Xhqt4ANvS1mRacwCsD9+wJbraNXc8O3DfMAiEAsj6F+LgRonjYTFeoP6EyRfYS0+vmtFaXd8/3+iE1sMo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5677116},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.esm.js","engines":{"npm":">=10.0.0","node":">=20.0.0"},"gitHead":"d2f6ac0eabf83d16f482173a5ef8a39397b94d13","scripts":{"ci":"npm run check:all","lint":"eslint .","size":"size-limit","test":"jest","build":"rollup -c","check":"npm-run-all -p lint lint:css lint:md format:check types:check","dupes":"jscpd . --config .jscpd.json","links":"lychee --no-progress --max-retries 0 --timeout 10 --exclude-path node_modules --exclude-path dist --exclude-path build --exclude-path coverage '**/*.md'","start":"vite","format":"prettier --write .","example":"vite --open /examples/index.html","lint:md":"markdownlint-cli2 '**/*.md' '#node_modules' '#dist' '#build' '#coverage'","prepare":"husky","dupes:ci":"jscpd . --config .jscpd.json --threshold 5","lint:css":"stylelint 'src/**/*.css'","lint:fix":"eslint . --fix","security":"npm-run-all -p security:audit security:osv security:semgrep security:secrets security:banned-deps","test:e2e":"playwright test","check:all":"npm-run-all -s check test build test:dist dupes size license:check security:audit security:secrets security:banned-deps","test:dist":"jest --config jest.dist.config.js","build:demo":"vite build","test:watch":"jest --watch","lint:md:fix":"markdownlint-cli2 --fix '**/*.md' '#node_modules' '#dist' '#build' '#coverage'","lint:strict":"eslint . --max-warnings=0","types:check":"tsc --noEmit --strict --skipLibCheck --moduleResolution bundler --module esnext --target es2020 --jsx react-jsx src/index.d.ts","format:check":"prettier --check .","lint:css:fix":"stylelint 'src/**/*.css' --fix","preview:demo":"vite preview","security:osv":"osv-scanner --lockfile=package-lock.json","build:analyze":"ANALYZE=true rollup -c","license:check":"license-checker-rseidelsohn --production --onlyAllow 'MIT;ISC;Apache-2.0;BSD-2-Clause;BSD-3-Clause;0BSD;CC0-1.0;Unlicense;Python-2.0;WTFPL;BlueOak-1.0.0' --excludePrivatePackages --summary","license:report":"license-checker-rseidelsohn --production --csv --out reports/licenses.csv","security:audit":"npm audit --production --audit-level=high","lint:css:strict":"stylelint 'src/**/*.css' --max-warnings=0","test:e2e:headed":"playwright test --headed","security:secrets":"trufflehog git file://. --only-verified --fail","security:semgrep":"semgrep --config=p/javascript --config=p/react --config=p/owasp-top-ten --error --metrics=off","security:banned-deps":"node scripts/check-banned-deps.mjs"},"_npmUser":{"name":"karlgroves","email":"karlgroves@gmail.com"},"overrides":{"axe-core":"npm:empty-npm-package@1.0.0"},"repository":{"url":"git+https://github.com/AFixt/lexic-a11y.git","type":"git"},"size-limit":[{"name":"ESM bundle","path":"dist/index.esm.js","limit":"105 KB"},{"name":"CJS bundle","path":"dist/index.js","limit":"105 KB"}],"_npmVersion":"11.12.1","description":"A fully featured, accessible, and internationalized rich text editor built with React and Lexical","directories":{},"_nodeVersion":"24.15.0","browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"dependencies":{"i18next":"^23.0.0","lexical":"^0.12.0","@lexical/code":"0.12.6","@lexical/html":"^0.12.0","@lexical/link":"^0.12.0","@lexical/list":"^0.12.0","react-i18next":"^13.0.0","@lexical/react":"^0.12.0","@lexical/table":"^0.12.0","@lexical/markdown":"^0.12.0","@lexical/rich-text":"^0.12.0","@lexical/selection":"^0.12.6"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","vite":"^7.3.2","husky":"^9.1.7","jscpd":"^4.0.9","react":"19.2.7","eslint":"9.39.4","parcel":"^2.14.4","rollup":"^2.80.0","globals":"15.15.0","prettier":"^3.8.3","react-dom":"19.2.7","stylelint":"^17.8.0","@eslint/js":"9.39.4","babel-jest":"^29.0.0","size-limit":"11.2.0","typescript":"5.9.3","@babel/core":"^7.29.0","lint-staged":"^16.4.0","npm-run-all":"4.1.5","@types/react":"19.2.17","ts-api-utils":"2.5.0","@commitlint/cli":"19.8.1","eslint-plugin-n":"17.24.0","@playwright/test":"1.60.0","@babel/preset-env":"^7.29.2","markdownlint-cli2":"0.18.1","@afixt/a11y-assert":"2.1.3","@babel/preset-react":"^7.22.0","eslint-plugin-jsdoc":"51.4.1","eslint-plugin-react":"7.37.5","@rollup/plugin-babel":"^6.0.0","@vitejs/plugin-react":"^5.2.0","rollup-plugin-terser":"^7.0.0","eslint-plugin-promise":"7.2.1","eslint-plugin-sonarjs":"3.0.7","eslint-plugin-unicorn":"60.0.0","rollup-plugin-postcss":"^4.0.0","@testing-library/react":"16.3.2","eslint-config-prettier":"9.1.2","eslint-plugin-import-x":"4.16.2","eslint-plugin-security":"3.0.1","jest-environment-jsdom":"^29.0.0","@rollup/plugin-commonjs":"^25.0.0","eslint-plugin-no-secrets":"2.3.3","rollup-plugin-visualizer":"5.14.0","@testing-library/jest-dom":"^6.0.0","eslint-plugin-react-hooks":"5.2.0","stylelint-config-standard":"^40.0.0","@rollup/plugin-node-resolve":"^15.0.0","@testing-library/user-event":"^14.0.0","license-checker-rseidelsohn":"4.4.2","@double-great/stylelint-a11y":"3.4.10","@size-limit/preset-small-lib":"11.2.0","@commitlint/config-conventional":"19.8.1","prettier-plugin-organize-imports":"4.3.0","rollup-plugin-peer-deps-external":"^2.2.0","stylelint-declaration-strict-value":"1.11.1"},"peerDependencies":{"react":"^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0","react-dom":"^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/lexic-a11y_1.1.3_1784737530833_0.2800866256469463","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@afixt/lexic-a11y","version":"2.0.0","keywords":["react","lexical","editor","rich-text","a11y","accessibility","i18n"],"author":{"name":"Karl Groves","email":"karlgroves@gmail.com"},"license":"MIT","_id":"@afixt/lexic-a11y@2.0.0","maintainers":[{"name":"macmilan","email":"marko.macmilan@gmail.com"},{"name":"jw1982","email":"john.watts@afixt.com"},{"name":"karlgroves","email":"karlgroves@gmail.com"}],"homepage":"https://github.com/AFixt/lexic-a11y#readme","bugs":{"url":"https://github.com/AFixt/lexic-a11y/issues"},"dist":{"shasum":"4b4532f8d5a91ea7a593f87fc35f3260aa6bccf6","tarball":"https://registry.npmjs.org/@afixt/lexic-a11y/-/lexic-a11y-2.0.0.tgz","fileCount":9,"integrity":"sha512-KQxNb8w9VltDKgtFMGskK8XQaOxvVs6kbRv7TvnCpZWf4QKnRyyhMfQzdkkP3QQKgTzUIPFrb4VHsR3Vuj+Olg==","signatures":[{"sig":"MEQCIHjilMP1NycCJRfGOpGe1nsIRoNF3Aa3Y3SVgktnrtF1AiAN274avdf2879uYZsIkACWq2cTFR/hRFY0kskJ1gCUIw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5681018},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.esm.js","engines":{"npm":">=10.0.0","node":">=20.0.0"},"gitHead":"1aa92345bfbfc1e8d52af7cee6345422181cc5c2","scripts":{"ci":"npm run check:all","lint":"eslint .","size":"size-limit","test":"jest","build":"rollup -c","check":"npm-run-all -p lint lint:css lint:md format:check types:check","dupes":"jscpd . --config .jscpd.json","links":"lychee --no-progress --max-retries 0 --timeout 10 --exclude-path node_modules --exclude-path dist --exclude-path build --exclude-path coverage '**/*.md'","start":"vite","format":"prettier --write .","example":"vite --open /examples/index.html","lint:md":"markdownlint-cli2 '**/*.md' '#node_modules' '#dist' '#build' '#coverage'","prepare":"husky","dupes:ci":"jscpd . --config .jscpd.json --threshold 5","lint:css":"stylelint 'src/**/*.css'","lint:fix":"eslint . --fix","security":"npm-run-all -p security:audit security:osv security:semgrep security:secrets security:banned-deps","test:e2e":"playwright test","check:all":"npm-run-all -s check test build test:dist dupes size license:check security:audit security:secrets security:banned-deps","test:dist":"jest --config jest.dist.config.js","build:demo":"vite build","test:watch":"jest --watch","lint:md:fix":"markdownlint-cli2 --fix '**/*.md' '#node_modules' '#dist' '#build' '#coverage'","lint:strict":"eslint . --max-warnings=0","types:check":"tsc --noEmit --strict --skipLibCheck --moduleResolution bundler --module esnext --target es2020 --jsx react-jsx src/index.d.ts","format:check":"prettier --check .","lint:css:fix":"stylelint 'src/**/*.css' --fix","preview:demo":"vite preview","security:osv":"osv-scanner --lockfile=package-lock.json","build:analyze":"ANALYZE=true rollup -c","license:check":"license-checker-rseidelsohn --production --onlyAllow 'MIT;ISC;Apache-2.0;BSD-2-Clause;BSD-3-Clause;0BSD;CC0-1.0;Unlicense;Python-2.0;WTFPL;BlueOak-1.0.0' --excludePrivatePackages --summary","license:report":"license-checker-rseidelsohn --production --csv --out reports/licenses.csv","security:audit":"npm audit --production --audit-level=high","lint:css:strict":"stylelint 'src/**/*.css' --max-warnings=0","test:e2e:headed":"playwright test --headed","security:secrets":"trufflehog git file://. --only-verified --fail","security:semgrep":"semgrep --config=p/javascript --config=p/react --config=p/owasp-top-ten --error --metrics=off","security:banned-deps":"node scripts/check-banned-deps.mjs"},"_npmUser":{"name":"karlgroves","email":"karlgroves@gmail.com"},"overrides":{"axe-core":"npm:empty-npm-package@1.0.0"},"repository":{"url":"git+https://github.com/AFixt/lexic-a11y.git","type":"git"},"size-limit":[{"name":"ESM bundle","path":"dist/index.esm.js","limit":"105 KB"},{"name":"CJS bundle","path":"dist/index.js","limit":"105 KB"}],"_npmVersion":"11.12.1","description":"A fully featured, accessible, and internationalized rich text editor built with React and Lexical","directories":{},"_nodeVersion":"24.15.0","browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"dependencies":{"i18next":"^23.0.0","lexical":"^0.12.0","@lexical/code":"0.12.6","@lexical/html":"^0.12.0","@lexical/link":"^0.12.0","@lexical/list":"^0.12.0","react-i18next":"^13.0.0","@lexical/react":"^0.12.0","@lexical/table":"^0.12.0","@lexical/markdown":"^0.12.0","@lexical/rich-text":"^0.12.0","@lexical/selection":"^0.12.6"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","vite":"^7.3.2","husky":"^9.1.7","jscpd":"^4.0.9","react":"19.2.7","eslint":"9.39.4","parcel":"^2.14.4","rollup":"^2.80.0","globals":"15.15.0","prettier":"^3.8.3","react-dom":"19.2.7","stylelint":"^17.8.0","@eslint/js":"9.39.4","babel-jest":"^29.0.0","size-limit":"11.2.0","typescript":"5.9.3","@babel/core":"^7.29.0","lint-staged":"^16.4.0","npm-run-all":"4.1.5","@types/react":"19.2.17","ts-api-utils":"2.5.0","@commitlint/cli":"19.8.1","eslint-plugin-n":"17.24.0","@playwright/test":"1.60.0","@babel/preset-env":"^7.29.2","markdownlint-cli2":"0.18.1","@afixt/a11y-assert":"2.1.3","@babel/preset-react":"^7.22.0","eslint-plugin-jsdoc":"51.4.1","eslint-plugin-react":"7.37.5","@rollup/plugin-babel":"^6.0.0","@vitejs/plugin-react":"^5.2.0","rollup-plugin-terser":"^7.0.0","eslint-plugin-promise":"7.2.1","eslint-plugin-sonarjs":"3.0.7","eslint-plugin-unicorn":"60.0.0","rollup-plugin-postcss":"^4.0.0","@testing-library/react":"16.3.2","eslint-config-prettier":"9.1.2","eslint-plugin-import-x":"4.16.2","eslint-plugin-security":"3.0.1","jest-environment-jsdom":"^29.0.0","@rollup/plugin-commonjs":"^25.0.0","eslint-plugin-no-secrets":"2.3.3","rollup-plugin-visualizer":"5.14.0","@testing-library/jest-dom":"^6.0.0","eslint-plugin-react-hooks":"5.2.0","stylelint-config-standard":"^40.0.0","@rollup/plugin-node-resolve":"^15.0.0","@testing-library/user-event":"^14.0.0","license-checker-rseidelsohn":"4.4.2","@double-great/stylelint-a11y":"3.4.10","@size-limit/preset-small-lib":"11.2.0","@commitlint/config-conventional":"19.8.1","prettier-plugin-organize-imports":"4.3.0","rollup-plugin-peer-deps-external":"^2.2.0","stylelint-declaration-strict-value":"1.11.1"},"peerDependencies":{"react":"^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0","react-dom":"^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/lexic-a11y_2.0.0_1784761585090_0.9647737227097621","host":"s3://npm-registry-packages-npm-production"}},"2.3.0":{"name":"@afixt/lexic-a11y","version":"2.3.0","description":"A fully featured, accessible, and internationalized rich text editor built with React and Lexical","main":"dist/index.js","module":"dist/index.esm.js","types":"dist/index.d.ts","scripts":{"start":"vite","build":"rollup -c","build:analyze":"ANALYZE=true rollup -c","build:demo":"vite build","preview:demo":"vite preview","test":"jest","test:watch":"jest --watch","test:dist":"jest --config jest.dist.config.js","lint":"eslint .","lint:strict":"eslint . --max-warnings=0","lint:fix":"eslint . --fix","lint:css":"stylelint 'src/**/*.css'","lint:css:strict":"stylelint 'src/**/*.css' --max-warnings=0","lint:css:fix":"stylelint 'src/**/*.css' --fix","lint:md":"markdownlint-cli2 '**/*.md' '#node_modules' '#dist' '#build' '#coverage'","lint:md:fix":"markdownlint-cli2 --fix '**/*.md' '#node_modules' '#dist' '#build' '#coverage'","types:check":"tsc --noEmit --strict --skipLibCheck --moduleResolution bundler --module esnext --target es2020 --jsx react-jsx src/index.d.ts","dupes":"jscpd . --config .jscpd.json","dupes:ci":"jscpd . --config .jscpd.json --threshold 5","format":"prettier --write .","format:check":"prettier --check .","links":"lychee --no-progress --max-retries 0 --timeout 10 --exclude-path node_modules --exclude-path dist --exclude-path build --exclude-path coverage '**/*.md'","size":"size-limit","security:audit":"npm audit --production --audit-level=high","security:osv":"osv-scanner --lockfile=package-lock.json","security:semgrep":"semgrep --config=p/javascript --config=p/react --config=p/owasp-top-ten --error --metrics=off","security:secrets":"trufflehog git file://. --only-verified --fail","security:banned-deps":"node scripts/check-banned-deps.mjs","validate:usecases":"node scripts/validate-usecases.mjs","security:action-pins":"node scripts/check-action-pins.mjs","security":"npm-run-all -p security:audit security:osv security:semgrep security:secrets security:banned-deps","license:check":"license-checker-rseidelsohn --production --onlyAllow 'MIT;ISC;Apache-2.0;BSD-2-Clause;BSD-3-Clause;0BSD;CC0-1.0;Unlicense;Python-2.0;WTFPL;BlueOak-1.0.0' --excludePrivatePackages --summary","license:report":"license-checker-rseidelsohn --production --csv --out reports/licenses.csv","check":"npm-run-all -p lint lint:css lint:md format:check types:check","check:all":"npm-run-all -s check test build test:dist dupes size license:check security:audit security:semgrep security:secrets security:banned-deps","ci":"npm run check:all","prepare":"husky","example":"vite --open /examples/index.html","test:e2e":"playwright test","test:e2e:headed":"playwright test --headed"},"keywords":["react","lexical","editor","rich-text","a11y","accessibility","i18n"],"author":{"name":"Karl Groves","email":"karlgroves@gmail.com"},"license":"MIT","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/AFixt/lexic-a11y.git"},"bugs":{"url":"https://github.com/AFixt/lexic-a11y/issues"},"homepage":"https://github.com/AFixt/lexic-a11y#readme","engines":{"node":"^22.22.2 || ^24.15.0 || >=26.0.0","npm":">=10.0.0"},"peerDependencies":{"react":"^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0","react-dom":"^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"},"overrides":{"axe-core":"npm:empty-npm-package@1.0.0"},"dependencies":{"@lexical/code":"0.12.6","@lexical/html":"^0.12.0","@lexical/link":"^0.12.0","@lexical/list":"^0.12.0","@lexical/markdown":"^0.12.0","@lexical/react":"^0.12.0","@lexical/rich-text":"^0.12.0","@lexical/selection":"^0.12.6","@lexical/table":"^0.12.0","i18next":"^23.0.0","lexical":"^0.12.0","react-i18next":"^13.0.0"},"devDependencies":{"@afixt/a11y-assert":"^2.1.3","@afixt/usecase-runner":"^2.0.1","@babel/core":"^7.29.0","@babel/preset-env":"^7.29.2","@babel/preset-react":"^7.22.0","@commitlint/cli":"19.8.1","@commitlint/config-conventional":"19.8.1","@double-great/stylelint-a11y":"3.4.10","@eslint/js":"9.39.4","@playwright/test":"1.60.0","@rollup/plugin-babel":"^6.0.0","@rollup/plugin-commonjs":"^25.0.0","@rollup/plugin-node-resolve":"^15.0.0","@size-limit/preset-small-lib":"11.2.0","@testing-library/jest-dom":"^6.0.0","@testing-library/react":"16.3.2","@testing-library/user-event":"^14.0.0","@types/react":"19.2.17","@vitejs/plugin-react":"^5.2.0","babel-jest":"^29.0.0","eslint":"9.39.4","eslint-config-prettier":"9.1.2","eslint-plugin-import-x":"4.16.2","eslint-plugin-jsdoc":"51.4.1","eslint-plugin-n":"17.24.0","eslint-plugin-no-secrets":"2.3.3","eslint-plugin-promise":"7.2.1","eslint-plugin-react":"7.37.5","eslint-plugin-react-hooks":"5.2.0","eslint-plugin-security":"3.0.1","eslint-plugin-sonarjs":"3.0.7","eslint-plugin-unicorn":"60.0.0","globals":"15.15.0","husky":"^9.1.7","jest":"^29.0.0","jest-environment-jsdom":"^29.0.0","jscpd":"^4.0.9","license-checker-rseidelsohn":"4.4.2","lint-staged":"^16.4.0","markdownlint-cli2":"0.18.1","npm-run-all":"4.1.5","prettier":"^3.8.3","prettier-plugin-organize-imports":"4.3.0","react":"19.2.7","react-dom":"19.2.7","rollup":"^2.80.0","rollup-plugin-peer-deps-external":"^2.2.0","rollup-plugin-postcss":"^4.0.0","rollup-plugin-terser":"^7.0.0","rollup-plugin-visualizer":"5.14.0","size-limit":"11.2.0","stylelint":"^17.8.0","stylelint-config-standard":"^40.0.0","stylelint-declaration-strict-value":"1.11.1","ts-api-utils":"2.5.0","typescript":"5.9.3","vite":"^7.3.5"},"size-limit":[{"name":"ESM bundle","path":"dist/index.esm.js","limit":"105 KB"},{"name":"CJS bundle","path":"dist/index.js","limit":"105 KB"}],"browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"_id":"@afixt/lexic-a11y@2.3.0","gitHead":"1ac0a4c4c80e801b0bc4a60f90d316c175af4932","_nodeVersion":"22.22.2","_npmVersion":"10.9.7","dist":{"integrity":"sha512-LmmPh2i0fVKte4yvQ2YzaOA96GU++LaQHf20se1fy/Zz8WsB716WsrdctWvoFGFznd3i2XfAKtkZsFN4XWgAfA==","shasum":"c1329c7739262b67ffe5ec725a46cf2534b02e1d","tarball":"https://registry.npmjs.org/@afixt/lexic-a11y/-/lexic-a11y-2.3.0.tgz","fileCount":9,"unpackedSize":5682280,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQD8Nis/k635GGeQ7PkKN2gdhXBVOTv04ZM9yexFFxAt6AIhAJSgG6tJsHFPlMDco/sQNslB0ZQ1cI85lfwl1SPh1EIp"}]},"_npmUser":{"name":"karlgroves","email":"karlgroves@gmail.com"},"directories":{},"maintainers":[{"name":"macmilan","email":"marko.macmilan@gmail.com"},{"name":"jw1982","email":"john.watts@afixt.com"},{"name":"karlgroves","email":"karlgroves@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/lexic-a11y_2.3.0_1787831207687_0.03465122299729351"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-25T20:10:27.234Z","modified":"2026-08-27T11:46:48.034Z","1.0.1":"2026-06-25T20:10:27.804Z","1.1.0":"2026-06-27T02:48:28.911Z","1.1.2":"2026-07-19T21:53:10.355Z","1.1.3":"2026-07-22T16:25:31.031Z","2.0.0":"2026-07-22T23:06:25.370Z","2.3.0":"2026-08-27T11:46:47.862Z"},"bugs":{"url":"https://github.com/AFixt/lexic-a11y/issues"},"author":{"name":"Karl Groves","email":"karlgroves@gmail.com"},"license":"MIT","homepage":"https://github.com/AFixt/lexic-a11y#readme","keywords":["react","lexical","editor","rich-text","a11y","accessibility","i18n"],"repository":{"type":"git","url":"git+https://github.com/AFixt/lexic-a11y.git"},"description":"A fully featured, accessible, and internationalized rich text editor built with React and Lexical","maintainers":[{"name":"macmilan","email":"marko.macmilan@gmail.com"},{"name":"jw1982","email":"john.watts@afixt.com"},{"name":"karlgroves","email":"karlgroves@gmail.com"}],"readme":"# lexic-a11y: An accessible Lexical Rich Text Editor Package\n\nAn accessible and internationalized rich text editor built with React and\nLexical. This package provides a modular editor focused on accessibility that\nsupports core formatting options. It is designed to be easily integrated into\nany React application and to serve as a reusable component for projects\nrequiring high accessibility (WCAG compliant) text editing capabilities.\n\n## Overview\n\nlexic-a11y is a self-contained, React-based editor that emphasizes\naccessibility, extensibility, and internationalization. It leverages the modern\nLexical framework by Meta to provide a headless editing experience that can be\neasily extended and customized. Designed with WCAG-compliant practices in mind,\nit provides keyboard shortcuts and accessibility features that make rich text\nediting more accessible to all users.\n\n## What It Does\n\n- Rich Text Editing: Offers essential text formatting including bold, italic,\n  underline, strikethrough, inline code, and a full range of headings (H1–H6).\n- Block Content: Blockquotes, fenced code blocks, horizontal rules, tables with\n  a real header row, and images that require alt text (or an explicit\n  \"decorative\" opt-out).\n- List Support: Create and manage ordered and unordered lists with proper\n  semantic structure.\n- Link Management: Insert and edit hyperlinks with an accessible dialog\n  interface, with URL scheme validation that rejects unsafe protocols.\n- Markdown Shortcuts: Type `#`, `>`, `-`, `1.`, `**bold**`, `` `code` ``,\n  ` ``` ` fences, and friends to format as you go; content can also be\n  serialized to Markdown.\n- Live Document Outline: Opt in with `showOutline` for a running list of the\n  document's headings, with WCAG-aligned warnings for skipped heading levels and\n  multiple H1s. It is a labelled list, so it contributes neither a heading nor a\n  landmark to the host page's structure.\n- Word and Character Count: Debounced counts surfaced in a polite live region.\n- Paste Sanitization: Pasted markup from Word or Google Docs is cleaned to\n  semantic HTML; Ctrl/Cmd+Shift+V pastes as plain text.\n- Keyboard Shortcuts: Implements a variety of keyboard shortcuts for quick\n  formatting actions (e.g., Ctrl/Cmd+B for bold, Ctrl/Cmd+Alt+1 for Heading 1)\n  and efficient navigation.\n- Documentation: Provides an overlay with available keyboard shortcuts and usage\n  tips (Ctrl/Cmd+D).\n- Internationalization (i18n): Integrated with react-i18next to allow\n  localization of toolbar labels and prompts, making it adaptable for\n  multi-language projects.\n- Accessibility: Designed with accessibility in mind, including ARIA roles,\n  keyboard navigability, and semantic output to ensure compliance with WCAG\n  standards.\n\n## Features\n\n- Core Formatting Options:\n  - Text Styling: Bold, Italic, Underline, Strikethrough, inline code.\n  - Headings: H1 through H6 with both toolbar buttons and keyboard shortcuts.\n- List Formatting:\n  - Ordered Lists: Create numbered lists with proper semantic structure.\n  - Unordered Lists: Create bullet lists with proper semantic structure.\n- Content Elements:\n  - Links: Insert and edit hyperlinks with an accessible dialog.\n  - Images: Insert by URL, or via the optional `onImageUpload` handler with a\n    drag-and-drop zone and file picker. Alt text is required before the image\n    can be inserted, unless it is explicitly marked decorative (`alt=\"\"`).\n  - Tables: Insert with a header row; exported with `scope=\"col\"`.\n  - Blockquotes, fenced code blocks, and horizontal rules.\n- Output Formats:\n  - Clean HTML (utility classes and Lexical's sizing markup stripped) or\n    Markdown, selected with the `outputFormat` prop.\n- Internationalization (i18n):\n  - Built-in support using react-i18next.\n  - Easy to add new languages and localize toolbar and prompt texts.\n- Accessibility (WCAG Compliant):\n  - ARIA roles and labels throughout the UI.\n  - Fully keyboard accessible, including a roving-tabindex toolbar.\n  - Semantic HTML output for screen readers and other assistive technologies.\n\n### Keyboard shortcuts\n\nOn macOS use <kbd>Cmd</kbd> wherever <kbd>Ctrl</kbd> is shown. The same list is\navailable in-app from the help overlay (<kbd>Ctrl</kbd>+<kbd>D</kbd>).\n\n| Shortcut             | Action                    |\n| -------------------- | ------------------------- |\n| `Ctrl+B` / `I` / `U` | Bold / Italic / Underline |\n| `Ctrl+Shift+X`       | Strikethrough             |\n| `Ctrl+E`             | Inline code               |\n| `Ctrl+Shift+E`       | Code block                |\n| `Ctrl+\\`             | Clear formatting          |\n| `Ctrl+Alt+[1–6]`     | Heading 1–6               |\n| `Ctrl+Shift+7`       | Ordered (numbered) list   |\n| `Ctrl+Shift+8`       | Unordered (bullet) list   |\n| `Ctrl+Shift+Q`       | Blockquote                |\n| `Ctrl+K`             | Insert / edit link        |\n| `Ctrl+Shift+M`       | Insert image              |\n| `Ctrl+Shift+L`       | Insert table              |\n| `Ctrl+Shift+-`       | Horizontal rule           |\n| `Ctrl+Shift+V`       | Paste as plain text       |\n| `Ctrl+D`             | Toggle the help overlay   |\n| `Escape`             | Close the open dialog     |\n\nThe toolbar is a single tab stop with arrow-key roving focus; `Home` and `End`\njump to the first and last control.\n\n## Installation\n\n### Prerequisites\n\n- Node.js — `package.json` declares `engines.node` as\n  `^22.22.2 || ^24.15.0 || >=26.0.0`, the real floor of the dev toolchain\n  (`@afixt/a11y-assert` → `@afixt/test-utils` needs ≥ 22.22.2). `.nvmrc` /\n  `.node-version` pin **22.22.2** and CI runs the current LTS (`lts/*`, Node 24)\n  plus a dedicated Node 22.22.2 floor job. With `engine-strict=true` in\n  `.npmrc`, an out-of-range Node makes `npm ci` fail hard (`EBADENGINE`), not\n  just warn. Note this floor is driven by the **test tooling**, not the shipped\n  runtime: the published bundle (`dist/`) is a browser React library and doesn't\n  itself need Node 22 — a consumer with `engine-strict` on an older Node will\n  nonetheless be refused the install, a deliberate, conservative trade-off\n  (#109).\n- npm v10+ (enforced via `engine-strict=true` in `.npmrc`)\n- React (v16.8+, v17.0.0+, or v18.0.0+ for Hooks support)\n- Homebrew (macOS/Linux) — used by the bootstrap script to install security\n  binaries (`trufflehog`, `osv-scanner`, `semgrep`, `lychee`)\n\n### Steps\n\n1. Clone the Repository:\n\n```bash\ngit clone https://github.com/AFixt/lexic-a11y.git\ncd lexic-a11y\n```\n\n1. Bootstrap (installs required Homebrew binaries and npm deps):\n\n```bash\nbash scripts/bootstrap.sh\n```\n\nOr, if you already have the security binaries installed, run the plain install:\n\n```bash\nnpm install\n```\n\n1. Build the Package:\n\nIf you plan to reuse this package in other projects, you can build it as a\nlibrary:\n\n```bash\nnpm run build\n```\n\nThis will generate a bundled version of the editor that can be imported into\nyour projects.\n\n## Usage\n\n### Integration in a React Project\n\n#### 1. Import the Editor Component\n\nIn your React application, import the main Editor component:\n\n```javascript\nimport React, { useState } from 'react';\nimport Editor from '@afixt/lexic-a11y';\nimport '@afixt/lexic-a11y/dist/styles.css'; // Import the styles\n\n// Resolve an uploaded File to a hosted URL (POST to your backend in a real app).\nasync function uploadImage(file) {\n  const url = await myBackend.upload(file);\n  return url;\n}\n\nexport default function App() {\n  const [content, setContent] = useState('');\n\n  return (\n    <div>\n      <h1>My Application with Lexical Editor</h1>\n      <Editor\n        onContentChange={setContent}\n        outputFormat=\"html\"\n        onImageUpload={uploadImage}\n        initialValue=\"<p>Pre-filled <strong>draft</strong> content.</p>\"\n        showOutline\n      />\n      <h2>Output HTML</h2>\n      <pre>{content}</pre>\n    </div>\n  );\n}\n```\n\n#### Editor props\n\n| Prop              | Type                              | Default  | Description                                                                                                                                                                                                             |\n| ----------------- | --------------------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `onContentChange` | `(content: string) => void`       | —        | Called on every edit with the serialized content, in the format chosen by `outputFormat`.                                                                                                                               |\n| `outputFormat`    | `'html' \\| 'markdown'`            | `'html'` | Format passed to `onContentChange`: cleaned HTML or Markdown. Nodes without a Markdown form (tables, images, horizontal rules) are omitted from Markdown output.                                                        |\n| `onImageUpload`   | `(file: File) => Promise<string>` | —        | Optional. When provided, the Insert Image dialog gains a drag-and-drop zone and file picker; the handler receives the chosen `File` and must resolve to the URL to embed.                                               |\n| `initialValue`    | `string`                          | —        | Optional trusted HTML used to seed the editor once, on mount (e.g. a saved draft or template). Images, tables, and code blocks are preserved. Later changes to this prop are ignored so user edits are never clobbered. |\n| `showOutline`     | `boolean`                         | `false`  | Whether to render the Document Outline panel below the editing surface. Off by default, which suits short-form embedded fields (a reply box, a ticket description). Pass `true` for long-form authoring.                |\n\n#### Upgrading\n\nComing from 1.1.x, the Document Outline panel changed in two ways that affect\nexisting consumers:\n\n- **It no longer renders by default.** It used to always render; it is now\n  opt-in. If you want it, pass `showOutline`:\n\n  ```jsx\n  <Editor onContentChange={setContent} showOutline />\n  ```\n\n- **It no longer adds a heading or a landmark to the host page.** The title is a\n  `<div>` rather than an `<h2>`, the panel's `<section>` is unnamed (so it stays\n  generic instead of becoming a `region` landmark), and the heading list is a\n  labelled `<ul>` rather than a `<nav>`. An embedded editor therefore leaves the\n  host page's heading hierarchy and landmark structure alone. Class names\n  (`.editor-outline`, `.editor-outline-title`, `.editor-outline-list`) are\n  unchanged, but CSS or queries that relied on the old elements —\n  `.editor-outline h2`, or a `nav` inside the panel — need updating.\n\n#### TypeScript\n\nThe package ships hand-maintained declarations at `dist/index.d.ts` (the source\nis JavaScript — see [ADR 0002](./docs/adr/0002-remain-on-javascript.md)). No\n`@types/...` package is needed:\n\n```typescript\nimport Editor, { ToolbarPlugin, i18n } from '@afixt/lexic-a11y';\nimport type { EditorProps, OutputFormat } from '@afixt/lexic-a11y';\n```\n\n`npm run types:check` compiles the declarations under `strict`, and\n`src/tests/public-api.test.js` fails if they drift from the library's real\nexports.\n\n#### 2. i18n Setup\n\nThe package exports its configured `i18next` instance as a **named** export\nalongside the default `Editor` export. Wrap your application with an i18n\nprovider:\n\n```javascript\nimport React from 'react';\nimport ReactDOM from 'react-dom/client';\nimport App from './App';\nimport { I18nextProvider } from 'react-i18next';\nimport { i18n } from '@afixt/lexic-a11y';\n\nconst root = ReactDOM.createRoot(document.getElementById('root'));\nroot.render(\n  <I18nextProvider i18n={i18n}>\n    <App />\n  </I18nextProvider>,\n);\n```\n\n#### 3. Styling\n\nThe CSS is included when you import the styles as shown above. This provides\nstyling for the toolbar and editor components.\n\n### Customizing the Editor\n\n- **Theme**: Lexical class names for each node type are defined in the `theme`\n  object in `src/components/Editor.js`. It is not currently exposed as a prop —\n  change it in source (or fork) to rename the classes.\n- **Custom Styling**: Customize colors, fonts, and spacing by overriding the CSS\n  classes from `dist/styles.css` (built from `src/styles/Editor.css`) to match\n  your project's design guidelines.\n\n### Extending the Editor\n\n- **Keyboard Shortcuts**: The shortcuts are registered in\n  `src/components/ToolbarPlugin.js` with a document-level `keydown` listener.\n  You can modify the key combinations or add new ones as needed. (Bold, italic,\n  and underline are deliberately left to Lexical's `RichTextPlugin` — handling\n  them again there applies the format twice.)\n- **Internationalization**: Update `src/utils/i18n.js` to add additional\n  languages or modify existing translations. Use the `useTranslation` hook\n  within any component to localize additional UI elements.\n- **Adding Features**: The editor ships with images (insert by URL or via the\n  optional `onImageUpload` handler), horizontal rules, and tables built in. To\n  add further formatting options, follow Lexical's modular architecture to\n  create and register new nodes.\n\n## Development\n\n### Running the Editor Locally\n\nTo run the editor in a development environment:\n\n1. Start the Development Server:\n\n```bash\nnpm start\n```\n\nThis launches the Vite dev server (configured in `vite.config.js`) and opens\n<http://localhost:4001> automatically.\n\n1. Making Changes:\n\n- Edit the source files in the /src directory.\n- The development server supports hot reloading, so your changes will appear\n  automatically.\n\n1. Running the Example Demo:\n\nThe repository includes a feature-tour example in `examples/` that imports the\neditor straight from `src/` (no build step required) and seeds it with sample\ncontent exercising every block type — headings, blockquote, lists, a table with\na header row, an image with alt text, inline and block code, and a horizontal\nrule. It also surfaces a \"Try this\" panel of keyboard shortcuts and Markdown\ntriggers, and the live serialized output.\n\n```bash\nnpm run example\n```\n\nThis starts the Vite dev server and opens the example at\n<http://localhost:4001/examples/index.html>. Because it imports from `src/`,\nyour edits to the source are reflected immediately with hot reloading — there is\nno stale pre-built bundle to rebuild. See\n[`examples/README.md`](examples/README.md) for details.\n\n### Try it on CodeSandbox\n\nYou can also try the editor directly on CodeSandbox without installing anything\nlocally:\n\n[![Edit lexic-a11y](https://codesandbox.io/static/img/play-codesandbox.svg)](https://codesandbox.io/p/sandbox/github/AFixt/lexic-a11y/tree/develop/sandbox)\n\nThis opens the `sandbox/` demo. Note that it is a **deliberately simplified,\nstandalone** rebuild of the editor (bold/italic/underline/strikethrough, H1–H3,\nlists) rather than the packaged component — it exists so CodeSandbox can run\nwithout building the library. For the full feature set (tables, images, code\nblocks, horizontal rules, the link dialog, and every keyboard shortcut), run\n`npm run example` locally.\n\n### End-to-end tests\n\nThe E2E suite runs the demo app in a real browser with\n[Playwright](https://playwright.dev/). A rich-text editor's correctness is\nlargely real-browser behavior (keyboard handling, selection, contenteditable\nquirks, ARIA state), which Jest unit tests cannot exercise.\n\n```bash\n# One-time: install the Playwright browser\nnpx playwright install chromium\n\n# Run the suite (starts the Vite dev server automatically)\nnpm run test:e2e\n\n# Debug with a visible browser\nnpm run test:e2e:headed\n```\n\nThe suite covers typing, formatting (toolbar and keyboard), lists, the link\ndialog, keyboard navigation, and ARIA state assertions. CI runs it on pull\nrequests via `.github/workflows/e2e.yml`.\n\n### Built-bundle smoke tests\n\n`npm test` imports from `src/`, so it cannot see a bug introduced by the build\nitself. `npm run test:dist` mounts the real `dist/` artifacts — both the ESM and\nCJS bundles — in jsdom and asserts they render:\n\n```bash\nnpm run build      # test:dist needs the artifacts\nnpm run test:dist\n```\n\nThis guards the class of regression that shipped in v1.1.2, where the bundles\nreferenced an unbound global `React` and threw `React is not defined` on mount\nwhile the source suite stayed green. `npm run check:all` runs it after `build`.\n\n### Building for Production\n\nOnce you are satisfied with your changes, build the package for production:\n\n```bash\nnpm run build\n```\n\nThe production-ready files will be output to the /dist directory.\n\n## Contributing\n\nWe welcome contributions from the community! If you'd like to contribute:\n\n- **Fork & branch:** Branch off `develop` (`feature/<issue>-<slug>`).\n- **Before pushing:** Run `npm run check:all` — this runs lint, tests, build,\n  duplication check, bundle size, license compliance, `npm audit`, and\n  trufflehog.\n- **Commit style:** [Conventional Commits](https://www.conventionalcommits.org/)\n  (enforced by commitlint via the `commit-msg` hook).\n- **Open issues:** Use the repository's issue tracker for bugs or feature\n  requests.\n\n### Available scripts\n\n| Script                         | Purpose                                        |\n| ------------------------------ | ---------------------------------------------- |\n| `npm start`                    | Start Vite dev server (demo, port 4001)        |\n| `npm run example`              | Open the feature-tour example                  |\n| `npm run build`                | Build the library (Rollup → `dist/`)           |\n| `npm run build:analyze`        | Build with bundle visualizer report            |\n| `npm test`                     | Run the Jest test suite                        |\n| `npm run test:dist`            | Smoke-test the built bundles (needs `build`)   |\n| `npm run test:e2e`             | Run the Playwright E2E suite                   |\n| `npm run lint`                 | Run ESLint                                     |\n| `npm run lint:css`             | Run Stylelint                                  |\n| `npm run lint:md`              | Run markdownlint-cli2                          |\n| `npm run types:check`          | Typecheck the published `.d.ts` under `strict` |\n| `npm run format`               | Run Prettier (write mode)                      |\n| `npm run format:check`         | Run Prettier in check mode                     |\n| `npm run dupes`                | Run jscpd duplication check                    |\n| `npm run size`                 | Enforce `size-limit` budgets                   |\n| `npm run links`                | Check markdown links with `lychee`             |\n| `npm run security`             | Run npm audit + OSV + Semgrep + trufflehog     |\n| `npm run license:check`        | Verify production dependency licenses          |\n| `npm run security:banned-deps` | Fail if a banned package resolves              |\n| `npm run check`                | Lint + stylelint + markdown + format + types   |\n| `npm run check:all`            | Full local gate (used by the `pre-push` hook)  |\n\n> **Accessibility test tooling:** `npm test` runs automated WCAG assertions via\n> [`@afixt/a11y-assert`](https://www.npmjs.com/package/@afixt/a11y-assert), a\n> first-party Afixt dev dependency. It declares `engines.node >= 22`, so run the\n> test suite on Node 22.22.2+ (the version CI uses); with `engine-strict=true`\n> an out-of-range Node fails `npm ci` hard (`EBADENGINE`), it does not merely\n> warn. It is a `devDependency` and is not part of the published package or its\n> production `license:check`.\n>\n> **`axe-core` is banned in this project**, directly and transitively. A\n> `package.json` `overrides` entry resolves it to an empty stub so it can never\n> be installed, and `npm run security:banned-deps` fails the build naming the\n> dependency that asked for it. Before adding a dependency, check it does not\n> pull in `axe-core` (`eslint-plugin-jsx-a11y`, `lighthouse`, `pa11y`,\n> `jest-axe`, and `cypress-axe` all do). Use `@afixt/a11y-assert` instead.\n\n### Architecture decisions\n\nSee [`docs/adr/`](./docs/adr/) for architectural decision records. Use\n[`docs/templates/ADR.md`](./docs/templates/ADR.md) to draft new ones.\n\n## License\n\nThis project is licensed under the MIT License. See the LICENSE file for more\ndetails.\n","readmeFilename":"README.md"}