{"_id":"@afixt/a11y-calc","_rev":"7-b64f460717532f451a3be1bce255e8fc","name":"@afixt/a11y-calc","dist-tags":{"latest":"0.2.2"},"versions":{"0.1.0":{"name":"@afixt/a11y-calc","version":"0.1.0","keywords":["react","calculator","accessibility","a11y","wcag","scientific-calculator","component"],"license":"MIT","_id":"@afixt/a11y-calc@0.1.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/a11y-calc#readme","bugs":{"url":"https://github.com/AFixt/a11y-calc/issues"},"dist":{"shasum":"061dd8c616039b4ec4d489210d26c5d2974ef2dd","tarball":"https://registry.npmjs.org/@afixt/a11y-calc/-/a11y-calc-0.1.0.tgz","fileCount":17,"integrity":"sha512-lc5AbhCKJjiAXt+Yy1MuLXYxiWKn3pneGJ0okBQ8o8Pwx4RHTLCJtBV7kfpGgACXFCRUCRfeqbXwtAujuXoaSA==","signatures":[{"sig":"MEYCIQDr6CfLdd52pI46rgv+AZjYDkatRbhVPnQCzeHIkCtUMgIhALHBtazBxi3GrzOZtFxBWlYmsVKGgk+pUnEsPOfE7Jg2","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":150508},"main":"./dist/index.cjs","type":"module","types":"./dist/src/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/src/index.d.ts","default":"./dist/index.mjs"},"require":{"types":"./dist/src/index.d.ts","default":"./dist/index.cjs"}},"./style.css":"./dist/style.css"},"gitHead":"17cb7ef45e33ec3326352006fe47b29ded8b0923","scripts":{"dev":"vite --config vite.demo.config.ts","lint":"eslint .","test":"vitest run","build":"tsc -b && vite build","preview":"vite preview --config vite.demo.config.ts","test:e2e":"npm run build:demo && playwright test","build:demo":"vite build --config vite.demo.config.ts","test:watch":"vitest","test:coverage":"vitest run --coverage","prepublishOnly":"npm run lint && npm test && npm run build"},"_npmUser":{"name":"karlgroves","email":"karlgroves@gmail.com"},"repository":{"url":"git+https://github.com/AFixt/a11y-calc.git","type":"git"},"_npmVersion":"10.2.4","description":"An accessible calculator React component with basic and scientific modes, styled after macOS Calculator.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.16.0","_hasShrinkwrap":false,"devDependencies":{"vite":"^8.0.4","jsdom":"^29.0.2","react":"^19.2.4","eslint":"^9.39.4","vitest":"^4.1.3","globals":"^17.4.0","react-dom":"^19.2.4","@eslint/js":"^9.39.4","typescript":"~6.0.2","@types/node":"^24.12.2","@types/react":"^19.2.14","vite-plugin-dts":"^4.5.4","@playwright/test":"^1.59.1","@types/react-dom":"^19.2.3","typescript-eslint":"^8.58.0","@vitest/coverage-v8":"^4.1.3","@vitejs/plugin-react":"^6.0.1","@testing-library/react":"^16.3.2","@testing-library/jest-dom":"^6.9.1","eslint-plugin-react-hooks":"^7.0.1","@testing-library/user-event":"^14.6.1","eslint-plugin-react-refresh":"^0.5.2"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/a11y-calc_0.1.0_1775595161454_0.7972814536924493","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@afixt/a11y-calc","version":"0.1.3","keywords":["react","calculator","accessibility","a11y","wcag","scientific-calculator","component"],"license":"MIT","_id":"@afixt/a11y-calc@0.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/a11y-calc#readme","bugs":{"url":"https://github.com/AFixt/a11y-calc/issues"},"dist":{"shasum":"6ce1ab3bbc8915cac0ceb50c45c2343a7f6006d6","tarball":"https://registry.npmjs.org/@afixt/a11y-calc/-/a11y-calc-0.1.3.tgz","fileCount":20,"integrity":"sha512-5koIoUi1duwNsb/33M+ClLze403ZpytnlnNmtKMeoFXN6xwWBulQ+0iimEKouClBvKveObQzExurB13nHUhyHw==","signatures":[{"sig":"MEUCIGuFE2+StyKT+Y2FB6eQjDZKHALfhbiZHxqwWeFBOG77AiEAnSRtiRmTq40ygXKdSIxpJexnjYDww2vZtRgDIWRFM2s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@afixt%2fa11y-calc@0.1.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":186344},"main":"./dist/index.cjs","type":"module","types":"./dist/src/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=22"},"exports":{".":{"import":{"types":"./dist/src/index.d.ts","default":"./dist/index.mjs"},"require":{"types":"./dist/src/index.d.ts","default":"./dist/index.cjs"}},"./style.css":"./dist/style.css"},"gitHead":"fbc562c1cf4de07cb4361865917fe8673fce7d45","scripts":{"ci":"npm run check:ci","dev":"vite --config vite.demo.config.ts","lhci":"lhci autorun","lint":"eslint . --max-warnings=0","size":"size-limit","test":"vitest run","build":"tsc -b && vite build","check":"run-p lint typecheck stylelint markdownlint format:check","dupes":"jscpd","links":"lychee --no-progress --offline 'README.md' 'docs/**/*.md'","format":"prettier --write .","prepare":"husky","preview":"vite preview --config vite.demo.config.ts","check:ci":"run-s check test build size dupes links security:audit security:osv security:semgrep security:secrets license:check","lint:fix":"eslint . --fix","security":"run-p security:audit security:osv security:semgrep security:secrets","test:e2e":"npm run build:demo && playwright test","test:zap":"echo 'Run: zap-baseline.py -t http://localhost:4173 after starting npm run preview'; exit 1","check:all":"run-s check test build size dupes links security:audit security:osv security:semgrep security:secrets security:codeql security:depcheck license:check","stylelint":"stylelint '**/*.css' --max-warnings=0","typecheck":"tsc -b --force","ai:context":"node scripts/ai-context.js","build:demo":"vite build --config vite.demo.config.ts","test:watch":"vitest","format:check":"prettier --check .","links:online":"lychee --no-progress --max-retries 1 --timeout 15 'README.md' 'docs/**/*.md'","markdownlint":"markdownlint-cli2 '**/*.md' '!node_modules' '!dist' '!coverage' '!reports' '!playwright-report' '!test-results'","security:osv":"osv-scanner --config=osv-scanner.toml --lockfile=package-lock.json","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","stylelint:fix":"stylelint '**/*.css' --fix","test:coverage":"vitest run --coverage","license:report":"mkdir -p reports && license-checker-rseidelsohn --production --csv --out reports/licenses.csv","prepublishOnly":"npm run lint && npm test && npm run build","security:audit":"npm audit --production --audit-level=high","security:codeql":"mkdir -p reports && codeql pack download codeql/javascript-queries && codeql database create ./.codeql-db --language=javascript --source-root=. --overwrite && codeql database analyze ./.codeql-db codeql/javascript-queries:codeql-suites/javascript-security-extended.qls --format=sarif-latest --output=reports/codeql.sarif","markdownlint:fix":"markdownlint-cli2 --fix '**/*.md' '!node_modules' '!dist' '!coverage' '!reports' '!playwright-report' '!test-results'","security:secrets":"trufflehog git file://. --only-verified --fail --no-update","security:semgrep":"semgrep --config=p/javascript --config=p/typescript --config=p/react --config=p/owasp-top-ten --config=p/security-audit --config=p/secrets --error --metrics=off","security:depcheck":"mkdir -p reports/dep-check && dependency-check --project \"$(node -p 'require(\"./package.json\").name')\" --scan . --format HTML --out reports/dep-check --suppression .dependency-check-suppressions.xml --exclude 'node_modules/**' --exclude 'dist/**' --exclude 'coverage/**'"},"_npmUser":{"name":"karlgroves","email":"karlgroves@gmail.com"},"overrides":{"tmp":">=0.2.6"},"repository":{"url":"git+https://github.com/AFixt/a11y-calc.git","type":"git"},"_npmVersion":"10.9.8","description":"An accessible calculator React component with basic and scientific modes, styled after macOS Calculator.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.22.3","_hasShrinkwrap":false,"devDependencies":{"vite":"^8.0.4","husky":"9.1.7","jscpd":"4.2.4","jsdom":"^29.0.2","react":"^19.2.4","eslint":"^9.39.4","vitest":"^4.1.3","globals":"^17.4.0","prettier":"3.8.3","@lhci/cli":"0.15.1","react-dom":"^19.2.4","stylelint":"17.12.0","tsc-files":"1.1.4","@eslint/js":"^9.39.4","size-limit":"12.1.0","typescript":"~6.0.2","web-vitals":"5.2.0","@types/node":"^25.9.1","lint-staged":"17.0.5","@types/react":"^19.2.14","npm-run-all2":"9.0.1","@commitlint/cli":"21.0.1","eslint-plugin-n":"18.0.1","vite-plugin-dts":"^4.5.4","@playwright/test":"^1.59.1","@types/react-dom":"^19.2.3","markdownlint-cli2":"0.22.1","typescript-eslint":"^8.58.0","@afixt/a11y-assert":"2.1.3","@vitest/coverage-v8":"^4.1.3","eslint-plugin-jsdoc":"63.0.0","eslint-plugin-react":"7.37.5","@vitejs/plugin-react":"^6.0.1","eslint-plugin-promise":"7.3.0","eslint-plugin-sonarjs":"4.0.3","eslint-plugin-unicorn":"64.0.0","@testing-library/react":"^16.3.2","eslint-config-prettier":"10.1.8","eslint-plugin-import-x":"4.16.2","eslint-plugin-jsx-a11y":"6.10.2","eslint-plugin-security":"4.0.0","eslint-plugin-no-secrets":"2.3.3","@testing-library/jest-dom":"^6.9.1","eslint-plugin-react-hooks":"^7.0.1","stylelint-config-standard":"40.0.0","@total-typescript/ts-reset":"0.6.1","@testing-library/user-event":"^14.6.1","eslint-plugin-react-refresh":"^0.5.2","license-checker-rseidelsohn":"4.4.2","@double-great/stylelint-a11y":"3.4.13","@size-limit/preset-small-lib":"12.1.0","@commitlint/config-conventional":"20.5.0","eslint-import-resolver-typescript":"4.4.4","stylelint-declaration-strict-value":"1.11.1"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/a11y-calc_0.1.3_1779994574626_0.9144250117614665","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@afixt/a11y-calc","version":"0.1.4","keywords":["react","calculator","accessibility","a11y","wcag","scientific-calculator","component"],"license":"MIT","_id":"@afixt/a11y-calc@0.1.4","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/a11y-calc#readme","bugs":{"url":"https://github.com/AFixt/a11y-calc/issues"},"dist":{"shasum":"55b44f4ad0ce3928308ec23e1cecafcd0f6f513f","tarball":"https://registry.npmjs.org/@afixt/a11y-calc/-/a11y-calc-0.1.4.tgz","fileCount":20,"integrity":"sha512-jHCvO3mFzpSQI6W90ypA+C9TfDAMUYEA5vMmiUnhG1ojk74yTSN9koAjcWH0A55qXsNc1n/pjDLYN0N9rm2Ogg==","signatures":[{"sig":"MEUCIGNFlm0PKKh7WuoP4DxgLgvdSXGwvkCz9kOf/+VkmQ3UAiEAgqZ3qcd+EkkCfFhB/yRmK3A1plXD3jRm9jhz4aGHxQY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@afixt%2fa11y-calc@0.1.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":186605},"main":"./dist/index.cjs","type":"module","types":"./dist/src/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=22"},"exports":{".":{"import":{"types":"./dist/src/index.d.ts","default":"./dist/index.mjs"},"require":{"types":"./dist/src/index.d.ts","default":"./dist/index.cjs"}},"./style.css":"./dist/style.css"},"gitHead":"8957cc897ac3922bb4d0e6e806b2445de1ca5ba1","scripts":{"ci":"npm run check:ci","dev":"vite --config vite.demo.config.ts","lhci":"lhci autorun","lint":"eslint . --max-warnings=0","size":"size-limit","test":"vitest run","build":"tsc -b && vite build","check":"run-p lint typecheck stylelint markdownlint format:check","dupes":"jscpd","links":"lychee --no-progress --offline 'README.md' 'docs/**/*.md'","format":"prettier --write .","prepare":"husky","preview":"vite preview --config vite.demo.config.ts","check:ci":"run-s check test build size dupes links security:audit security:osv security:semgrep security:secrets license:check","lint:fix":"eslint . --fix","security":"run-p security:audit security:osv security:semgrep security:secrets","test:e2e":"npm run build:demo && playwright test","test:zap":"echo 'Run: zap-baseline.py -t http://localhost:4173 after starting npm run preview'; exit 1","check:all":"run-s check test build size dupes links security:audit security:osv security:semgrep security:secrets security:codeql security:depcheck license:check","stylelint":"stylelint '**/*.css' --max-warnings=0","typecheck":"tsc -b --force","ai:context":"node scripts/ai-context.js","build:demo":"vite build --config vite.demo.config.ts","test:watch":"vitest","format:check":"prettier --check .","links:online":"lychee --no-progress --max-retries 1 --timeout 15 'README.md' 'docs/**/*.md'","markdownlint":"markdownlint-cli2 '**/*.md' '!node_modules' '!dist' '!coverage' '!reports' '!playwright-report' '!test-results'","security:osv":"osv-scanner --config=osv-scanner.toml --lockfile=package-lock.json","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","stylelint:fix":"stylelint '**/*.css' --fix","test:coverage":"vitest run --coverage","license:report":"mkdir -p reports && license-checker-rseidelsohn --production --csv --out reports/licenses.csv","prepublishOnly":"npm run lint && npm test && npm run build","security:audit":"npm audit --production --audit-level=high","security:codeql":"mkdir -p reports && codeql pack download codeql/javascript-queries && codeql database create ./.codeql-db --language=javascript --source-root=. --overwrite && codeql database analyze ./.codeql-db codeql/javascript-queries:codeql-suites/javascript-security-extended.qls --format=sarif-latest --output=reports/codeql.sarif","markdownlint:fix":"markdownlint-cli2 --fix '**/*.md' '!node_modules' '!dist' '!coverage' '!reports' '!playwright-report' '!test-results'","security:secrets":"trufflehog git file://. --only-verified --fail --no-update","security:semgrep":"semgrep --config=p/javascript --config=p/typescript --config=p/react --config=p/owasp-top-ten --config=p/security-audit --config=p/secrets --error --metrics=off","security:depcheck":"mkdir -p reports/dep-check && dependency-check --project \"$(node -p 'require(\"./package.json\").name')\" --scan . --format HTML --out reports/dep-check --suppression .dependency-check-suppressions.xml --exclude 'node_modules/**' --exclude 'dist/**' --exclude 'coverage/**'"},"_npmUser":{"name":"karlgroves","email":"karlgroves@gmail.com"},"overrides":{"tmp":">=0.2.6","markdown-it":"^14.2.0"},"repository":{"url":"git+https://github.com/AFixt/a11y-calc.git","type":"git"},"_npmVersion":"10.9.8","description":"An accessible calculator React component with basic and scientific modes, styled after macOS Calculator.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.22.3","_hasShrinkwrap":false,"devDependencies":{"vite":"^8.0.4","husky":"9.1.7","jscpd":"4.2.4","jsdom":"^29.0.2","react":"^19.2.4","eslint":"^9.39.4","vitest":"^4.1.3","globals":"^17.4.0","prettier":"3.8.3","@lhci/cli":"0.15.1","react-dom":"^19.2.4","stylelint":"17.12.0","tsc-files":"1.1.4","@eslint/js":"^9.39.4","size-limit":"12.1.0","typescript":"~6.0.2","web-vitals":"5.3.0","@types/node":"^25.9.1","lint-staged":"17.0.7","@types/react":"^19.2.14","npm-run-all2":"9.0.1","@commitlint/cli":"21.0.2","eslint-plugin-n":"18.0.1","vite-plugin-dts":"^5.0.2","@playwright/test":"^1.59.1","@types/react-dom":"^19.2.3","markdownlint-cli2":"0.22.1","typescript-eslint":"^8.58.0","@afixt/a11y-assert":"2.1.3","@vitest/coverage-v8":"^4.1.3","eslint-plugin-jsdoc":"63.0.1","eslint-plugin-react":"7.37.5","@vitejs/plugin-react":"^6.0.1","eslint-plugin-promise":"7.3.0","eslint-plugin-sonarjs":"4.0.3","eslint-plugin-unicorn":"64.0.0","@testing-library/react":"^16.3.2","eslint-config-prettier":"10.1.8","eslint-plugin-import-x":"4.16.2","eslint-plugin-jsx-a11y":"6.10.2","eslint-plugin-security":"4.0.0","eslint-plugin-no-secrets":"2.3.3","@testing-library/jest-dom":"^6.9.1","eslint-plugin-react-hooks":"^7.0.1","stylelint-config-standard":"40.0.0","@total-typescript/ts-reset":"0.6.1","@testing-library/user-event":"^14.6.1","eslint-plugin-react-refresh":"^0.5.2","license-checker-rseidelsohn":"4.4.2","@double-great/stylelint-a11y":"3.4.14","@size-limit/preset-small-lib":"12.1.0","@commitlint/config-conventional":"21.0.2","eslint-import-resolver-typescript":"4.4.5","stylelint-declaration-strict-value":"1.11.1"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/a11y-calc_0.1.4_1781626732458_0.08978345139211252","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@afixt/a11y-calc","version":"0.1.5","keywords":["react","calculator","accessibility","a11y","wcag","scientific-calculator","component"],"license":"MIT","_id":"@afixt/a11y-calc@0.1.5","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/a11y-calc#readme","bugs":{"url":"https://github.com/AFixt/a11y-calc/issues"},"dist":{"shasum":"c47bff7f12f6bb6fdcb92af54b346e2f045ea969","tarball":"https://registry.npmjs.org/@afixt/a11y-calc/-/a11y-calc-0.1.5.tgz","fileCount":20,"integrity":"sha512-tTgYR7iH5tiiKNvszZHllBrC8h6kwodfRXMWFI4ro9ZAxrY6pTU+CEo1gPbsnVqiHsqJ2r2ctEvu3QVAVZogUw==","signatures":[{"sig":"MEYCIQDo03iXnoo7QeEFgOMsFh16FPkInUd9SJa1jnndHcN15AIhAIt8yMBCUXhPOOwr1uSIKz3AnjB7GqEK2Jq9EAPP2fiz","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@afixt%2fa11y-calc@0.1.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":186119},"main":"./dist/index.cjs","type":"module","types":"./dist/src/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=22"},"exports":{".":{"import":{"types":"./dist/src/index.d.ts","default":"./dist/index.mjs"},"require":{"types":"./dist/src/index.d.ts","default":"./dist/index.cjs"}},"./style.css":"./dist/style.css"},"gitHead":"5eae59372234dfb3f9fc7879d223b1fdb929d30f","scripts":{"ci":"npm run check:ci","dev":"vite --config vite.demo.config.ts","lint":"eslint . --max-warnings=0","size":"size-limit","test":"vitest run","build":"tsc -b && vite build","check":"run-p lint typecheck stylelint markdownlint format:check","dupes":"jscpd","links":"lychee --no-progress --offline 'README.md' 'docs/**/*.md'","format":"prettier --write .","prepare":"husky","preview":"vite preview --config vite.demo.config.ts","check:ci":"run-s check test build size dupes links security:audit security:osv security:semgrep security:secrets license:check","lint:fix":"eslint . --fix","security":"run-p security:audit security:osv security:semgrep security:secrets","test:e2e":"npm run build:demo && playwright test","test:zap":"echo 'Run: zap-baseline.py -t http://localhost:4173 after starting npm run preview'; exit 1","check:all":"run-s check test build size dupes links security:audit security:osv security:semgrep security:secrets security:codeql security:depcheck license:check","stylelint":"stylelint '**/*.css' --max-warnings=0","typecheck":"tsc -b --force","ai:context":"node scripts/ai-context.js","build:demo":"vite build --config vite.demo.config.ts","test:watch":"vitest","format:check":"prettier --check .","links:online":"lychee --no-progress --max-retries 1 --timeout 15 'README.md' 'docs/**/*.md'","markdownlint":"markdownlint-cli2 '**/*.md' '!node_modules' '!dist' '!coverage' '!reports' '!playwright-report' '!test-results'","security:osv":"osv-scanner --config=osv-scanner.toml --lockfile=package-lock.json","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","stylelint:fix":"stylelint '**/*.css' --fix","test:coverage":"vitest run --coverage","license:report":"mkdir -p reports && license-checker-rseidelsohn --production --csv --out reports/licenses.csv","prepublishOnly":"npm run lint && npm test && npm run build","security:audit":"npm audit --production --audit-level=high","security:codeql":"mkdir -p reports && codeql pack download codeql/javascript-queries && codeql database create ./.codeql-db --language=javascript --source-root=. --overwrite && codeql database analyze ./.codeql-db codeql/javascript-queries:codeql-suites/javascript-security-extended.qls --format=sarif-latest --output=reports/codeql.sarif","markdownlint:fix":"markdownlint-cli2 --fix '**/*.md' '!node_modules' '!dist' '!coverage' '!reports' '!playwright-report' '!test-results'","security:secrets":"trufflehog git file://. --only-verified --fail --no-update","security:semgrep":"semgrep --config=p/javascript --config=p/typescript --config=p/react --config=p/owasp-top-ten --config=p/security-audit --config=p/secrets --error --metrics=off","security:depcheck":"mkdir -p reports/dep-check && dependency-check --project \"$(node -p 'require(\"./package.json\").name')\" --scan . --format HTML --out reports/dep-check --suppression .dependency-check-suppressions.xml --exclude 'node_modules/**' --exclude 'dist/**' --exclude 'coverage/**'"},"_npmUser":{"name":"karlgroves","email":"karlgroves@gmail.com"},"overrides":{"tmp":">=0.2.6","undici":"^7.28.0","js-yaml":"^4.3.0","markdown-it":"^14.2.0"},"repository":{"url":"git+https://github.com/AFixt/a11y-calc.git","type":"git"},"_npmVersion":"10.9.8","description":"An accessible calculator React component with basic and scientific modes, styled after macOS Calculator.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.23.1","_hasShrinkwrap":false,"devDependencies":{"vite":"^8.0.4","husky":"9.1.7","jscpd":"4.2.4","jsdom":"^29.0.2","react":"^19.2.4","eslint":"^9.39.4","vitest":"^4.1.3","globals":"^17.4.0","prettier":"3.8.3","react-dom":"^19.2.4","stylelint":"17.12.0","tsc-files":"1.1.4","@eslint/js":"^9.39.4","size-limit":"12.1.0","typescript":"~6.0.2","web-vitals":"5.3.0","@types/node":"^25.9.1","lint-staged":"17.0.7","@types/react":"^19.2.14","npm-run-all2":"9.0.1","@commitlint/cli":"21.0.2","eslint-plugin-n":"18.0.1","vite-plugin-dts":"^5.0.2","@playwright/test":"^1.59.1","@types/react-dom":"^19.2.3","markdownlint-cli2":"0.22.1","typescript-eslint":"^8.58.0","@afixt/a11y-assert":"2.1.3","@vitest/coverage-v8":"^4.1.3","eslint-plugin-jsdoc":"63.0.1","eslint-plugin-react":"7.37.5","@vitejs/plugin-react":"^6.0.1","eslint-plugin-promise":"7.3.0","eslint-plugin-sonarjs":"4.0.3","eslint-plugin-unicorn":"64.0.0","@testing-library/react":"^16.3.2","eslint-config-prettier":"10.1.8","eslint-plugin-import-x":"4.16.2","eslint-plugin-security":"4.0.0","eslint-plugin-no-secrets":"2.3.3","@testing-library/jest-dom":"^6.9.1","eslint-plugin-react-hooks":"^7.0.1","stylelint-config-standard":"40.0.0","@total-typescript/ts-reset":"0.6.1","@testing-library/user-event":"^14.6.1","eslint-plugin-react-refresh":"^0.5.2","license-checker-rseidelsohn":"4.4.2","@double-great/stylelint-a11y":"3.4.14","@size-limit/preset-small-lib":"12.1.0","@commitlint/config-conventional":"21.0.2","eslint-import-resolver-typescript":"4.4.5","stylelint-declaration-strict-value":"1.11.1"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/a11y-calc_0.1.5_1784774004410_0.5828449695183051","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@afixt/a11y-calc","version":"0.2.0","keywords":["react","calculator","accessibility","a11y","wcag","scientific-calculator","component"],"license":"MIT","_id":"@afixt/a11y-calc@0.2.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/a11y-calc#readme","bugs":{"url":"https://github.com/AFixt/a11y-calc/issues"},"dist":{"shasum":"09334e3d8a72e9a7b1d99d85a143b93dd894564a","tarball":"https://registry.npmjs.org/@afixt/a11y-calc/-/a11y-calc-0.2.0.tgz","fileCount":20,"integrity":"sha512-PZyl0OkQehNPN+heYPFmbmVSsifbp20qxSq3ZntgGY8nV24eO5sxj3Buefw4mB+NY1N1St6fOdZwMeLMf/WfHQ==","signatures":[{"sig":"MEQCIHQ+f8hAVfedcWj/9e2GYKRab4IxK7OcKXAf3dq5VLEAAiAzx2+A1hO/spjt2b5RN/U+HbwjNS0yx9PF1JENcr/95Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@afixt%2fa11y-calc@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":187106},"main":"./dist/index.cjs","type":"module","types":"./dist/src/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=22"},"exports":{".":{"import":{"types":"./dist/src/index.d.ts","default":"./dist/index.mjs"},"require":{"types":"./dist/src/index.d.ts","default":"./dist/index.cjs"}},"./style.css":"./dist/style.css"},"gitHead":"46ee14f26df964dd01c3959a4826a77221bbfa50","scripts":{"ci":"npm run check:ci","dev":"vite --config vite.demo.config.ts","lint":"eslint . --max-warnings=0","size":"size-limit","test":"vitest run","build":"tsc -b && vite build","check":"run-p lint typecheck stylelint markdownlint format:check","dupes":"jscpd","links":"lychee --no-progress --offline 'README.md' 'docs/**/*.md'","format":"prettier --write .","prepare":"husky","preview":"vite preview --config vite.demo.config.ts","check:ci":"run-s check test build size dupes links security:audit security:osv security:semgrep security:secrets license:check","lint:fix":"eslint . --fix","security":"run-p security:audit security:osv security:semgrep security:secrets","test:e2e":"npm run build:demo && playwright test","test:zap":"echo 'Run: zap-baseline.py -t http://localhost:4173 after starting npm run preview'; exit 1","check:all":"run-s check test build size dupes links security:audit security:osv security:semgrep security:secrets security:codeql security:depcheck license:check","stylelint":"stylelint '**/*.css' --max-warnings=0","typecheck":"tsc -b --force","ai:context":"node scripts/ai-context.js","build:demo":"vite build --config vite.demo.config.ts","test:watch":"vitest","format:check":"prettier --check .","links:online":"lychee --no-progress --max-retries 3 --timeout 30 'README.md' 'docs/**/*.md'","markdownlint":"markdownlint-cli2 '**/*.md' '!node_modules' '!dist' '!coverage' '!reports' '!playwright-report' '!test-results'","security:osv":"osv-scanner --config=osv-scanner.toml --lockfile=package-lock.json","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","stylelint:fix":"stylelint '**/*.css' --fix","test:coverage":"vitest run --coverage","license:report":"mkdir -p reports && license-checker-rseidelsohn --production --csv --out reports/licenses.csv","prepublishOnly":"npm run lint && npm test && npm run build","security:audit":"npm audit --production --audit-level=high","security:codeql":"mkdir -p reports && codeql pack download codeql/javascript-queries && codeql database create ./.codeql-db --language=javascript --source-root=. --overwrite && codeql database analyze ./.codeql-db codeql/javascript-queries:codeql-suites/javascript-security-extended.qls --format=sarif-latest --output=reports/codeql.sarif","markdownlint:fix":"markdownlint-cli2 --fix '**/*.md' '!node_modules' '!dist' '!coverage' '!reports' '!playwright-report' '!test-results'","security:secrets":"trufflehog git file://. --only-verified --fail --no-update","security:semgrep":"semgrep --config=p/javascript --config=p/typescript --config=p/react --config=p/owasp-top-ten --config=p/security-audit --config=p/secrets --error --metrics=off","security:depcheck":"mkdir -p reports/dep-check && dependency-check --project \"$(node -p 'require(\"./package.json\").name')\" ${NVD_API_KEY:+--nvdApiKey \"$NVD_API_KEY\"} --scan . --format HTML --out reports/dep-check --suppression .dependency-check-suppressions.xml --exclude 'node_modules/**' --exclude 'dist/**' --exclude 'coverage/**'","validate:usecases":"usecase-runner validate ./usecases --config ./usecases/usecase-runner.config.yaml"},"_npmUser":{"name":"karlgroves","email":"karlgroves@gmail.com"},"overrides":{"tmp":">=0.2.6","undici":"^7.28.0","js-yaml":"^4.3.0","markdown-it":"^14.2.0"},"repository":{"url":"git+https://github.com/AFixt/a11y-calc.git","type":"git"},"_npmVersion":"10.9.8","description":"An accessible calculator React component with basic and scientific modes, styled after macOS Calculator.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.23.2","_hasShrinkwrap":false,"devDependencies":{"vite":"^8.0.4","husky":"9.1.7","jscpd":"4.2.4","jsdom":"^29.0.2","react":"^19.2.4","eslint":"^9.39.4","vitest":"^4.1.3","globals":"^17.4.0","prettier":"3.8.3","react-dom":"^19.2.4","stylelint":"17.12.0","tsc-files":"1.1.4","@eslint/js":"^9.39.4","size-limit":"12.1.0","typescript":"~6.0.2","web-vitals":"5.3.0","@types/node":"^25.9.1","lint-staged":"17.0.7","@types/react":"^19.2.14","npm-run-all2":"9.0.1","@commitlint/cli":"21.0.2","eslint-plugin-n":"18.0.1","vite-plugin-dts":"^5.0.2","@playwright/test":"^1.59.1","@types/react-dom":"^19.2.3","markdownlint-cli2":"0.22.1","typescript-eslint":"^8.58.0","@afixt/a11y-assert":"2.1.3","@vitest/coverage-v8":"^4.1.3","eslint-plugin-jsdoc":"63.0.1","eslint-plugin-react":"7.37.5","@vitejs/plugin-react":"^6.0.1","eslint-plugin-promise":"7.3.0","eslint-plugin-sonarjs":"4.0.3","eslint-plugin-unicorn":"64.0.0","@testing-library/react":"^16.3.2","eslint-config-prettier":"10.1.8","eslint-plugin-import-x":"4.16.2","eslint-plugin-security":"4.0.0","eslint-plugin-no-secrets":"2.3.3","@testing-library/jest-dom":"^6.9.1","eslint-plugin-react-hooks":"^7.0.1","stylelint-config-standard":"40.0.0","@total-typescript/ts-reset":"0.6.1","@testing-library/user-event":"^14.6.1","eslint-plugin-react-refresh":"^0.5.2","license-checker-rseidelsohn":"4.4.2","@double-great/stylelint-a11y":"3.4.14","@size-limit/preset-small-lib":"12.1.0","@commitlint/config-conventional":"21.0.2","eslint-import-resolver-typescript":"4.4.5","stylelint-declaration-strict-value":"1.11.1"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/a11y-calc_0.2.0_1786755483674_0.5101458967791437","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@afixt/a11y-calc","version":"0.2.1","keywords":["react","calculator","accessibility","a11y","wcag","scientific-calculator","component"],"license":"MIT","_id":"@afixt/a11y-calc@0.2.1","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/a11y-calc#readme","bugs":{"url":"https://github.com/AFixt/a11y-calc/issues"},"dist":{"shasum":"3831ddd26906a7b648b4a67ce9e667d686cdb348","tarball":"https://registry.npmjs.org/@afixt/a11y-calc/-/a11y-calc-0.2.1.tgz","fileCount":20,"integrity":"sha512-qG8EmuWk4Y2nIZt5mXZRdm/wSLShBVj/dKCaQn4KcMkFM3kVBmGYAB9TDwmwu10YgV/PGBw6thOKnpRSmdQznA==","signatures":[{"sig":"MEUCIGSjzX5OBpndlNyDQz1G3FQz0TOxF9VsSnZxSpuIKBaAAiEAv4B2RWSVQUuCLPHwp6Dbb/dy7Dq402+P8MKL/2LVuBw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@afixt%2fa11y-calc@0.2.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":187155},"main":"./dist/index.cjs","type":"module","types":"./dist/src/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=22"},"exports":{".":{"import":{"types":"./dist/src/index.d.ts","default":"./dist/index.mjs"},"require":{"types":"./dist/src/index.d.ts","default":"./dist/index.cjs"}},"./style.css":"./dist/style.css"},"gitHead":"3e65ba814c16e41c45b88b16ead246e3bc84569f","scripts":{"ci":"npm run check:ci","dev":"vite --config vite.demo.config.ts","lint":"eslint . --max-warnings=0","size":"size-limit","test":"vitest run","build":"tsc -b && vite build","check":"run-p lint typecheck stylelint markdownlint format:check","dupes":"jscpd","links":"lychee --no-progress --offline 'README.md' 'docs/**/*.md'","format":"prettier --write .","prepare":"husky","preview":"vite preview --config vite.demo.config.ts","check:ci":"run-s check test build size dupes links security:audit security:osv security:semgrep security:secrets license:check","lint:fix":"eslint . --fix","security":"run-p security:audit security:osv security:semgrep security:secrets","test:e2e":"npm run build:demo && playwright test","test:zap":"echo 'Run: zap-baseline.py -t http://localhost:4173 after starting npm run preview'; exit 1","check:all":"run-s check test build size dupes links security:audit security:osv security:semgrep security:secrets security:codeql security:depcheck license:check","stylelint":"stylelint '**/*.css' --max-warnings=0","typecheck":"tsc -b --force","ai:context":"node scripts/ai-context.js","build:demo":"vite build --config vite.demo.config.ts","test:watch":"vitest","format:check":"prettier --check .","links:online":"lychee --no-progress --max-retries 3 --timeout 30 'README.md' 'docs/**/*.md'","markdownlint":"markdownlint-cli2 '**/*.md' '!node_modules' '!dist' '!coverage' '!reports' '!playwright-report' '!test-results'","security:osv":"osv-scanner --config=osv-scanner.toml --lockfile=package-lock.json","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","stylelint:fix":"stylelint '**/*.css' --fix","test:coverage":"vitest run --coverage","license:report":"mkdir -p reports && license-checker-rseidelsohn --production --csv --out reports/licenses.csv","prepublishOnly":"npm run lint && npm test && npm run build","security:audit":"npm audit --production --audit-level=high","security:codeql":"mkdir -p reports && codeql pack download codeql/javascript-queries && codeql database create ./.codeql-db --language=javascript --source-root=. --overwrite && codeql database analyze ./.codeql-db codeql/javascript-queries:codeql-suites/javascript-security-extended.qls --format=sarif-latest --output=reports/codeql.sarif","markdownlint:fix":"markdownlint-cli2 --fix '**/*.md' '!node_modules' '!dist' '!coverage' '!reports' '!playwright-report' '!test-results'","security:secrets":"trufflehog git file://. --only-verified --fail --no-update","security:semgrep":"semgrep --config=p/javascript --config=p/typescript --config=p/react --config=p/owasp-top-ten --config=p/security-audit --config=p/secrets --error --metrics=off","security:depcheck":"mkdir -p reports/dep-check && dependency-check --project \"$(node -p 'require(\"./package.json\").name')\" ${NVD_API_KEY:+--nvdApiKey \"$NVD_API_KEY\"} --scan . --format HTML --out reports/dep-check --suppression .dependency-check-suppressions.xml --exclude 'node_modules/**' --exclude 'dist/**' --exclude 'coverage/**'","validate:usecases":"usecase-runner validate ./usecases --config ./usecases/usecase-runner.config.yaml"},"_npmUser":{"name":"karlgroves","email":"karlgroves@gmail.com"},"overrides":{"tmp":">=0.2.6","undici":"^7.28.0","js-yaml":"^4.3.0","markdown-it":"^14.2.0"},"repository":{"url":"git+https://github.com/AFixt/a11y-calc.git","type":"git"},"_npmVersion":"10.9.8","description":"An accessible calculator React component with basic and scientific modes, styled after macOS Calculator.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.0.4","husky":"9.1.7","jscpd":"4.2.4","jsdom":"^29.0.2","react":"^19.2.4","eslint":"^9.39.4","vitest":"^4.1.3","globals":"^17.4.0","prettier":"3.8.3","react-dom":"^19.2.4","stylelint":"17.12.0","tsc-files":"1.1.4","@eslint/js":"^9.39.4","size-limit":"12.1.0","typescript":"~6.0.2","web-vitals":"5.3.0","@types/node":"^25.9.1","lint-staged":"17.0.7","@types/react":"^19.2.14","npm-run-all2":"9.0.1","@commitlint/cli":"21.0.2","eslint-plugin-n":"18.0.1","vite-plugin-dts":"^5.0.2","@playwright/test":"^1.59.1","@types/react-dom":"^19.2.3","markdownlint-cli2":"0.22.1","typescript-eslint":"^8.58.0","@afixt/a11y-assert":"2.1.3","@vitest/coverage-v8":"^4.1.3","eslint-plugin-jsdoc":"63.0.1","eslint-plugin-react":"7.37.5","@vitejs/plugin-react":"^6.0.1","eslint-plugin-promise":"7.3.0","eslint-plugin-sonarjs":"4.0.3","eslint-plugin-unicorn":"64.0.0","@testing-library/react":"^16.3.2","eslint-config-prettier":"10.1.8","eslint-plugin-import-x":"4.16.2","eslint-plugin-security":"4.0.0","eslint-plugin-no-secrets":"2.3.3","@testing-library/jest-dom":"^6.9.1","eslint-plugin-react-hooks":"^7.0.1","stylelint-config-standard":"40.0.0","@total-typescript/ts-reset":"0.6.1","@testing-library/user-event":"^14.6.1","eslint-plugin-react-refresh":"^0.5.2","license-checker-rseidelsohn":"4.4.2","@double-great/stylelint-a11y":"3.4.14","@size-limit/preset-small-lib":"12.1.0","@commitlint/config-conventional":"21.0.2","eslint-import-resolver-typescript":"4.4.5","stylelint-declaration-strict-value":"1.11.1"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/a11y-calc_0.2.1_1787226808016_0.4963601319259494","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@afixt/a11y-calc","version":"0.2.2","publishConfig":{"access":"public"},"type":"module","description":"An accessible calculator React component with basic and scientific modes, styled after macOS Calculator.","keywords":["react","calculator","accessibility","a11y","wcag","scientific-calculator","component"],"license":"MIT","repository":{"type":"git","url":"git+https://github.com/AFixt/a11y-calc.git"},"main":"./dist/index.cjs","module":"./dist/index.mjs","types":"./dist/src/index.d.ts","exports":{".":{"import":{"types":"./dist/src/index.d.ts","default":"./dist/index.mjs"},"require":{"types":"./dist/src/index.d.ts","default":"./dist/index.cjs"}},"./style.css":"./dist/style.css"},"sideEffects":["**/*.css"],"engines":{"node":">=22"},"scripts":{"dev":"vite --config vite.demo.config.ts","build":"tsc -b && vite build","build:demo":"vite build --config vite.demo.config.ts","typecheck":"tsc -b --force","lint":"eslint . --max-warnings=0","lint:fix":"eslint . --fix","format":"prettier --write .","format:check":"prettier --check .","stylelint":"stylelint '**/*.css' --max-warnings=0","stylelint:fix":"stylelint '**/*.css' --fix","markdownlint":"markdownlint-cli2 '**/*.md' '!node_modules' '!dist' '!coverage' '!reports' '!playwright-report' '!test-results'","markdownlint:fix":"markdownlint-cli2 --fix '**/*.md' '!node_modules' '!dist' '!coverage' '!reports' '!playwright-report' '!test-results'","preview":"vite preview --config vite.demo.config.ts","test":"vitest run","test:watch":"vitest","test:coverage":"vitest run --coverage","test:e2e":"npm run build:demo && playwright test","validate:usecases":"usecase-runner validate ./usecases --config ./usecases/usecase-runner.config.yaml","test:zap":"echo 'Run: zap-baseline.py -t http://localhost:4173 after starting npm run preview'; exit 1","size":"size-limit","ai:context":"node scripts/ai-context.js","dupes":"jscpd","links":"lychee --no-progress --offline 'README.md' 'docs/**/*.md'","links:online":"lychee --no-progress --max-retries 3 --timeout 30 'README.md' 'docs/**/*.md'","security:audit":"npm audit --production --audit-level=high","security:osv":"osv-scanner --config=osv-scanner.toml --lockfile=package-lock.json","security:semgrep":"semgrep --config=p/javascript --config=p/typescript --config=p/react --config=p/owasp-top-ten --config=p/security-audit --config=p/secrets --error --metrics=off","security:secrets":"trufflehog git file://. --only-verified --fail --no-update","security:codeql":"mkdir -p reports && codeql pack download codeql/javascript-queries && codeql database create ./.codeql-db --language=javascript --source-root=. --overwrite && codeql database analyze ./.codeql-db codeql/javascript-queries:codeql-suites/javascript-security-extended.qls --format=sarif-latest --output=reports/codeql.sarif","security:depcheck":"mkdir -p reports/dep-check && dependency-check --project \"$(node -p 'require(\"./package.json\").name')\" ${NVD_API_KEY:+--nvdApiKey \"$NVD_API_KEY\"} --scan . --format HTML --out reports/dep-check --suppression .dependency-check-suppressions.xml --exclude 'node_modules/**' --exclude 'dist/**' --exclude 'coverage/**'","security":"run-p security:audit security:osv security:semgrep security:secrets","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":"mkdir -p reports && license-checker-rseidelsohn --production --csv --out reports/licenses.csv","check":"run-p lint typecheck stylelint markdownlint format:check","check:ci":"run-s check test build size dupes links security:audit security:osv security:semgrep security:secrets license:check","check:all":"run-s check test build size dupes links security:audit security:osv security:semgrep security:secrets security:codeql security:depcheck license:check","ci":"npm run check:ci","prepare":"husky","prepublishOnly":"npm run lint && npm test && npm run build"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"overrides":{"tmp":">=0.2.6","markdown-it":"^14.2.0","undici":"^7.28.0","js-yaml":"^4.3.0","puppeteer":"25.6.0"},"devDependencies":{"@afixt/a11y-assert":"2.1.3","@commitlint/cli":"21.0.2","@commitlint/config-conventional":"21.0.2","@double-great/stylelint-a11y":"3.4.14","@eslint/js":"^9.39.4","@playwright/test":"^1.59.1","@size-limit/preset-small-lib":"12.1.0","@testing-library/jest-dom":"^6.9.1","@testing-library/react":"^16.3.2","@testing-library/user-event":"^14.6.1","@total-typescript/ts-reset":"0.6.1","@types/node":"^25.9.1","@types/react":"^19.2.14","@types/react-dom":"^19.2.3","@vitejs/plugin-react":"^6.0.1","@vitest/coverage-v8":"^4.1.3","eslint":"^9.39.4","eslint-config-prettier":"10.1.8","eslint-import-resolver-typescript":"4.4.5","eslint-plugin-import-x":"4.16.2","eslint-plugin-jsdoc":"63.0.1","eslint-plugin-n":"18.0.1","eslint-plugin-no-secrets":"2.3.3","eslint-plugin-promise":"7.3.0","eslint-plugin-react":"7.37.5","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-react-refresh":"^0.5.2","eslint-plugin-security":"4.0.0","eslint-plugin-sonarjs":"4.0.3","eslint-plugin-unicorn":"64.0.0","globals":"^17.4.0","husky":"9.1.7","jscpd":"4.2.4","jsdom":"^29.0.2","license-checker-rseidelsohn":"4.4.2","lint-staged":"17.0.7","markdownlint-cli2":"0.22.1","npm-run-all2":"9.0.1","prettier":"3.8.3","react":"^19.2.4","react-dom":"^19.2.4","size-limit":"12.1.0","stylelint":"17.12.0","stylelint-config-standard":"40.0.0","stylelint-declaration-strict-value":"1.11.1","tsc-files":"1.1.4","typescript":"~6.0.2","typescript-eslint":"^8.58.0","vite":"^8.0.4","vite-plugin-dts":"^5.0.2","vitest":"^4.1.3","web-vitals":"5.3.0"},"_id":"@afixt/a11y-calc@0.2.2","gitHead":"761157efa07882e3263ee50fcc2e1253de67a925","bugs":{"url":"https://github.com/AFixt/a11y-calc/issues"},"homepage":"https://github.com/AFixt/a11y-calc#readme","_nodeVersion":"22.23.2","_npmVersion":"10.9.8","dist":{"integrity":"sha512-xqOiiQ8esWxPqeQnyvpPQjV+eOlAvqXjAUR9zllYHc3vLzIikg24gK9+kxD2n7dwTtSR3g9EysEf1yEwQ8qn0g==","shasum":"b61b7e04875334b99cb18f2f536a950ebefa5355","tarball":"https://registry.npmjs.org/@afixt/a11y-calc/-/a11y-calc-0.2.2.tgz","fileCount":21,"unpackedSize":191680,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@afixt%2fa11y-calc@0.2.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDppGs7EytlgFPpe7z6LK3Ygxn+cuWiGW3tWqMsDGoKNAIgGdLATk+mWW32/5ug6BJhI10hBaJ3L37hBn+mHvjuqZE="}]},"_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/a11y-calc_0.2.2_1787249820067_0.6660113007867485"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-07T20:52:41.371Z","modified":"2026-08-20T18:17:00.688Z","0.1.0":"2026-04-07T20:52:41.683Z","0.1.3":"2026-05-28T18:56:14.812Z","0.1.4":"2026-06-16T16:18:52.603Z","0.1.5":"2026-07-23T02:33:24.606Z","0.2.0":"2026-08-15T00:58:03.832Z","0.2.1":"2026-08-20T11:53:28.132Z","0.2.2":"2026-08-20T18:17:00.223Z"},"bugs":{"url":"https://github.com/AFixt/a11y-calc/issues"},"license":"MIT","homepage":"https://github.com/AFixt/a11y-calc#readme","keywords":["react","calculator","accessibility","a11y","wcag","scientific-calculator","component"],"repository":{"type":"git","url":"git+https://github.com/AFixt/a11y-calc.git"},"description":"An accessible calculator React component with basic and scientific modes, styled after macOS Calculator.","maintainers":[{"name":"macmilan","email":"marko.macmilan@gmail.com"},{"name":"jw1982","email":"john.watts@afixt.com"},{"name":"karlgroves","email":"karlgroves@gmail.com"}],"readme":"# @afixt/a11y-calc\n\nAn accessible calculator React component styled after the macOS built-in\ncalculator, with basic and scientific modes. Built with accessibility as the\nprimary design constraint.\n\n## Features\n\n- **Basic mode** — standard four-function calculator (add, subtract, multiply,\n  divide, percent, sign toggle)\n- **Scientific mode** — trigonometric, logarithmic, exponential, power, root,\n  and factorial functions, parentheses, constants (π, e), degree/radian toggle,\n  and a \"2nd\" function key\n- **Fully accessible** — screen reader announcements, keyboard support, ARIA\n  attributes, high-contrast and reduced-motion support\n- **Themeable** — all colors and sizes exposed as CSS custom properties and an\n  optional `theme` prop\n\n## Installation\n\n```bash\nnpm install @afixt/a11y-calc\n```\n\n## Usage\n\n```tsx\nimport { Calculator } from '@afixt/a11y-calc';\nimport '@afixt/a11y-calc/style.css';\n\n// Basic usage\n<Calculator />\n\n// Start in scientific mode\n<Calculator initialMode=\"scientific\" />\n\n// Custom theme\n<Calculator theme={{\n  'calc-bg': '#1a1a2e',\n  'btn-operator-bg': '#e94560',\n  'btn-number-bg': '#16213e',\n  'btn-number-text': '#eee',\n  'display-bg': '#0f3460',\n  'display-text': '#ffffff',\n}} />\n```\n\n### Props\n\n| Prop          | Type                      | Default   | Description                         |\n| ------------- | ------------------------- | --------- | ----------------------------------- |\n| `initialMode` | `'basic' \\| 'scientific'` | `'basic'` | Which mode the calculator starts in |\n| `theme`       | `CalculatorTheme`         | —         | Partial theme override object       |\n\n## Theming\n\nEvery visual property is exposed as a CSS custom property. You can override them\nglobally in CSS or per-instance via the `theme` prop.\n\n### CSS Custom Properties\n\n| Property                      | Default (dark) | Description                             |\n| ----------------------------- | -------------- | --------------------------------------- |\n| `--calc-bg`                   | `#2a2a2a`      | Calculator body background              |\n| `--calc-radius`               | `12px`         | Border radius of the calculator         |\n| `--calc-width`                | `320px`        | Width in basic mode                     |\n| `--calc-width-scientific`     | `720px`        | Width in scientific mode                |\n| `--display-bg`                | `#1c1c1c`      | Display area background                 |\n| `--display-text`              | `#ffffff`      | Display text color                      |\n| `--display-font-size`         | `3rem`         | Display number size                     |\n| `--btn-size`                  | `70px`         | Minimum button height                   |\n| `--btn-font-size`             | `1.5rem`       | Button text size                        |\n| `--btn-number-bg`             | `#505050`      | Number button background                |\n| `--btn-number-text`           | `#ffffff`      | Number button text                      |\n| `--btn-number-hover`          | `#6a6a6a`      | Number button hover                     |\n| `--btn-function-bg`           | `#a5a5a5`      | Function button (AC, %, +/-) background |\n| `--btn-function-text`         | `#000000`      | Function button text                    |\n| `--btn-operator-bg`           | `#f09a36`      | Operator button background              |\n| `--btn-operator-text`         | `#ffffff`      | Operator button text                    |\n| `--btn-operator-hover`        | `#f5b04e`      | Operator button hover                   |\n| `--btn-operator-pressed-bg`   | `#ffffff`      | Active operator background              |\n| `--btn-operator-pressed-text` | `#f09a36`      | Active operator text                    |\n| `--btn-scientific-bg`         | `#3a3a3a`      | Scientific button background            |\n| `--btn-scientific-text`       | `#ffffff`      | Scientific button text                  |\n| `--focus-ring-color`          | `#58a6ff`      | Focus indicator color                   |\n| `--focus-ring-width`          | `3px`          | Focus indicator width                   |\n\n#### Example: global CSS override\n\n```css\n.calculator {\n  --calc-bg: #1a1a2e;\n  --btn-operator-bg: #e94560;\n  --btn-number-bg: #16213e;\n}\n```\n\nThe calculator also responds to `prefers-color-scheme: light`,\n`prefers-contrast: more`, and `prefers-reduced-motion: reduce` media queries\nautomatically.\n\n## Accessibility\n\n### Conformance\n\nThe `<Calculator>` component targets **WCAG 2.2 AA**. Accessibility is verified\nat three layers:\n\n1. `@afixt/a11y-assert` via Vitest against the rendered component\n2. `@afixt/a11y-assert` via Playwright against the running demo\n3. A dedicated `accessibility` GitHub Actions workflow on every PR\n\nSee [ADR 0009](docs/adr/0009-a11y-layering-and-docs.md) for the layering\nrationale. Known limitations are tracked as issues labeled `a11y`.\n\n### Semantic HTML\n\n- All buttons are native `<button type=\"button\">` elements\n- The display uses the `<output>` element\n- The calculator container uses `role=\"application\"` with\n  `aria-roledescription=\"calculator\"` to allow keyboard passthrough in screen\n  readers\n\n### ARIA Attributes\n\n- Every symbolic button has an explicit `aria-label` (e.g., `÷` is labeled\n  \"Divide\", `√x` is \"Square root\")\n- Active operator buttons have `aria-pressed=\"true\"`\n- A live region (`aria-live=\"polite\"`) announces every action in natural\n  language:\n  - Digit press: `\"5\"`\n  - Operator: `\"plus\"`\n  - Equals: `\"5 plus 3 equals 8\"`\n  - Scientific: `\"square root of 9 equals 3\"`\n  - Error: `\"Error, cannot divide by zero\"`\n  - Clear: `\"All cleared, 0\"`\n\n### Keyboard Support\n\n| Key             | Action                        |\n| --------------- | ----------------------------- |\n| `0`–`9`         | Input digit                   |\n| `.`             | Decimal point                 |\n| `+` `-` `*` `/` | Operators                     |\n| `Enter` or `=`  | Equals                        |\n| `Escape`        | Clear all                     |\n| `Backspace`     | Delete last digit             |\n| `%`             | Percent                       |\n| `^`             | Power (scientific mode)       |\n| `(` `)`         | Parentheses (scientific mode) |\n\n### Visual Accessibility\n\n- Minimum 44px touch targets on all calculator buttons\n- Visible focus indicators (never suppressed)\n- Light/dark mode support (`prefers-color-scheme`)\n- High contrast support (`prefers-contrast: more`)\n- Reduced motion support (`prefers-reduced-motion`)\n- Font sizes use `rem` units\n\n## Scientific Mode Functions\n\n| Button       | Aria Label                                      | Function                          |\n| ------------ | ----------------------------------------------- | --------------------------------- |\n| sin / asin   | Sine / Arc sine                                 | Trigonometric sine and inverse    |\n| cos / acos   | Cosine / Arc cosine                             | Trigonometric cosine and inverse  |\n| tan / atan   | Tangent / Arc tangent                           | Trigonometric tangent and inverse |\n| sinh / asinh | Hyperbolic sine / Inverse hyperbolic sine       | Hyperbolic functions              |\n| cosh / acosh | Hyperbolic cosine / Inverse hyperbolic cosine   | Hyperbolic functions              |\n| tanh / atanh | Hyperbolic tangent / Inverse hyperbolic tangent | Hyperbolic functions              |\n| ln / log₁₀   | Natural log / Log base 10                       | Logarithms                        |\n| x² / x³      | x squared / x cubed                             | Powers                            |\n| xⁿ           | x to the power of n                             | Arbitrary power                   |\n| eˣ / 10ˣ     | e to the power / 10 to the power                | Exponentials                      |\n| √x / ∛x      | Square root / Cube root                         | Roots                             |\n| 1/x          | Reciprocal                                      | Reciprocal                        |\n| x!           | Factorial                                       | Factorial                         |\n| π            | Pi                                              | 3.14159...                        |\n| e            | Euler's number e                                | 2.71828...                        |\n| Rad/Deg      | Switch angle mode                               | Toggle radians/degrees            |\n| 2nd          | Second function                                 | Toggles alternate functions       |\n\n## Development\n\n### First-time setup\n\n```bash\ngit clone https://github.com/AFixt/a11y-calc.git\ncd a11y-calc\nbash scripts/bootstrap.sh    # installs every external scanner used by the hooks\nnpm ci\n```\n\nThe bootstrap script installs `trufflehog`, `lychee`, `semgrep`, `osv-scanner`,\n`codeql`, `dependency-check`, and `zap` via Homebrew on macOS (with Linux/WSL\nrelease-binary hints for the rest). First run of `dependency-check` seeds the\nNVD mirror (~1 GB, 20–40 min — faster with an NVD API key). To use a key,\n[request one from NVD](https://nvd.nist.gov/developers/request-an-api-key) and\nexport it as `NVD_API_KEY` (e.g. in your shell profile);\n`npm run security:depcheck` picks it up automatically and updates drop from ~an\nhour to a couple of minutes.\n\n### Scripts\n\n```bash\nnpm run dev            # Start demo dev server (vite)\nnpm run build          # Type-check and build library (dist/)\nnpm run build:demo     # Build the demo app (dist-demo/)\nnpm run preview        # Serve the built demo\nnpm run lint           # ESLint\nnpm run typecheck      # tsc --noEmit across all project references\nnpm test               # Unit tests (vitest)\nnpm run test:watch     # Tests in watch mode\nnpm run test:coverage  # Tests with coverage report\nnpm run test:e2e       # Build demo + run Playwright E2E tests\nnpm run size           # size-limit budgets\nnpm run ai:context     # Print project summary (for AI sessions / new contribs)\n```\n\n### Gates\n\n- `npm run check` — fast: lint + typecheck + stylelint + markdownlint + format\n  check\n- `npm run check:ci` — CI target: adds tests, build, size, dupes, links, fast\n  security scanners, license allowlist\n- `npm run check:all` — pre-push: full gate including CodeQL and OWASP\n  Dependency-Check\n\n`npm run check:all` runs automatically on `git push` via Husky.\n\n## Contributing\n\n1. Run `bash scripts/bootstrap.sh` and `npm ci`.\n2. Create a branch, commit with\n   [Conventional Commits](https://www.conventionalcommits.org/) (enforced by\n   `commitlint` on commit-msg).\n3. Husky's `pre-commit` runs `lint-staged` + type check on staged files\n   - TruffleHog secret scan (see ADR 0012). `pre-push` runs the full\n     `check:all`.\n4. Open a PR targeting `main`. CI runs `check:ci`, the a11y and performance\n   workflows, the security workflow (OWASP ZAP baseline), and — when Markdown\n   changes — the lychee online link check. CodeQL and OWASP Dependency-Check run\n   locally on `pre-push` (`check:all`), not in CI (see ADR 0015 and ADR 0003).\n   There are no scheduled workflows (see ADR 0015).\n5. Non-obvious engineering decisions get an ADR in [`docs/adr/`](docs/adr/) —\n   see [`docs/templates/adr-template.md`](docs/templates/adr-template.md).\n\n## Tech Stack\n\n- [React](https://react.dev/) + [TypeScript](https://www.typescriptlang.org/)\n- [Vite](https://vite.dev/) for bundling\n- [Vitest](https://vitest.dev/) +\n  [Testing Library](https://testing-library.com/) for unit tests\n- [Playwright](https://playwright.dev/) for E2E tests\n\n## License\n\nMIT\n","readmeFilename":"README.md"}