{"_id":"@bruno-bombonate/ngx-forms","_rev":"14-066b6206c0be62145fb9911ae5213ce2","name":"@bruno-bombonate/ngx-forms","dist-tags":{"latest":"22.0.0"},"versions":{"1.0.0":{"name":"@bruno-bombonate/ngx-forms","version":"1.0.0","_id":"@bruno-bombonate/ngx-forms@1.0.0","maintainers":[{"name":"bruno-bombonate","email":"bruno.siecola@outlook.com"}],"dist":{"shasum":"85e6eb7ddf89c774b7c9d90d9c62578bf053e208","tarball":"https://registry.npmjs.org/@bruno-bombonate/ngx-forms/-/ngx-forms-1.0.0.tgz","fileCount":20,"integrity":"sha512-xgvetlK0KSDhiEUcoGtGbzujp4v2TVrG2pho3PttldEd2v394m/p6htk2URbvqfPg7DOQ4WjtcxmBYuSMqzFsg==","signatures":[{"sig":"MEQCIE/CPfzHt5UC/Z28vqQ5ESUqgfRaoW4U2uUJkPonBODZAiALk5EXBTZFP2NRqtxlnG2zeuKmG9VSd4DwiFNd8ern6g==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":47216,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkQxCBACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoIUA//Ypxwx2NRWxmiU1clKuSfpb/lXx80OOP2Q8dT+1ihC0QoH6oV\r\nItj9QVN/iTpgKj0KMfhcjBZUXtEp467MYyTFS5MeybHCyrThJvKPHq8KpwSk\r\nMr1oX8eJvDxcyS+MAzsS9l2owM21QybUHQuWLaHsNzFdUY81e3n2yH+QrgrS\r\nlwFKDZ2AZs70mhsyLXYCwBbIX4AYS7hwtqRTZ2RqnGP58Y4pVttk1Jjaw+YJ\r\nrOJLicDHft6jjpAaVkjx68DMUetx2cflPCY6tc2BEvCCa5JyBLIy9oyLGWCU\r\niD+G8+h9EgpxZmIT8lp2HNn77qEieKEaNhT2VpsqBDJ6eVOPCywcu59zekS6\r\ni/ji31e8mm5nFVMA8uReodDF+JrrlrNh8yAaDhn4RycyjYCw7VHpq8+sI2ku\r\n2WLy+lxjcL1OhuveIhcdrb8deXQUqDkCmthFc45UGvHyDHFtF8hvjAae56E3\r\nWMPSImqylGUOK1DsD+8HMZZQylKnrBG6Xe1gDg8BaoYwrtjky/DRkMAfDSSM\r\nzRDSH1n5NJdHSkms9dthYqx37sD0rGDc7f4OKEkRiBLKmRgBkUSTED3qz2LD\r\nBrItpBiZ2KebSb//va3N48fJE9FAc1EMsTtzaOoaUSaRXieXhdiIGCHWJPFm\r\nD03nTA4np4fLGS7B3HMavNCp/orFW00uQKo=\r\n=SBI0\r\n-----END PGP SIGNATURE-----\r\n"},"es2020":"fesm2020/bruno-bombonate-ngx-forms.mjs","module":"fesm2015/bruno-bombonate-ngx-forms.mjs","esm2020":"esm2020/bruno-bombonate-ngx-forms.mjs","exports":{".":{"node":"./fesm2015/bruno-bombonate-ngx-forms.mjs","types":"./index.d.ts","es2015":"./fesm2015/bruno-bombonate-ngx-forms.mjs","es2020":"./fesm2020/bruno-bombonate-ngx-forms.mjs","default":"./fesm2020/bruno-bombonate-ngx-forms.mjs","esm2020":"./esm2020/bruno-bombonate-ngx-forms.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"988ac19cfc1031ab31d37c25a63270fa67922985","typings":"index.d.ts","_npmUser":{"name":"bruno-bombonate","email":"bruno.siecola@outlook.com"},"fesm2015":"fesm2015/bruno-bombonate-ngx-forms.mjs","fesm2020":"fesm2020/bruno-bombonate-ngx-forms.mjs","_npmVersion":"9.2.0","description":"A package with FormsModule containing FormControlTipComponent and FormControlErrorComponent.","directories":{},"sideEffects":false,"_nodeVersion":"18.16.0","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/core":"^15.2.0","@angular/common":"^15.2.0"},"_npmOperationalInternal":{"tmp":"tmp/ngx-forms_1.0.0_1682116737466_0.12320772088951926","host":"s3://npm-registry-packages"}},"2.0.0":{"name":"@bruno-bombonate/ngx-forms","version":"2.0.0","_id":"@bruno-bombonate/ngx-forms@2.0.0","maintainers":[{"name":"bruno-bombonate","email":"bruno.siecola@outlook.com"}],"dist":{"shasum":"f8533a73c02fbc2e5f0d6d68fa399fb691ebe228","tarball":"https://registry.npmjs.org/@bruno-bombonate/ngx-forms/-/ngx-forms-2.0.0.tgz","fileCount":20,"integrity":"sha512-Mtrq4mtUyWkxvndTuQGPqBvZzn9sA0wei6f7rRXu8jo4UdWKgs5/ejp4dvm/p2MwvutXPorRkf1VDn9GcSVh3Q==","signatures":[{"sig":"MEUCIElZpEvNFwLOBHzSAdlA9MUEF6XzTId10wO1hNgC1S+SAiEA0hWbBbsCRLVKwQcf623Kilm5t1V8YZsYfAoH1ICnYM0=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":52304,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkRAxGACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr4NQ/7BQ8RTRR/SFQC4flVS5zKWecLui1lq4N+csTKncIjNHgoL9lL\r\nppkhAzVypVBBYv6bzoQBsAAMhK0+TNMYHN3v2xVWWVO+S4MNV9lJlnAFNluO\r\nuiJw0YwxnfIAt8yV1xmP9OQwvz9hRoRnZmTH9IPSnRJsGI+iWatSu3PFABug\r\nFv+w3vn0GmDF54R1Oh3IQd6WneM0wOEO9osCDtt1VHC8sG3oMYotwNVfjAPP\r\nHjG93LHgI7EBnduEeIBCLCSXsR9v86C1pvPE8/C4e2+hXVeZ4zcgWIicwQgJ\r\n4QcUa2Y2w6KPEtXaRexh+r2ubgdlrzFYgjnCA+EpwtkbKPS6pUa1k/nDaso/\r\nVSTSsVAlYwxId5vZgWRIgMJobrxeVqMjFCVc28E1U/pgVnETt8Zm+WOZYTdM\r\nhSnlSpyBzfAcv/RyXXSf5hFn5IGM1y1/LfFZtR1wW/SHwYrAq3j1kss/EHkX\r\nH2o0aBr+MSen0577YmXzd2Ub2EywRWSPdOgLwwBlUNFCmc7O3Hz33oF2FIUF\r\n9EFpYRCqgprUSwpWQ24h2eckwsaMTyezbWK5NOcuUTGBUf7iyYrnUn2yhzBG\r\nVpRkURwQcDPGVsPZgEGah0J8qamaV8on9wuTdrK58udFx/BC9ZU/9iUGTc8m\r\nhQishDQP5xipoqQ8GguHiKXIsiTmNq/a69c=\r\n=gbzr\r\n-----END PGP SIGNATURE-----\r\n"},"es2020":"fesm2020/bruno-bombonate-ngx-forms.mjs","module":"fesm2015/bruno-bombonate-ngx-forms.mjs","esm2020":"esm2020/bruno-bombonate-ngx-forms.mjs","exports":{".":{"node":"./fesm2015/bruno-bombonate-ngx-forms.mjs","types":"./index.d.ts","es2015":"./fesm2015/bruno-bombonate-ngx-forms.mjs","es2020":"./fesm2020/bruno-bombonate-ngx-forms.mjs","default":"./fesm2020/bruno-bombonate-ngx-forms.mjs","esm2020":"./esm2020/bruno-bombonate-ngx-forms.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"e7ee2461acb7051c87597f2582a4872fb6c73fc6","typings":"index.d.ts","_npmUser":{"name":"bruno-bombonate","email":"bruno.siecola@outlook.com"},"fesm2015":"fesm2015/bruno-bombonate-ngx-forms.mjs","fesm2020":"fesm2020/bruno-bombonate-ngx-forms.mjs","_npmVersion":"9.2.0","description":"A package with FormsModule containing ControlTipComponent and ControlErrorComponent.","directories":{},"sideEffects":false,"_nodeVersion":"18.16.0","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/core":"^15.2.0","@angular/common":"^15.2.0"},"_npmOperationalInternal":{"tmp":"tmp/ngx-forms_2.0.0_1682181190374_0.518891198736259","host":"s3://npm-registry-packages"}},"3.0.0":{"name":"@bruno-bombonate/ngx-forms","version":"3.0.0","_id":"@bruno-bombonate/ngx-forms@3.0.0","maintainers":[{"name":"bruno-bombonate","email":"bruno.siecola@outlook.com"}],"dist":{"shasum":"fb3b87a11d686f62957fa9c2e900bd35da39117d","tarball":"https://registry.npmjs.org/@bruno-bombonate/ngx-forms/-/ngx-forms-3.0.0.tgz","fileCount":22,"integrity":"sha512-qr8j7oUtanc4SEIUKSih2sUakLsMWmK8O31yFdyA7lxWRwqJgYq5n3ah97z7pIkdEAK06EUC5b5o/RAm1RWVBg==","signatures":[{"sig":"MEQCIHdn5J3lrWmgm1IbpsV1BV9YXGBH4YvY6M6AyaglAz6KAiBTc/lF8xph60+gmVBIXDZLvUcDD9xA6cnK3B7InKXLIQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":60225,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkREXxACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmqo3w/9F5/C0uuesBJOhn1lKtHJ0HEpwALrkfZ/skht3XKZwZccS0OH\r\ny33S2N4WQCYhLq08ms8XTTmVNwGhiSRNq+bUgcue+10w7frY8eX9d2fZOWht\r\nVGEBfAGYNo2cwsDJqt3/LE8Weu4LS8U6szPNTGQtygbtsctKr5TgNkulWlAQ\r\n2r7zQpUc5/CoAEX7EeFCTgl2Rc75moqwe/cW/xdXV2rmD84MuV+qcq+uA2OP\r\n5hvq9196agOyLNy4ryQ7mcOaz1hnqqVItFv9sD6y9VShis1M+m6CZjMnc6jq\r\nGY6n9JabCjnCW7l1hiGYdZceBerLgKRQRV7aMZl7d6x1xDT5q7I6QW2rOU0J\r\nHAYsFDXDHNwdDNT1rxqOol3PWLIIS6YaPdVPLIh+/WKH4orD2+JLSoQEee/2\r\n5W8mwWUsTXRWay6BL5Cvt5lt2N2ZQ5t934lIpaMlKXVgoyoCIH0fKLqBe0Rb\r\naHBfR7Yp5hQtv4M00m4BaF3KmBWdVeVC9YzWFaKrH5TiipujZHPFNwLeuvqA\r\nnphbbz4wZVZspAAOjFic2MNI6K5b9T8KHlxf+bIdHSjA+9wb4PdL4UsSCIWv\r\npCM2ANfxo9So6qqDmnJTaoNdQErHR6SyWFj7eiKCRanOISme7XeKyHP6nwfs\r\njPUCtY+EIs357Xi7cJVKD3yGmWWUb356wio=\r\n=R5Ro\r\n-----END PGP SIGNATURE-----\r\n"},"es2020":"fesm2020/bruno-bombonate-ngx-forms.mjs","module":"fesm2015/bruno-bombonate-ngx-forms.mjs","esm2020":"esm2020/bruno-bombonate-ngx-forms.mjs","exports":{".":{"node":"./fesm2015/bruno-bombonate-ngx-forms.mjs","types":"./index.d.ts","es2015":"./fesm2015/bruno-bombonate-ngx-forms.mjs","es2020":"./fesm2020/bruno-bombonate-ngx-forms.mjs","default":"./fesm2020/bruno-bombonate-ngx-forms.mjs","esm2020":"./esm2020/bruno-bombonate-ngx-forms.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"e7ee2461acb7051c87597f2582a4872fb6c73fc6","typings":"index.d.ts","_npmUser":{"name":"bruno-bombonate","email":"bruno.siecola@outlook.com"},"fesm2015":"fesm2015/bruno-bombonate-ngx-forms.mjs","fesm2020":"fesm2020/bruno-bombonate-ngx-forms.mjs","_npmVersion":"9.2.0","description":"A package with FormsModule containing ControlTipComponent and ControlErrorComponent.","directories":{},"sideEffects":false,"_nodeVersion":"18.16.0","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/core":"^15.2.0","@angular/common":"^15.2.0"},"_npmOperationalInternal":{"tmp":"tmp/ngx-forms_3.0.0_1682195953427_0.5029958167101598","host":"s3://npm-registry-packages"}},"3.0.1":{"name":"@bruno-bombonate/ngx-forms","version":"3.0.1","_id":"@bruno-bombonate/ngx-forms@3.0.1","maintainers":[{"name":"bruno-bombonate","email":"bruno.siecola@outlook.com"}],"dist":{"shasum":"24c0e82efcc424e950783dd1b18d8c25c1c6709f","tarball":"https://registry.npmjs.org/@bruno-bombonate/ngx-forms/-/ngx-forms-3.0.1.tgz","fileCount":22,"integrity":"sha512-gJNgdTCdGynCSJOPcg6RNygDvmy+cFBLdNT3g0NW0Z2Y3mpIaZBd545fDPmAHKVucwQWmP2E3tuNu/lohyYhKw==","signatures":[{"sig":"MEYCIQDrPWGT9NQRALPHsc3OxROvkbKaFnH855wH8pQ5tZOAhQIhAM7S5TidR5yIgd+1kntSKMZfQiqrnjH7Lz35AZKb3Jnc","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":60618,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkRtBMACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqpsBAAoH2NX0lfIt7mRDwyylxY48J7lqv6lv6wYL3f7fbz7IyaBmZr\r\nS/nOTG2Wqi4VnWIUOwbykRm/ZL+LxmiMBfgrMyHYPdBhind6qkIa3QUFLWNQ\r\nqDrPGHtzSqpUASbF6GL53xmKyIFZ/zuywzI8vc+AyA2u+IUitdAq1EH+Y0uT\r\nS6vBzPHJybVGAYWMkyOpSpdmgybJfTwPbYzLnSM/vGnWcWN2fDiQ4uy2bxWa\r\nw6V5cHB8k+rvy786MzVVpn6W6Vey8Zx87LyUxLSy9rJX9J5YEV73RC4+0MwF\r\n7BjfNt8M1m08YXtc4UhPqI3Cx6Lf7ZMdGfE2z1pUW5vaSGLfuB2wjV+Hj3PU\r\n4QcA8Qe80Cqzu1xoyQ01Des2jjnvMxImhANzoZh5RamZh1you18yMBY26odA\r\nuvZDb8Nhhqm5TGCDIAizyy9IiUU3mchTBLGgA7zRK5IWD7uD+wZcp3WFbJk8\r\nGWeJyX7BsjQX6OHQJhVLOxlE0UBfNFxsHiWYZuO1NYFwoBKbk8VbA/2fbisP\r\nXSNhUKWV6b/56b5eATCUenVxSnuaUvAK+QMd6oE+oLKOHhMqw9uxqNNushZ1\r\nXu/omKvV0vppufZDZOEIOSPWQ+/O7VqIWbSts2rarSZnhTsbAJZMot4VDGD8\r\nsLdX9Yxfr3zkxDgalKoomhAe4u+fJUXQcCE=\r\n=mDPJ\r\n-----END PGP SIGNATURE-----\r\n"},"es2020":"fesm2020/bruno-bombonate-ngx-forms.mjs","module":"fesm2015/bruno-bombonate-ngx-forms.mjs","esm2020":"esm2020/bruno-bombonate-ngx-forms.mjs","exports":{".":{"node":"./fesm2015/bruno-bombonate-ngx-forms.mjs","types":"./index.d.ts","es2015":"./fesm2015/bruno-bombonate-ngx-forms.mjs","es2020":"./fesm2020/bruno-bombonate-ngx-forms.mjs","default":"./fesm2020/bruno-bombonate-ngx-forms.mjs","esm2020":"./esm2020/bruno-bombonate-ngx-forms.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"03013605fc7a55527ff05c9055980a0d25854ff4","typings":"index.d.ts","_npmUser":{"name":"bruno-bombonate","email":"bruno.siecola@outlook.com"},"fesm2015":"fesm2015/bruno-bombonate-ngx-forms.mjs","fesm2020":"fesm2020/bruno-bombonate-ngx-forms.mjs","_npmVersion":"9.2.0","description":"A package with FormsModule containing ControlTipComponent and ControlErrorComponent.","directories":{},"sideEffects":false,"_nodeVersion":"18.16.0","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/core":"^15.2.0","@angular/common":"^15.2.0"},"_npmOperationalInternal":{"tmp":"tmp/ngx-forms_3.0.1_1682362444495_0.8946427703497397","host":"s3://npm-registry-packages"}},"3.0.2":{"name":"@bruno-bombonate/ngx-forms","version":"3.0.2","_id":"@bruno-bombonate/ngx-forms@3.0.2","maintainers":[{"name":"bruno-bombonate","email":"bruno.siecola@outlook.com"}],"dist":{"shasum":"9785ec8a978b8d9a551fe9dac4a9c908641d4c5b","tarball":"https://registry.npmjs.org/@bruno-bombonate/ngx-forms/-/ngx-forms-3.0.2.tgz","fileCount":22,"integrity":"sha512-zg1qBHnByYg0V+hW5yWxpu2K90p4QYzPFiq+gRS5j2Q5lXvw+egrnUQ3FkweSsdP1n9hqtSmuu5nL6lnn3YFFQ==","signatures":[{"sig":"MEUCIBd4YfM4tCSzEcSFN5xnnmKqTbuDK5bXtBua1FXZUTMnAiEApCcrJHwR6l/7tMt/TMEZkhClDE9+B02zVUGapM6VDXU=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":59928,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkRtHDACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmp0Qw//cyxwe3UFkukiL1FRh3whw5su6emp661QcbfXFye2RWVLZWxX\r\ngaSO/04Vg+C81zDahFuTI4XXhODF6Fkuz6Fi33RcFnU99iUgi/q9q+D5aVj3\r\ni8nc2H3we52hyZyn2/ZJRWXxjeUvMq/PqKVclUD7POk5LYgj/wl4NkoMbt83\r\nfSA5WW1qNA7Hva8Jmq0fdhQiLMErB72sN9YF9dOYRDYmrX0B/5iK7XyUDagZ\r\njceahQpeIuWCIVu9phTFqgrwiMpi+Jr+GgAH7vR5Z1Q2pRLcJBCiM5qITcGr\r\nTGGRzS6uX0kDg88FYNGCLJWrhULZtx6TuCczPHGQ6oKjP0OqufSb+YszTNw3\r\nZ/uW07Sngi44G3l7Y56zCfi0HKDPKGJHpTSAvaXWhPO5oT4PakJVIAtUCGjY\r\nSvfT0Gt5eHbwAYFY6wEa8qDYct6282/6tSlNB1gNtFJL1yRKjW9ALsSfwIEF\r\n06y06xFjMgdFId25EI9CsvmkkY/oGK/oljTQrleBn3F9sGypNkfiU0GB3HDr\r\n194VLY0TROD58tOQ22zT1MkkLem7qexYPol7mlk91n5rDh0NiUYshwg9CUbS\r\n6zePPT27u4HYpmCIu9zSB7n2+BzRNrIpALqQeO1lpG0c3aPjJXc5xjz3ntM3\r\nwPXYfOVQwuasJ4r5a7lmJ1K+vhdKwCrxORo=\r\n=6l5m\r\n-----END PGP SIGNATURE-----\r\n"},"es2020":"fesm2020/bruno-bombonate-ngx-forms.mjs","module":"fesm2015/bruno-bombonate-ngx-forms.mjs","esm2020":"esm2020/bruno-bombonate-ngx-forms.mjs","exports":{".":{"node":"./fesm2015/bruno-bombonate-ngx-forms.mjs","types":"./index.d.ts","es2015":"./fesm2015/bruno-bombonate-ngx-forms.mjs","es2020":"./fesm2020/bruno-bombonate-ngx-forms.mjs","default":"./fesm2020/bruno-bombonate-ngx-forms.mjs","esm2020":"./esm2020/bruno-bombonate-ngx-forms.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"03013605fc7a55527ff05c9055980a0d25854ff4","typings":"index.d.ts","_npmUser":{"name":"bruno-bombonate","email":"bruno.siecola@outlook.com"},"fesm2015":"fesm2015/bruno-bombonate-ngx-forms.mjs","fesm2020":"fesm2020/bruno-bombonate-ngx-forms.mjs","_npmVersion":"9.2.0","description":"A package with FormsModule containing ControlTipComponent and ControlErrorComponent.","directories":{},"sideEffects":false,"_nodeVersion":"18.16.0","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/core":"^15.2.0","@angular/common":"^15.2.0"},"_npmOperationalInternal":{"tmp":"tmp/ngx-forms_3.0.2_1682362819608_0.6405936518959903","host":"s3://npm-registry-packages"}},"3.0.3":{"name":"@bruno-bombonate/ngx-forms","version":"3.0.3","_id":"@bruno-bombonate/ngx-forms@3.0.3","maintainers":[{"name":"bruno-bombonate","email":"bruno.siecola@outlook.com"}],"dist":{"shasum":"a62838795fb9dc518ab0393ac58e25f8217d8099","tarball":"https://registry.npmjs.org/@bruno-bombonate/ngx-forms/-/ngx-forms-3.0.3.tgz","fileCount":22,"integrity":"sha512-bBRU3ZGlAbIutqkmlLdSTUedAOorJm6+owmm3ah0yNKdOvqpnmh/lFYCbXHY+sUItXOMvU0bUtu3Pux2+nfHmQ==","signatures":[{"sig":"MEQCIF6f+A4ZNFCFXYHBh51imJVzbJOYZ4zbI+QitWjsuxffAiAmyjISjZGSQBieD2qMDoid0NGcb3KaiunFUJXt+vQgVA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":60342,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkRtgWACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo6QA/+O8pKbfvbbOwcQvaNwZodRcBSxN0tnV3C2xObuDaHRjJ/qT+8\r\njIzJ8Xmb1fDZHoRsZBE6xbrU6N6gzYjXMt2IDHCd5Bh4fnGoN8HVZ5x3WZHk\r\ndIqSmFaNjd6rERv2Q0ZNruFimWCLeUaF0UgP+tnOw7p5XrNPP+iMkUqBrj2w\r\ncpZS+RVWfI8/aUXk8pin4cJbKtZn54cracT8Z3EshcAXubM7cbwSb1IGpGfB\r\nwgFcrjWcqCFrwU3842M/TJx2ogE3EooPz0i0F3Qk4GWpGmWBNrwuB0qbhFx0\r\nK/VgQbz3d+oEhQaIbnRnTEcev/YejS1VH9c7dZ6TCPD/JBZqd0AsFIXiI0xM\r\nsVa5J0z69+MPgBTu4/Nd5EX5xCAV40Edr0OZpxSIHgZx1JieLhD6gZnUg/ve\r\no+wbVpQsZZElCprmtceoMc2IpAoBmtMj73ux84B5f2bEUtJma2CRuQfwmzm7\r\nDDp9jO4tanLPU0dMqpzgNo2G6anmdFaIzNlPosr0L6UMSBY3vQE+rhdzWLI3\r\nq6+S0q6QbOb9QxofzqbfjWZslG2hD3u8RLYi4vdp6HQXigSMpiJW23TGghCq\r\nQv03mshsZxHfcYnKEks9wAm9v4AEqfcpm1cp714SLR39+7pYOty+tLPIiIHl\r\nodWOA0kqmyOaq7yt8siju121Rh9POT83r0U=\r\n=h4C8\r\n-----END PGP SIGNATURE-----\r\n"},"es2020":"fesm2020/bruno-bombonate-ngx-forms.mjs","module":"fesm2015/bruno-bombonate-ngx-forms.mjs","esm2020":"esm2020/bruno-bombonate-ngx-forms.mjs","exports":{".":{"node":"./fesm2015/bruno-bombonate-ngx-forms.mjs","types":"./index.d.ts","es2015":"./fesm2015/bruno-bombonate-ngx-forms.mjs","es2020":"./fesm2020/bruno-bombonate-ngx-forms.mjs","default":"./fesm2020/bruno-bombonate-ngx-forms.mjs","esm2020":"./esm2020/bruno-bombonate-ngx-forms.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"03013605fc7a55527ff05c9055980a0d25854ff4","typings":"index.d.ts","_npmUser":{"name":"bruno-bombonate","email":"bruno.siecola@outlook.com"},"fesm2015":"fesm2015/bruno-bombonate-ngx-forms.mjs","fesm2020":"fesm2020/bruno-bombonate-ngx-forms.mjs","_npmVersion":"9.2.0","description":"A package with FormsModule containing ControlTipComponent and ControlErrorComponent.","directories":{},"sideEffects":false,"_nodeVersion":"18.16.0","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/core":"^15.2.0","@angular/common":"^15.2.0"},"_npmOperationalInternal":{"tmp":"tmp/ngx-forms_3.0.3_1682364438661_0.2360131016712188","host":"s3://npm-registry-packages"}},"4.0.0":{"name":"@bruno-bombonate/ngx-forms","version":"4.0.0","_id":"@bruno-bombonate/ngx-forms@4.0.0","maintainers":[{"name":"bruno-bombonate","email":"bruno.siecola@outlook.com"}],"dist":{"shasum":"11d37c44f5d4b981d9521be6b3f0725498fa8a98","tarball":"https://registry.npmjs.org/@bruno-bombonate/ngx-forms/-/ngx-forms-4.0.0.tgz","fileCount":20,"integrity":"sha512-BuXG/+MhBU4uxz1F7cRz1BtOG3I6o+i5MGdx488AGSjfWTSCPu7W9Y0pawMTqtApyO7wRMSc1Euva/yt4Tzeww==","signatures":[{"sig":"MEUCIG98IGJGFjVHLHSNZsZNQlrRmzbHVqyzCvCgZbW9Me6QAiEApieae8+jBqSEzNsW3GVy5r9Z5Jb8+DASIjIeXI50wqE=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":45753},"module":"fesm2022/bruno-bombonate-ngx-forms.mjs","exports":{".":{"esm":"./esm2022/bruno-bombonate-ngx-forms.mjs","types":"./index.d.ts","default":"./fesm2022/bruno-bombonate-ngx-forms.mjs","esm2022":"./esm2022/bruno-bombonate-ngx-forms.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"5568ea89e72775b795158b81ef18d9d1711fcb71","typings":"index.d.ts","_npmUser":{"name":"bruno-bombonate","email":"bruno.siecola@outlook.com"},"_npmVersion":"9.2.0","description":"A package with FormsModule containing ControlTipComponent and ControlErrorComponent.","directories":{},"sideEffects":false,"_nodeVersion":"18.16.0","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/core":"^16.0.3","@angular/common":"^16.0.3"},"_npmOperationalInternal":{"tmp":"tmp/ngx-forms_4.0.0_1685385695250_0.5197557518916598","host":"s3://npm-registry-packages"}},"5.0.0":{"name":"@bruno-bombonate/ngx-forms","version":"5.0.0","_id":"@bruno-bombonate/ngx-forms@5.0.0","maintainers":[{"name":"bruno-bombonate","email":"bruno.siecola@outlook.com"}],"dist":{"shasum":"93f0807e7262339c97c50ecdaafceea8b6580e48","tarball":"https://registry.npmjs.org/@bruno-bombonate/ngx-forms/-/ngx-forms-5.0.0.tgz","fileCount":20,"integrity":"sha512-YT4RY526EJfDQQDoJQV5k5pF7M6LXa6Ga1zuxt9zs7idJtD+JwPzZVlKO7MtYo/Nt4RB4Djiyt8UFicnfQUlTQ==","signatures":[{"sig":"MEQCICpGVwB1j7WfFSVgIDPblIisIeKGjb5CXKpoT/w6o403AiAdaiGTtTQ2J4oMQj027SR/elUuJd1l9PLBjO/wtQFHPA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":45398},"module":"fesm2022/bruno-bombonate-ngx-forms.mjs","exports":{".":{"esm":"./esm2022/bruno-bombonate-ngx-forms.mjs","types":"./index.d.ts","default":"./fesm2022/bruno-bombonate-ngx-forms.mjs","esm2022":"./esm2022/bruno-bombonate-ngx-forms.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"2124989473666fc16984df3d2773b7b43daa9683","typings":"index.d.ts","_npmUser":{"name":"bruno-bombonate","email":"bruno.siecola@outlook.com"},"_npmVersion":"9.2.0","description":"A package with FormsModule containing ControlTipComponent and ControlErrorComponent.","directories":{},"sideEffects":false,"_nodeVersion":"18.16.0","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/core":"^17.0.0","@angular/common":"^17.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ngx-forms_5.0.0_1701119862778_0.7059298510841048","host":"s3://npm-registry-packages"}},"18.0.0":{"name":"@bruno-bombonate/ngx-forms","version":"18.0.0","_id":"@bruno-bombonate/ngx-forms@18.0.0","maintainers":[{"name":"bruno-bombonate","email":"bruno.siecola@outlook.com"}],"dist":{"shasum":"499c00edf2e054d1329dc21a72d273a13df74010","tarball":"https://registry.npmjs.org/@bruno-bombonate/ngx-forms/-/ngx-forms-18.0.0.tgz","fileCount":20,"integrity":"sha512-zsbR4ANW4owvUxUoVPTtCg9Eb/48yXSd0rz22IL29zHJoyyCoOrBVQDYT/+zeQMYQwBZ0giqyaYRwBVeMBw7yA==","signatures":[{"sig":"MEUCIQD112M4+hCnkFPFPjVNn1/jThBTkmWGNuHobJ+e6z4piAIgGHQ9QDhOcr+y8NPXJu7EIkokL65cskGIqK8ddQ8s/1k=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":45223},"module":"fesm2022/bruno-bombonate-ngx-forms.mjs","exports":{".":{"esm":"./esm2022/bruno-bombonate-ngx-forms.mjs","types":"./index.d.ts","default":"./fesm2022/bruno-bombonate-ngx-forms.mjs","esm2022":"./esm2022/bruno-bombonate-ngx-forms.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"d3dc6640c7d657fc7a9936ef334e56cd6a295519","typings":"index.d.ts","_npmUser":{"name":"bruno-bombonate","email":"bruno.siecola@outlook.com"},"_npmVersion":"11.0.0","description":"A package with FormsModule containing ControlTipComponent and ControlErrorComponent.","directories":{},"sideEffects":false,"_nodeVersion":"20.18.1","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/core":"^18.0.0","@angular/common":"^18.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ngx-forms_18.0.0_1737357488338_0.42328374265803825","host":"s3://npm-registry-packages-npm-production"}},"19.0.0":{"name":"@bruno-bombonate/ngx-forms","version":"19.0.0","_id":"@bruno-bombonate/ngx-forms@19.0.0","maintainers":[{"name":"bruno-bombonate","email":"bruno.siecola@outlook.com"}],"dist":{"shasum":"62a6cda57d560aca0426223f5df00e8808daa2dd","tarball":"https://registry.npmjs.org/@bruno-bombonate/ngx-forms/-/ngx-forms-19.0.0.tgz","fileCount":13,"integrity":"sha512-YFiSUhi8a9HOzRQ7gDqHzowEhnEGihz+m2/FA+jltVHDjdbcNXzU87A5o0fH71FCC/VJzIA0Nnr5z64vsle0wQ==","signatures":[{"sig":"MEUCICFY1bGUgMUjUuLUmdXAB49ObIRgqqVFNtvgZ0JINEOwAiEA1d48zJtAhisDRLty0dg1u9nxSylRiidyfk0VfGa3zvU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":19543},"module":"fesm2022/bruno-bombonate-ngx-forms.mjs","exports":{".":{"types":"./index.d.ts","default":"./fesm2022/bruno-bombonate-ngx-forms.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"7f32d0b69f58eda2e8ab6487251b0faa70768d2e","typings":"index.d.ts","_npmUser":{"name":"bruno-bombonate","actor":{"name":"bruno-bombonate","type":"user","email":"bruno.siecola@outlook.com"},"email":"bruno.siecola@outlook.com"},"_npmVersion":"10.9.2","description":"A package containing ControlTipComponent and ControlErrorComponent.","directories":{},"sideEffects":false,"_nodeVersion":"22.15.0","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/core":"^19.0.0","@angular/common":"^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ngx-forms_19.0.0_1750756703705_0.9368309141981943","host":"s3://npm-registry-packages-npm-production"}},"20.0.0":{"name":"@bruno-bombonate/ngx-forms","version":"20.0.0","_id":"@bruno-bombonate/ngx-forms@20.0.0","maintainers":[{"name":"bruno-bombonate","email":"bruno.siecola@outlook.com"}],"dist":{"shasum":"be59a3386f6a5382a7031fcb0aab94085118db00","tarball":"https://registry.npmjs.org/@bruno-bombonate/ngx-forms/-/ngx-forms-20.0.0.tgz","fileCount":5,"integrity":"sha512-fl2tV242izuFmX+sQkVI0MjSbqBik38aqlW/kk8+laayaN5xTvcFy2ym7buY5g0yUtzn07L9XZO+09HnPiTOew==","signatures":[{"sig":"MEYCIQCamRA1VJR3WFRc0e3bgBTfaLVM3Jb3RmMn4HLQ6zVo4gIhAMIuI1UvEA/LoCpCpdavIXhKLzZJbpYm89yFBAq4ZcRd","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":18653},"module":"fesm2022/bruno-bombonate-ngx-forms.mjs","exports":{".":{"types":"./index.d.ts","default":"./fesm2022/bruno-bombonate-ngx-forms.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"dd7cad3d5a03609a7115daaa284080aa1560cb6a","typings":"index.d.ts","_npmUser":{"name":"bruno-bombonate","actor":{"name":"bruno-bombonate","type":"user","email":"bruno.siecola@outlook.com"},"email":"bruno.siecola@outlook.com"},"_npmVersion":"10.9.2","description":"A package containing ControlTipComponent and ControlErrorComponent.","directories":{},"sideEffects":false,"_nodeVersion":"22.16.0","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/core":"^20.0.0","@angular/common":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ngx-forms_20.0.0_1751141273056_0.06796597408441252","host":"s3://npm-registry-packages-npm-production"}},"21.0.0":{"name":"@bruno-bombonate/ngx-forms","version":"21.0.0","_id":"@bruno-bombonate/ngx-forms@21.0.0","maintainers":[{"name":"bruno-bombonate","email":"bruno.siecola@outlook.com"}],"dist":{"shasum":"1f3aa76f07dab690f9aa29a146072028776903f1","tarball":"https://registry.npmjs.org/@bruno-bombonate/ngx-forms/-/ngx-forms-21.0.0.tgz","fileCount":5,"integrity":"sha512-LE4PQHt+0ealoX/3T6cTOh/wUMhR0tU6R18V39vhUpKKNvSwSmNSfCDEoSk6DuxLvWryqMVhKRw7J297oLHXpA==","signatures":[{"sig":"MEUCIQCUxkiMVobYSWBK8Vp2A7GAdxhL8QK0TRQhsi5DETX8HgIgPq9dlVKKEEe8C/8wD3nBPiNgJzZMO2Vh02KCWlWniOs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCakF+uGwaQD88Jh1TLKV7Qo9tXPSTto4UrTFNkxr+3CwIgBu4ZY4Bvq3lCwMqP21vQNGgrV/zjrhawIpkzLYfljW4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":26907},"type":"module","module":"fesm2022/bruno-bombonate-ngx-forms.mjs","exports":{".":{"types":"./types/bruno-bombonate-ngx-forms.d.ts","default":"./fesm2022/bruno-bombonate-ngx-forms.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"d5fced5157ef89faf702f9476d8bab6554627492","typings":"types/bruno-bombonate-ngx-forms.d.ts","_npmUser":{"name":"bruno-bombonate","email":"bruno.siecola@outlook.com"},"_npmVersion":"12.0.2","description":"A package containing `ControlTipComponent` and `ControlErrorComponent`, with `FormsService`/`provideNgxForms` to customize error messages and error-visibility rules app-wide.","directories":{},"sideEffects":false,"_nodeVersion":"24.18.1","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/core":"^21.0.0","@angular/forms":"^21.0.0","@angular/common":"^21.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ngx-forms_21.0.0_1789666685741_0.3882598551758971","host":"s3://npm-registry-packages-npm-production"}},"22.0.0":{"_id":"@bruno-bombonate/ngx-forms@22.0.0","dist":{"shasum":"046959b5893af6a93d422b155ddb21aa13546316","tarball":"https://registry.npmjs.org/@bruno-bombonate/ngx-forms/-/ngx-forms-22.0.0.tgz","fileCount":5,"integrity":"sha512-ogbTU2hcBn4fRnkgPwvmwurccpkTZf+fWOwRYzhg3Om1DVlRUechXezQZMkdfPJ+9Z08gB1TESCffNqsiou0ow==","signatures":[{"sig":"MEUCIHdsyN3IKciAtvJvYcgQ/GZF+syYKm0LXKjmbFkGX4JYAiEAn/DFkPqx9TvDq2QdJ/fhM/3G2Nn9O+N9QxDek3Wa5rE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCCxpYqSALi9MDo13KMXLPv/firYfDztOE4bDazZ6ozDwIgOWNefOjSihyXnFg/ag55bBzxMUqnqQHQiuiFx7XQTVY="}],"unpackedSize":42573},"name":"@bruno-bombonate/ngx-forms","type":"module","module":"fesm2022/bruno-bombonate-ngx-forms.mjs","exports":{".":{"types":"./types/bruno-bombonate-ngx-forms.d.ts","default":"./fesm2022/bruno-bombonate-ngx-forms.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"03210be70cc955f338fa5bf8001697cef4b710f1","typings":"types/bruno-bombonate-ngx-forms.d.ts","version":"22.0.0","_npmUser":{"name":"bruno-bombonate","email":"bruno.siecola@outlook.com"},"_npmVersion":"12.0.2","description":"A package containing `ControlTipComponent` and `ControlErrorComponent`, with `FormsService`/`provideNgxForms` to customize error messages and error-visibility rules app-wide. `ControlErrorComponent` works with both Reactive Forms (`AbstractControl`) and S","directories":{},"maintainers":[{"name":"bruno-bombonate","email":"bruno.siecola@outlook.com"}],"sideEffects":false,"_nodeVersion":"24.18.1","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"rxjs":"^7.4.0","@angular/core":"^22.0.0","@angular/forms":"^22.0.0","@angular/common":"^22.0.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/ngx-forms_22.0.0_1789725138918_0.10932493266168253"}}},"time":{"created":"2023-04-21T22:38:57.465Z","modified":"2026-09-18T09:52:19.142Z","1.0.0":"2023-04-21T22:38:57.620Z","2.0.0":"2023-04-22T16:33:10.594Z","3.0.0":"2023-04-22T20:39:13.639Z","3.0.1":"2023-04-24T18:54:04.681Z","3.0.2":"2023-04-24T19:00:19.776Z","3.0.3":"2023-04-24T19:27:18.841Z","4.0.0":"2023-05-29T18:41:35.433Z","5.0.0":"2023-11-27T21:17:42.945Z","18.0.0":"2025-01-20T07:18:08.508Z","19.0.0":"2025-06-24T09:18:23.893Z","20.0.0":"2025-06-28T20:07:53.224Z","21.0.0":"2026-09-17T17:38:05.824Z","22.0.0":"2026-09-18T09:52:19.011Z"},"description":"A package containing `ControlTipComponent` and `ControlErrorComponent`, with `FormsService`/`provideNgxForms` to customize error messages and error-visibility rules app-wide. `ControlErrorComponent` works with both Reactive Forms (`AbstractControl`) and S","maintainers":[{"name":"bruno-bombonate","email":"bruno.siecola@outlook.com"}],"readme":"\n# @bruno-bombonate/ngx-forms\n\nA package containing `ControlTipComponent` and `ControlErrorComponent`, with `FormsService`/`provideNgxForms` to customize error messages and error-visibility rules app-wide. `ControlErrorComponent` works with both Reactive Forms (`AbstractControl`) and Signal Forms (`FieldTree`, `@angular/forms/signals`) — pass either one to the same `[control]` input.\n\n## Installation\n\n```bash\nnpm install @bruno-bombonate/ngx-forms\n```\n\n### Compatibility table\n\n|@bruno-bombonate/ngx-forms|Angular|\n|-|-|\n|3.0.3|15.x|\n|4.0.0|16.x|\n|5.0.0|17.x|\n|18.0.0|18.x|\n|19.0.0|19.x|\n|20.0.0|20.x|\n|21.0.0|21.x|\n|22.0.0|22.x|\n\nWorks with any Angular 22 version (`^22.0.0`), not just the exact minor/patch used to build this package.\n\n## Setup\n\nCall `provideNgxForms()` in your `app.config.ts`, even with no arguments — besides letting you [customize error messages](#overriding-or-adding-custom-errors-or-the-error-visibility-rule), it registers the `ng-valid`/`ng-invalid`/`ng-touched`/`ng-untouched`/`ng-dirty`/`ng-pristine` CSS classes for Signal Forms fields. Reactive Forms adds these classes on its own; Signal Forms doesn't unless you opt in, and `SignalFormComponentClass` (from `@bruno-bombonate/ngx-classes`) relies on `.ng-invalid` to scroll to the first invalid field on submit.\n\n```typescript\nimport { ApplicationConfig, provideBrowserGlobalErrorListeners } from '@angular/core';\nimport { provideRouter } from '@angular/router';\nimport { routes } from './app.routes';\nimport { provideClientHydration, withEventReplay } from '@angular/platform-browser';\nimport { provideNgxForms } from '@bruno-bombonate/ngx-forms';\n\nexport const appConfig: ApplicationConfig = {\n  providers: [\n    provideBrowserGlobalErrorListeners(),\n    provideRouter(routes),\n    provideClientHydration(withEventReplay()),\n    provideNgxForms()\n  ]\n};\n```\n\n## Usage\n\n### Import.\n\n#### user-form.component.ts\n\n```typescript\nimport { Component } from '@angular/core';\nimport { ControlTipComponent, ControlErrorComponent } from '@bruno-bombonate/ngx-forms';\n\n@Component({\n  selector: 'app-user-form',\n  imports: [\n    // components\n    ControlTipComponent,\n    ControlErrorComponent\n  ],\n  templateUrl: './user-form.component.html',\n  styleUrl: './user-form.component.sass'\n})\nexport class UserFormComponent { }\n\n```\n\n#### user-form.component.html\n\nUsing ControlTipComponent only.\n\n```html\n<form [formGroup]=\"form\" (ngSubmit)=\"handleNgSubmit()\">\n  <div>\n    <label\n      for=\"name\">\n      Name\n    </label>\n    <input\n      type=\"text\"\n      id=\"name\"\n      formControlName=\"name\">\n    <control-tip>\n      Fill this field with your full name.\n    </control-tip>\n  </div>\n  <button\n    type=\"submit\">\n    Submit\n  </button>\n</form>\n```\n\nUsing ControlErrorComponent only. `ControlErrorComponent` receives the whole control (not just its errors) and decides on its own whether the message should be visible — by default, when the control has errors and is touched or dirty. Pass it a Reactive Forms `AbstractControl`:\n\n```html\n<form [formGroup]=\"form\" (ngSubmit)=\"handleNgSubmit()\">\n  <div>\n    <label\n      for=\"name\">\n      Name\n    </label>\n    <input\n      type=\"text\"\n      id=\"name\"\n      formControlName=\"name\">\n    <control-error\n      [control]=\"form.controls['name']\">\n    </control-error>\n  </div>\n  <button\n    type=\"submit\">\n    Submit\n  </button>\n</form>\n```\n\n...or a Signal Forms field — same `[control]` input, `ControlErrorComponent` detects which kind it got at runtime:\n\n```html\n<form [formRoot]=\"form\" (submit)=\"handleSubmit()\">\n  <div>\n    <label\n      for=\"name\">\n      Name\n    </label>\n    <input\n      id=\"name\"\n      [formField]=\"form.name\">\n    <control-error\n      [control]=\"form.name\">\n    </control-error>\n  </div>\n  <button\n    type=\"submit\">\n    Submit\n  </button>\n</form>\n```\n\n`[formRoot]` and `[formField]` are the directives Signal Forms itself provides — import `FormRoot`/`FormField` from `@angular/forms/signals` into your component's `imports` array alongside `ControlErrorComponent`.\n\nUsing both ControlTipComponent and ControlErrorComponent. If you need the same visibility rule elsewhere in your template (for example, to hide a `ControlTipComponent` while an error is shown), inject `FormsService` and call `controlErrorVisible(control)` for a Reactive control or `fieldErrorVisible(field())` for a Signal Forms field — these are the same predicates `ControlErrorComponent` uses internally (the default ones, or the ones you provided via `provideNgxForms`, see below).\n\n```typescript\nimport { Component, inject } from '@angular/core';\nimport { FormsService } from '@bruno-bombonate/ngx-forms';\n\n@Component({\n  selector: 'app-user-form',\n  // ...\n})\nexport class UserFormComponent {\n  protected readonly formsService = inject(FormsService);\n}\n```\n\n```html\n<form [formGroup]=\"form\" (ngSubmit)=\"handleNgSubmit()\">\n  <div>\n    <label\n      for=\"name\">\n      Name\n    </label>\n    <input\n      type=\"text\"\n      id=\"name\"\n      formControlName=\"name\">\n    @if (formsService.controlErrorVisible(form.controls['name']) === false) {\n      <control-tip>\n        Fill this field with your full name.\n      </control-tip>\n    } @else {\n      <control-error\n        [control]=\"form.controls['name']\">\n      </control-error>\n    }\n  </div>\n  <button\n    type=\"submit\">\n    Submit\n  </button>\n</form>\n```\n\n### Overriding or adding custom errors, or the error visibility rule.\n\nOut of the box, `ControlErrorComponent` already has a message for every one of Angular's built-in validators, for both forms:\n\n- **Reactive Forms**: `required`, `requiredTrue`, `email`, `pattern`, `min`, `max`, `minlength`, `maxlength`.\n- **Signal Forms**: `required`, `email`, `pattern`, `min`, `max`, `minLength`, `maxLength` (note the casing — Signal Forms' own validators use `minLength`/`maxLength`, not `minlength`/`maxlength`, and there's no separate `requiredTrue` kind).\n\nYou only need `provideNgxForms` if you want to change one of those messages, translate them, or add a message for your own custom validator's error key (like `custom` below) — `controlErrors`/`fieldErrors` are **merged** into their respective built-in defaults, not a replacement for them, so you only need to list the keys you're adding or overriding, not the full set.\n\n`provideNgxForms` takes an optional options object — `controlErrors`, `controlErrorVisible`, `fieldErrors` and `fieldErrorVisible` are all optional, so you can pass any combination, or call it with no arguments at all (see [Setup](#setup) above).\n\n#### app.config.ts\n\n```typescript\nimport { ApplicationConfig, provideBrowserGlobalErrorListeners } from '@angular/core';\nimport { provideRouter } from '@angular/router';\nimport { routes } from './app.routes';\nimport { provideClientHydration, withEventReplay } from '@angular/platform-browser';\nimport { provideNgxForms, ControlErrors, ControlErrorVisible, FieldErrors, FieldErrorVisible } from '@bruno-bombonate/ngx-forms';\n\nexport const controlErrors: ControlErrors = {\n  // overriding a built-in message\n  required: () => 'Please fill this field.',\n  // adding a message for your own custom validator's error key\n  custom: (error: any) => 'My custom error message...'\n};\n\n// Default rule is: control.errors !== null && (control.touched || control.dirty).\n// Override it here to change when every <control-error> bound to a Reactive control shows its message.\nexport const controlErrorVisible: ControlErrorVisible = (control) => control.errors !== null;\n\nexport const fieldErrors: FieldErrors = {\n  required: () => 'Please fill this field.'\n};\n\n// Default rule is: field.errors().length > 0 && (field.touched() || field.dirty()).\n// Override it here to change when every <control-error> bound to a Signal Forms field shows its message.\nexport const fieldErrorVisible: FieldErrorVisible = (field) => field.errors().length > 0;\n\nexport const appConfig: ApplicationConfig = {\n  providers: [\n    provideBrowserGlobalErrorListeners(),\n    provideRouter(routes),\n    provideClientHydration(withEventReplay()),\n    provideNgxForms({ controlErrors, controlErrorVisible, fieldErrors, fieldErrorVisible })\n  ]\n};\n```\n\nIf a control (or field) has an error whose key isn't in the built-in list and wasn't added through `controlErrors`/`fieldErrors`, `ControlErrorComponent` throws — that's on purpose, so a forgotten custom-validator message fails loudly in development instead of silently showing nothing.\n","readmeFilename":"README.md"}