{"_id":"@aarongustafson/form-validation-list","_rev":"8-5b475ca074917e48c9eb0354e3c895e1","name":"@aarongustafson/form-validation-list","dist-tags":{"latest":"2.3.0"},"versions":{"0.0.1":{"name":"@aarongustafson/form-validation-list","version":"0.0.1","keywords":["html","custom element","web component"],"author":{"url":"https://www.aaron-gustafson.com/","name":"Aaron Gustafson","email":"aaron@easy-designs.net"},"license":"MIT","_id":"@aarongustafson/form-validation-list@0.0.1","maintainers":[{"name":"aarongustafson","email":"aaron@easy-designs.net"}],"homepage":"https://github.com/aarongustafson/form-validation-list#readme","bugs":{"url":"https://github.com/aarongustafson/form-validation-list/issues"},"dist":{"shasum":"3ce5b74500987bdc48f50d8ca4bf384a76c0d3c7","tarball":"https://registry.npmjs.org/@aarongustafson/form-validation-list/-/form-validation-list-0.0.1.tgz","fileCount":7,"integrity":"sha512-W/zfkVk0yveLtM9/K8ZVTavAk44krvG/WwKzfQF2bfSNBPG+YuGs90QDQh1mdqs53/wJgxKGrxO/KTb222LQ5g==","signatures":[{"sig":"MEUCIAwgmL6WjHU+HdTzRvMwfrDMIwg40Zpb6WSEHypB0040AiEApHZ6Bv0Ez6Di6igc03ucvCNdWqJ+MWDOVhBUpHpGaGI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":30144},"main":"index.js","type":"module","module":"form-validation-list.js","engines":{"node":">=14.0.0"},"exports":{".":{"import":"./index.js"},"./define.js":{"import":"./define.js"},"./custom-elements.json":"./custom-elements.json","./form-validation-list.js":{"import":"./form-validation-list.js"}},"gitHead":"60799eefec7e030a1b31261235d62e7a157acc54","scripts":{"lint":"npm run lint:eslint && npm run lint:prettier","test":"vitest","setup":"node scripts/setup.js","format":"npm run format:eslint && npm run format:prettier","test:ui":"vitest --ui","test:run":"vitest run","lint:eslint":"eslint .","format:eslint":"eslint . --fix","lint:prettier":"prettier \"**/*.js\" --check --ignore-path .gitignore","test:coverage":"vitest run --coverage","format:prettier":"prettier \"**/*.js\" --write --ignore-path .gitignore"},"_npmUser":{"name":"aarongustafson","email":"aaron@easy-designs.net"},"repository":{"url":"git+https://github.com/aarongustafson/form-validation-list.git","type":"git"},"_npmVersion":"11.6.2","description":"A web component comprising a list of validation rules for a field.","directories":{},"_nodeVersion":"24.11.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"customElements":"custom-elements.json","devDependencies":{"eslint":"^9.39.1","vitest":"^4.0.10","prettier":"^3.6.2","happy-dom":"^20.0.10","@vitest/ui":"^4.0.10","@vitest/coverage-v8":"^4.0.10","@testing-library/dom":"^10.4.1","@open-wc/eslint-config":"^13.0.0","eslint-config-prettier":"^10.1.8","@testing-library/user-event":"^14.6.1"},"_npmOperationalInternal":{"tmp":"tmp/form-validation-list_0.0.1_1764914367659_0.8510682539933307","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"@aarongustafson/form-validation-list","version":"1.0.0","keywords":["html","custom element","web component"],"author":{"url":"https://www.aaron-gustafson.com/","name":"Aaron Gustafson","email":"aaron@easy-designs.net"},"license":"MIT","_id":"@aarongustafson/form-validation-list@1.0.0","maintainers":[{"name":"aarongustafson","email":"aaron@easy-designs.net"}],"homepage":"https://github.com/aarongustafson/form-validation-list#readme","bugs":{"url":"https://github.com/aarongustafson/form-validation-list/issues"},"dist":{"shasum":"667b6836b52530befd59516ada8ade05d05de476","tarball":"https://registry.npmjs.org/@aarongustafson/form-validation-list/-/form-validation-list-1.0.0.tgz","fileCount":7,"integrity":"sha512-zCKrKWv0g9NmD1UQmT7tr55NHs0hFCwUZl8sQfgxXOxdIOZIdgzRz1XCqBBAE6DridsxA/yxcsNS3PfOZVZfvA==","signatures":[{"sig":"MEQCIH+GH/A6sVcR0KV1kWlvIgHvBhM++sbg3/nkjh7nagNvAiBizm8+B+0BHUd3vye02RgJjERPvDx9k70wmRPEakrmEg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aarongustafson%2fform-validation-list@1.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":30144},"main":"index.js","type":"module","module":"form-validation-list.js","engines":{"node":">=14.0.0"},"exports":{".":{"import":"./index.js"},"./define.js":{"import":"./define.js"},"./custom-elements.json":"./custom-elements.json","./form-validation-list.js":{"import":"./form-validation-list.js"}},"gitHead":"b79b3946654470f7f209674afeff2e73fb2c5964","scripts":{"lint":"npm run lint:eslint && npm run lint:prettier","test":"vitest","setup":"node scripts/setup.js","format":"npm run format:eslint && npm run format:prettier","test:ui":"vitest --ui","test:run":"vitest run","lint:eslint":"eslint .","format:eslint":"eslint . --fix","lint:prettier":"prettier \"**/*.js\" --check --ignore-path .gitignore","test:coverage":"vitest run --coverage","format:prettier":"prettier \"**/*.js\" --write --ignore-path .gitignore"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e104540c-6bbc-4677-b5ed-54691d03dad7"}},"repository":{"url":"git+https://github.com/aarongustafson/form-validation-list.git","type":"git"},"_npmVersion":"11.6.4","description":"A web component comprising a list of validation rules for a field.","directories":{},"_nodeVersion":"20.19.6","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"customElements":"custom-elements.json","devDependencies":{"eslint":"^9.39.1","vitest":"^4.0.10","prettier":"^3.6.2","happy-dom":"^20.0.10","@vitest/ui":"^4.0.10","@vitest/coverage-v8":"^4.0.10","@testing-library/dom":"^10.4.1","@open-wc/eslint-config":"^13.0.0","eslint-config-prettier":"^10.1.8","@testing-library/user-event":"^14.6.1"},"_npmOperationalInternal":{"tmp":"tmp/form-validation-list_1.0.0_1764914471129_0.2655998069161307","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@aarongustafson/form-validation-list","version":"1.0.1","keywords":["html","custom element","web component"],"author":{"url":"https://www.aaron-gustafson.com/","name":"Aaron Gustafson","email":"aaron@easy-designs.net"},"license":"MIT","_id":"@aarongustafson/form-validation-list@1.0.1","maintainers":[{"name":"aarongustafson","email":"aaron@easy-designs.net"}],"homepage":"https://github.com/aarongustafson/form-validation-list#readme","bugs":{"url":"https://github.com/aarongustafson/form-validation-list/issues"},"dist":{"shasum":"cece3765b5f5fa753878027ccf220f6611e530ce","tarball":"https://registry.npmjs.org/@aarongustafson/form-validation-list/-/form-validation-list-1.0.1.tgz","fileCount":7,"integrity":"sha512-Rvbi9QCGZo0emUXS0Hn2SO1L9tQD9JwxDNVrWy4C5if3wWCW93CyFVPFDv1thpLGRjHQpLLc1YUKWmIeVT5AEA==","signatures":[{"sig":"MEUCIQCWKY7FgcpoEj2n9KzPWIUIb3BAtg8svjl+0vF20WY2GwIgDVaueyPisz9y6mQe9n04y0fenGFvgyqkT13bR//+rpk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aarongustafson%2fform-validation-list@1.0.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":30144},"main":"index.js","type":"module","module":"form-validation-list.js","engines":{"node":">=14.0.0"},"exports":{".":{"import":"./index.js"},"./define.js":{"import":"./define.js"},"./custom-elements.json":"./custom-elements.json","./form-validation-list.js":{"import":"./form-validation-list.js"}},"gitHead":"116965f2909a9bd3f580cddf009bfda540a087fa","scripts":{"lint":"npm run lint:eslint && npm run lint:prettier","test":"vitest","setup":"node scripts/setup.js","format":"npm run format:eslint && npm run format:prettier","test:ui":"vitest --ui","test:run":"vitest run","lint:eslint":"eslint .","format:eslint":"eslint . --fix","lint:prettier":"prettier \"**/*.js\" --check --ignore-path .gitignore","test:coverage":"vitest run --coverage","format:prettier":"prettier \"**/*.js\" --write --ignore-path .gitignore"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e104540c-6bbc-4677-b5ed-54691d03dad7"}},"repository":{"url":"git+https://github.com/aarongustafson/form-validation-list.git","type":"git"},"_npmVersion":"11.6.4","description":"A web component comprising a list of validation rules for a field.","directories":{},"_nodeVersion":"20.19.6","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"customElements":"custom-elements.json","devDependencies":{"eslint":"^9.39.1","vitest":"^4.0.10","prettier":"^3.6.2","happy-dom":"^20.0.10","@vitest/ui":"^4.0.10","@vitest/coverage-v8":"^4.0.10","@testing-library/dom":"^10.4.1","@open-wc/eslint-config":"^13.0.0","eslint-config-prettier":"^10.1.8","@testing-library/user-event":"^14.6.1"},"_npmOperationalInternal":{"tmp":"tmp/form-validation-list_1.0.1_1764954686515_0.4982824309251521","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@aarongustafson/form-validation-list","version":"2.0.0","keywords":["html","custom element","web component"],"author":{"url":"https://www.aaron-gustafson.com/","name":"Aaron Gustafson","email":"aaron@easy-designs.net"},"license":"MIT","_id":"@aarongustafson/form-validation-list@2.0.0","maintainers":[{"name":"aarongustafson","email":"aaron@easy-designs.net"}],"homepage":"https://github.com/aarongustafson/form-validation-list#readme","bugs":{"url":"https://github.com/aarongustafson/form-validation-list/issues"},"dist":{"shasum":"52be9464352961e1c1c6f1b730a0752fc4b44282","tarball":"https://registry.npmjs.org/@aarongustafson/form-validation-list/-/form-validation-list-2.0.0.tgz","fileCount":7,"integrity":"sha512-RIRtU1HkXNdOYMvQ4PFMTjaxgrpI4RIfrruQjTZmH1bKldEpDGDaN7JS0cNwffTkUEdiBzS1CKgCeDZxHXsRsQ==","signatures":[{"sig":"MEUCIQD/ssQFBtH/zH6mYqq9JaATxLF0qU6J2UnfohdFH7WYYwIgPwuiWkF4MP6STPOWtuAzoU0tzEhtHClQTZWktqjqrrQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aarongustafson%2fform-validation-list@2.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":30700},"main":"index.js","type":"module","module":"form-validation-list.js","engines":{"node":">=14.0.0"},"exports":{".":{"import":"./index.js"},"./define.js":{"import":"./define.js"},"./custom-elements.json":"./custom-elements.json","./form-validation-list.js":{"import":"./form-validation-list.js"}},"gitHead":"daed8a3876185fab0b210939f0bef8d17c8c7892","scripts":{"lint":"npm run lint:eslint && npm run lint:prettier","test":"vitest","setup":"node scripts/setup.js","format":"npm run format:eslint && npm run format:prettier","test:ui":"vitest --ui","test:run":"vitest run","lint:eslint":"eslint .","format:eslint":"eslint . --fix","lint:prettier":"prettier \"**/*.js\" --check --ignore-path .gitignore","test:coverage":"vitest run --coverage","format:prettier":"prettier \"**/*.js\" --write --ignore-path .gitignore"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e104540c-6bbc-4677-b5ed-54691d03dad7"}},"repository":{"url":"git+https://github.com/aarongustafson/form-validation-list.git","type":"git"},"_npmVersion":"11.6.4","description":"A web component comprising a list of validation rules for a field.","directories":{},"_nodeVersion":"20.19.6","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"customElements":"custom-elements.json","devDependencies":{"eslint":"^9.39.1","vitest":"^4.0.10","prettier":"^3.6.2","happy-dom":"^20.0.10","@vitest/ui":"^4.0.10","@vitest/coverage-v8":"^4.0.10","@testing-library/dom":"^10.4.1","@open-wc/eslint-config":"^13.0.0","eslint-config-prettier":"^10.1.8","@testing-library/user-event":"^14.6.1"},"_npmOperationalInternal":{"tmp":"tmp/form-validation-list_2.0.0_1765213344037_0.7659906421830038","host":"s3://npm-registry-packages-npm-production"}},"2.0.1":{"name":"@aarongustafson/form-validation-list","version":"2.0.1","keywords":["html","custom element","web component"],"author":{"url":"https://www.aaron-gustafson.com/","name":"Aaron Gustafson","email":"aaron@easy-designs.net"},"license":"MIT","_id":"@aarongustafson/form-validation-list@2.0.1","maintainers":[{"name":"aarongustafson","email":"aaron@easy-designs.net"}],"homepage":"https://github.com/aarongustafson/form-validation-list#readme","bugs":{"url":"https://github.com/aarongustafson/form-validation-list/issues"},"dist":{"shasum":"ca1c96bbbad5e7a1bff55161ecadcb5bc225b758","tarball":"https://registry.npmjs.org/@aarongustafson/form-validation-list/-/form-validation-list-2.0.1.tgz","fileCount":7,"integrity":"sha512-avtpvmOXwa5CL9inXots4VQIfuP6DrtncHYdhWrZEU3AdWQs5uMGbW4B5sNKYQHqhRmVtKG3P5K4oIIO/qrVaw==","signatures":[{"sig":"MEUCIAcKQF9TAydXA/dnKt6kATG6eEY5qxd7DYNL+PtI6HyxAiEA1IlFeNU7jl9EFgLSCwuwopKCc/OsqbQ75V7ePxk6xPM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aarongustafson%2fform-validation-list@2.0.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":31033},"main":"index.js","type":"module","module":"form-validation-list.js","engines":{"node":">=14.0.0"},"exports":{".":{"import":"./index.js"},"./define.js":{"import":"./define.js"},"./custom-elements.json":"./custom-elements.json","./form-validation-list.js":{"import":"./form-validation-list.js"}},"gitHead":"b64497e379c9dbacf26cda892667b488d7876aea","scripts":{"lint":"npm run lint:eslint && npm run lint:prettier","test":"vitest","setup":"node scripts/setup.js","format":"npm run format:eslint && npm run format:prettier","test:ui":"vitest --ui","version":"node scripts/update-demo-versions.js && git add demo/esm.html","test:run":"vitest run","lint:eslint":"eslint .","format:eslint":"eslint . --fix","lint:prettier":"prettier \"**/*.js\" --check --ignore-path .gitignore","test:coverage":"vitest run --coverage","format:prettier":"prettier \"**/*.js\" --write --ignore-path .gitignore"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e104540c-6bbc-4677-b5ed-54691d03dad7"}},"repository":{"url":"git+https://github.com/aarongustafson/form-validation-list.git","type":"git"},"_npmVersion":"11.6.4","description":"A web component comprising a list of validation rules for a field.","directories":{},"_nodeVersion":"20.19.6","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"customElements":"custom-elements.json","devDependencies":{"eslint":"^9.39.1","vitest":"^4.0.10","prettier":"^3.6.2","happy-dom":"^20.0.10","@vitest/ui":"^4.0.10","@vitest/coverage-v8":"^4.0.10","@testing-library/dom":"^10.4.1","@open-wc/eslint-config":"^13.0.0","eslint-config-prettier":"^10.1.8","@testing-library/user-event":"^14.6.1"},"_npmOperationalInternal":{"tmp":"tmp/form-validation-list_2.0.1_1765307337222_0.052533732608172734","host":"s3://npm-registry-packages-npm-production"}},"2.1.0":{"name":"@aarongustafson/form-validation-list","version":"2.1.0","keywords":["html","custom element","web component"],"author":{"url":"https://www.aaron-gustafson.com/","name":"Aaron Gustafson","email":"aaron@easy-designs.net"},"license":"MIT","_id":"@aarongustafson/form-validation-list@2.1.0","maintainers":[{"name":"aarongustafson","email":"aaron@easy-designs.net"}],"homepage":"https://github.com/aarongustafson/form-validation-list#readme","bugs":{"url":"https://github.com/aarongustafson/form-validation-list/issues"},"dist":{"shasum":"f4d05ae9c5231392b9195a67fde4e78150d80280","tarball":"https://registry.npmjs.org/@aarongustafson/form-validation-list/-/form-validation-list-2.1.0.tgz","fileCount":8,"integrity":"sha512-zR7CJMiGBz0b3tmNlYSQByz6C5d6pdeI77rAKPXjXt4CIaxUB1loXiPYrsSgJjc+5Owf75WfXH0QBZ2SsVjExQ==","signatures":[{"sig":"MEUCIQCamvFro2LQoWhli6FI6SoH8eFL8B1ChyCB+gn7eVLZKAIgMMqnTOma+DezEdWc1/laS07luJr/xeZ5wBMX0U11L+M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aarongustafson%2fform-validation-list@2.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":38830},"main":"index.js","type":"module","types":"form-validation-list.d.ts","module":"form-validation-list.js","engines":{"node":">=14.0.0"},"exports":{".":{"types":"./form-validation-list.d.ts","import":"./index.js"},"./define.js":{"import":"./define.js"},"./custom-elements.json":"./custom-elements.json","./form-validation-list.js":{"types":"./form-validation-list.d.ts","import":"./form-validation-list.js"}},"gitHead":"5914d822cbad1daa29cbdbbb3503cdedce9cb21e","scripts":{"lint":"npm run lint:eslint && npm run lint:prettier","test":"vitest","setup":"node scripts/setup.js","format":"npm run format:eslint && npm run format:prettier","test:ui":"vitest --ui","version":"node scripts/update-demo-versions.js && git add demo/esm.html","test:run":"vitest run","lint:eslint":"eslint .","postversion":"git push --follow-tags","format:eslint":"eslint . --fix","lint:prettier":"prettier \"**/*.js\" --check --ignore-path .gitignore","test:coverage":"vitest run --coverage","format:prettier":"prettier \"**/*.js\" --write --ignore-path .gitignore"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e104540c-6bbc-4677-b5ed-54691d03dad7"}},"repository":{"url":"git+https://github.com/aarongustafson/form-validation-list.git","type":"git"},"_npmVersion":"11.7.0","description":"A web component comprising a list of validation rules for a field.","directories":{},"_nodeVersion":"20.19.6","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"customElements":"custom-elements.json","devDependencies":{"eslint":"^9.39.1","vitest":"^4.0.10","prettier":"^3.6.2","happy-dom":"^20.0.10","@vitest/ui":"^4.0.10","@vitest/coverage-v8":"^4.0.10","@testing-library/dom":"^10.4.1","@open-wc/eslint-config":"^13.0.0","eslint-config-prettier":"^10.1.8","@testing-library/user-event":"^14.6.1"},"_npmOperationalInternal":{"tmp":"tmp/form-validation-list_2.1.0_1765686407358_0.029868955990313584","host":"s3://npm-registry-packages-npm-production"}},"2.2.0":{"name":"@aarongustafson/form-validation-list","version":"2.2.0","keywords":["html","custom element","web component"],"author":{"url":"https://www.aaron-gustafson.com/","name":"Aaron Gustafson","email":"aaron@easy-designs.net"},"license":"MIT","_id":"@aarongustafson/form-validation-list@2.2.0","maintainers":[{"name":"aarongustafson","email":"aaron@easy-designs.net"}],"homepage":"https://github.com/aarongustafson/form-validation-list#readme","bugs":{"url":"https://github.com/aarongustafson/form-validation-list/issues"},"dist":{"shasum":"84ece0d48e49ef6f466191156605db6d3643a707","tarball":"https://registry.npmjs.org/@aarongustafson/form-validation-list/-/form-validation-list-2.2.0.tgz","fileCount":8,"integrity":"sha512-qSJhuRX/fieWdcErpRuCae3R0EwvElcRw12PTmzmFzDSUBFxREVDqHcMN6W5l+6BTUDBBqfiUvks5lF8ob2O3Q==","signatures":[{"sig":"MEYCIQC1EPMYHiHNX3bA+cCf/CicKz2Ze9AUp68dEblY/SU7nwIhAOVpLgGIM+q7f1d06GVc8HxmAhID1kMhKXpwBE3fuk+Y","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aarongustafson%2fform-validation-list@2.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":38864},"main":"index.js","type":"module","types":"form-validation-list.d.ts","module":"form-validation-list.js","engines":{"node":">=20"},"exports":{".":{"types":"./form-validation-list.d.ts","import":"./index.js"},"./define.js":{"import":"./define.js"},"./custom-elements.json":"./custom-elements.json","./form-validation-list.js":{"types":"./form-validation-list.d.ts","import":"./form-validation-list.js"}},"gitHead":"eebedf16530531ca8cae9b17d13215e68f43bce5","scripts":{"lint":"npm run lint:eslint && npm run lint:prettier","test":"vitest","setup":"node scripts/setup.js","format":"npm run format:eslint && npm run format:prettier","test:ui":"vitest --ui","version":"node scripts/update-demo-versions.js && git add demo/esm.html","test:run":"vitest run","lint:eslint":"eslint .","postversion":"git push --follow-tags","format:eslint":"eslint . --fix","lint:prettier":"prettier \"**/*.js\" --check --ignore-path .gitignore","test:coverage":"vitest run --coverage","format:prettier":"prettier \"**/*.js\" --write --ignore-path .gitignore"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e104540c-6bbc-4677-b5ed-54691d03dad7"}},"repository":{"url":"git+https://github.com/aarongustafson/form-validation-list.git","type":"git"},"_npmVersion":"11.12.1","description":"A web component comprising a list of validation rules for a field.","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"customElements":"custom-elements.json","devDependencies":{"eslint":"^9.39.1","vitest":"^4.0.10","prettier":"^3.6.2","happy-dom":"^20.0.10","@vitest/ui":"^4.0.10","@vitest/coverage-v8":"^4.0.10","@testing-library/dom":"^10.4.1","@open-wc/eslint-config":"^13.0.0","eslint-config-prettier":"^10.1.8","@testing-library/user-event":"^14.6.1"},"_npmOperationalInternal":{"tmp":"tmp/form-validation-list_2.2.0_1776889762417_0.937362205647065","host":"s3://npm-registry-packages-npm-production"}},"2.3.0":{"name":"@aarongustafson/form-validation-list","version":"2.3.0","description":"A web component comprising a list of validation rules for a field.","keywords":["html","custom element","web component"],"author":{"name":"Aaron Gustafson","email":"aaron@easy-designs.net","url":"https://www.aaron-gustafson.com/"},"license":"MIT","homepage":"https://github.com/aarongustafson/form-validation-list#readme","repository":{"type":"git","url":"git+https://github.com/aarongustafson/form-validation-list.git"},"bugs":{"url":"https://github.com/aarongustafson/form-validation-list/issues"},"type":"module","main":"index.js","module":"form-validation-list.js","types":"form-validation-list.d.ts","customElements":"custom-elements.json","exports":{".":{"import":"./index.js","types":"./form-validation-list.d.ts"},"./form-validation-list.js":{"import":"./form-validation-list.js","types":"./form-validation-list.d.ts"},"./define.js":{"import":"./define.js"},"./custom-elements.json":"./custom-elements.json"},"engines":{"node":">=20"},"scripts":{"setup":"node scripts/setup.js","test":"vitest","test:ui":"vitest --ui","test:run":"vitest run","test:coverage":"vitest run --coverage","lint":"npm run lint:eslint && npm run lint:prettier","format":"npm run format:eslint && npm run format:prettier","lint:eslint":"eslint .","format:eslint":"eslint . --fix","lint:prettier":"prettier \"**/*.js\" --check --ignore-path .gitignore","format:prettier":"prettier \"**/*.js\" --write --ignore-path .gitignore","version":"node scripts/update-demo-versions.js && git add demo/esm.html","postversion":"git push --follow-tags"},"devDependencies":{"@open-wc/eslint-config":"^13.0.0","@testing-library/dom":"^10.4.1","@testing-library/user-event":"^14.6.1","@vitest/coverage-v8":"^4.0.10","@vitest/ui":"^4.0.10","eslint":"^9.39.1","eslint-config-prettier":"^10.1.8","happy-dom":"^20.0.10","prettier":"^3.6.2","vitest":"^4.0.10"},"publishConfig":{"access":"public"},"gitHead":"b3fc6bd2ebd34a751b3a634642d6353ac4912c2d","_id":"@aarongustafson/form-validation-list@2.3.0","_nodeVersion":"20.20.2","_npmVersion":"11.13.0","dist":{"integrity":"sha512-zkAlYe5jJegE5qQjosFpkovJagNy/Zwt6aqhDMg3paIccwpB9onNrzSHly8/RBfMnf3lk9xkOxCYPeLO3IJR7w==","shasum":"8f7e8a05495df2140e99aac534918387b32b5b7a","tarball":"https://registry.npmjs.org/@aarongustafson/form-validation-list/-/form-validation-list-2.3.0.tgz","fileCount":8,"unpackedSize":60600,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aarongustafson%2fform-validation-list@2.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQD1dZbC+dcpal9V0NOpDp90J8PA2tkoTN90AqW4jltCagIgXkG6b7BQ8WdqIK2RA5u8crhsu/cRZ2YvNpypy82WYlo="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e104540c-6bbc-4677-b5ed-54691d03dad7"}},"directories":{},"maintainers":[{"name":"aarongustafson","email":"aaron@easy-designs.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/form-validation-list_2.3.0_1777347620359_0.1312630771209733"},"_hasShrinkwrap":false}},"time":{"created":"2025-12-05T05:59:27.559Z","modified":"2026-04-28T03:40:20.765Z","0.0.1":"2025-12-05T05:59:27.823Z","1.0.0":"2025-12-05T06:01:11.321Z","1.0.1":"2025-12-05T17:11:26.687Z","2.0.0":"2025-12-08T17:02:24.181Z","2.0.1":"2025-12-09T19:08:57.393Z","2.1.0":"2025-12-14T04:26:47.546Z","2.2.0":"2026-04-22T20:29:22.593Z","2.3.0":"2026-04-28T03:40:20.495Z"},"bugs":{"url":"https://github.com/aarongustafson/form-validation-list/issues"},"author":{"name":"Aaron Gustafson","email":"aaron@easy-designs.net","url":"https://www.aaron-gustafson.com/"},"license":"MIT","homepage":"https://github.com/aarongustafson/form-validation-list#readme","keywords":["html","custom element","web component"],"repository":{"type":"git","url":"git+https://github.com/aarongustafson/form-validation-list.git"},"description":"A web component comprising a list of validation rules for a field.","maintainers":[{"name":"aarongustafson","email":"aaron@easy-designs.net"}],"readme":"# form-validation-list Web Component\n\n[![npm version](https://img.shields.io/npm/v/@aarongustafson/form-validation-list.svg)](https://www.npmjs.com/package/@aarongustafson/form-validation-list) [![Build Status](https://img.shields.io/github/actions/workflow/status/aarongustafson/form-validation-list/ci.yml?branch=main)](https://github.com/aarongustafson/form-validation-list/actions)\n\nA web component that provides visual validation feedback for form fields using a list of validation rules. As users type, each rule is checked against a regular expression pattern and displays a checkmark (✓) or X (✗) to indicate whether the requirement is met. The component integrates with the browser's built-in form validation and is fully accessible.\n\n## Features\n\n- **Light DOM** - Uses light DOM for better accessibility and SEO\n- **Pattern-based validation** - Define rules using regular expressions\n- **Accessible** - Single live summary while typing, with full criteria state restored on blur\n- **Customizable** - Configure classes, icons, and localized rule state strings\n- **Browser validation integration** - Participates in native form validation using `setCustomValidity`\n- **Event-driven** - Fires custom events for programmatic interaction\n- **Visual feedback** - Animated cascade effect when validating rules\n\n## TypeScript & Framework Support\n\n- Ships with bundled `.d.ts` definitions so editors and TypeScript builds understand `FormValidationListElement` and `defineFormValidationList`.\n- `for`, `trigger-event`, `input-throttle`, `each-delay`, the icon/state text attributes, and every class-related attribute reflect between properties and attributes, keeping reactive frameworks and declarative templates in sync with DOM state.\n- An internal `_upgradeProperty` helper captures properties that were assigned before the element upgraded, ensuring early property sets (common in SSR or JSX) are not lost.\n- The `HTMLElementTagNameMap` is augmented so `document.querySelector('form-validation-list')` is strongly typed in TS/JSX projects.\n\n## Demo\n\n[Live Demo](https://aarongustafson.github.io/form-validation-list/demo/) ([Source](./demo/index.html))\n\nAdditional examples:\n- [ESM CDN (esm.sh)](https://aarongustafson.github.io/form-validation-list/demo/esm.html) ([Source](./demo/esm.html))\n- [unpkg CDN](https://aarongustafson.github.io/form-validation-list/demo/unpkg.html) ([Source](./demo/unpkg.html))\n\n## Installation\n\n```bash\nnpm install @aarongustafson/form-validation-list\n```\n\n## Usage\n\n### Option 1: Import the class and define manually\n\nImport the class and define the custom element with your preferred tag name:\n\n```javascript\nimport { FormValidationListElement } from '@aarongustafson/form-validation-list';\n\ncustomElements.define('my-custom-name', FormValidationListElement);\n```\n\n### Option 2: Auto-define the custom element (browser environments only)\n\nUse the guarded definition helper to register the element when `customElements` is available:\n\n```javascript\nimport '@aarongustafson/form-validation-list/define.js';\n```\n\nIf you prefer to control when the element is registered, call the helper directly:\n\n```javascript\nimport { defineFormValidationList } from '@aarongustafson/form-validation-list/define.js';\n\ndefineFormValidationList();\n```\n\nYou can also include the guarded script from HTML:\n\n```html\n<script src=\"./node_modules/@aarongustafson/form-validation-list/define.js\" type=\"module\"></script>\n```\n\n### Basic Example\n\n```html\n<form>\n  <label for=\"username\">Username:</label>\n  <input type=\"text\" id=\"username\" name=\"username\" required>\n\n  <form-validation-list for=\"username\">\n    <ul>\n      <li data-pattern=\"[A-Z]+\">At least one capital letter</li>\n      <li data-pattern=\"[a-z]+\">At least one lowercase letter</li>\n      <li data-pattern=\"[\\d]+\">At least one number</li>\n    </ul>\n  </form-validation-list>\n\n  <button type=\"submit\">Submit</button>\n</form>\n```\n\n## How It Works\n\n### Validation Flow\n\n1. Add a `for` attribute to the `<form-validation-list>` element with the ID of the input field you want to validate\n2. Inside the element, add list items (or any elements) with a `data-pattern` attribute containing a regular expression\n3. Matched rules get the `validation-matched` class and show a checkmark; unmatched rules get `validation-unmatched` and show an X\n4. Once the field has a value, each rule also includes visually hidden localized state text such as \"Criteria met\" or \"Criteria not met\"\n5. The component uses `setCustomValidity()` to participate in the browser's form validation\n\n### Trigger Event Behavior\n\n#### With `trigger-event=\"input\"` (default)\n\n- Validation runs on input events with a configurable delay (see `input-throttle`)\n- While typing, the field temporarily stops referencing the full criteria list via `aria-describedby` to avoid duplicate announcements\n- A single polite live region announces the localized summary using the `announcement` template\n- When the user blurs (leaves) the field:\n  - Any pending validation timeouts are cleared to prevent cascading updates\n  - The field's `aria-describedby` is restored after a brief delay so returning to the field reads the full criteria state again\n\n#### With `trigger-event=\"blur\"`\n\n- Validation runs immediately (without throttling) when the user leaves the field\n- The `input-throttle` attribute is ignored\n- No aria-describedby suspension occurs, so the full criteria list remains visible while typing\n- No live region announcements occur during typing\n\n## Attributes\n\n| Attribute | Type | Default | Description |\n|-----------|------|---------|-------------|\n| `for` | `string` | `\"\"` | **Required.** The ID of the input field to validate |\n| `trigger-event` | `string` | `\"input\"` | When to trigger validation: `\"input\"` (with throttle) or `\"blur\"` (immediate, no announcements while typing) |\n| `input-throttle` | `number` | `250` | Delay in milliseconds before running validation for `input` events. Only used when `trigger-event=\"input\"`. Set to `0` to disable throttling. |\n| `each-delay` | `number` | `150` | Delay in milliseconds between each rule being classified (creates cascade effect) |\n| `field-invalid-class` | `string` | `\"validation-invalid\"` | Class to apply to the field when invalid |\n| `field-valid-class` | `string` | `\"validation-valid\"` | Class to apply to the field when valid |\n| `rule-unmatched-class` | `string` | `\"validation-unmatched\"` | Class to apply to unmatched rules |\n| `rule-matched-class` | `string` | `\"validation-matched\"` | Class to apply to matched rules |\n| `rule-matched-icon` | `string` | `\"✓\"` | Override the matched icon glyph for this instance |\n| `rule-unmatched-icon` | `string` | `\"✗\"` | Override the unmatched icon glyph for this instance |\n| `rule-matched-alt` | `string` | `\"Criteria met\"` | Localized hidden state text inserted for matched rules once the field has a value |\n| `rule-unmatched-alt` | `string` | `\"Criteria not met\"` | Localized hidden state text inserted for unmatched rules once the field has a value |\n| `announcement` | `string` | `\"Criteria met: {matched} of {total}\"` | Live region summary while typing. Use `{matched}` and `{total}` placeholders. |\n| `validation-message` | `string` | `\"Please match all validation requirements ({matched} of {total})\"` | Custom validation message template. Use `{matched}` and `{total}` as placeholders for internationalization |\n\n### Example with Custom Attributes\n\n```html\n<form-validation-list\n  for=\"password\"\n  trigger-event=\"input\"\n  input-throttle=\"0\"\n  rule-matched-alt=\"Requirement met\"\n  rule-unmatched-alt=\"Requirement not met\"\n  announcement=\"{matched} of {total} requirements met\"\n  each-delay=\"100\"\n  field-valid-class=\"is-valid\"\n  field-invalid-class=\"is-invalid\">\n  <ul>\n    <li data-pattern=\".{8,}\">At least 8 characters</li>\n    <li data-pattern=\"[A-Z]+\">At least one uppercase letter</li>\n    <li data-pattern=\"[\\d]+\">At least one number</li>\n  </ul>\n</form-validation-list>\n```\n\n## Generated Markup\n\nThe component automatically enhances your markup with additional elements and IDs:\n\n**Your HTML:**\n\n```html\n<form-validation-list for=\"password\">\n  <ul>\n    <li data-pattern=\".{8,}\">At least 8 characters</li>\n  </ul>\n</form-validation-list>\n```\n\n**Generated DOM (simplified):**\n\n```html\n<form-validation-list for=\"password\">\n  <ul id=\"form-validation-list-abc123xyz\">\n    <li data-pattern=\".{8,}\" class=\"validation-unmatched\" aria-atomic=\"true\">\n      <span class=\"form-validation-list-rule-icon\" aria-hidden=\"true\"></span>\n      <span class=\"form-validation-list-rule-state\">Criteria not met </span>\n      At least 8 characters\n    </li>\n  </ul>\n  <span aria-live=\"polite\" aria-atomic=\"true\" class=\"form-validation-list-live-region\"></span>\n</form-validation-list>\n```\n\n**What gets added:**\n\n- **List ID**: A unique ID is assigned to your `<ul>` or `<ol>` element and linked to the input via `aria-describedby`\n- **Rule icon span**: A `<span class=\"form-validation-list-rule-icon\">` is prepended to each rule showing ✓ or ✗\n  - `aria-hidden=\"true\"` prevents screen readers from announcing the icon\n  - Content controlled via the `rule-matched-icon` and `rule-unmatched-icon` attributes or the `--rule-matched-icon` and `--rule-unmatched-icon` CSS properties\n- **Rule state span**: A `<span class=\"form-validation-list-rule-state\">` is inserted after the icon with visually hidden state text\n  - Hidden with `clip: rect(0 0 0 0)` and `position: absolute`\n  - Contains localized state text (default: “Criteria met ” or “Criteria not met ”, configurable via `rule-matched-alt` and `rule-unmatched-alt` attributes)\n  - Only populated when the field has a value (`.has-value` class on the component)\n- **Live region**: A `<span class=\"form-validation-list-live-region\">` with `aria-live=\"polite\"` is added as a sibling to your list\n  - Only updated while typing with `trigger-event=\"input\"`\n  - Cleared on blur and during programmatic validation\n\n\n## Validation Rules\n\nRules are defined using the `data-pattern` attribute on any element inside the `<form-validation-list>`. The value should be a valid regular expression pattern.\n\n### Example Patterns\n\n```html\n<form-validation-list for=\"password\">\n  <ul>\n    <!-- Length requirements -->\n    <li data-pattern=\".{8,}\">At least 8 characters</li>\n    <li data-pattern=\".{8,32}\">Between 8 and 32 characters</li>\n\n    <!-- Character type requirements -->\n    <li data-pattern=\"[A-Z]+\">At least one uppercase letter</li>\n    <li data-pattern=\"[a-z]+\">At least one lowercase letter</li>\n    <li data-pattern=\"[\\d]+\">At least one number</li>\n    <li data-pattern=\"[!@#$%^&*]+\">At least one special character</li>\n\n    <!-- Format requirements -->\n    <li data-pattern=\".+@.+\\..+\">Valid email format</li>\n    <li data-pattern=\"^[a-zA-Z0-9]+$\">Only letters and numbers</li>\n  </ul>\n</form-validation-list>\n```\n\n## Events\n\nThe component fires a custom event when validation completes:\n\n| Event | Description | Detail |\n|-------|-------------|--------|\n| `form-validation-list:validated` | Fired after validation completes | `{ isValid, matchedRules, totalRules, field }` |\n\n### Example Event Handling\n\n```javascript\nconst validationList = document.querySelector('form-validation-list');\n\nvalidationList.addEventListener('form-validation-list:validated', (event) => {\n  const { isValid, matchedRules, totalRules, field } = event.detail;\n  console.log(`Matched ${matchedRules} of ${totalRules} rules`);\n  console.log(`Field is ${isValid ? 'valid' : 'invalid'}`);\n});\n```\n\n## JavaScript API\n\n### Methods\n\n#### `validate()`\n\nManually trigger validation and return the current validation state.\n\n```javascript\nconst validationList = document.querySelector('form-validation-list');\nconst isValid = validationList.validate();\nconsole.log('Is valid:', isValid);\n```\n\n### Properties\n\n#### `isValid` (getter)\n\nReturns the current validation state as a boolean.\n\n```javascript\nconst validationList = document.querySelector('form-validation-list');\nconsole.log('Current state:', validationList.isValid);\n```\n\n## CSS Custom Properties\n\n| Property | Default | Description |\n|----------|---------|-------------|\n| `--rule-matched-icon` | `\"✓\"` | Content for the matched state icon. Legacy alias: `--validation-icon-matched` |\n| `--rule-unmatched-icon` | `\"✗\"` | Content for the unmatched state icon. Legacy alias: `--validation-icon-unmatched` |\n| `--rule-icon-size` | `1em` | Size of the validation icons. Legacy alias: `--validation-icon-size` |\n| `--rule-matched-color` | `green` | Color for matched rules. Legacy alias: `--validation-matched-color` |\n| `--rule-unmatched-color` | `red` | Color for unmatched rules. Legacy alias: `--validation-unmatched-color` |\n\n### Example Custom Styling\n\n```css\nform-validation-list {\n  --rule-matched-icon: \"✅\";\n  --rule-unmatched-icon: \"❌\";\n  --rule-icon-size: 1.2em;\n  --rule-matched-color: #28a745;\n  --rule-unmatched-color: #dc3545;\n}\n\nform-validation-list ul {\n  list-style: none;\n  padding-left: 0;\n}\n\nform-validation-list li {\n  padding: 0.5rem 0;\n  transition: all 0.3s ease;\n}\n```\n\n## Internationalization\n\nThe component exposes separate templates for browser validation messages, live typing announcements, and per-rule hidden state text:\n\n- `validation-message` supports `{matched}` and `{total}` placeholders for native form validation.\n- `announcement` supports `{matched}` and `{total}` placeholders for the live region summary while typing.\n- `rule-matched-alt` and `rule-unmatched-alt` provide localized rule state text when the field is revisited.\n\n```html\n<!-- Spanish -->\n<form-validation-list\n  for=\"contrasena\"\n  announcement=\"{matched} de {total} criterios cumplidos\"\n  rule-matched-alt=\"Criterio cumplido\"\n  rule-unmatched-alt=\"Criterio pendiente\"\n  validation-message=\"Por favor, cumple todos los requisitos ({matched} de {total})\">\n  <ul>\n    <li data-pattern=\"[A-Z]+\">Al menos una letra mayúscula</li>\n    <li data-pattern=\"[a-z]+\">Al menos una letra minúscula</li>\n    <li data-pattern=\"[\\d]+\">Al menos un número</li>\n  </ul>\n</form-validation-list>\n\n<!-- French -->\n<form-validation-list\n  for=\"mot-de-passe\"\n  announcement=\"{matched} critères satisfaits sur {total}\"\n  rule-matched-alt=\"Critère satisfait\"\n  rule-unmatched-alt=\"Critère non satisfait\"\n  validation-message=\"Veuillez satisfaire à toutes les exigences ({matched} sur {total})\">\n  <ul>\n    <li data-pattern=\"[A-Z]+\">Au moins une lettre majuscule</li>\n    <li data-pattern=\"[a-z]+\">Au moins une lettre minuscule</li>\n    <li data-pattern=\"[\\d]+\">Au moins un chiffre</li>\n  </ul>\n</form-validation-list>\n```\n\nThe message template uses `{matched}` and `{total}` as placeholders that will be replaced with the current count of matched rules and total rules.\n\n## Accessibility\n\nThe component is built with accessibility in mind:\n\n- **Native List Semantics**: The component preserves the semantics of your existing `ul`/`li` markup\n- **Smart Live Region**: A dedicated polite, atomic live region announces the localized summary only while the user types with `trigger-event=\"input\"`, keeping screen reader chatter minimal\n- **ARIA Described-by Management**: The validation list is automatically associated with the input field via `aria-describedby`. With `trigger-event=\"input\"`, the list is temporarily suspended while typing to avoid duplicate announcements, then restored on blur. With `trigger-event=\"blur\"`, the list remains visible at all times.\n- **Timeout Cleanup**: Pending validation timeouts are cleared on blur to prevent cascading updates after focus leaves the field\n- **Localized Rule State**: Each rule gets visually hidden state text in the DOM once the field has a value, which works better with translation tooling than CSS-only alternative text\n- **Existing Descriptions**: If the field already has an `aria-describedby` attribute, the component preserves existing values and appends its own ID\n\n### Screen Reader Experience\n\n#### With `trigger-event=\"input\"` (recommended for complex validation)\n\nWhen a user focuses on the input field, screen readers announce the field label followed by the validation requirements. While the user types:\n- The full validation list is temporarily hidden from the screen reader via aria-describedby suspension\n- A concise live announcement summarizes progress using the `announcement` template (e.g., \"Criteria met: 2 of 3\")\n- This prevents overwhelming screen reader users with repetitive rule announcements on every keystroke\n\nOn blur (when leaving the field):\n- Pending validations are cancelled to prevent stale updates\n- The field's `aria-describedby` is restored after a brief delay\n- Returning to the field will announce the final criteria state\n\n#### With `trigger-event=\"blur\"` (for simple or expensive validation)\n\n- The full validation requirements remain visible via `aria-describedby` at all times\n- Validation only occurs when leaving the field\n- Validation happens immediately without throttling\n- Screen readers will read the full criteria only once on focus, then again on return if changes occurred\n\n## Browser Validation Integration\n\nThe component participates in the browser's native form validation using the `setCustomValidity()` API:\n\n- When all rules are matched, the custom validity is cleared (`setCustomValidity('')`)\n- When any rule is unmatched, a custom validity message is set\n- This prevents form submission until all validation rules are met\n- Works seamlessly with the `:valid` and `:invalid` CSS pseudo-classes\n- Compatible with the Constraint Validation API\n\n```javascript\nconst form = document.querySelector('form');\nconst field = document.getElementById('username');\n\nform.addEventListener('submit', (e) => {\n  if (!form.checkValidity()) {\n    e.preventDefault();\n    console.log('Validation failed:', field.validationMessage);\n  }\n});\n```\n\n## Browser Support\n\nThis component uses modern web standards:\n- Custom Elements v1\n- ES Modules\n- CSS Custom Properties\n\nFor older browsers, you may need polyfills.\n\n## Migrating from jQuery Easy Validation Rules\n\nIf you're migrating from the jQuery version:\n\n| jQuery Version | Web Component Version |\n|----------------|----------------------|\n| `data-validation-rules=\"id\"` | `for=\"id\"` |\n| `data-validation-rules-rule=\"pattern\"` | `data-pattern=\"pattern\"` |\n| `trigger_event: \"keyup\"` | `trigger-event=\"input\"` |\n| `each_delay: 150` | `each-delay=\"150\"` |\n| `field_invalid_class: \"class\"` | `field-invalid-class=\"class\"` |\n| `field_valid_class: \"class\"` | `field-valid-class=\"class\"` |\n| `rule_unmatched_class: \"class\"` | `rule-unmatched-class=\"class\"` |\n| `rule_matched_class: \"class\"` | `rule-matched-class=\"class\"` |\n\n## Development\n\n```bash\n# Install dependencies\nnpm install\n\n# Run tests\nnpm test\n\n# Run tests with coverage\nnpm run test:coverage\n\n# Lint code\nnpm run lint\n\n# Format code\nnpm run format\n\n# View demo\nopen demo/index.html\n```\n\n## License\n\nMIT © [Aaron Gustafson](https://www.aaron-gustafson.com/)\n","readmeFilename":"README.md"}