{"_id":"@bruno-bombonate/ngx-classes","_rev":"17-2665b65790608fcf5c6d38f738b2bf76","name":"@bruno-bombonate/ngx-classes","dist-tags":{"latest":"22.0.0"},"versions":{"1.0.2":{"name":"@bruno-bombonate/ngx-classes","version":"1.0.2","_id":"@bruno-bombonate/ngx-classes@1.0.2","maintainers":[{"name":"bruno-bombonate","email":"bruno.siecola@outlook.com"}],"dist":{"shasum":"5d95eb70d38a0dbde2df0c3bfbf8cabf176fecce","tarball":"https://registry.npmjs.org/@bruno-bombonate/ngx-classes/-/ngx-classes-1.0.2.tgz","fileCount":16,"integrity":"sha512-nq9Ma15YYXYZuQXcyrEqMv/ev9QOdXKFqS0iqPZwfaU2T83x9L0/T+pSo312nX0g1ppQSUkOx1Ca9V/Sx7stQQ==","signatures":[{"sig":"MEQCICipBkxRacuhRW0LpLzFMMkM8+ZTFrDhofQ34MUO7DGzAiAWL/pG3jUa6NXEhNwEob/hvbWntqVY14sYuRdGqoch9Q==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":24740,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkQQehACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmopfg//TFJ6oEvpUH6d2d1m1HgQ827zWImvCG6AmGa+koi4qH4HSOoY\r\nDfbfl4XmJsJws7VymuP0KInz95Wp1vMOfXfSpxiVGJbiRlFeZ4Bax2Z+vE4d\r\n8HBAoWDytTlSw5P48zp26Zyyutrw/ao+KYCuQuqHqRbJ+i1FWUNogA7gpWNk\r\nyhmwDsVTC5/jg6MgvQnX7M1cP6UdPIJaM4ss0LUuGR3Se3kTbK2zsiEbwmOh\r\nla5JV5oihCerBkejREY3yVvem/IVGqOW/kxW4J1eXjAMhkzqc2Jabh5i+o2D\r\nwEOWsCOG2QnpZLO6L5fZf8zkfWZvbiT6Jg7s3ITsXJ+YOwkzBqFNULAQkW0+\r\nZhQ1u8PWHwARhkqqzzHIuYktSDInVP4dulWqa2tQwEscuwcRsOTmcaDQawMJ\r\nbbmqucUtnIpHXiZrhYjtZR9D4ZMkxxuyh2ZQFRuyXnd9IN5/7eJqf03z9QYg\r\nZsQ8hb9MnbcbtI5g4Rcw1Vp4bd28DoG2J5zJy9TNQ6PbaYIjmc0PHeCI8ws2\r\no1mYmmjPhExMRVuJbDq0RfwBmeBT2+ZvKELeEEJu2qsskxxs8Gqa8VlaPyCP\r\nasuJk+DWNaEVPRsR+ub74UtLDnaJPngzk0+LfK1tHg5ILVRVRM06VEv9WYFr\r\nXLrk4/YfV34WSKHnkR9xPf7w1QH/T+vdoxU=\r\n=cQfB\r\n-----END PGP SIGNATURE-----\r\n"},"es2020":"fesm2020/bruno-bombonate-ngx-classes.mjs","module":"fesm2015/bruno-bombonate-ngx-classes.mjs","esm2020":"esm2020/bruno-bombonate-ngx-classes.mjs","exports":{".":{"node":"./fesm2015/bruno-bombonate-ngx-classes.mjs","types":"./index.d.ts","es2015":"./fesm2015/bruno-bombonate-ngx-classes.mjs","es2020":"./fesm2020/bruno-bombonate-ngx-classes.mjs","default":"./fesm2020/bruno-bombonate-ngx-classes.mjs","esm2020":"./esm2020/bruno-bombonate-ngx-classes.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"9b9280e8cfcc37cb5b6b87a2afe1e78596f40da9","typings":"index.d.ts","_npmUser":{"name":"bruno-bombonate","email":"bruno.siecola@outlook.com"},"fesm2015":"fesm2015/bruno-bombonate-ngx-classes.mjs","fesm2020":"fesm2020/bruno-bombonate-ngx-classes.mjs","_npmVersion":"9.2.0","description":"A package with base classes that are frequently used in my Angular projects.","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-classes_1.0.2_1681983393473_0.691487334650436","host":"s3://npm-registry-packages"}},"1.1.0":{"name":"@bruno-bombonate/ngx-classes","version":"1.1.0","_id":"@bruno-bombonate/ngx-classes@1.1.0","maintainers":[{"name":"bruno-bombonate","email":"bruno.siecola@outlook.com"}],"dist":{"shasum":"71f1675ebb56e382e8d1b3eb571d00a615ff494c","tarball":"https://registry.npmjs.org/@bruno-bombonate/ngx-classes/-/ngx-classes-1.1.0.tgz","fileCount":28,"integrity":"sha512-t9JRowHuXZteLWyrXFG3Xe/X86FVwQ2wZHaSYmOaqHyKAtm7DYAaQvCih1Ygw4Sxo+jaF9ysxHSKJV1ZGUeZOw==","signatures":[{"sig":"MEQCIBP+UD3UfHy4rPX2bBzfwg12+e64JQOFAxTd9hXujUCJAiBoUROll3NhZ2uI2fHlWELqxmlwxe8uZON25HNT3ct1hg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":114155,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkRD3jACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrKgg//ca9XDe+55RBdcTxAlLg3xWCi1GYu7QXuWayQ9ZGpwJi/cPZ4\r\n8ePqTJuftcrZXgV3iupn5mMYwiQh2GveHMPErYVfgHlotuSjiKKuAz/LGGTG\r\nYalR6oLCJNENh4Evp3lCDAjUZqPcH6E5jezNjOEfmAg4vm61Z52siXozLBTf\r\nTPK0s80DLuF3ThPOoRol5luuIGzyXjH0CXAoL9e3za7l0rKaqXZBicQHvw8M\r\ni6RbQVCNhbAK87AnkAKqvLMhbMo6pNl4nkKVqvcnSjBAc+HHjIk64CYEXSC/\r\nBJYFbHmr6LD1Jvx0vQjie5BBaFptgmxuPbdZ2fewERs8E0UxT9J6TjMaBorR\r\nDqpmqjVRl1LY623dp7cR80OY0uq0EKS92ajMLvYiqO4NxBBZJL+Zx4QXsARc\r\n82KdwLD9HftHB6k8UGbv7q4AKsv88GFaSIgKDpN87+Mg39KqRYdHUkWfgRqV\r\n4DCtXA1kFAs8eL3d2TR4/XtAjeS1o4v63pV0qDsqb4aPkbOaQY5l/KQhGp2p\r\n9X7Z7hozehFOIbVTSfih51wL7ZdD4nJVondR0oy13EAXPq+Q4OQdXDqISpD5\r\nX771FPnioexmkbZt/od/qbd1PI8h379mBFuCOy3k2E9GRBGOmluwqwWU5FET\r\n11eObB1SjuBCiXkWtfy6UQZFw0kqJZNMzLE=\r\n=LCuz\r\n-----END PGP SIGNATURE-----\r\n"},"es2020":"fesm2020/bruno-bombonate-ngx-classes.mjs","module":"fesm2015/bruno-bombonate-ngx-classes.mjs","esm2020":"esm2020/bruno-bombonate-ngx-classes.mjs","exports":{".":{"node":"./fesm2015/bruno-bombonate-ngx-classes.mjs","types":"./index.d.ts","es2015":"./fesm2015/bruno-bombonate-ngx-classes.mjs","es2020":"./fesm2020/bruno-bombonate-ngx-classes.mjs","default":"./fesm2020/bruno-bombonate-ngx-classes.mjs","esm2020":"./esm2020/bruno-bombonate-ngx-classes.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-classes.mjs","fesm2020":"fesm2020/bruno-bombonate-ngx-classes.mjs","_npmVersion":"9.2.0","description":"A package with base classes that are frequently used in my Angular projects.","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-classes_1.1.0_1682193891295_0.09272898881932035","host":"s3://npm-registry-packages"}},"1.1.1":{"name":"@bruno-bombonate/ngx-classes","version":"1.1.1","_id":"@bruno-bombonate/ngx-classes@1.1.1","maintainers":[{"name":"bruno-bombonate","email":"bruno.siecola@outlook.com"}],"dist":{"shasum":"c9c654f2be2546646a229e63a476d9ca10ff72e5","tarball":"https://registry.npmjs.org/@bruno-bombonate/ngx-classes/-/ngx-classes-1.1.1.tgz","fileCount":28,"integrity":"sha512-uv3ERtR2dAtSkMdIm5mKRL2wT6P+VV2x6SPGt1aT9QtyLPOtNUZ2ddfbUKYLNn506SrpqQ8+6HmKulW4uTEs6Q==","signatures":[{"sig":"MEQCIBOLXYcwN0hM1WxCZHvl+yq4ARv2lD9iKbo852x6aBvRAiAHcKqgFIzbtERm0rQ6v+fDKlUYQrzpFhAQc62KE64lbA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":114052,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkRsw5ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmowEA//crOHDqzWZSPO0LeiVolc2Wr+cBXdVNCWOuqi0gapcTPpwiLL\r\ne1L5gEb/fmIrCCRZBWm++gk/ckrzG1VjqBQTdRjKsOBFqr25CdG+BgO5daeu\r\nfH4Aa46Q8IX8xFYpqHWmTXUxPqdT0xI8VCxysVjucrdROEXUBsN3gJv/yHtK\r\n+UoWNDSeUvy5lK/XLoiaHwgmma7PqD+4JANvNegpA+0m87p/hA9MiQqgHuMU\r\nnsn3dvfXXqOGAVwSyZxmCALqMWv7kgGjSDwtU/hCrKxbbKjLawe4sF16KeY/\r\n/W100ijYitbQELodOqtCfx0Ng+gqh6gtrq2a0MtXeCu1Bam90r6KT8K9y6/0\r\n8VdpVXJICmaCfZ0sfB+D5WTTJ9pNBLgSPj+pzhX3gn17f89bFa4bZ26bM//e\r\nzy1WF6cQal+0ejnyJXZnIciLZe79VQ02U7rIzJpURwHEU86GCQQUZbNFXs+5\r\nv5JAcwhax9Pm0yAZdqS+by/DhiPxV6R9lyXrt8ONXKGAS+XO1mGieO+M+d7F\r\njUe23iwOty8GIJp7+i8IxavqJ1xXd2i9jWUBF2hxklFiMh7F1o1C51+PmvAs\r\nx7Rq4QN3KTakFZa7E/DL87/iabEf9mwbhBAgHTTTcznyJKzgRHLHyeLOH0Vr\r\nd5HZpBe5gr/hBhQUYusEpeJBv3D2R6wMQVg=\r\n=tQSX\r\n-----END PGP SIGNATURE-----\r\n"},"es2020":"fesm2020/bruno-bombonate-ngx-classes.mjs","module":"fesm2015/bruno-bombonate-ngx-classes.mjs","esm2020":"esm2020/bruno-bombonate-ngx-classes.mjs","exports":{".":{"node":"./fesm2015/bruno-bombonate-ngx-classes.mjs","types":"./index.d.ts","es2015":"./fesm2015/bruno-bombonate-ngx-classes.mjs","es2020":"./fesm2020/bruno-bombonate-ngx-classes.mjs","default":"./fesm2020/bruno-bombonate-ngx-classes.mjs","esm2020":"./esm2020/bruno-bombonate-ngx-classes.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-classes.mjs","fesm2020":"fesm2020/bruno-bombonate-ngx-classes.mjs","_npmVersion":"9.2.0","description":"A package with base classes that are frequently used in my Angular projects.","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-classes_1.1.1_1682361401450_0.4924646101933563","host":"s3://npm-registry-packages"}},"1.2.0":{"name":"@bruno-bombonate/ngx-classes","version":"1.2.0","_id":"@bruno-bombonate/ngx-classes@1.2.0","maintainers":[{"name":"bruno-bombonate","email":"bruno.siecola@outlook.com"}],"dist":{"shasum":"a9551af100f8958223ded98cdf539bf95d95ff95","tarball":"https://registry.npmjs.org/@bruno-bombonate/ngx-classes/-/ngx-classes-1.2.0.tgz","fileCount":28,"integrity":"sha512-lziShwmaQONvDcSlnAiDMDUkmGTzWFTlob0OU9hjQek6QJZNrEuz1nHJGoO997hFajHT7v94lqB+jv5eC+UW0A==","signatures":[{"sig":"MEUCIQD2ZTyHP4iyCG1KU9SL7fChxyE8bi34+YN48JDs9n4kfwIgKWDE1V6IDiJ0sLyuimErR7s+5FR8lKFkM8eHXluaUGI=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":115566,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkRwXJACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpKZRAAob8eSBaUtDn0nHhNTMJsAytCsRczvNVZFZApL5ovR+Vqm7rS\r\n9Nrtzi1HqsNKWSmDEopGpqQ7l7DU0jcIEMFBR5SNVZwnegqZJYkFw7VNqMOH\r\nF5mwVDl6q1sHr5Yc/GTfLJkDJPn2QTTibwfaPz2KRZNazIoXVkgAn/4GId4I\r\nxX+Z48FGSDtBce69+u2ZPMbDENg2VuRIfiixngFAxK/6hRKXwFLfUe58Gzj0\r\n/gNuWbWTMZtyzM8FdeLA1hV4ADwVqoF6++8GV6Hxy3zkHJhqKfuLj7e2Of5h\r\nfciT316tD+qa3eTsf7auNCCQWth0a05mhnFoUPizslQB8peOP1qAmywspZ/B\r\nfL6mj018b+jqjdpU6xyRiExtqSYJ03j/qF46KnPwd8y9DBEBueiQ42xeWayN\r\nT56joUkEEeTMeYGLNPCJW4WzGX3kFleWdjP7GMGjBQwOMCoQ4U0Cy47hYMcv\r\nJh0oy7UP8yU3XYFeaMm3AOqevfr/8Y0v5FP/bmSfdnoWGqx8z7crmngubOkk\r\nrFwAoDDKCJKMd825wkc+EPjA5y+6dKUagZhoUojeUzoFZbdHUnnJMeU8NKq2\r\nYD9ppWRwN3Gh+jAeuON45yIqJEcafLs50kXO01Z3CV5vBF7w5/IbpwgKBQA2\r\ntDL+dqdaZW8vcg3EdGYovNuwV5pIwYL8u58=\r\n=yhLD\r\n-----END PGP SIGNATURE-----\r\n"},"es2020":"fesm2020/bruno-bombonate-ngx-classes.mjs","module":"fesm2015/bruno-bombonate-ngx-classes.mjs","esm2020":"esm2020/bruno-bombonate-ngx-classes.mjs","exports":{".":{"node":"./fesm2015/bruno-bombonate-ngx-classes.mjs","types":"./index.d.ts","es2015":"./fesm2015/bruno-bombonate-ngx-classes.mjs","es2020":"./fesm2020/bruno-bombonate-ngx-classes.mjs","default":"./fesm2020/bruno-bombonate-ngx-classes.mjs","esm2020":"./esm2020/bruno-bombonate-ngx-classes.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-classes.mjs","fesm2020":"fesm2020/bruno-bombonate-ngx-classes.mjs","_npmVersion":"9.2.0","description":"A package with base classes that are frequently used in my Angular projects.","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-classes_1.2.0_1682376137221_0.5385285115314009","host":"s3://npm-registry-packages"}},"2.0.0":{"name":"@bruno-bombonate/ngx-classes","version":"2.0.0","_id":"@bruno-bombonate/ngx-classes@2.0.0","maintainers":[{"name":"bruno-bombonate","email":"bruno.siecola@outlook.com"}],"dist":{"shasum":"8e706dd0091c6bc1845eb15e61b5065cc7f921c3","tarball":"https://registry.npmjs.org/@bruno-bombonate/ngx-classes/-/ngx-classes-2.0.0.tgz","fileCount":26,"integrity":"sha512-kgl2ff+5GDuTZ6rM3vzyDkOogTYcwvOKjpblDXLqcp4mSwhH6poFLv8iqQijpJNen3Mg/jZqElj55zR3zEQhcg==","signatures":[{"sig":"MEYCIQDqguhqrri+iUM9s+VzpI5fP8LRb/JB/+/IIC8Luj7usAIhAOd6leubRRST7Pei3Pcyq8o/Qqi6rBRW10fOYC2j8QBz","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":83610},"module":"fesm2022/bruno-bombonate-ngx-classes.mjs","exports":{".":{"esm":"./esm2022/bruno-bombonate-ngx-classes.mjs","types":"./index.d.ts","default":"./fesm2022/bruno-bombonate-ngx-classes.mjs","esm2022":"./esm2022/bruno-bombonate-ngx-classes.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"1630202856d5aa27cb7573b4389753b51c2c1fd0","typings":"index.d.ts","_npmUser":{"name":"bruno-bombonate","email":"bruno.siecola@outlook.com"},"_npmVersion":"9.2.0","description":"A package with base classes that are frequently used in my Angular projects.","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-classes_2.0.0_1685385449673_0.8551630063503071","host":"s3://npm-registry-packages"}},"3.0.0":{"name":"@bruno-bombonate/ngx-classes","version":"3.0.0","_id":"@bruno-bombonate/ngx-classes@3.0.0","maintainers":[{"name":"bruno-bombonate","email":"bruno.siecola@outlook.com"}],"dist":{"shasum":"2f99ec428d778875c62d5c0d0a5b7b2ba8f439fc","tarball":"https://registry.npmjs.org/@bruno-bombonate/ngx-classes/-/ngx-classes-3.0.0.tgz","fileCount":26,"integrity":"sha512-FNREhsQZ1AnSGmDxQW/GJsMWtZEG5OG3Pq/zFIF/S6fC60K/Icn+WCGQDHwse0XL8L3A76pG9ZSVdv7JMNAR4w==","signatures":[{"sig":"MEUCIEsQOwwMCQ13peoVhbAruE3oi0l7IBTIGjSW5s71KnCQAiEAxRjbcohodvu3/lgKVnYf0fJyD9oHZaRciNaQ11qyuhI=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":82963},"module":"fesm2022/bruno-bombonate-ngx-classes.mjs","exports":{".":{"esm":"./esm2022/bruno-bombonate-ngx-classes.mjs","types":"./index.d.ts","default":"./fesm2022/bruno-bombonate-ngx-classes.mjs","esm2022":"./esm2022/bruno-bombonate-ngx-classes.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 base classes that are frequently used in my Angular projects.","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-classes_3.0.0_1701119856475_0.9727254536799146","host":"s3://npm-registry-packages"}},"18.0.0":{"name":"@bruno-bombonate/ngx-classes","version":"18.0.0","_id":"@bruno-bombonate/ngx-classes@18.0.0","maintainers":[{"name":"bruno-bombonate","email":"bruno.siecola@outlook.com"}],"dist":{"shasum":"d8c8dbe2c9bce6d075329bcea1edcda4d1f288b6","tarball":"https://registry.npmjs.org/@bruno-bombonate/ngx-classes/-/ngx-classes-18.0.0.tgz","fileCount":26,"integrity":"sha512-CkVnVMKoRuNcS2ydGqSNya29+nvfa/zELiiDjCRiY4n6VBfCbLjgKcPPgvrKAkY7zZ6rtr2vmQxmKjm/rH5SfA==","signatures":[{"sig":"MEYCIQDrB2/31eVKVyLrUD5bcKVoVyGfpsfDMMlh0RS0715slAIhAMNx8u2oB74TWJIARHIQx3Wgn6Sx8Xd7Jo+cEGCr+P8t","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":81700},"module":"fesm2022/bruno-bombonate-ngx-classes.mjs","exports":{".":{"esm":"./esm2022/bruno-bombonate-ngx-classes.mjs","types":"./index.d.ts","default":"./fesm2022/bruno-bombonate-ngx-classes.mjs","esm2022":"./esm2022/bruno-bombonate-ngx-classes.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 base classes that are frequently used in my Angular projects.","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-classes_18.0.0_1737357480498_0.24302587725277514","host":"s3://npm-registry-packages-npm-production"}},"19.0.0":{"name":"@bruno-bombonate/ngx-classes","version":"19.0.0","_id":"@bruno-bombonate/ngx-classes@19.0.0","maintainers":[{"name":"bruno-bombonate","email":"bruno.siecola@outlook.com"}],"dist":{"shasum":"24ccc2f54752310d71d8ac8608585b3d85e327d4","tarball":"https://registry.npmjs.org/@bruno-bombonate/ngx-classes/-/ngx-classes-19.0.0.tgz","fileCount":16,"integrity":"sha512-jWKsZ++FI+z6C+c0Ph3QfMZMMg+WOaXLQtycfsRnmAxRB6lmgrqdKoBLsQHEMGCMCucJytrRg8/YWD04lYsAZg==","signatures":[{"sig":"MEQCIE+QPWI+frs1P8nwshNMZtIaC9QU30+Qqwwk85engoA5AiB5L3cYz9yKD3EXQ30Af8glcEWC3nmxSZDVu5lG0/Y+Yw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":45428},"module":"fesm2022/bruno-bombonate-ngx-classes.mjs","exports":{".":{"types":"./index.d.ts","default":"./fesm2022/bruno-bombonate-ngx-classes.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 with base classes that are frequently used in my Angular projects.","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-classes_19.0.0_1750756693326_0.1671272689955512","host":"s3://npm-registry-packages-npm-production"}},"20.0.0":{"name":"@bruno-bombonate/ngx-classes","version":"20.0.0","_id":"@bruno-bombonate/ngx-classes@20.0.0","maintainers":[{"name":"bruno-bombonate","email":"bruno.siecola@outlook.com"}],"dist":{"shasum":"c949a0b0bff339dfc779ce4416dffa7e4904e959","tarball":"https://registry.npmjs.org/@bruno-bombonate/ngx-classes/-/ngx-classes-20.0.0.tgz","fileCount":5,"integrity":"sha512-1xb3cl/JI6G/6x5kc2T1R3b5dsvV87nliOkMgbMcqP6VxLxu7gdSNpZ6rhLy77kWxoTQp5deSK0gSiOKVUYP7A==","signatures":[{"sig":"MEYCIQCYAh+MFQRyOpnxuuSIrauKzpsY55SWJyArQF+O91yCNwIhALNp7pRP3kl7HV0Xgmlk6oKFmZ6cxG2SI4XjCD4ioGE/","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":46944},"module":"fesm2022/bruno-bombonate-ngx-classes.mjs","exports":{".":{"types":"./index.d.ts","default":"./fesm2022/bruno-bombonate-ngx-classes.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 with base classes that are frequently used in my Angular projects.","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-classes_20.0.0_1751141268498_0.23543632771586687","host":"s3://npm-registry-packages-npm-production"}},"21.0.0":{"name":"@bruno-bombonate/ngx-classes","version":"21.0.0","_id":"@bruno-bombonate/ngx-classes@21.0.0","maintainers":[{"name":"bruno-bombonate","email":"bruno.siecola@outlook.com"}],"dist":{"shasum":"cd132810fd22405cac7bddea1eda692336734d07","tarball":"https://registry.npmjs.org/@bruno-bombonate/ngx-classes/-/ngx-classes-21.0.0.tgz","fileCount":5,"integrity":"sha512-unWzzpzuDEkMTU1lJdgE1Qey0xGfT9QQMY7yQ1zkI4rDFnWDwuZFD1maOiMtWsZuDqIVqRDKWU1j7qvvcm4dtw==","signatures":[{"sig":"MEQCIDXwjGD/McVLfkhhj66YG+SvVtwu+DauPFeBMJ3/ePJ5AiBEhqyvalAjydBumQV0bVie3l/nOT0hrlfPBg3KrRRKmQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIFncklb/rngAQXqkB8XtWXSmShG+Xi/G88ktUQ+yeFJKAiEAzr9fv4tN60LbEFEZZcG+cK4H0OWmgW5QdA3iBG/mMKg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":50636},"type":"module","module":"fesm2022/bruno-bombonate-ngx-classes.mjs","exports":{".":{"types":"./types/bruno-bombonate-ngx-classes.d.ts","default":"./fesm2022/bruno-bombonate-ngx-classes.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"d5fced5157ef89faf702f9476d8bab6554627492","typings":"types/bruno-bombonate-ngx-classes.d.ts","_npmUser":{"name":"bruno-bombonate","email":"bruno.siecola@outlook.com"},"_npmVersion":"12.0.2","description":"A package with base classes that are frequently used in my Angular projects.","directories":{},"sideEffects":false,"_nodeVersion":"24.18.1","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"rxjs":"^7.4.0","@angular/core":"^21.0.0","@angular/forms":"^21.0.0","@angular/common":"^21.0.0","@angular/router":"^21.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ngx-classes_21.0.0_1789666706901_0.10874383980226843","host":"s3://npm-registry-packages-npm-production"}},"22.0.0":{"_id":"@bruno-bombonate/ngx-classes@22.0.0","dist":{"shasum":"1051fd792c484a408c5bfc050477cf3d17b297b1","tarball":"https://registry.npmjs.org/@bruno-bombonate/ngx-classes/-/ngx-classes-22.0.0.tgz","fileCount":5,"integrity":"sha512-mQNSUXTEEPipfy1mAbHmVa1C+LSrPl32ZgaI5zeE335sLVeq7GUXqYRsCuUxklNJD02wnC6YYTCc2kIjZBpH5g==","signatures":[{"sig":"MEUCIQCobkOl0BDS7fYKZm04C+Qla+haW1XDiCkTJcXIfUFe/AIgPGayUfQ+RGpGGYt0OxvlpwgdYz25THDutumuVqu5bFQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQD8UIMnwNoenN6lcdkIJ21w2nAosJKgcZYtzXnyX+JD7wIhAJU5wIvccwKwSylCNesNIyMIUiTMHfFwS3G75fZganTA"}],"unpackedSize":68723},"name":"@bruno-bombonate/ngx-classes","type":"module","module":"fesm2022/bruno-bombonate-ngx-classes.mjs","exports":{".":{"types":"./types/bruno-bombonate-ngx-classes.d.ts","default":"./fesm2022/bruno-bombonate-ngx-classes.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"03210be70cc955f338fa5bf8001697cef4b710f1","typings":"types/bruno-bombonate-ngx-classes.d.ts","version":"22.0.0","_npmUser":{"name":"bruno-bombonate","email":"bruno.siecola@outlook.com"},"_npmVersion":"12.0.2","description":"A package with base classes that are frequently used in my Angular projects.","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","@angular/router":"^22.0.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/ngx-classes_22.0.0_1789725110785_0.07340365415626282"}}},"time":{"created":"2023-04-20T09:36:33.473Z","modified":"2026-09-18T09:51:51.028Z","1.0.0":"2023-04-19T01:01:05.857Z","1.0.1":"2023-04-20T09:33:09.631Z","1.0.2":"2023-04-20T09:36:33.630Z","1.1.0":"2023-04-22T20:04:51.458Z","1.1.1":"2023-04-24T18:36:41.622Z","1.2.0":"2023-04-24T22:42:17.434Z","2.0.0":"2023-05-29T18:37:29.884Z","3.0.0":"2023-11-27T21:17:36.650Z","18.0.0":"2025-01-20T07:18:00.686Z","19.0.0":"2025-06-24T09:18:13.530Z","20.0.0":"2025-06-28T20:07:48.677Z","21.0.0":"2026-09-17T17:38:26.985Z","22.0.0":"2026-09-18T09:51:50.882Z"},"description":"A package with base classes that are frequently used in my Angular projects.","maintainers":[{"name":"bruno-bombonate","email":"bruno.siecola@outlook.com"}],"readme":"\n# @bruno-bombonate/ngx-classes\n\nA package with base classes that are frequently used in my Angular projects.\n\n## Installation\n\n```bash\nnpm install @bruno-bombonate/ngx-classes\n```\n\n### Compatibility table\n\n|@bruno-bombonate/ngx-classes|Angular|\n|-|-|\n|1.2.0|15.x|\n|2.0.0|16.x|\n|3.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## Usage\n\n### ListContainerClass\n\nList containers are responsible for fetching data from the server. Data presentation must be made at [child component](#listcomponentclass).\n\n```typescript\nimport { Component, inject } from '@angular/core';\nimport { UserSearchFormComponent } from '../../components/user-search-form/user-search-form.component';\nimport { UserListComponent } from '../../components/user-list/user-list.component';\nimport { ListContainerClass, SearchParamType, SearchParamValueType } from '@bruno-bombonate/ngx-classes';\nimport { HttpService } from '../../../../../../utils/services/http/http.service';\nimport { ToastService } from '@bruno-bombonate/ngx-toast';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\n@Component({\n  selector: 'app-users-list',\n  imports: [\n    // components\n    UserSearchFormComponent,\n    UserListComponent\n  ],\n  templateUrl: './users-list.component.html',\n  styleUrl: './users-list.component.sass'\n})\nexport class UsersListComponent extends ListContainerClass {\n\n  private readonly httpService = inject(HttpService);\n  private readonly toastService = inject(ToastService);\n\n  public override listSearchParamsList = [\n    { name: 'page', type: SearchParamType.QueryParam, valueType: SearchParamValueType.Number, valueDefault: 1 },\n    { name: 'limit', type: SearchParamType.QueryParam, valueType: SearchParamValueType.Number, valueDefault: 20 },\n    { name: 'orderBy', type: SearchParamType.QueryParam, valueType: SearchParamValueType.String, valueDefault: 'userId' },\n    { name: 'orderByDirection', type: SearchParamType.QueryParam, valueType: SearchParamValueType.String, valueDefault: 'ASC' },\n    { name: 'userId', type: SearchParamType.QueryParam, valueType: SearchParamValueType.Number },\n    { name: 'userName', type: SearchParamType.QueryParam, valueType: SearchParamValueType.String },\n    { name: 'userEmail', type: SearchParamType.QueryParam, valueType: SearchParamValueType.String },\n    { name: 'userStatus', type: SearchParamType.QueryParam, valueType: SearchParamValueType.Boolean }\n  ];\n\n  protected override getList(): void {\n    if (this.listLoading() === false) {\n      this.listLoading.set(true);\n      this.httpService.get({ url: 'users', params: this.listSearchParams() })\n        .pipe(takeUntilDestroyed(this.destroyRef))\n        .subscribe({\n          next: (response: any) => {\n            this.list.set(response.data);\n            this.listLength.set(response.length);\n            this.listLoading.set(false);\n          },\n          error: (response: any) => {\n            this.toastService.error(response.message);\n            this.listLoading.set(false);\n          }\n        });\n    }\n  }\n\n}\n```\n\n`ListContainerClass` gives you, ready to use in your template:\n\n- `list: Signal<any[]>`, `listLength: Signal<number>`, `listLoading: Signal<boolean>` — set them yourself inside `getList()`, as shown above.\n- `listSearchParams: Signal<any>` — the current search params, already read from the route and coerced to the right type (see `SearchParam` below). Pass it as `[formData]` to your search-form component.\n- `handleListSearchFormChange(value: any): void` — bind it to your search-form's `(formChange)`. It merges `value` into the current search params, resets `page` back to `1`, and navigates (updating the URL's query params) — which in turn re-triggers `getList()` through the `queryParams` subscription set up by the base class.\n- `handleListPageChange(pageEvent: any): void` — bind it to a paginator's page-change event (any object with a `pageIndex` property). Same idea as above, but only touches `page`.\n\n#### The `SearchParam` array\n\nEach entry in `listSearchParamsList` describes one filter/param your list understands:\n\n```typescript\nexport enum SearchParamType {\n  Param = 'paramMap',       // a route path segment, e.g. the :id in /users/:id\n  QueryParam = 'queryParamMap' // a query string param, e.g. ?page=1\n}\n\nexport enum SearchParamValueType {\n  Number = 'number',\n  String = 'string',\n  Boolean = 'boolean'\n}\n\nexport interface SearchParam {\n  name: string;\n  type: SearchParamType;\n  valueType: SearchParamValueType;\n  valueDefault?: number | string | boolean;\n}\n```\n\n`type` decides whether the raw value is read from `activatedRoute.snapshot.paramMap` or `.queryParamMap`; `valueType` decides how the raw (always-a-string) value gets coerced — this coercion is done with the exported `transform`/`transformNumber`/`transformString`/`transformBoolean` functions, which you can also import and use on their own if you need the same string-to-typed-value coercion somewhere else in your app.\n\n### ListComponentClass\n\nList components are responsible for presenting data only. HTTP requests must be made at [parent component](#listcontainerclass).\n\n```typescript\nimport { Component } from '@angular/core';\nimport { RouterLink } from '@angular/router';\nimport { StatusPipe } from '../../../../../../../../../../utils/pipes/status/status.pipe';\nimport { ListComponentClass } from '@bruno-bombonate/ngx-classes';\n\n@Component({\n  selector: 'app-user-list',\n  imports: [\n    // directives\n    RouterLink,\n    // pipes\n    StatusPipe\n  ],\n  templateUrl: './user-list.component.html',\n  styleUrl: './user-list.component.sass'\n})\nexport class UserListComponent extends ListComponentClass { }\n```\n\n### ViewComponentClass\n\nView components are responsible for presenting data only. HTTP requests must be made at parent component.\n\n```typescript\nimport { Component } from '@angular/core';\nimport { DatePipe } from '@angular/common';\nimport { StatusPipe } from '../../../../../../../../../../utils/pipes/status/status.pipe';\nimport { ViewComponentClass } from '@bruno-bombonate/ngx-classes';\n\n@Component({\n  selector: 'app-user-view',\n  imports: [\n    // pipes\n    DatePipe,\n    StatusPipe\n  ],\n  templateUrl: './user-view.component.html',\n  styleUrl: './user-view.component.sass'\n})\nexport class UserViewComponent extends ViewComponentClass { }\n```\n\n### FormComponentClass\n\nForm components are responsible for manipulating data and passing it on. HTTP requests must be made at [parent component](#destroyrefclass).\n\n```typescript\nimport { Component, OnChanges, input } from '@angular/core';\nimport { ReactiveFormsModule, FormGroup, FormControl, Validators } from '@angular/forms';\nimport { ControlErrorComponent } from '@bruno-bombonate/ngx-forms';\nimport { FormComponentClass } from '@bruno-bombonate/ngx-classes';\n\n@Component({\n  selector: 'app-user-form',\n  imports: [\n    // modules\n    ReactiveFormsModule,\n    // components\n    ControlErrorComponent\n  ],\n  templateUrl: './user-form.component.html',\n  styleUrl: './user-form.component.sass'\n})\nexport class UserFormComponent extends FormComponentClass implements OnChanges {\n  \n  public override readonly form = input(\n    new FormGroup({\n      name: new FormControl<null | string>(null, [Validators.required]),\n      email: new FormControl<null | string>(null, [Validators.required, Validators.email]),\n      password: new FormControl<null | string>(null, [Validators.required])\n    })\n  );\n\n}\n```\n\n`FormComponentClass` already wires up, so you only need to override `form` (and optionally `mapInputValue`/`mapOutputValue`):\n\n- **Inputs**: `form` (your `FormGroup`, override it as shown above), `formData` (pass the record being edited; on its first change it's mapped through `mapInputValue` and patched into `form` without emitting `formChange`), `formLoading` (disable double-submits while `true` — it's checked by `handleNgSubmit`), `formReset` (a `Subject<void>`; call `.next()` on the instance you pass in to reset the form, e.g. after a successful non-navigating submit).\n- **Outputs**: `formSubmit` (emits the value mapped through `mapOutputValue`, only when the form is valid and `formLoading` is `false`), `formChange` (emits on every value change, debounced 500ms, also mapped through `mapOutputValue` — bind it to `handleListSearchFormChange` of a [`ListContainerClass`](#listcontainerclass) for a live search form), `formBack` (not emitted by the base class itself — it's there for you to `emit()` from your own component when you add a cancel/back action, so callers have one consistent output to listen to).\n- **`mapInputValue(value)` / `mapOutputValue(value)`** — override these `protected` methods when the shape of `formData` (coming from the API) doesn't match the shape `form` expects, or vice-versa (e.g. splitting/joining a nested `password` group, like the sign-up form in this project's own boilerplate does).\n- **Submit with an invalid form**: `handleNgSubmit` (bind it to `(ngSubmit)` on your `<form>`) calls `form.markAllAsTouched()` and, if still invalid, scrolls the first control matching `.ng-invalid` **inside this component's own host element** into view — it won't reach into other components on the page, and it skips the `<form>` element itself (which also gets `.ng-invalid` from Angular when its group is invalid).\n\n### SignalFormComponentClass\n\nThe Signal Forms (`@angular/forms/signals`) counterpart of `FormComponentClass`. It's a separate class, not an overload of the same one: a Reactive `FormGroup` is handed to `FormComponentClass` as a ready-made `input()`, but a Signal Forms formModel/schema is normally built inside the component itself via `signal()` + `form()`, so `formModel` and `form` are declared here as `abstract` properties for your component to define, not as inputs.\n\n```typescript\nimport { Component, signal } from '@angular/core';\nimport { FormRoot, FormField, form, required, email } from '@angular/forms/signals';\nimport { ControlErrorComponent } from '@bruno-bombonate/ngx-forms';\nimport { SignalFormComponentClass } from '@bruno-bombonate/ngx-classes';\n\ninterface UserFormModel {\n  name: string;\n  email: string;\n}\n\n@Component({\n  selector: 'app-user-form',\n  imports: [\n    // modules\n    FormRoot,\n    FormField,\n    // components\n    ControlErrorComponent\n  ],\n  templateUrl: './user-form.component.html',\n  styleUrl: './user-form.component.sass'\n})\nexport class UserFormComponent extends SignalFormComponentClass<UserFormModel> {\n\n  protected override readonly formModel = signal<UserFormModel>({\n    name: '',\n    email: ''\n  });\n\n  protected override readonly form = form(this.formModel, (path) => {\n    required(path.name);\n    required(path.email);\n    email(path.email);\n  });\n\n}\n```\n\n```html\n<form [formRoot]=\"form\" (submit)=\"handleSubmit()\">\n  <input [formField]=\"form.name\" />\n  <control-error [control]=\"form.name\" />\n  <input [formField]=\"form.email\" type=\"email\" />\n  <control-error [control]=\"form.email\" />\n</form>\n```\n\n`FormRoot` and `FormField` are the directives Signal Forms itself provides (from `@angular/forms/signals`) — `[formRoot]` wires the `<form>` element up to the root field, and `[formField]` binds an individual input/select/textarea to a field.\n\n- **Inputs**: `formData` (same role as in `FormComponentClass` — pass the record being edited; it's mapped through `mapInputValue` and merged into `formModel` without marking the field dirty, so it never triggers `formChange`), `formLoading`, `formReset` (a `Subject<void>`; call `.next()` to restore `formModel` to the value it had when the component was created and clear the field's touched/dirty state).\n- **Outputs**: same three as `FormComponentClass` — `formSubmit`, `formChange` (debounced 500ms, only for edits the user actually made through a bound control, not for `formData` updates), `formBack`.\n- **`formModel` / `form`** — declare these two `abstract` properties in your subclass, as shown above. `form` is what you bind to `[control]`/`[formRoot]` in the template and read for validation state; `formModel` is the plain signal holding the value.\n- **CSS classes required for the submit-scroll behavior**: unlike Reactive Forms, Signal Forms does not add `ng-invalid`/`ng-touched`/etc. classes by default. Call [`provideNgxForms()`](../ngx-forms/README.md) in your `app.config.ts` (even with no arguments) so `handleSubmit`'s scroll-to-first-invalid-field behavior has a `.ng-invalid` class to look for.\n- **`<control-error>`** (from `@bruno-bombonate/ngx-forms`) accepts a Signal Forms field the same way it accepts a Reactive `AbstractControl` — see [its README](../ngx-forms/README.md) for the dual-support details.\n\n### DestroyRefClass\n\nThis is a wildcard class that you must extend ever where is a subscription, making it easier to unsubscribe using takeUntilDestroyed.\n\n```typescript\nimport { Component, inject, signal } from '@angular/core';\nimport { UserFormComponent } from '../../components/user-form/user-form.component';\nimport { DestroyRefClass } from '@bruno-bombonate/ngx-classes';\nimport { HttpService } from '../../../../../../utils/services/http/http.service';\nimport { ToastService } from '@bruno-bombonate/ngx-toast';\nimport { Router, ActivatedRoute } from '@angular/router';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\n@Component({\n  selector: 'app-users-add',\n  imports: [\n    // components\n    UserFormComponent\n  ],\n  templateUrl: './users-add.component.html',\n  styleUrl: './users-add.component.sass'\n})\nexport class UsersAddComponent extends DestroyRefClass {\n\n  private readonly httpService = inject(HttpService);\n  private readonly toastService = inject(ToastService);\n  private readonly router = inject(Router);\n  public readonly activatedRoute = inject(ActivatedRoute);\n\n  public readonly formLoading = signal<boolean>(false);\n\n  public handleFormSubmit(value: any): void {\n    if (this.formLoading() === false) {\n      this.formLoading.set(true);\n      this.httpService.post({ url: 'users', body: value })\n        .pipe(takeUntilDestroyed(this.destroyRef))\n        .subscribe({\n          next: (response: any) => {\n            this.toastService.success(response.message);\n            this.router.navigate(['../'], { relativeTo: this.activatedRoute });\n          },\n          error: (response: any) => {\n            this.toastService.error(response.message);\n            this.formLoading.set(false);\n          }\n        });\n    }\n  }\n\n}\n```\n","readmeFilename":"README.md"}