{"_id":"@suntelecoms/ngx-dynamic-form","_rev":"38-f7cebdd6d5b9a9fe29973b9bef4b342f","name":"@suntelecoms/ngx-dynamic-form","dist-tags":{"latest":"1.7.21"},"versions":{"1.1.0":{"name":"@suntelecoms/ngx-dynamic-form","version":"1.1.0","keywords":["angular","dynamic-form","reactive-forms","angular-material","suntelecoms"],"author":{"name":"Amadou Diallo","email":"amadoumacbookpro38@gmail.com"},"license":"MIT","_id":"@suntelecoms/ngx-dynamic-form@1.1.0","maintainers":[{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"}],"dist":{"shasum":"66317aae23b561a1255a36d8539cb03f8028491c","tarball":"https://registry.npmjs.org/@suntelecoms/ngx-dynamic-form/-/ngx-dynamic-form-1.1.0.tgz","fileCount":20,"integrity":"sha512-H32WTpFUqjXxGYNgWpikZ+zxHfIj2OMPvSu7mPSgkYgxh6DaqrJgxvbSYYgd3N9PohqA+ug4sdyLmb5S0MHJ7g==","signatures":[{"sig":"MEUCIQCD6wEgkI9uOJkbr+KMFOAJtbZvMR5fYY4RcQwgxnTQcgIgcSPV6ErRGJCYKq98Zk9LJ2CNYaRJpHd3vCRdNXwidxM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":315631},"module":"fesm2022/suntelecoms-ngx-dynamic-form.mjs","exports":{".":{"types":"./index.d.ts","default":"./fesm2022/suntelecoms-ngx-dynamic-form.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"4dd941a7de696e160c1bb7ef7d7ef84ee1dbcad5","typings":"index.d.ts","_npmUser":{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"},"_npmVersion":"10.2.4","description":"Générateur de formulaires Angular dynamiques — SUNTELECOMS","directories":{},"sideEffects":false,"_nodeVersion":"18.19.1","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/cdk":">=19.0.0","@angular/core":">=19.0.0","@angular/forms":">=19.0.0","@angular/common":">=19.0.0","@angular/router":">=19.0.0","@angular/material":">=19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ngx-dynamic-form_1.1.0_1781919332660_0.38031408612912565","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"@suntelecoms/ngx-dynamic-form","version":"1.1.1","keywords":["angular","dynamic-form","reactive-forms","angular-material","suntelecoms"],"author":{"name":"Amadou Diallo","email":"amadoumacbookpro38@gmail.com"},"license":"MIT","_id":"@suntelecoms/ngx-dynamic-form@1.1.1","maintainers":[{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"}],"dist":{"shasum":"52e305813c5f98a50f082d43f7fcdce9597388ed","tarball":"https://registry.npmjs.org/@suntelecoms/ngx-dynamic-form/-/ngx-dynamic-form-1.1.1.tgz","fileCount":20,"integrity":"sha512-/vcJo3uEqWMqUw/vsh3YPdf5WxBR9a2RY0v+DQW9XdVJ/EkKHprE11VpgTCkqIrQROGlr9Uz2PEufPUboVb72w==","signatures":[{"sig":"MEUCIB5rbk1mZQ6PbtoKQsOiA+Sj1flu9gXMDPUWYciUgE/qAiEA5ojK4LXS7NaYYg2YaCOFBRi17hZ86PjHwI8KNoZa90I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":316796},"module":"fesm2022/suntelecoms-ngx-dynamic-form.mjs","exports":{".":{"types":"./index.d.ts","default":"./fesm2022/suntelecoms-ngx-dynamic-form.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"4b4b7560bbdf6fc558acf0e78a3740b66daabf20","typings":"index.d.ts","_npmUser":{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"},"_npmVersion":"10.2.4","description":"Générateur de formulaires Angular dynamiques — SUNTELECOMS","directories":{},"sideEffects":false,"_nodeVersion":"18.19.1","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/cdk":">=19.0.0","@angular/core":">=19.0.0","@angular/forms":">=19.0.0","@angular/common":">=19.0.0","@angular/router":">=19.0.0","@angular/material":">=19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ngx-dynamic-form_1.1.1_1782081444712_0.8969844275340473","host":"s3://npm-registry-packages-npm-production"}},"1.1.2":{"name":"@suntelecoms/ngx-dynamic-form","version":"1.1.2","keywords":["angular","dynamic-form","reactive-forms","angular-material","suntelecoms"],"author":{"name":"Amadou Diallo","email":"amadoumacbookpro38@gmail.com"},"license":"MIT","_id":"@suntelecoms/ngx-dynamic-form@1.1.2","maintainers":[{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"}],"dist":{"shasum":"1e268dd43c6ca1535fbd65d2aa6afa59f7f28483","tarball":"https://registry.npmjs.org/@suntelecoms/ngx-dynamic-form/-/ngx-dynamic-form-1.1.2.tgz","fileCount":20,"integrity":"sha512-G+w6Rc7pTWum+0ntpIva+ZTbr8HeshoK06rjYAphiKRMq96x0a9Ihp+Jip9VnBkgR2Hb0ibi2r29uVhJzORd6Q==","signatures":[{"sig":"MEUCIANnd/2ZcJIPzBN1mmHgUDGxoBDjyHT2Kp/2qeK0E3ihAiEAnc5P1hBoj3//U83kiq2yrdW0I+4IfY1nqgB4mENfzQ8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":316924},"module":"fesm2022/suntelecoms-ngx-dynamic-form.mjs","exports":{".":{"types":"./index.d.ts","default":"./fesm2022/suntelecoms-ngx-dynamic-form.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"4b4b7560bbdf6fc558acf0e78a3740b66daabf20","typings":"index.d.ts","_npmUser":{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"},"_npmVersion":"10.2.4","description":"Générateur de formulaires Angular dynamiques — SUNTELECOMS","directories":{},"sideEffects":false,"_nodeVersion":"18.19.1","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/cdk":">=19.0.0","@angular/core":">=19.0.0","@angular/forms":">=19.0.0","@angular/common":">=19.0.0","@angular/router":">=19.0.0","@angular/material":">=19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ngx-dynamic-form_1.1.2_1782081943428_0.3537861409900185","host":"s3://npm-registry-packages-npm-production"}},"1.1.3":{"name":"@suntelecoms/ngx-dynamic-form","version":"1.1.3","keywords":["angular","dynamic-form","reactive-forms","angular-material","suntelecoms"],"author":{"name":"Amadou Diallo","email":"amadoumacbookpro38@gmail.com"},"license":"MIT","_id":"@suntelecoms/ngx-dynamic-form@1.1.3","maintainers":[{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"}],"dist":{"shasum":"97631b7785ee95f5cc36f4828a7929c73849ce52","tarball":"https://registry.npmjs.org/@suntelecoms/ngx-dynamic-form/-/ngx-dynamic-form-1.1.3.tgz","fileCount":20,"integrity":"sha512-gGivqjCziq9cZJVD9ntL4fGLpBkyKhEkfUyOvoBGSr9nVKYOUds6h8xuzKr0QSDCpMF+A1aexUgQTpGI22r6PA==","signatures":[{"sig":"MEUCID0S10kBbHuS65y1jX7ftk3rrfUeSdm/MOFLgRzjy00wAiEA1MC603X0sf8DX+OHRwtNzO4YieHmimZzNe1KSuzBU8I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":329386},"module":"fesm2022/suntelecoms-ngx-dynamic-form.mjs","exports":{".":{"types":"./index.d.ts","default":"./fesm2022/suntelecoms-ngx-dynamic-form.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"aba7b92888accf6e8d69c9c624bb582a8ff6dc59","typings":"index.d.ts","_npmUser":{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"},"_npmVersion":"10.2.4","description":"Générateur de formulaires Angular dynamiques — SUNTELECOMS","directories":{},"sideEffects":false,"_nodeVersion":"18.19.1","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/cdk":">=19.0.0","@angular/core":">=19.0.0","@angular/forms":">=19.0.0","@angular/common":">=19.0.0","@angular/router":">=19.0.0","@angular/material":">=19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ngx-dynamic-form_1.1.3_1782082418861_0.46666605350887536","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@suntelecoms/ngx-dynamic-form","version":"1.2.0","keywords":["angular","dynamic-form","reactive-forms","angular-material","suntelecoms"],"author":{"name":"Amadou Diallo","email":"amadoumacbookpro38@gmail.com"},"license":"MIT","_id":"@suntelecoms/ngx-dynamic-form@1.2.0","maintainers":[{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"}],"dist":{"shasum":"e79c793943ae1925a6cdeb216a390a3ef129eeda","tarball":"https://registry.npmjs.org/@suntelecoms/ngx-dynamic-form/-/ngx-dynamic-form-1.2.0.tgz","fileCount":21,"integrity":"sha512-RG3w4Ski6dy9KcbGjVrhcT4uCR+GYxoh8Zg3z/2stlb+GnHAFrKyfTqpEf9BLk+J5+QlWYOpQ5bGWrwQ/hadlw==","signatures":[{"sig":"MEQCIHFeVYdGwL4jcVMaPdUA7BK1/CUmd5xUlO8vCTzM/00PAiBP27Alq5FBcEizJPv/scS130KqsMaV4iJ/F/cxmW4S2g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":411750},"module":"fesm2022/suntelecoms-ngx-dynamic-form.mjs","exports":{".":{"types":"./index.d.ts","default":"./fesm2022/suntelecoms-ngx-dynamic-form.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"81616e3c489ae94a976fc91657f8060b85d556aa","typings":"index.d.ts","_npmUser":{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"},"_npmVersion":"10.2.4","description":"Générateur de formulaires Angular dynamiques — SUNTELECOMS","directories":{},"sideEffects":false,"_nodeVersion":"18.19.1","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/cdk":">=19.0.0","@angular/core":">=19.0.0","@angular/forms":">=19.0.0","@angular/common":">=19.0.0","@angular/router":">=19.0.0","@angular/material":">=19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ngx-dynamic-form_1.2.0_1782084954885_0.9942616070364054","host":"s3://npm-registry-packages-npm-production"}},"1.2.3":{"name":"@suntelecoms/ngx-dynamic-form","version":"1.2.3","keywords":["angular","dynamic-form","reactive-forms","angular-material","suntelecoms"],"author":{"name":"Amadou Diallo","email":"amadoumacbookpro38@gmail.com"},"license":"MIT","_id":"@suntelecoms/ngx-dynamic-form@1.2.3","maintainers":[{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"}],"dist":{"shasum":"7486845fa523155680cad102cb36cbb47b701732","tarball":"https://registry.npmjs.org/@suntelecoms/ngx-dynamic-form/-/ngx-dynamic-form-1.2.3.tgz","fileCount":21,"integrity":"sha512-kPH8sWGeKQPXb77E5gygFMNm3ma3Sp+05STrTTCR396K3abP3PFaYRxZqyAfWckzGDR450TapHomR0EIXg/WKA==","signatures":[{"sig":"MEQCIGd05hJ3jgkzyMfUdpAf6gX3f8V7/+6miYvuRKOwsUarAiAujfCg4sDNSLfAFMjm0GE48m70lluHX/7Tbo81of2imQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":423358},"module":"fesm2022/suntelecoms-ngx-dynamic-form.mjs","exports":{".":{"types":"./index.d.ts","default":"./fesm2022/suntelecoms-ngx-dynamic-form.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"adbbe2fa2c5223faecc3ee70cf847437b204d723","typings":"index.d.ts","_npmUser":{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"},"_npmVersion":"10.2.4","description":"Générateur de formulaires Angular dynamiques — SUNTELECOMS","directories":{},"sideEffects":false,"_nodeVersion":"18.19.1","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/cdk":">=19.0.0","@angular/core":">=19.0.0","@angular/forms":">=19.0.0","@angular/common":">=19.0.0","@angular/router":">=19.0.0","@angular/material":">=19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ngx-dynamic-form_1.2.3_1782086543422_0.9379222155180693","host":"s3://npm-registry-packages-npm-production"}},"1.2.5":{"name":"@suntelecoms/ngx-dynamic-form","version":"1.2.5","keywords":["angular","dynamic-form","reactive-forms","angular-material","suntelecoms"],"author":{"name":"Amadou Diallo","email":"amadoumacbookpro38@gmail.com"},"license":"MIT","_id":"@suntelecoms/ngx-dynamic-form@1.2.5","maintainers":[{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"}],"dist":{"shasum":"316f6c1da6ab6545ef079e3c18b2bf15f44447ab","tarball":"https://registry.npmjs.org/@suntelecoms/ngx-dynamic-form/-/ngx-dynamic-form-1.2.5.tgz","fileCount":21,"integrity":"sha512-MeqhMM0D7TgpD1OLvvbgM3bc//2FVZbAsR+yaV9mYDC/pKVeB9alr3yoVUfQlV/Q3+Naxvl6aGCgi8ALqKThCA==","signatures":[{"sig":"MEQCICPCwaC37Aba+cpS+sPR43XWFM9JVxUl6OheOrZyDDOfAiBjpyCdUGkME6oUDt6pL+ZRiUf0WdrMCPmVEkXpbjYM8w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":448684},"module":"fesm2022/suntelecoms-ngx-dynamic-form.mjs","exports":{".":{"types":"./index.d.ts","default":"./fesm2022/suntelecoms-ngx-dynamic-form.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"9020dcaf65251c35016bc153c94bbaad716b492a","typings":"index.d.ts","_npmUser":{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"},"_npmVersion":"10.2.4","description":"Générateur de formulaires Angular dynamiques — SUNTELECOMS","directories":{},"sideEffects":false,"_nodeVersion":"18.19.1","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/cdk":">=19.0.0","@angular/core":">=19.0.0","@angular/forms":">=19.0.0","@angular/common":">=19.0.0","@angular/router":">=19.0.0","@angular/material":">=19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ngx-dynamic-form_1.2.5_1782113793942_0.15897228859084223","host":"s3://npm-registry-packages-npm-production"}},"1.2.6":{"name":"@suntelecoms/ngx-dynamic-form","version":"1.2.6","keywords":["angular","dynamic-form","reactive-forms","angular-material","suntelecoms"],"author":{"name":"Amadou Diallo","email":"amadoumacbookpro38@gmail.com"},"license":"MIT","_id":"@suntelecoms/ngx-dynamic-form@1.2.6","maintainers":[{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"}],"dist":{"shasum":"bf64a7c3070bf84086d68b0ba4b211fe92102c71","tarball":"https://registry.npmjs.org/@suntelecoms/ngx-dynamic-form/-/ngx-dynamic-form-1.2.6.tgz","fileCount":21,"integrity":"sha512-xUU7nJpfXzHHtNZZSuyc8Fi/mBaA3gvU5khvg0yxdf/3MhIuAGJH5kAeWKTGVfz6v9fo5XX7m9rj4O4US/TAkQ==","signatures":[{"sig":"MEQCIAfIXY3IW7HaqljgV+7Hpl8Z1L4IAJTl4dc8ClUTuGBoAiBOC8a5s4qHt+8bfLzNYEkK0FL9U2tfYKHB8X0q3GnhCQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":454919},"module":"fesm2022/suntelecoms-ngx-dynamic-form.mjs","exports":{".":{"types":"./index.d.ts","default":"./fesm2022/suntelecoms-ngx-dynamic-form.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"9020dcaf65251c35016bc153c94bbaad716b492a","typings":"index.d.ts","_npmUser":{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"},"_npmVersion":"10.2.4","description":"Générateur de formulaires Angular dynamiques — SUNTELECOMS","directories":{},"sideEffects":false,"_nodeVersion":"18.19.1","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/cdk":">=19.0.0","@angular/core":">=19.0.0","@angular/forms":">=19.0.0","@angular/common":">=19.0.0","@angular/router":">=19.0.0","@angular/material":">=19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ngx-dynamic-form_1.2.6_1782115139899_0.4732278936099765","host":"s3://npm-registry-packages-npm-production"}},"1.2.8":{"name":"@suntelecoms/ngx-dynamic-form","version":"1.2.8","keywords":["angular","dynamic-form","reactive-forms","angular-material","suntelecoms"],"author":{"name":"Amadou Diallo","email":"amadoumacbookpro38@gmail.com"},"license":"MIT","_id":"@suntelecoms/ngx-dynamic-form@1.2.8","maintainers":[{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"}],"dist":{"shasum":"84fbdb8df073ac6a5ec35a95bd60d63baf4ac303","tarball":"https://registry.npmjs.org/@suntelecoms/ngx-dynamic-form/-/ngx-dynamic-form-1.2.8.tgz","fileCount":21,"integrity":"sha512-3Lnq2lUiGFpbElH1gpbehoxjuW7lF43T48488AnEh8fhdBEbzzRZz2bljQSx0pNz1U3iL+ezi2WSCTlO/b4suQ==","signatures":[{"sig":"MEQCIE/Ngpxv1muHbSTm3DyfV3DrSmAuP5R8I4UhOyoDaThUAiBGrHeO/n++PuxA6ftiRc4pWln7OzTu6Cu0UJGP6Lc1oA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":595003},"module":"fesm2022/suntelecoms-ngx-dynamic-form.mjs","exports":{".":{"types":"./index.d.ts","default":"./fesm2022/suntelecoms-ngx-dynamic-form.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"322aa31753d82278a10dede0400f3b7aac76bb86","typings":"index.d.ts","_npmUser":{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"},"_npmVersion":"10.2.4","description":"Générateur de formulaires Angular dynamiques — SUNTELECOMS","directories":{},"sideEffects":false,"_nodeVersion":"18.19.1","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/cdk":">=19.0.0","@angular/core":">=19.0.0","@angular/forms":">=19.0.0","@angular/common":">=19.0.0","@angular/router":">=19.0.0","@angular/material":">=19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ngx-dynamic-form_1.2.8_1782336870681_0.06280396352431206","host":"s3://npm-registry-packages-npm-production"}},"1.2.9":{"name":"@suntelecoms/ngx-dynamic-form","version":"1.2.9","keywords":["angular","dynamic-form","reactive-forms","angular-material","suntelecoms"],"author":{"name":"Amadou Diallo","email":"amadoumacbookpro38@gmail.com"},"license":"MIT","_id":"@suntelecoms/ngx-dynamic-form@1.2.9","maintainers":[{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"}],"dist":{"shasum":"c237529102430d7cc24880329fd0ae2ca26e6a46","tarball":"https://registry.npmjs.org/@suntelecoms/ngx-dynamic-form/-/ngx-dynamic-form-1.2.9.tgz","fileCount":21,"integrity":"sha512-3Ly2qhM/HjGRTc7w4eCJ4ExRvXz0fHJXUx9iIKMGFuGhibVoiii4wuCZrI3rgQ/vU71Ff95poMKFhCGzqjSBZg==","signatures":[{"sig":"MEYCIQDt46uJbIS3ZOeY1m6KpwgLd03GT2Qr+T51Z2+8c6YgNQIhAJQjqiH71GN2EDMmzrTZFW57bv5xvm4zpdCsu5OWWBR8","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":603227},"module":"fesm2022/suntelecoms-ngx-dynamic-form.mjs","exports":{".":{"types":"./index.d.ts","default":"./fesm2022/suntelecoms-ngx-dynamic-form.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"db4b278626c524441b9b455c4cf7ae121a537441","typings":"index.d.ts","_npmUser":{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"},"_npmVersion":"10.2.4","description":"Générateur de formulaires Angular dynamiques — SUNTELECOMS","directories":{},"sideEffects":false,"_nodeVersion":"18.19.1","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/cdk":">=19.0.0","@angular/core":">=19.0.0","@angular/forms":">=19.0.0","@angular/common":">=19.0.0","@angular/router":">=19.0.0","@angular/material":">=19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ngx-dynamic-form_1.2.9_1782691565637_0.5565494315487296","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@suntelecoms/ngx-dynamic-form","version":"1.3.0","keywords":["angular","dynamic-form","reactive-forms","angular-material","suntelecoms"],"author":{"name":"Amadou Diallo","email":"amadoumacbookpro38@gmail.com"},"license":"MIT","_id":"@suntelecoms/ngx-dynamic-form@1.3.0","maintainers":[{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"}],"dist":{"shasum":"1524d3a427992c6c7f019bf5add1b481e4b65566","tarball":"https://registry.npmjs.org/@suntelecoms/ngx-dynamic-form/-/ngx-dynamic-form-1.3.0.tgz","fileCount":22,"integrity":"sha512-P8jVV5DZi3se5c0pSoEv744N5ZOfoJP391gasV5YqUk+byPW2e9kVQvc+VLXcyw6JuvcCQK90f+6DZZk4JBJ/w==","signatures":[{"sig":"MEUCIDCXlDNpgbSBYkIlxTiQQ8xWHIgjr7WX+RrzsWBXeZQ9AiEA+hxMK8SAe+TzT0Kx4Zk5vNx89wvI1tGxD3s248hHvU4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":619542},"module":"fesm2022/suntelecoms-ngx-dynamic-form.mjs","exports":{".":{"types":"./index.d.ts","default":"./fesm2022/suntelecoms-ngx-dynamic-form.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"5c6976a50d89b4758d6095177766f98914e8eca4","typings":"index.d.ts","_npmUser":{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"},"_npmVersion":"10.9.8","description":"Générateur de formulaires Angular dynamiques — SUNTELECOMS","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/cdk":">=19.0.0","@angular/core":">=19.0.0","@angular/forms":">=19.0.0","@angular/common":">=19.0.0","@angular/router":">=19.0.0","@angular/material":">=19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ngx-dynamic-form_1.3.0_1783634142175_0.8389450246243948","host":"s3://npm-registry-packages-npm-production"}},"1.3.1":{"name":"@suntelecoms/ngx-dynamic-form","version":"1.3.1","keywords":["angular","dynamic-form","reactive-forms","angular-material","suntelecoms"],"author":{"name":"Amadou Diallo","email":"amadoumacbookpro38@gmail.com"},"license":"MIT","_id":"@suntelecoms/ngx-dynamic-form@1.3.1","maintainers":[{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"}],"dist":{"shasum":"64c127f15b946395a49add1f6cb06055bf277196","tarball":"https://registry.npmjs.org/@suntelecoms/ngx-dynamic-form/-/ngx-dynamic-form-1.3.1.tgz","fileCount":22,"integrity":"sha512-IYMETssnRdPiufwD+HulGoYDP42ks/6jHD4srbHxEEV3+RX3VKDb6FUWSxKZ34026GW9vwPKhVqfDQ/pvotlHA==","signatures":[{"sig":"MEQCICSrYCy8bBkHEAElWKjV7DIxeabdwrQRaCHKQeQtFl78AiB9gJmh+n9ejL0hPcnuW/6XnE/XUVqTr5TEhnSyZTncEA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":620170},"module":"fesm2022/suntelecoms-ngx-dynamic-form.mjs","exports":{".":{"types":"./index.d.ts","default":"./fesm2022/suntelecoms-ngx-dynamic-form.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"97656bdd646fb8292b8a2d26d09a9c262a654ae2","typings":"index.d.ts","_npmUser":{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"},"_npmVersion":"10.9.8","description":"Générateur de formulaires Angular dynamiques — SUNTELECOMS","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/cdk":">=19.0.0","@angular/core":">=19.0.0","@angular/forms":">=19.0.0","@angular/common":">=19.0.0","@angular/router":">=19.0.0","@angular/material":">=19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ngx-dynamic-form_1.3.1_1783635261332_0.9874877363027359","host":"s3://npm-registry-packages-npm-production"}},"1.3.2":{"name":"@suntelecoms/ngx-dynamic-form","version":"1.3.2","keywords":["angular","dynamic-form","reactive-forms","angular-material","suntelecoms"],"author":{"name":"Amadou Diallo","email":"amadoumacbookpro38@gmail.com"},"license":"MIT","_id":"@suntelecoms/ngx-dynamic-form@1.3.2","maintainers":[{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"}],"dist":{"shasum":"71d41276bf0f93323d72d118e950e67ba62e03be","tarball":"https://registry.npmjs.org/@suntelecoms/ngx-dynamic-form/-/ngx-dynamic-form-1.3.2.tgz","fileCount":22,"integrity":"sha512-rLnLtbrqJRBYP4m7TXQVuv2vq6DkZ2uJdW+8oYRaKk+0pNZ6RB7PhFQIQBQjqvShwMeqKzGttFVXd8tPurUoaA==","signatures":[{"sig":"MEUCIBljwkbUU4nyjy6B1tK7qIrfPu7r8wxXCp0d56+PTa8FAiEAtgKCI68u1XOU/fSUlQCTYZLZvzGLZoxp35RNiprxtAo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":627628},"module":"fesm2022/suntelecoms-ngx-dynamic-form.mjs","exports":{".":{"types":"./index.d.ts","default":"./fesm2022/suntelecoms-ngx-dynamic-form.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"97656bdd646fb8292b8a2d26d09a9c262a654ae2","typings":"index.d.ts","_npmUser":{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"},"_npmVersion":"10.9.8","description":"Générateur de formulaires Angular dynamiques — SUNTELECOMS","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/cdk":">=19.0.0","@angular/core":">=19.0.0","@angular/forms":">=19.0.0","@angular/common":">=19.0.0","@angular/router":">=19.0.0","@angular/material":">=19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ngx-dynamic-form_1.3.2_1783636417097_0.5963066443153757","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"@suntelecoms/ngx-dynamic-form","version":"1.4.0","keywords":["angular","dynamic-form","reactive-forms","angular-material","suntelecoms"],"author":{"name":"Amadou Diallo","email":"amadoumacbookpro38@gmail.com"},"license":"MIT","_id":"@suntelecoms/ngx-dynamic-form@1.4.0","maintainers":[{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"}],"dist":{"shasum":"fead61940aa78150d0eaf7b06a3e3b7ae95efe5d","tarball":"https://registry.npmjs.org/@suntelecoms/ngx-dynamic-form/-/ngx-dynamic-form-1.4.0.tgz","fileCount":24,"integrity":"sha512-FiIv+nG2SfHvUdQHAxx4GOILFzOfDkTsoJ8OqJy+I2eEboy8g4Ba79fGA9Lg1JWzgMPjEj+lJ0nUDS5qUv6eYw==","signatures":[{"sig":"MEUCIHVgaFZz2p8YoHesmbFaQLUkbn29HA1CIBbJZbnLipArAiEAzb/N9iJbBtgcLkBPyrW4kdx17fxRzaGT3gXG8Qx4798=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":691185},"module":"fesm2022/suntelecoms-ngx-dynamic-form.mjs","exports":{".":{"types":"./index.d.ts","default":"./fesm2022/suntelecoms-ngx-dynamic-form.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"2685052e63cf5399bdeea4415917c50df4d066ab","typings":"index.d.ts","_npmUser":{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"},"_npmVersion":"10.9.8","description":"Générateur de formulaires Angular dynamiques — SUNTELECOMS","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/cdk":">=19.0.0","@angular/core":">=19.0.0","@angular/forms":">=19.0.0","@angular/common":">=19.0.0","@angular/router":">=19.0.0","@angular/material":">=19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ngx-dynamic-form_1.4.0_1786404798776_0.69187816573854","host":"s3://npm-registry-packages-npm-production"}},"1.4.1":{"name":"@suntelecoms/ngx-dynamic-form","version":"1.4.1","keywords":["angular","dynamic-form","reactive-forms","angular-material","suntelecoms"],"author":{"name":"Amadou Diallo","email":"amadoumacbookpro38@gmail.com"},"license":"MIT","_id":"@suntelecoms/ngx-dynamic-form@1.4.1","maintainers":[{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"}],"dist":{"shasum":"3eb29c0ab1e17271e87583e373e679c46c5858f5","tarball":"https://registry.npmjs.org/@suntelecoms/ngx-dynamic-form/-/ngx-dynamic-form-1.4.1.tgz","fileCount":24,"integrity":"sha512-voPgZjEzmvW3jO+EA1pRG9r8s9ebWIx66lbpS2vRAthO6GjI7mICFaZ4JT0ZDdlMU+HQR6VV6kUnhUs1VuO6PA==","signatures":[{"sig":"MEQCIArUbxn/ED91V6mDyPS5kgRXlZSoxfJ2ujCbGLZzLq1DAiBFVuw1kSqRJ6Z8gu6Xe0ByKNeZz/s4bbzqJ3kob+ux5A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":736146},"module":"fesm2022/suntelecoms-ngx-dynamic-form.mjs","exports":{".":{"types":"./index.d.ts","default":"./fesm2022/suntelecoms-ngx-dynamic-form.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"a8e2929c3e11fcfe039108f4a5c28edd0aa06de9","typings":"index.d.ts","_npmUser":{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"},"_npmVersion":"10.9.8","description":"Générateur de formulaires Angular dynamiques — SUNTELECOMS","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/cdk":">=19.0.0","@angular/core":">=19.0.0","@angular/forms":">=19.0.0","@angular/common":">=19.0.0","@angular/router":">=19.0.0","@angular/material":">=19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ngx-dynamic-form_1.4.1_1786408437143_0.032338497603776384","host":"s3://npm-registry-packages-npm-production"}},"1.4.2":{"name":"@suntelecoms/ngx-dynamic-form","version":"1.4.2","keywords":["angular","dynamic-form","reactive-forms","angular-material","suntelecoms"],"author":{"name":"Amadou Diallo","email":"amadoumacbookpro38@gmail.com"},"license":"MIT","_id":"@suntelecoms/ngx-dynamic-form@1.4.2","maintainers":[{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"}],"dist":{"shasum":"34bbda2519042be0c450736fc849f996555fc022","tarball":"https://registry.npmjs.org/@suntelecoms/ngx-dynamic-form/-/ngx-dynamic-form-1.4.2.tgz","fileCount":24,"integrity":"sha512-f8EwJRt4Zg/6w7tlDak3IVgsDqdnYeJRI4UFGs5bX3Y1ZzLdU+2ltmkHDVpcqDB5v61Lou//aIjLbE0qfkt2lw==","signatures":[{"sig":"MEQCIHzHjvmNYLFqU6rTTByUK3e31XanirCsV20epE4+CpkPAiB6aCDAAbYxWgHvwq1dhtjCFAGiGcAVxIWUHodK0m4iEA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":736388},"module":"fesm2022/suntelecoms-ngx-dynamic-form.mjs","exports":{".":{"types":"./index.d.ts","default":"./fesm2022/suntelecoms-ngx-dynamic-form.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"83090073cd573971d092fdd3293379d159604275","typings":"index.d.ts","_npmUser":{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"},"_npmVersion":"10.9.8","description":"Générateur de formulaires Angular dynamiques — SUNTELECOMS","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/cdk":">=19.0.0","@angular/core":">=19.0.0","@angular/forms":">=19.0.0","@angular/common":">=19.0.0","@angular/router":">=19.0.0","@angular/material":">=19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ngx-dynamic-form_1.4.2_1786582505226_0.5356359703298232","host":"s3://npm-registry-packages-npm-production"}},"1.5.0":{"name":"@suntelecoms/ngx-dynamic-form","version":"1.5.0","keywords":["angular","dynamic-form","reactive-forms","angular-material","suntelecoms"],"author":{"name":"Amadou Diallo","email":"amadoumacbookpro38@gmail.com"},"license":"MIT","_id":"@suntelecoms/ngx-dynamic-form@1.5.0","maintainers":[{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"}],"dist":{"shasum":"1d9915c755e3ad7ef6af901da2b164737a3c5425","tarball":"https://registry.npmjs.org/@suntelecoms/ngx-dynamic-form/-/ngx-dynamic-form-1.5.0.tgz","fileCount":24,"integrity":"sha512-O2aIB/uIneKZRPP76OWqq8Zbh9cVn9O2iWgur2FnRZDhtBJwt1K2fh/2KEo986EQi0QpH4STVq4T+/FcIZ/Law==","signatures":[{"sig":"MEUCIQDtSrqC6TKh1eeeKYdao9BfoGvWdL/v8gEMwBF9unJyUQIgYBWN1VSyorvQN0LlvUitGr3VPc2BN+iGvplSfVvoOps=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":782467},"module":"fesm2022/suntelecoms-ngx-dynamic-form.mjs","exports":{".":{"types":"./index.d.ts","default":"./fesm2022/suntelecoms-ngx-dynamic-form.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"ebcdb1cde940133712797fc438b04668d8f46789","typings":"index.d.ts","_npmUser":{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"},"_npmVersion":"10.9.8","description":"Générateur de formulaires Angular dynamiques — SUNTELECOMS","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"flag-icons":">=7.0.0","@angular/cdk":">=19.0.0","@angular/core":">=19.0.0","@angular/forms":">=19.0.0","@angular/common":">=19.0.0","@angular/router":">=19.0.0","@angular/material":">=19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ngx-dynamic-form_1.5.0_1786899723550_0.7439457488984555","host":"s3://npm-registry-packages-npm-production"}},"1.5.1":{"name":"@suntelecoms/ngx-dynamic-form","version":"1.5.1","keywords":["angular","dynamic-form","reactive-forms","angular-material","suntelecoms"],"author":{"name":"Amadou Diallo","email":"amadoumacbookpro38@gmail.com"},"license":"MIT","_id":"@suntelecoms/ngx-dynamic-form@1.5.1","maintainers":[{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"}],"dist":{"shasum":"94e5b3ed03b0de4d65d447c1a6b794f3f222da2c","tarball":"https://registry.npmjs.org/@suntelecoms/ngx-dynamic-form/-/ngx-dynamic-form-1.5.1.tgz","fileCount":24,"integrity":"sha512-6jLAUoeDeJk/EjYHLZW7zngdmLfY9pGu4+1lhldwmx1hc2ef2z08VoR33NcKVal7OgWik6R+hf/yJ2Ex6T6lPw==","signatures":[{"sig":"MEUCICfJ3SBSYSwzHYl8/7hcHEPDzEmlSaGOPZGYnEnZIdmwAiEA05OAQEjRp5MHGUZcDCo0XRmPS40SI9Un2VZFkUIsc30=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":782455},"module":"fesm2022/suntelecoms-ngx-dynamic-form.mjs","exports":{".":{"types":"./index.d.ts","default":"./fesm2022/suntelecoms-ngx-dynamic-form.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"ebcdb1cde940133712797fc438b04668d8f46789","typings":"index.d.ts","_npmUser":{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"},"_npmVersion":"10.9.8","description":"Générateur de formulaires Angular dynamiques — SUNTELECOMS","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"flag-icons":">=7.0.0","@angular/cdk":">=19.0.0","@angular/core":">=19.0.0","@angular/forms":">=19.0.0","@angular/common":">=19.0.0","@angular/router":">=19.0.0","@angular/material":">=19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ngx-dynamic-form_1.5.1_1786969993834_0.245662078999052","host":"s3://npm-registry-packages-npm-production"}},"1.6.0":{"name":"@suntelecoms/ngx-dynamic-form","version":"1.6.0","keywords":["angular","dynamic-form","reactive-forms","angular-material","suntelecoms"],"author":{"name":"Amadou Diallo","email":"amadoumacbookpro38@gmail.com"},"license":"MIT","_id":"@suntelecoms/ngx-dynamic-form@1.6.0","maintainers":[{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"}],"dist":{"shasum":"2a2b84af0a15aef80a8fbbb2699492efa6619327","tarball":"https://registry.npmjs.org/@suntelecoms/ngx-dynamic-form/-/ngx-dynamic-form-1.6.0.tgz","fileCount":44,"integrity":"sha512-b+AIeV0Comy9e/qR8Iq+2jU4h7eAHSZU6jTafBbK5KU4B4uQiIJo2qEnNXuxTuWjjgFVJCWkEzOkdfjlEIA/sQ==","signatures":[{"sig":"MEQCIHuMtyQ3Qa1QSsDKzLZ+iqzKCx6Fbpj7oog6Iub4Ws/LAiBA2Eo3RuTeb/mJ4ltyLj2ErXhDpP3Z/CVQ5DXf69OZlg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":858664},"module":"fesm2022/suntelecoms-ngx-dynamic-form.mjs","exports":{".":{"types":"./index.d.ts","default":"./fesm2022/suntelecoms-ngx-dynamic-form.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"14fee2058a854dc4c2a2f3eb4d8c312cce82265d","typings":"index.d.ts","_npmUser":{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"},"_npmVersion":"10.9.8","description":"Générateur de formulaires Angular dynamiques — SUNTELECOMS","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"flag-icons":">=7.0.0","@angular/cdk":">=19.0.0","@angular/core":">=19.0.0","@angular/forms":">=19.0.0","@angular/common":">=19.0.0","@angular/router":">=19.0.0","@angular/material":">=19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ngx-dynamic-form_1.6.0_1786996223407_0.43257950324425054","host":"s3://npm-registry-packages-npm-production"}},"1.6.1":{"name":"@suntelecoms/ngx-dynamic-form","version":"1.6.1","keywords":["angular","dynamic-form","reactive-forms","angular-material","suntelecoms"],"author":{"name":"Amadou Diallo","email":"amadoumacbookpro38@gmail.com"},"license":"MIT","_id":"@suntelecoms/ngx-dynamic-form@1.6.1","maintainers":[{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"}],"dist":{"shasum":"5e3ca0414178c616e9ad4c9c511461cfe91a6498","tarball":"https://registry.npmjs.org/@suntelecoms/ngx-dynamic-form/-/ngx-dynamic-form-1.6.1.tgz","fileCount":24,"integrity":"sha512-9K/TpANcsMcXkqQC7RZ701IPyZpGqW0eDR8Ts4Q0Nc4tcDMlVT7ykor0gs3cGLzklQkRKx9+dM6I2nKklOZgyA==","signatures":[{"sig":"MEUCID3X7SHf2ZgXfL08gnfqTCvAQFWr9sdL8QmKlyMJO6KgAiEAuGQMj3RCn+P+6/VJIsv6l1VeGQO9/zxgTGFzdAjcpp8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":876466},"module":"fesm2022/suntelecoms-ngx-dynamic-form.mjs","exports":{".":{"types":"./index.d.ts","default":"./fesm2022/suntelecoms-ngx-dynamic-form.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"14fee2058a854dc4c2a2f3eb4d8c312cce82265d","typings":"index.d.ts","_npmUser":{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"},"_npmVersion":"10.9.8","description":"Générateur de formulaires Angular dynamiques — SUNTELECOMS","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"flag-icons":">=7.0.0","@angular/cdk":">=19.0.0","@angular/core":">=19.0.0","@angular/forms":">=19.0.0","@angular/common":">=19.0.0","@angular/router":">=19.0.0","@angular/material":">=19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ngx-dynamic-form_1.6.1_1786998982549_0.8821186627362194","host":"s3://npm-registry-packages-npm-production"}},"1.6.2":{"name":"@suntelecoms/ngx-dynamic-form","version":"1.6.2","keywords":["angular","dynamic-form","reactive-forms","angular-material","suntelecoms"],"author":{"name":"Amadou Diallo","email":"amadoumacbookpro38@gmail.com"},"license":"MIT","_id":"@suntelecoms/ngx-dynamic-form@1.6.2","maintainers":[{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"}],"dist":{"shasum":"dc7864b508f7c1f7755d42aebc3d473ac7713246","tarball":"https://registry.npmjs.org/@suntelecoms/ngx-dynamic-form/-/ngx-dynamic-form-1.6.2.tgz","fileCount":24,"integrity":"sha512-yYpGDj4JpAQlFTCZU6/zWcOY+wR5kLCKiIGKenKPFHqRbi/VMgtbtt6JUNFn8YsYxwgabRoLUTWniwS3tAtQFg==","signatures":[{"sig":"MEQCIFL5MpDtZYOEpwmNho1lrgJw8nIv37chf9mAr0U9yae+AiAUAzKogVh1IO2xvcLSKJoZ6Di8qe1gryHUM7MuM1+1pg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":876456},"module":"fesm2022/suntelecoms-ngx-dynamic-form.mjs","exports":{".":{"types":"./index.d.ts","default":"./fesm2022/suntelecoms-ngx-dynamic-form.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"14fee2058a854dc4c2a2f3eb4d8c312cce82265d","typings":"index.d.ts","_npmUser":{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"},"_npmVersion":"10.9.8","description":"Générateur de formulaires Angular dynamiques — SUNTELECOMS","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"flag-icons":">=7.0.0","@angular/cdk":">=19.0.0","@angular/core":">=19.0.0","@angular/forms":">=19.0.0","@angular/common":">=19.0.0","@angular/router":">=19.0.0","@angular/material":">=19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ngx-dynamic-form_1.6.2_1787049464356_0.6707219617349185","host":"s3://npm-registry-packages-npm-production"}},"1.6.3":{"name":"@suntelecoms/ngx-dynamic-form","version":"1.6.3","keywords":["angular","dynamic-form","reactive-forms","angular-material","suntelecoms"],"author":{"name":"Amadou Diallo","email":"amadoumacbookpro38@gmail.com"},"license":"MIT","_id":"@suntelecoms/ngx-dynamic-form@1.6.3","maintainers":[{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"}],"dist":{"shasum":"5c8b9dd05fb5796d2b41bbc7a995020ca40a4d52","tarball":"https://registry.npmjs.org/@suntelecoms/ngx-dynamic-form/-/ngx-dynamic-form-1.6.3.tgz","fileCount":24,"integrity":"sha512-B5rXcGFtyLg22g9mPEpHLG99w+pHHyPZm0JrVcivr98NjyAMI1T0z5n0aFhIuxlxbN4Stk8TXJy9r5DhARHiHQ==","signatures":[{"sig":"MEQCIH5k6qW2KLju8BrkiCGdNheWkqJWY5/mrZpvAqH/B3e+AiB10ygmXNzSjaitrbOKRq3uaG5Kvr/448hLrhNjRtF/9w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":876598},"module":"fesm2022/suntelecoms-ngx-dynamic-form.mjs","exports":{".":{"types":"./index.d.ts","default":"./fesm2022/suntelecoms-ngx-dynamic-form.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"14fee2058a854dc4c2a2f3eb4d8c312cce82265d","typings":"index.d.ts","_npmUser":{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"},"_npmVersion":"10.9.8","description":"Générateur de formulaires Angular dynamiques — SUNTELECOMS","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"flag-icons":">=7.0.0","@angular/cdk":">=19.0.0","@angular/core":">=19.0.0","@angular/forms":">=19.0.0","@angular/common":">=19.0.0","@angular/router":">=19.0.0","@angular/material":">=19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ngx-dynamic-form_1.6.3_1787051239563_0.8321862691701221","host":"s3://npm-registry-packages-npm-production"}},"1.6.4":{"name":"@suntelecoms/ngx-dynamic-form","version":"1.6.4","keywords":["angular","dynamic-form","reactive-forms","angular-material","suntelecoms"],"author":{"name":"Amadou Diallo","email":"amadoumacbookpro38@gmail.com"},"license":"MIT","_id":"@suntelecoms/ngx-dynamic-form@1.6.4","maintainers":[{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"}],"dist":{"shasum":"3a46f53f2760a25d3be7b94e2f0cd184b0845461","tarball":"https://registry.npmjs.org/@suntelecoms/ngx-dynamic-form/-/ngx-dynamic-form-1.6.4.tgz","fileCount":24,"integrity":"sha512-0GUy4YqUtFAE0nBcnJn5c4N4YaugJWL//riTIb2mXgXCQ9TvUFlMUzuAhHOic8I2xVY9kjqWgBd1ACVmkymnmw==","signatures":[{"sig":"MEQCIEOvzbNaLW2JI3gL0HbPRe5qKxMhQpjMmOerEV+h8a42AiBNLEa+sadaE0n6L9SH9RzByiwGV6ocHl6YIx8vkVI+9g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":876730},"module":"fesm2022/suntelecoms-ngx-dynamic-form.mjs","exports":{".":{"types":"./index.d.ts","default":"./fesm2022/suntelecoms-ngx-dynamic-form.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"14fee2058a854dc4c2a2f3eb4d8c312cce82265d","typings":"index.d.ts","_npmUser":{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"},"_npmVersion":"10.9.8","description":"Générateur de formulaires Angular dynamiques — SUNTELECOMS","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"flag-icons":">=7.0.0","@angular/cdk":">=19.0.0","@angular/core":">=19.0.0","@angular/forms":">=19.0.0","@angular/common":">=19.0.0","@angular/router":">=19.0.0","@angular/material":">=19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ngx-dynamic-form_1.6.4_1787053689907_0.8921022069692457","host":"s3://npm-registry-packages-npm-production"}},"1.6.5":{"name":"@suntelecoms/ngx-dynamic-form","version":"1.6.5","keywords":["angular","dynamic-form","reactive-forms","angular-material","suntelecoms"],"author":{"name":"Amadou Diallo","email":"amadoumacbookpro38@gmail.com"},"license":"MIT","_id":"@suntelecoms/ngx-dynamic-form@1.6.5","maintainers":[{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"}],"dist":{"shasum":"0d7d1a62aa2e7d8808756b6126e08b4c8b20c8cc","tarball":"https://registry.npmjs.org/@suntelecoms/ngx-dynamic-form/-/ngx-dynamic-form-1.6.5.tgz","fileCount":24,"integrity":"sha512-OtFjMBB2KArTvH5AlaiKLIlmFZIVrrmYeRGIKC/TcTMy7IrxCMJcNlz7+jQkyc4BDMOeWzG/u+nOB8fXlUH6ow==","signatures":[{"sig":"MEQCID3XyByJiykIry0GqSA2FUJ5iZdR3TBqW2lwIyktTpjnAiAhKZ0ab+N3wzlnam+DrnXazx2ofvoejxVirPLYVA56XA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":876910},"module":"fesm2022/suntelecoms-ngx-dynamic-form.mjs","exports":{".":{"types":"./index.d.ts","default":"./fesm2022/suntelecoms-ngx-dynamic-form.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"14fee2058a854dc4c2a2f3eb4d8c312cce82265d","typings":"index.d.ts","_npmUser":{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"},"_npmVersion":"10.9.8","description":"Générateur de formulaires Angular dynamiques — SUNTELECOMS","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"flag-icons":">=7.0.0","@angular/cdk":">=19.0.0","@angular/core":">=19.0.0","@angular/forms":">=19.0.0","@angular/common":">=19.0.0","@angular/router":">=19.0.0","@angular/material":">=19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ngx-dynamic-form_1.6.5_1787072397186_0.14354686548760398","host":"s3://npm-registry-packages-npm-production"}},"1.6.6":{"name":"@suntelecoms/ngx-dynamic-form","version":"1.6.6","keywords":["angular","dynamic-form","reactive-forms","angular-material","suntelecoms"],"author":{"name":"Amadou Diallo","email":"amadoumacbookpro38@gmail.com"},"license":"MIT","_id":"@suntelecoms/ngx-dynamic-form@1.6.6","maintainers":[{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"}],"dist":{"shasum":"37db10fd2c7c9643c81c24412e40d1ef2028824c","tarball":"https://registry.npmjs.org/@suntelecoms/ngx-dynamic-form/-/ngx-dynamic-form-1.6.6.tgz","fileCount":24,"integrity":"sha512-FBZOTejg2T59I7stRerMeMp1sDV7OVLp/qwXIwxYYX6S9gd0CuTulL3BTwllNHLBkl0AsaBIT4I3/SXR5FRZUQ==","signatures":[{"sig":"MEYCIQDkIpi1IVR5vzSdg/j1giW8jRvV9ABO3SXlDTD6mNWfXAIhALpH/7nts4gBlqqAKzn3tKyqMudmd/G3qSYMWpCF2xBG","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":883770},"module":"fesm2022/suntelecoms-ngx-dynamic-form.mjs","exports":{".":{"types":"./index.d.ts","default":"./fesm2022/suntelecoms-ngx-dynamic-form.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"14fee2058a854dc4c2a2f3eb4d8c312cce82265d","typings":"index.d.ts","_npmUser":{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"},"_npmVersion":"10.9.8","description":"Générateur de formulaires Angular dynamiques — SUNTELECOMS","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"flag-icons":">=7.0.0","@angular/cdk":">=19.0.0","@angular/core":">=19.0.0","@angular/forms":">=19.0.0","@angular/common":">=19.0.0","@angular/router":">=19.0.0","@angular/material":">=19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ngx-dynamic-form_1.6.6_1787076304464_0.17047843526873496","host":"s3://npm-registry-packages-npm-production"}},"1.7.0":{"name":"@suntelecoms/ngx-dynamic-form","version":"1.7.0","keywords":["angular","dynamic-form","reactive-forms","angular-material","suntelecoms"],"author":{"name":"Amadou Diallo","email":"amadoumacbookpro38@gmail.com"},"license":"MIT","_id":"@suntelecoms/ngx-dynamic-form@1.7.0","maintainers":[{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"}],"dist":{"shasum":"f98ebcb8332d18dc58c0753c96486ff4a211ca5d","tarball":"https://registry.npmjs.org/@suntelecoms/ngx-dynamic-form/-/ngx-dynamic-form-1.7.0.tgz","fileCount":24,"integrity":"sha512-cl35U3ZqfyCHQNS5LRuZEi7O5RwoNae77vrbWlIpYtimsyEpkEJYKCB+D8WpPVMpiNK5gc48nW6NRcbHlnWeqg==","signatures":[{"sig":"MEUCIC/lXg0/BzS+voiD+WlXvKF05B580L2YCKu2JEk5lvM2AiEA0MVRKpCSqOgsWiKYAc7F245Jr7C97DJJfAgjUdWTw4c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":898723},"module":"fesm2022/suntelecoms-ngx-dynamic-form.mjs","exports":{".":{"types":"./index.d.ts","default":"./fesm2022/suntelecoms-ngx-dynamic-form.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"14fee2058a854dc4c2a2f3eb4d8c312cce82265d","typings":"index.d.ts","_npmUser":{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"},"_npmVersion":"10.9.8","description":"Générateur de formulaires Angular dynamiques — SUNTELECOMS","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"flag-icons":">=7.0.0","@angular/cdk":">=19.0.0","@angular/core":">=19.0.0","@angular/forms":">=19.0.0","@angular/common":">=19.0.0","@angular/router":">=19.0.0","@angular/material":">=19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ngx-dynamic-form_1.7.0_1787263683041_0.03794965237508108","host":"s3://npm-registry-packages-npm-production"}},"1.7.1":{"name":"@suntelecoms/ngx-dynamic-form","version":"1.7.1","keywords":["angular","dynamic-form","reactive-forms","angular-material","suntelecoms"],"author":{"name":"Amadou Diallo","email":"amadoumacbookpro38@gmail.com"},"license":"MIT","_id":"@suntelecoms/ngx-dynamic-form@1.7.1","maintainers":[{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"}],"dist":{"shasum":"fda2eb4e6c9868186236072778fe273b0d46440d","tarball":"https://registry.npmjs.org/@suntelecoms/ngx-dynamic-form/-/ngx-dynamic-form-1.7.1.tgz","fileCount":24,"integrity":"sha512-62Uu+V5OISVzmOZ23D/LTsij1b3KI9PQsIPgcvJsCyQatsKFkEwNjwOyLuiTOOfXvk0KAoNVe7YVL61vTZ5bmQ==","signatures":[{"sig":"MEUCIEUPtYBaq7fR1wUMXOjY+eoaSRjxCQxK5CWzBxbxfygtAiEAz45iCY42bBLITWl+ETWG3wl4AI1vfRM7h69dMynCncQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":900162},"module":"fesm2022/suntelecoms-ngx-dynamic-form.mjs","exports":{".":{"types":"./index.d.ts","default":"./fesm2022/suntelecoms-ngx-dynamic-form.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"14fee2058a854dc4c2a2f3eb4d8c312cce82265d","typings":"index.d.ts","_npmUser":{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"},"_npmVersion":"10.9.8","description":"Générateur de formulaires Angular dynamiques — SUNTELECOMS","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"flag-icons":">=7.0.0","@angular/cdk":">=19.0.0","@angular/core":">=19.0.0","@angular/forms":">=19.0.0","@angular/common":">=19.0.0","@angular/router":">=19.0.0","@angular/material":">=19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ngx-dynamic-form_1.7.1_1787266556520_0.6370472940073972","host":"s3://npm-registry-packages-npm-production"}},"1.7.2":{"name":"@suntelecoms/ngx-dynamic-form","version":"1.7.2","keywords":["angular","dynamic-form","reactive-forms","angular-material","suntelecoms"],"author":{"name":"Amadou Diallo","email":"amadoumacbookpro38@gmail.com"},"license":"MIT","_id":"@suntelecoms/ngx-dynamic-form@1.7.2","maintainers":[{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"}],"dist":{"shasum":"7922145dc2ce26dbd897b3a9ecc6cbae1fbd8b03","tarball":"https://registry.npmjs.org/@suntelecoms/ngx-dynamic-form/-/ngx-dynamic-form-1.7.2.tgz","fileCount":24,"integrity":"sha512-AZUrCtjYeDllxgt0PYPJli0Ptu79KQexIiBukQSaWsHjLAF0nXSF/yvswH/bwmKYAa5axTM5BK64qLOWnm8evw==","signatures":[{"sig":"MEUCIA733j91SiJATsOxJ1lzx+ag1HQI4g8le5BG3ppi2MyhAiEArRtTIBvXdBEIvNSZG89U0Lfh5b2Za2TOoy85y/quhMM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":900946},"module":"fesm2022/suntelecoms-ngx-dynamic-form.mjs","exports":{".":{"types":"./index.d.ts","default":"./fesm2022/suntelecoms-ngx-dynamic-form.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"14fee2058a854dc4c2a2f3eb4d8c312cce82265d","typings":"index.d.ts","_npmUser":{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"},"_npmVersion":"10.9.8","description":"Générateur de formulaires Angular dynamiques — SUNTELECOMS","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"flag-icons":">=7.0.0","@angular/cdk":">=19.0.0","@angular/core":">=19.0.0","@angular/forms":">=19.0.0","@angular/common":">=19.0.0","@angular/router":">=19.0.0","@angular/material":">=19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ngx-dynamic-form_1.7.2_1787269772821_0.8423416698657726","host":"s3://npm-registry-packages-npm-production"}},"1.7.3":{"name":"@suntelecoms/ngx-dynamic-form","version":"1.7.3","keywords":["angular","dynamic-form","reactive-forms","angular-material","suntelecoms"],"author":{"name":"Amadou Diallo","email":"amadoumacbookpro38@gmail.com"},"license":"MIT","_id":"@suntelecoms/ngx-dynamic-form@1.7.3","maintainers":[{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"}],"dist":{"shasum":"7fc95a59f74af6e7efe5e1004cc1fe86652a0b19","tarball":"https://registry.npmjs.org/@suntelecoms/ngx-dynamic-form/-/ngx-dynamic-form-1.7.3.tgz","fileCount":24,"integrity":"sha512-t4C+auQw6ocx6iwMgtKS9sFCKPyP5upD8tRN8GyO/e6AqFLbHeSX++SzBLAVNT6OOR9zAeaADW+UjyvK5a/Qtw==","signatures":[{"sig":"MEUCICYeTUN2fT9PKLiC8B8flG+GgHe/S/7rErjZX1Yn65ztAiEA237V22kJaGL81aChgMYQiKdseXQwvREA3Tqw54dJ2/E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":916485},"module":"fesm2022/suntelecoms-ngx-dynamic-form.mjs","exports":{".":{"types":"./index.d.ts","default":"./fesm2022/suntelecoms-ngx-dynamic-form.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"14fee2058a854dc4c2a2f3eb4d8c312cce82265d","typings":"index.d.ts","_npmUser":{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"},"_npmVersion":"10.9.8","description":"Générateur de formulaires Angular dynamiques — SUNTELECOMS","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"flag-icons":">=7.0.0","@angular/cdk":">=19.0.0","@angular/core":">=19.0.0","@angular/forms":">=19.0.0","@angular/common":">=19.0.0","@angular/router":">=19.0.0","@angular/material":">=19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ngx-dynamic-form_1.7.3_1787309935347_0.9577929742187898","host":"s3://npm-registry-packages-npm-production"}},"1.7.4":{"name":"@suntelecoms/ngx-dynamic-form","version":"1.7.4","keywords":["angular","dynamic-form","reactive-forms","angular-material","suntelecoms"],"author":{"name":"Amadou Diallo","email":"amadoumacbookpro38@gmail.com"},"license":"MIT","_id":"@suntelecoms/ngx-dynamic-form@1.7.4","maintainers":[{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"}],"dist":{"shasum":"435d9a21e136ce9ebf15fd9c53bef62576625edc","tarball":"https://registry.npmjs.org/@suntelecoms/ngx-dynamic-form/-/ngx-dynamic-form-1.7.4.tgz","fileCount":24,"integrity":"sha512-rXw4cJy417j1kvTq0rke0Br37AOACxDPa/nHH7qFn9MTaxnyDH2Ooq/sVIusCBdI2ZnSApqMZ5tpRHHu2K7tFA==","signatures":[{"sig":"MEYCIQC00y2bJ7OJjpOE7NOxAj+J2ag61vMKxccoLVSvrmxolQIhALUPPaGfM2ntAYeKq9I+XZsSHuKDhl7mVCeM95uJclly","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":918563},"module":"fesm2022/suntelecoms-ngx-dynamic-form.mjs","exports":{".":{"types":"./index.d.ts","default":"./fesm2022/suntelecoms-ngx-dynamic-form.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"14fee2058a854dc4c2a2f3eb4d8c312cce82265d","typings":"index.d.ts","_npmUser":{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"},"_npmVersion":"10.9.8","description":"Générateur de formulaires Angular dynamiques — SUNTELECOMS","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"flag-icons":">=7.0.0","@angular/cdk":">=19.0.0","@angular/core":">=19.0.0","@angular/forms":">=19.0.0","@angular/common":">=19.0.0","@angular/router":">=19.0.0","@angular/material":">=19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ngx-dynamic-form_1.7.4_1787310732288_0.8386985672145248","host":"s3://npm-registry-packages-npm-production"}},"1.7.7":{"name":"@suntelecoms/ngx-dynamic-form","version":"1.7.7","keywords":["angular","dynamic-form","reactive-forms","angular-material","suntelecoms"],"author":{"name":"Amadou Diallo","email":"amadoumacbookpro38@gmail.com"},"license":"MIT","_id":"@suntelecoms/ngx-dynamic-form@1.7.7","maintainers":[{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"}],"dist":{"shasum":"1c49c73d9865caaaf30fa91d5343718b1f1528f5","tarball":"https://registry.npmjs.org/@suntelecoms/ngx-dynamic-form/-/ngx-dynamic-form-1.7.7.tgz","fileCount":24,"integrity":"sha512-vnNx9O6jav6C7NiBxBfebekHlDqXX+h1crIDg7qNkAi04Ux36/V6q26mD07WvUSSmaj3qVyJw73Q7i+pXuDhiA==","signatures":[{"sig":"MEYCIQCq2HcyMkORFRhq5M+C9Am9xCukXl4ZMzAzzFM+XfsXLgIhANnGHh37tQGiWpfFNFpRArd0Q9blTy1DD2aZanlfBsfj","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":953933},"module":"fesm2022/suntelecoms-ngx-dynamic-form.mjs","exports":{".":{"types":"./index.d.ts","default":"./fesm2022/suntelecoms-ngx-dynamic-form.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"1e00b1977778d056fee1751dba2ed8acc1b8d86d","typings":"index.d.ts","_npmUser":{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"},"_npmVersion":"10.9.8","description":"Générateur de formulaires Angular dynamiques — SUNTELECOMS","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"flag-icons":">=7.0.0","@angular/cdk":">=19.0.0","@angular/core":">=19.0.0","@angular/forms":">=19.0.0","@angular/common":">=19.0.0","@angular/router":">=19.0.0","@angular/material":">=19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ngx-dynamic-form_1.7.7_1787672040739_0.39186166784373166","host":"s3://npm-registry-packages-npm-production"}},"1.7.10":{"name":"@suntelecoms/ngx-dynamic-form","version":"1.7.10","keywords":["angular","dynamic-form","reactive-forms","angular-material","suntelecoms"],"author":{"name":"Amadou Diallo","email":"amadoumacbookpro38@gmail.com"},"license":"MIT","_id":"@suntelecoms/ngx-dynamic-form@1.7.10","maintainers":[{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"}],"dist":{"shasum":"6b5cd0fecf22cd52be9f3d7b8215faa1b4f3b4dc","tarball":"https://registry.npmjs.org/@suntelecoms/ngx-dynamic-form/-/ngx-dynamic-form-1.7.10.tgz","fileCount":24,"integrity":"sha512-e15yuhPttADzK187u8yL3SPrEeshBJAsmJahtbYsT0q6iCH1AaqTyPuvgGmJPuARM7uBH0z1L/p62wvnTSZR/Q==","signatures":[{"sig":"MEUCIQCXEaod37GDQ2RIfBIYKmnCFlN1E1nG1d6m+DTD8EVLngIgEyHmuORuqPKjo7O1Ru/g3gZTwQERAYzktTbpeVILmfk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":982046},"module":"fesm2022/suntelecoms-ngx-dynamic-form.mjs","exports":{".":{"types":"./index.d.ts","default":"./fesm2022/suntelecoms-ngx-dynamic-form.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"1e00b1977778d056fee1751dba2ed8acc1b8d86d","typings":"index.d.ts","_npmUser":{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"},"_npmVersion":"10.9.8","description":"Générateur de formulaires Angular dynamiques — SUNTELECOMS","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"flag-icons":">=7.0.0","@angular/cdk":">=19.0.0","@angular/core":">=19.0.0","@angular/forms":">=19.0.0","@angular/common":">=19.0.0","@angular/router":">=19.0.0","@angular/material":">=19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ngx-dynamic-form_1.7.10_1787678749099_0.6449212185523217","host":"s3://npm-registry-packages-npm-production"}},"1.7.14":{"name":"@suntelecoms/ngx-dynamic-form","version":"1.7.14","keywords":["angular","dynamic-form","reactive-forms","angular-material","suntelecoms"],"author":{"name":"Amadou Diallo","email":"amadoumacbookpro38@gmail.com"},"license":"MIT","_id":"@suntelecoms/ngx-dynamic-form@1.7.14","maintainers":[{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"}],"dist":{"shasum":"a1accb3065420b62144b0e49f9f39cc7745b0597","tarball":"https://registry.npmjs.org/@suntelecoms/ngx-dynamic-form/-/ngx-dynamic-form-1.7.14.tgz","fileCount":24,"integrity":"sha512-3EITZ3NewBItSowmJAh1y/3PGkDY2tgQiwtGDRwklGWBgqKrvzGpYhXc/i1njKRWcuLFOLFQufzQd0VKb71CCA==","signatures":[{"sig":"MEYCIQDkCUJYyITnA6horZCSDMMRfMBbbkTlbWuUN5qz+z1WYgIhAO6G/EInPpyHNyEZlsD8ZTp5jX9tkGMPVIrgSCcjwfR/","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1027099},"module":"fesm2022/suntelecoms-ngx-dynamic-form.mjs","exports":{".":{"types":"./index.d.ts","default":"./fesm2022/suntelecoms-ngx-dynamic-form.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"8390c367b25e6e92a97378fa57ec921a14f5c098","typings":"index.d.ts","_npmUser":{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"},"_npmVersion":"10.9.8","description":"Générateur de formulaires Angular dynamiques — SUNTELECOMS","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"flag-icons":">=7.0.0","@angular/cdk":">=19.0.0","@angular/core":">=19.0.0","@angular/forms":">=19.0.0","@angular/common":">=19.0.0","@angular/router":">=19.0.0","@angular/material":">=19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ngx-dynamic-form_1.7.14_1787835726911_0.20006591984427535","host":"s3://npm-registry-packages-npm-production"}},"1.7.15":{"name":"@suntelecoms/ngx-dynamic-form","version":"1.7.15","keywords":["angular","dynamic-form","reactive-forms","angular-material","suntelecoms"],"author":{"name":"Amadou Diallo","email":"amadoumacbookpro38@gmail.com"},"license":"MIT","_id":"@suntelecoms/ngx-dynamic-form@1.7.15","maintainers":[{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"}],"dist":{"shasum":"6f38af21e0538bf32553058f02d7df1daf6bc9ca","tarball":"https://registry.npmjs.org/@suntelecoms/ngx-dynamic-form/-/ngx-dynamic-form-1.7.15.tgz","fileCount":24,"integrity":"sha512-LLIO2Cmblg15GJM5nwcvi/kXa1c8pgCwAkJC+tsl2in6a+73Xg8BRl85FUgQ+btag66wVsTTaQgbA3YzUNNWXQ==","signatures":[{"sig":"MEQCIAy09y2OacbvoIqcDkuvfocIZGoW+5VJYt1ps5WY/VVqAiBYnW/XiAx6K/k5VG+/LJMl2KEsNCGfJe4swKQyFiwXDQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1027988},"module":"fesm2022/suntelecoms-ngx-dynamic-form.mjs","exports":{".":{"types":"./index.d.ts","default":"./fesm2022/suntelecoms-ngx-dynamic-form.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"8390c367b25e6e92a97378fa57ec921a14f5c098","typings":"index.d.ts","_npmUser":{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"},"_npmVersion":"10.9.8","description":"Générateur de formulaires Angular dynamiques — SUNTELECOMS","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"flag-icons":">=7.0.0","@angular/cdk":">=19.0.0","@angular/core":">=19.0.0","@angular/forms":">=19.0.0","@angular/common":">=19.0.0","@angular/router":">=19.0.0","@angular/material":">=19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ngx-dynamic-form_1.7.15_1787837369908_0.7258253958703773","host":"s3://npm-registry-packages-npm-production"}},"1.7.16":{"name":"@suntelecoms/ngx-dynamic-form","version":"1.7.16","keywords":["angular","dynamic-form","reactive-forms","angular-material","suntelecoms"],"author":{"name":"Amadou Diallo","email":"amadoumacbookpro38@gmail.com"},"license":"MIT","_id":"@suntelecoms/ngx-dynamic-form@1.7.16","maintainers":[{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"}],"dist":{"shasum":"f9bbdab2d64c1d4afba77769150c9f437b6eb72b","tarball":"https://registry.npmjs.org/@suntelecoms/ngx-dynamic-form/-/ngx-dynamic-form-1.7.16.tgz","fileCount":24,"integrity":"sha512-Bf88tdBHYka2Twk+bqLv978MJv2iZZOp9KqiNZUCF/VROUoRLNygGrtS4hxSm5U4lM7fDjbgR6lBcaF9s2bkDQ==","signatures":[{"sig":"MEUCIQD29a3Kwu3EEkWps43DIjowRzynOsmWgXJKYLIxPMyvcAIgPJ20gkQEgNFLfrKU4aTX/25CZUfGWeVzFUilJINPZCk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDKAlOrQQIobxs/eLEKho1j2XxUgJSPPU5AgPzd8QgzEQIgKA/xX2oOw4EG0k8yYJrGwBIt3AcEQH3MPxxVYb6+hU8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1028812},"module":"fesm2022/suntelecoms-ngx-dynamic-form.mjs","exports":{".":{"types":"./index.d.ts","default":"./fesm2022/suntelecoms-ngx-dynamic-form.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"8390c367b25e6e92a97378fa57ec921a14f5c098","typings":"index.d.ts","_npmUser":{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"},"_npmVersion":"10.9.8","description":"Générateur de formulaires Angular dynamiques — SUNTELECOMS","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"flag-icons":">=7.0.0","@angular/cdk":">=19.0.0","@angular/core":">=19.0.0","@angular/forms":">=19.0.0","@angular/common":">=19.0.0","@angular/router":">=19.0.0","@angular/material":">=19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ngx-dynamic-form_1.7.16_1787853698721_0.877788245054663","host":"s3://npm-registry-packages-npm-production"}},"1.7.19":{"name":"@suntelecoms/ngx-dynamic-form","version":"1.7.19","keywords":["angular","dynamic-form","reactive-forms","angular-material","suntelecoms"],"author":{"name":"Amadou Diallo","email":"amadoumacbookpro38@gmail.com"},"license":"MIT","_id":"@suntelecoms/ngx-dynamic-form@1.7.19","maintainers":[{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"}],"dist":{"shasum":"1d27792c98821f25db7725d1a17bc8ef7bf1ddf8","tarball":"https://registry.npmjs.org/@suntelecoms/ngx-dynamic-form/-/ngx-dynamic-form-1.7.19.tgz","fileCount":26,"integrity":"sha512-5/lB9PGmKAWOvxFY+ch2VPo2XyjqHUB8bPW6fqR50gjcs28ewW8YyE+oGq49YboOxfGDfxPVnyTQcR7PlOAeFw==","signatures":[{"sig":"MEQCIHiisFwVkZylaPPHafSV5Odm5ahEtldWz6ggqkc3VQcdAiBBrQn77RthZBamcrLfvySOyzNGQsoJJP5Waci5D+iIuA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIClhWvYFOL1CvpwqYEPmnaplZ0nHakj92g/wUf+3A7uBAiBDl2TDE6ih2LWDwrfgUVuXB/ePwKuTo2zsL/al9CLkuQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1050280},"module":"fesm2022/suntelecoms-ngx-dynamic-form.mjs","exports":{".":{"types":"./index.d.ts","default":"./fesm2022/suntelecoms-ngx-dynamic-form.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"206d90c4071fe46eba51426580a6b1a8f3617e42","typings":"index.d.ts","_npmUser":{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"},"_npmVersion":"10.9.8","description":"Générateur de formulaires Angular dynamiques — SUNTELECOMS","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"flag-icons":">=7.0.0","@angular/cdk":">=19.0.0","@angular/core":">=19.0.0","@angular/forms":">=19.0.0","@angular/common":">=19.0.0","@angular/router":">=19.0.0","@angular/material":">=19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ngx-dynamic-form_1.7.19_1789836665976_0.6835561163405397","host":"s3://npm-registry-packages-npm-production"}},"1.7.20":{"name":"@suntelecoms/ngx-dynamic-form","version":"1.7.20","keywords":["angular","dynamic-form","reactive-forms","angular-material","suntelecoms"],"author":{"name":"Amadou Diallo","email":"amadoumacbookpro38@gmail.com"},"license":"MIT","_id":"@suntelecoms/ngx-dynamic-form@1.7.20","maintainers":[{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"}],"dist":{"shasum":"ec7d52bfbabb92a72892316e7f15eb51e5829e9a","tarball":"https://registry.npmjs.org/@suntelecoms/ngx-dynamic-form/-/ngx-dynamic-form-1.7.20.tgz","fileCount":26,"integrity":"sha512-7qxJfvftpYQHRnOHG22IQY+Kkdo3w85PwSYGOaXOcnfgjYH4/Fe1Jvj4BC9dAGCNKCRbF3oyLLdrtcXZIYa7bA==","signatures":[{"sig":"MEUCIFkjlWSqPJSR/+CqrZwD6RQie22PFDuQpEXoSAx4FcbAAiEAmOOfyFeqxbUC51/VJtWF+VCD2WgkEJ/ybs9lYcP3+l0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDddWaE2Wjiklphgj8PHc7vN25FFVoIDH3DfFqRu85MlwIgXzueuaRj9NGdSNf0YBCp6KL6E0np9JE5DW6E+dFVCrM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1058060},"module":"fesm2022/suntelecoms-ngx-dynamic-form.mjs","exports":{".":{"types":"./index.d.ts","default":"./fesm2022/suntelecoms-ngx-dynamic-form.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"6b911ed2ee8157162c47dca6c6e6a9ca3391e1f6","typings":"index.d.ts","_npmUser":{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"},"_npmVersion":"10.9.8","description":"Générateur de formulaires Angular dynamiques — SUNTELECOMS","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"flag-icons":">=7.0.0","@angular/cdk":">=19.0.0","@angular/core":">=19.0.0","@angular/forms":">=19.0.0","@angular/common":">=19.0.0","@angular/router":">=19.0.0","@angular/material":">=19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ngx-dynamic-form_1.7.20_1790417276389_0.9925625851005044","host":"s3://npm-registry-packages-npm-production"}},"1.7.21":{"_id":"@suntelecoms/ngx-dynamic-form@1.7.21","dist":{"shasum":"3a943c56e136e0ed9706dba97be87a775c4340ce","tarball":"https://registry.npmjs.org/@suntelecoms/ngx-dynamic-form/-/ngx-dynamic-form-1.7.21.tgz","fileCount":28,"integrity":"sha512-QMTUbgJlq9E2mt/n+UcffCn7r+h6XgXzNunY+3fkx+bufFAye+8UPV1PyX+jmnhWf7uSrTYCk0zqb8OhyEBY/g==","signatures":[{"sig":"MEUCIQD7RA26uPKrUF3IobWCHyVsjiTPNAW+IJog+JoMS1HRbQIgJrT/PVn0rRcUWhuUjVB5CxLQbVlHtzbbj/DwNFU/3p0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDOrTmxlHginS4kGmbk+Hh/K8Fn7nlUl3lt9gb7OAk72gIgQWbduFRTDQYjfjt0qzJk0zLY9dixQDSz3J3Za9W859M="}],"unpackedSize":1089118},"name":"@suntelecoms/ngx-dynamic-form","author":{"name":"Amadou Diallo","email":"amadoumacbookpro38@gmail.com"},"module":"fesm2022/suntelecoms-ngx-dynamic-form.mjs","exports":{".":{"types":"./index.d.ts","default":"./fesm2022/suntelecoms-ngx-dynamic-form.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"6b911ed2ee8157162c47dca6c6e6a9ca3391e1f6","license":"MIT","typings":"index.d.ts","version":"1.7.21","_npmUser":{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"},"keywords":["angular","dynamic-form","reactive-forms","angular-material","suntelecoms"],"_npmVersion":"10.9.8","description":"Générateur de formulaires Angular dynamiques — SUNTELECOMS","directories":{},"maintainers":[{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"}],"sideEffects":false,"_nodeVersion":"22.23.2","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"flag-icons":">=7.0.0","@angular/cdk":">=19.0.0","@angular/core":">=19.0.0","@angular/forms":">=19.0.0","@angular/common":">=19.0.0","@angular/router":">=19.0.0","@angular/material":">=19.0.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/ngx-dynamic-form_1.7.21_1790431374399_0.60543613589943"}}},"time":{"created":"2026-06-20T01:35:32.510Z","modified":"2026-09-26T14:02:54.665Z","1.1.0":"2026-06-20T01:35:32.839Z","1.1.1":"2026-06-21T22:37:24.854Z","1.1.2":"2026-06-21T22:45:43.563Z","1.1.3":"2026-06-21T22:53:38.993Z","1.2.0":"2026-06-21T23:35:55.034Z","1.2.3":"2026-06-22T00:02:23.573Z","1.2.5":"2026-06-22T07:36:34.087Z","1.2.6":"2026-06-22T07:59:00.043Z","1.2.8":"2026-06-24T21:34:30.814Z","1.2.9":"2026-06-29T00:06:05.790Z","1.3.0":"2026-07-09T21:55:42.303Z","1.3.1":"2026-07-09T22:14:21.491Z","1.3.2":"2026-07-09T22:33:37.228Z","1.4.0":"2026-08-10T23:33:18.941Z","1.4.1":"2026-08-11T00:33:57.327Z","1.4.2":"2026-08-13T00:55:05.380Z","1.5.0":"2026-08-16T17:02:03.693Z","1.5.1":"2026-08-17T12:33:14.011Z","1.6.0":"2026-08-17T19:50:23.565Z","1.6.1":"2026-08-17T20:36:22.692Z","1.6.2":"2026-08-18T10:37:44.498Z","1.6.3":"2026-08-18T11:07:19.727Z","1.6.4":"2026-08-18T11:48:10.062Z","1.6.5":"2026-08-18T16:59:57.346Z","1.6.6":"2026-08-18T18:05:04.618Z","1.7.0":"2026-08-20T22:08:03.240Z","1.7.1":"2026-08-20T22:55:56.689Z","1.7.2":"2026-08-20T23:49:32.966Z","1.7.3":"2026-08-21T10:58:55.517Z","1.7.4":"2026-08-21T11:12:12.424Z","1.7.7":"2026-08-25T15:34:00.927Z","1.7.10":"2026-08-25T17:25:49.249Z","1.7.14":"2026-08-27T13:02:07.062Z","1.7.15":"2026-08-27T13:29:30.093Z","1.7.16":"2026-08-27T18:01:38.863Z","1.7.19":"2026-09-19T16:51:06.067Z","1.7.20":"2026-09-26T10:07:56.494Z","1.7.21":"2026-09-26T14:02:54.500Z"},"author":{"name":"Amadou Diallo","email":"amadoumacbookpro38@gmail.com"},"license":"MIT","keywords":["angular","dynamic-form","reactive-forms","angular-material","suntelecoms"],"description":"Générateur de formulaires Angular dynamiques — SUNTELECOMS","maintainers":[{"name":"amepro38","email":"amadoumacbookpro38@gmail.com"}],"readme":"# @suntelecoms/ngx-dynamic-form\n\n> Génère des formulaires Angular complexes à partir d'une configuration TypeScript — sans écrire une ligne de template HTML. Inclut un Form Builder visuel, la gestion des schémas sauvegardés, un système de stockage interchangeable (localStorage / API REST) et le support des formulaires **multi-étapes (Stepper)**.\n\n[![Angular](https://img.shields.io/badge/Angular-19-red?logo=angular)](https://angular.dev)\n[![Angular Material](https://img.shields.io/badge/Angular_Material-19-blue?logo=material-design)](https://material.angular.io)\n[![Version](https://img.shields.io/badge/version-1.7.21-brightgreen)](CHANGELOG.md)\n[![License](https://img.shields.io/badge/License-MIT-green)](LICENSE)\n[![Author](https://img.shields.io/badge/Author-Amadou%20Diallo-purple)](mailto:amadoumacbookpro38@gmail.com)\n\n---\n\n## Sommaire\n\n- [Présentation](#présentation)\n- [Fonctionnalités](#fonctionnalités)\n- [Installation](#installation)\n- [Démarrage rapide — formulaire statique](#démarrage-rapide--formulaire-statique)\n- [Démarrage rapide — stack complète](#démarrage-rapide--stack-complète)\n- [Types de champs](#types-de-champs)\n- [Configuration — DynamicFormConfig](#configuration--dynamicformconfig)\n- [Propriétés d'un champ — DynamicFormField](#propriétés-dun-champ--dynamicformfield)\n- [Options dynamiques depuis une API](#options-dynamiques-depuis-une-api)\n- [Listes en cascade — dependsOn](#listes-en-cascade--dependson)\n- [Recherche distante (typeahead) — remoteSearch](#recherche-distante-typeahead--remotesearch)\n- [Filtre des options API — optionsFilter](#filtre-des-options-api--optionsfilter)\n- [Validation](#validation)\n- [Validation par pattern — regex](#validation-par-pattern--regex)\n- [Vérification d'unicité — uniqueCheck](#vérification-dunicité--uniquecheck)\n- [Affichage conditionnel — showWhen](#affichage-conditionnel--showwhen)\n- [Auto-remplissage depuis une API — lookup](#auto-remplissage-depuis-une-api--lookup)\n- [Required conditionnel — requiredWhen](#required-conditionnel--requiredwhen)\n- [Validation croisée — maxField / minField](#validation-croisée--maxfield--minfield)\n- [Au moins un champ obligatoire — atLeastOneOf](#au-moins-un-champ-obligatoire--atleastoneof)\n- [Guard de step — beforeNext](#guard-de-step--beforenext)\n- [Icônes (Material Icons)](#icônes-material-icons)\n- [Disposition en grille (col)](#disposition-en-grille-col)\n- [API du composant DynamicForm](#api-du-composant-dynamicform)\n- [Formulaires multi-étapes — Stepper](#formulaires-multi-étapes--stepper)\n- [provideNgxForms — configuration globale](#providengxforms--configuration-globale)\n- [FormConfigService — gestion des schémas](#formconfigservice--gestion-des-schémas)\n- [Stockage — LocalStorage vs API REST](#stockage--localstorage-vs-api-rest)\n- [Form Builder — éditeur visuel](#form-builder--éditeur-visuel)\n- [Composants de navigation](#composants-de-navigation)\n- [Intégration dans un composant](#intégration-dans-un-composant)\n- [Pages de démonstration](#pages-de-démonstration)\n- [Exemples complets](#exemples-complets)\n- [Personnalisation CSS](#personnalisation-css)\n- [Interfaces TypeScript](#interfaces-typescript)\n- [Auteur](#auteur)\n\n---\n\n## Présentation\n\n**@suntelecoms/ngx-dynamic-form** est un plugin Angular 19 qui génère des formulaires réactifs dynamiquement à partir d'un objet de configuration TypeScript. Il s'appuie sur **Angular Reactive Forms** et **Angular Material**.\n\nDepuis la **v1.2.0**, le plugin embarque :\n- Le **Form Builder visuel** (`<ngx-form-builder>`) — avec mode **Stepper**\n- Le **gestionnaire de formulaires** (`<ngx-mes-formulaires>`)\n- La **page de rendu par code** (`<ngx-form-loader>`)\n- Un **système de stockage abstrait** (localStorage par défaut, API REST Spring en option)\n- Les **formulaires multi-étapes** (`<ngx-stepper-form>`) avec étape de récapitulatif\n\nRésultat : dans n'importe quel projet Angular, il suffit de **2 lignes** pour avoir une interface complète de paramétrage de formulaires.\n\n---\n\n## Fonctionnalités\n\n- **25 types de champs** — `text`, `email`, `password`, `number`, `tel`, `url`, `date`, `datetime-local`, `time`, `month`, `week`, `textarea`, `select`, `multiselect`, `radio`, `checkbox`, `switch`, `range`, `color`, `location`, `file`, `phone`, `hidden`, `divider`, `heading`\n- **3 variantes d'apparence** — `outline`, `fill`, `simple` (label fixe au-dessus) — globale ou par champ _(v1.2.7)_\n- **Datepicker Material** (`mat-datepicker`) pour le type `date` _(v1.2.8)_\n- **Géolocalisation** — type `location` avec bouton GPS et API `navigator.geolocation` _(v1.2.8)_\n- **Curseur de valeur** — type `range` rendu en `mat-slider` _(v1.2.8)_\n- **Interrupteur** — type `switch` rendu en `mat-slide-toggle` _(v1.2.8)_\n- **Styling par champ** — `fontSize`, `textAlign`, `color`, `backgroundColor`, `borderColor`, `labelColor`, `fontWeight`, `fontStyle`, `cssClass`, `styles` _(v1.2.7)_\n- **Masque de saisie** — propriété `mask` (`#` = chiffre, autres chars = séparateurs) _(v1.2.7)_\n- **Préfixe / suffixe texte** — propriétés `prefix` et `suffix` _(v1.2.7)_\n- **Code unique par formulaire** — propriété `code` saisie par l'utilisateur, utilisée pour l'URL de partage et la récupération par code _(v1.2.9)_\n- **Authentification Bearer token** — `auth` dans `provideNgxForms` + intercepteur `ngxFormsAuthInterceptor` pour les APIs sécurisées (login/mot de passe → JWT) _(v1.3.0)_\n- **Floating label** Angular Material (`mat-form-field appearance=\"outline\"`)\n- **Validation déclarative** — `required`, `email`, `minLength`, `maxLength`, `min`, `max`, `pattern`, validateur personnalisé\n- **Messages d'erreur personnalisés** par champ\n- **Champ téléphone international** — type `phone`, sélecteur de pays (menu avec recherche, apparence Material native) + masque automatique, valeur E.164 dans le formulaire, 135 pays préconfigurés _(v1.4.0, sélecteur revu en v1.4.7)_ ; **valeur existante affichée en édition** — pays déduit de l'indicatif, numéro local masqué _(v1.7.20)_\n- **Vérification d'unicité asynchrone** — propriété `uniqueCheck` sur un champ, appel API debounced (400 ms), auto-détection enveloppe SUNTELECOMS `{ data: boolean }` _(v1.4.0)_\n- **Affichage conditionnel** (`showWhen`) avec 7 opérateurs\n- **Logique ET / OU sur conditions multiples** — propriété `conditionLogic: 'AND' | 'OR'`, configurable depuis le Builder _(v1.4.0)_\n- **Grille 12 colonnes** — propriété `col`\n- **Icônes Material Icons** — préfixe et suffixe par champ\n- **Préremplissage** via `[initialValues]`\n- **Mode lecture seule / désactivé** par champ\n- **Sections et séparateurs** (`heading`, `divider`)\n- **API publique** — `getForm()`, `patchValues()` via `@ViewChild`\n- **Événements** — `formSubmit`, `formChange`, `formReset`\n- **Formulaires multi-étapes (Stepper)** — `<ngx-stepper-form>` avec navigation, validation par étape et récapitulatif automatique _(v1.2.0)_\n- **Form Builder visuel** — interface 3 panneaux, supporte les modes Formulaire et Stepper _(v1.2.0)_\n- **Options dynamiques depuis une API** — propriétés `url`, `displayName`, `displayValue` sur les champs `select`, `multiselect`, `radio` _(v1.2.5)_, avec extraction automatique des réponses enveloppées (`{ data: [...] }`) ou via `responseDataKey` _(v1.4.4)_\n- **Listes en cascade** — propriété `dependsOn` : un champ recharge ses options (statiques ou distantes, avec interpolation `{{champ}}` dans `url`) quand un autre champ change _(v1.4.5)_\n- **Stockage abstrait** — localStorage ou API REST Spring\n- **FormConfigService** — Signal-based, Observable API\n- **Auto-remplissage depuis une API** (`lookup`) — sur `blur`, requête GET/POST → remplit des champs cibles via une map `populate` en notation pointée _(v1.6.0)_\n- **Required conditionnel** (`requiredWhen`) — `Validators.required` activé dynamiquement selon une `FieldCondition`, sans code impératif _(v1.6.0)_\n- **Validation croisée min/max** (`maxField` / `minField`) — erreur posée sur le `FormControl` cible si la valeur dépasse/est inférieure à celle d'un autre champ _(v1.6.0)_\n- **Au moins un obligatoire** (`atLeastOneOf`) — validateur de groupe sur `DynamicFormConfig` et `FormStep` _(v1.6.0)_\n- **Guard de step asynchrone** (`beforeNext`) — appel HTTP avant l'avancement ; HTTP 4xx bloque l'étape et affiche le message d'erreur du serveur _(v1.6.0)_\n- **Événement `fieldChange`** — émis par `DynamicFormComponent` et `StepperFormComponent` à chaque changement de champ, avec `{ key, value, form }` pour piloter la logique métier depuis l'hôte _(v1.6.0)_\n- **Copie automatique de champ** (`copyFrom`) — propriété sur `DynamicFormField` : quand le champ source change, la valeur est copiée automatiquement dans ce champ sans code impératif dans l'hôte _(v1.7.2)_\n- **Valeur par défaut** (`defaultValue`) — initialise le champ avec une valeur arbitraire à l'ouverture du formulaire _(v1.7.2)_\n- **Form Builder complet** — le builder visuel expose désormais toutes les propriétés de `DynamicFormField` : `defaultValue`, `disabled`, `hidden`, `copyFrom`, `responseDataKey`, `dependsOn`/`dependsOnMode`/`dependsOnItemKey`/`dependsOnOffset`, `minDate`/`maxDate`, `lookup.triggerOn` _(v1.7.3)_\n- **Recherche distante (typeahead)** — propriété `remoteSearch` sur un champ `select` : au lieu de charger toutes les options via `url`, affiche un `mat-autocomplete` qui interroge `url` avec le texte tapé (debounce, `minChars` avant la première requête, params statiques additionnels) — pour les listes trop grandes pour être chargées entièrement (ex : recherche client) _(v1.7.5)_\n- **Locale du datepicker configurable** — le type `date` affiche `DD/MM/YYYY` par défaut (`fr-FR`, calendrier et noms de mois en français) au lieu du format US du navigateur ; personnalisable par champ (`dateLocale`) ou globalement (`provideNgxForms({ dateLocale })`) _(v1.7.6)_\n- **Recherche dans « Mes Formulaires »** — filtre les formulaires sauvegardés par titre ou code, utile dès que le catalogue grandit _(v1.7.9)_\n- **Filtre des options API** — propriété `optionsFilter` sur un champ `select`/`multiselect`/`radio` chargé via `url` : ne garde que les items dont une propriété correspond à une condition (ex: `status === 'ACTIF'`), avec logique ET/OU sur plusieurs conditions — même mécanique que `showWhen`, mais évaluée contre les propriétés brutes de chaque item API _(v1.7.10)_\n- **Champ fichier fonctionnel** — le type `file` est maintenant relié au formulaire (dropzone clic/glisser-déposer, liste de fichiers choisis, `formControl.value` = `File`/`File[]`) ; avant v1.7.11 l'`<input type=\"file\">` n'était pas connecté, aucune valeur ne remontait _(v1.7.11)_\n- **Code ISO pays** — type `iso-country` : liste déroulante recherchable (nom ou code) avec drapeau, même référentiel que `country-dial-code` — garantit un code toujours valide au lieu d'une saisie libre _(v1.7.12, converti en liste déroulante en v1.7.14)_\n- **Montants avec séparateur de milliers** — `thousandSeparator` sur un champ `number` : saisie et affichage « 20 000 », « 1 250 000,5 » (reformaté à la frappe, curseur conservé), valeur numérique `20000` dans le FormControl — validateurs `min`/`max`/`maxField` et payload inchangés ; case à cocher dans le Form Builder _(v1.7.21)_\n- **Dates au calendrier uniquement** — le type `date` ne se saisit plus au clavier : un clic ouvre le calendrier (Material ou sélecteur natif en apparence `simple`), ce qui évite aussi la lecture US MM/JJ d'une date tapée _(v1.7.19)_\n- **Période de dates** — `maxField` / `minField` sur les champs `date` (et `datetime-local`, `month`, `week`, `time`) : date de début ≤ date de fin, dates hors période grisées dans le calendrier, configurable dans le Form Builder _(v1.7.18)_\n- **Label composé** — `displayName` accepte un chemin pointé (`personnePhysique.nom`) ou un modèle de concaténation (`'{{codeClient}} - {{telephone}}'`) pour les options chargées via `url` (y compris `remoteSearch`) _(v1.7.17)_\n- **Indicatif téléphonique pays** — nouveau type `country-dial-code` : recherche de pays (nom/indicatif/code) avec drapeau, stocke uniquement l'indicatif choisi (ex: `'+221'`) comme attribut autonome, réutilise le référentiel du type `phone` _(v1.7.13)_\n\n---\n\n## Installation\n\n### 1. Prérequis\n\n- Angular **19+**\n- Node.js **18+**\n\n### 2. Installer les dépendances\n\n```bash\nnpm install @suntelecoms/ngx-dynamic-form @angular/material@^19.0.0 @angular/cdk@^19.0.0\n```\n\n### 3. Ajouter le thème Material et les icônes\n\n**angular.json :**\n```json\n\"styles\": [\n  \"@angular/material/prebuilt-themes/azure-blue.css\",\n  \"src/styles.css\"\n]\n```\n\n**index.html :**\n```html\n<link href=\"https://fonts.googleapis.com/icon?family=Material+Icons\" rel=\"stylesheet\">\n<link href=\"https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;500&display=swap\" rel=\"stylesheet\">\n```\n\n### 4. Configurer le plugin (app.config.ts)\n\n```typescript\nimport { ApplicationConfig } from '@angular/core';\nimport { provideRouter } from '@angular/router';\nimport { provideAnimations } from '@angular/platform-browser/animations';\nimport { provideNgxForms } from '@suntelecoms/ngx-dynamic-form';\nimport { routes } from './app.routes';\n\nexport const appConfig: ApplicationConfig = {\n  providers: [\n    provideRouter(routes),\n    provideAnimations(),\n    provideNgxForms({ storage: 'local' }),  // ← stockage localStorage\n  ],\n};\n```\n\n### 5. Ajouter les routes (app.routes.ts)\n\n```typescript\nimport { Routes } from '@angular/router';\n\nexport const routes: Routes = [\n  {\n    path: 'builder',\n    loadComponent: () => import('@suntelecoms/ngx-dynamic-form').then(m => m.FormBuilderComponent),\n  },\n  {\n    path: 'mes-formulaires',\n    loadComponent: () => import('@suntelecoms/ngx-dynamic-form').then(m => m.MesFormulairesComponent),\n  },\n  {\n    path: 'form/:code',   // ← le formulaire est identifié par son code unique\n    loadComponent: () => import('@suntelecoms/ngx-dynamic-form').then(m => m.FormLoaderComponent),\n  },\n];\n```\n\n**C'est tout.** Aucun code supplémentaire à écrire — le Builder, la liste des formulaires et la page de rendu sont entièrement fournis par le plugin.\n\n---\n\n## Démarrage rapide — formulaire statique\n\nUtilisez `<ngx-dynamic-form>` directement avec une config TypeScript :\n\n```typescript\nimport { Component } from '@angular/core';\nimport { DynamicFormComponent } from '@suntelecoms/ngx-dynamic-form';\nimport type { DynamicFormConfig, DynamicFormSubmitEvent } from '@suntelecoms/ngx-dynamic-form';\n\n@Component({\n  selector: 'app-contact',\n  standalone: true,\n  imports: [DynamicFormComponent],\n  template: `\n    <ngx-dynamic-form [config]=\"config\" (formSubmit)=\"onSubmit($event)\" />\n  `,\n})\nexport class ContactComponent {\n  config: DynamicFormConfig = {\n    submitLabel: 'Envoyer',\n    showReset: true,\n    fields: [\n      { key: 'name',  type: 'text',  label: 'Nom complet', col: 6, icon: 'person',\n        validation: { required: true } },\n      { key: 'email', type: 'email', label: 'E-mail',      col: 6, icon: 'email',\n        validation: { required: true, email: true } },\n      { key: 'message', type: 'textarea', label: 'Message', rows: 5,\n        validation: { required: true } },\n    ],\n  };\n\n  onSubmit(event: DynamicFormSubmitEvent): void {\n    console.log(event.value);\n  }\n}\n```\n\n---\n\n## Démarrage rapide — stack complète\n\nPour disposer du **Form Builder + gestionnaire + rendu par URL** dans votre application, il suffit des 2 fichiers de configuration vus à l'installation. Après `ng serve` :\n\n| URL | Page |\n|---|---|\n| `/builder` | Interface graphique de création de formulaires (simple ou stepper) |\n| `/mes-formulaires` | Liste des formulaires sauvegardés, avec rendu à la volée |\n| `/form/mon-code` | Rendu d'un formulaire sauvegardé par son code unique |\n\n---\n\n## Types de champs\n\n### Saisie texte\n\n| Type | Rendu | Description |\n|---|---|---|\n| `text` | `<input type=\"text\">` | Champ texte standard |\n| `email` | `<input type=\"email\">` | Validation e-mail intégrée |\n| `password` | `<input type=\"password\">` | Mot de passe masqué |\n| `number` | `<input type=\"number\">` | Supporte `min`, `max` |\n| `tel` | `<input type=\"tel\">` | Téléphone — compatible masque de saisie |\n| `url` | `<input type=\"url\">` | URL |\n| `textarea` | `<textarea>` | Zone de texte multi-lignes, propriété `rows` |\n\n### Date & Heure\n\n| Type | Rendu | Description |\n|---|---|---|\n| `date` | `mat-datepicker` | Calendrier Material — popup avec sélection mois/année _(v1.2.8)_ ; `minDate`/`maxDate` pour borner les dates sélectionnables, `'today'` ou une date ISO _(v1.6.6)_ ; affichage `DD/MM/YYYY` (locale `fr-FR`) par défaut, personnalisable par champ (`dateLocale`) ou globalement (`provideNgxForms({ dateLocale })`) _(v1.7.6)_ ; **sélection au calendrier uniquement** — saisie clavier bloquée, un clic sur le champ ouvre le calendrier, le bouton calendrier reste accessible au clavier (Tab puis Entrée) _(v1.7.19)_ |\n| `datetime-local` | `<input type=\"datetime-local\">` | Date et heure combinées |\n| `time` | `<input type=\"time\">` | Heure (HH:mm) |\n| `month` | `<input type=\"month\">` | Mois et année |\n| `week` | `<input type=\"week\">` | Semaine ISO |\n\n### Choix\n\n| Type | Rendu | Description |\n|---|---|---|\n| `select` | `<mat-select>` | Liste déroulante — 1 choix — options statiques ou API |\n| `multiselect` | `<mat-select multiple>` | Liste déroulante — plusieurs choix |\n| `radio` | `<mat-radio-group>` | Boutons radio — options statiques ou API |\n| `checkbox` | `<mat-checkbox>` | Case à cocher booléenne |\n| `switch` | `<mat-slide-toggle>` | Interrupteur on/off _(v1.2.8)_ |\n\n### Spéciaux\n\n| Type | Rendu | Description |\n|---|---|---|\n| `range` | `<mat-slider>` | Curseur de valeur — propriétés `min`, `max`, `step`, `showValue` _(v1.2.8)_ |\n| `color` | `<input type=\"color\">` | Sélecteur de couleur avec affichage du code hex _(v1.2.8)_ |\n| `location` | `<input>` + bouton GPS | Champ adresse avec géolocalisation — bouton `my_location` déclenche `navigator.geolocation` _(v1.2.8)_ |\n| `file` | Dropzone (clic ou glisser-déposer) + liste de fichiers choisis | Téléversement — `accept`, `multiple` ; `formControl.value` = `File` (ou `File[]` si `multiple`), à empaqueter en `FormData` par le consommateur dans `onSubmit` — le plugin ne fait aucun appel HTTP lui-même _(fonctionnel depuis v1.7.11 — avant cette version l'`<input>` n'était pas relié au formulaire)_ |\n| `phone` | `mat-form-field` + menu pays | Téléphone international — sélecteur de pays (menu + recherche), masque automatique, valeur E.164 dans le FormGroup _(v1.4.0, v1.4.7)_ ; en édition (`initialValues`, `patchValue`), la valeur existante s'affiche : `'+22222123456'` ou `'0022222123456'` → pays déduit de l'indicatif (le plus long l'emporte, ex. `+1242` avant `+1`) + numéro local masqué ; sans indicatif (`'774127793'`), le pays `defaultCountry` est gardé _(v1.7.20)_ |\n| `iso-country` | `mat-autocomplete` — recherche pays | Code ISO 3166-1 alpha-2 : liste déroulante recherchable (nom ou code) avec drapeau SVG (`flag-icons`, même rendu que `phone` — pas d'emoji, repli en deux lettres nues sur certains Windows/webviews), sur le même référentiel `PHONE_COUNTRIES` que `country-dial-code` (son `.code` EST le code ISO) — garantit un code toujours valide, pas de saisie libre ; validation `^[A-Za-z]{2}$` conservée en filet de sécurité si une valeur est posée par programmation _(v1.7.12 en saisie libre, converti en liste déroulante en v1.7.14, drapeau SVG en v1.7.15)_ |\n| `country-dial-code` | `mat-autocomplete` — recherche pays | Choix de l'indicatif téléphonique d'un pays comme attribut autonome (ex: `Pays.indicatifTel = '+221'`) — distinct de `phone` (qui saisit un numéro complet E.164) ; recherche par nom, indicatif ou code sur le même référentiel `PHONE_COUNTRIES`, drapeau SVG (`flag-icons`, même rendu que `phone`) dans chaque résultat, `formControl.value` = l'indicatif choisi (ex: `'+221'`) _(v1.7.13, drapeau SVG en v1.7.15)_ |\n\n### Mise en page\n\n| Type | Rendu | Description |\n|---|---|---|\n| `hidden` | `<input type=\"hidden\">` | Champ caché (présent dans le FormGroup) |\n| `divider` | `<hr>` | Séparateur horizontal |\n| `heading` | `<h1>` à `<h6>` | Titre de section — propriétés `text`, `level` |\n\n---\n\n## Configuration — DynamicFormConfig\n\n```typescript\ninterface DynamicFormConfig {\n  fields: DynamicFormField[];     // Liste des champs (obligatoire)\n  submitLabel?: string;           // Libellé du bouton Envoyer (défaut : \"Envoyer\")\n  resetLabel?: string;            // Libellé du bouton Réinitialiser (défaut : \"Réinitialiser\")\n  showReset?: boolean;            // Afficher le bouton Réinitialiser (défaut : false)\n  layout?: 'vertical' | 'horizontal' | 'inline';\n  cssClass?: string;\n  debug?: boolean;                // Affiche les valeurs JSON en temps réel\n  // Apparence globale ← v1.2.7\n  appearance?: 'outline' | 'fill' | 'simple'; // défaut : 'outline'\n  floatLabel?: 'auto' | 'always';             // défaut : 'auto'\n  // Validation de groupe ← v1.6.0\n  atLeastOneOf?: string[];        // Au moins un des champs listés doit être renseigné\n  atLeastOneOfMessage?: string;   // Message d'erreur (défaut : 'Au moins un champ est requis.')\n}\n```\n\n---\n\n## Propriétés d'un champ — DynamicFormField\n\n```typescript\ninterface DynamicFormField {\n  // Obligatoire\n  key: string;                    // Identifiant unique (clé dans FormGroup)\n  type: FieldType;\n\n  // Affichage\n  label?: string;\n  placeholder?: string;\n  hint?: string;\n  icon?: string;                  // Icône préfixe (Material Icons)\n  iconSuffix?: string;            // Icône suffixe (Material Icons)\n  prefix?: string;                // Texte préfixe dans le champ (ex : '+221')  ← v1.2.7\n  suffix?: string;                // Texte suffixe dans le champ (ex : 'FCFA')  ← v1.2.7\n\n  // Valeur & état\n  defaultValue?: any;\n  disabled?: boolean;\n  readonly?: boolean;\n  hidden?: boolean;\n\n  // Options statiques (select / multiselect / radio)\n  options?: SelectOption[];\n\n  // Options dynamiques chargées depuis une API  ← v1.2.5\n  url?: string;          // endpoint relatif ('villes'), absolu ('https://...'),\n                          // ou racine-relatif ('/autre-service/api/...') ← v1.4.4\n  displayName?: string;  // label : clé, chemin pointé ou modèle '{{codeClient}} - {{telephone}}' (défaut : 'label')\n  displayValue?: string; // propriété de la réponse API utilisée comme valeur (défaut : 'value')\n  responseDataKey?: string; // clé du tableau si la réponse est enveloppée, ex: 'data'\n                             // (défaut : essaie 'data' automatiquement si la réponse\n                             // n'est pas déjà un tableau)  ← v1.4.4\n\n  // Recherche distante : remplace le chargement eager de `url` par un typeahead\n  // debouncé — voir Recherche distante (typeahead) — remoteSearch  ← v1.7.5\n  remoteSearch?: RemoteSearchConfig; // type: 'select' uniquement\n\n  // Filtre les items reçus de `url` avant mapping — voir Filtre des options API — optionsFilter  ← v1.7.10\n  optionsFilter?: FieldCondition | FieldCondition[];\n  optionsFilterLogic?: 'AND' | 'OR'; // défaut 'AND'\n\n  // Copie automatique depuis un autre champ  ← v1.7.2\n  copyFrom?: string; // clé du champ source — quand sa valeur change, elle est copiée ici automatiquement\n\n  // Liste en cascade : recharge ses options quand le champ `dependsOn` change  ← v1.4.5\n  dependsOn?: string;         // clé d'un autre champ du formulaire\n  dependsOnMode?: 'server' | 'client'; // défaut 'server' — voir Listes en cascade  ← v1.4.6\n  dependsOnItemKey?: string;  // mode 'client' : propriété de l'item à comparer   ← v1.4.6\n  dependsOnOffset?: number;   // mode 'client' : décalage numérique avant comparaison ← v1.4.6\n\n  // Validation\n  validation?: FieldValidation;\n\n  // Disposition\n  col?: 1|2|3|4|6|8|9|12;       // Colonnes sur 12 (défaut : 12)\n  cssClass?: string;             // Classe CSS ajoutée sur l'hôte  ← v1.2.7\n\n  // Affichage conditionnel\n  showWhen?: FieldCondition | FieldCondition[];\n  conditionLogic?: 'AND' | 'OR';  // Logique entre conditions multiples (défaut : 'AND')  ← v1.4.0\n\n  // Vérification d'unicité asynchrone  ← v1.4.0\n  uniqueCheck?: {\n    url: string;      // Endpoint POST — reçoit { value } — doit retourner boolean ou { data: boolean }\n    message?: string; // Message d'erreur (défaut : 'Cette valeur existe déjà.')\n  };\n\n  // Auto-remplissage depuis une API  ← v1.6.0\n  lookup?: FieldLookup;\n\n  // Spécifique number — montant « 20 000 » (valeur 20000)  ← v1.7.21\n  thousandSeparator?: boolean | string; // true = espace, ou le séparateur voulu (ex: '.')\n\n  // Spécifique phone  ← v1.4.0\n  defaultCountry?: string; // Code ISO 3166-1 alpha-2 (ex : 'FR', 'SN') — défaut : 'FR'\n\n  // Spécifique file\n  accept?: string;                // Ex : \".pdf,.jpg\"\n  multiple?: boolean;\n\n  // Spécifique textarea\n  rows?: number;                  // Défaut : 3\n\n  // Spécifique date  ← v1.6.6\n  minDate?: string;               // 'today', ou une date ISO ('2026-01-01')\n  maxDate?: string;               // idem — borne le mat-datepicker et l'input natif (apparence simple)\n  dateLocale?: string;            // Locale d'affichage (ex: 'fr-FR' → 25/08/2026) — remplace la\n                                   // locale globale de provideNgxForms. Défaut global : 'fr-FR'  ← v1.7.6\n  // Exemple — une date de mise en circulation ne peut pas être dans le futur :\n  // { key: 'dateMiseCirculation', type: 'date', label: 'Date de mise en circulation', maxDate: 'today' }\n  // Une date de rendez-vous ne peut pas être dans le passé :\n  // { key: 'dateRdv', type: 'date', label: 'Date du rendez-vous', minDate: 'today' }\n\n  // Spécifique heading\n  text?: string;\n  level?: 1|2|3|4|5|6;          // Défaut : 2\n\n  // Spécifique range  ← v1.2.8\n  min?: number;                   // Valeur minimale du curseur (défaut : 0)\n  max?: number;                   // Valeur maximale du curseur (défaut : 100)\n  step?: number;                  // Pas du curseur (défaut : 1)\n  showValue?: boolean;            // Afficher la valeur courante à côté du curseur\n\n  // Masque de saisie  ← v1.2.7\n  // '#' = chiffre obligatoire, tout autre caractère = séparateur littéral\n  // Ex : '## ### ## ##' → téléphone SN, '##/##/####' → date, '#### #### #### ####' → CB\n  mask?: string;\n\n  // Apparence individuelle (override la valeur globale du formulaire)  ← v1.2.7\n  appearance?: 'outline' | 'fill' | 'simple';\n  floatLabel?: 'auto' | 'always';\n\n  // Style & Apparence  ← v1.2.7 / v1.2.8\n  fontSize?: string;                        // Ex : '14px', '1.1rem'\n  textAlign?: 'left' | 'center' | 'right';\n  color?: string;                           // Couleur du texte saisi\n  backgroundColor?: string;                 // Couleur de fond du champ\n  borderColor?: string;                     // Couleur de la bordure  ← v1.2.8\n  labelColor?: string;                      // Couleur du label       ← v1.2.8\n  fontWeight?: 'normal' | 'bold';\n  fontStyle?: 'normal' | 'italic';\n  styles?: Record<string, string>;          // Styles CSS inline supplémentaires\n\n  attrs?: Record<string, any>;\n}\n```\n\n### SelectOption\n\n```typescript\ninterface SelectOption {\n  label: string;\n  value: any;\n  disabled?: boolean;\n  group?: string;\n  dependsOnValue?: any; // valeur du champ `dependsOn` pour laquelle cette option apparaît ← v1.4.5\n}\n```\n\n---\n\n## Options dynamiques depuis une API\n\n> **Nouveauté v1.2.5**\n\nPour les champs `select`, `multiselect` et `radio`, les options peuvent être chargées automatiquement depuis une API REST au lieu d'être définies statiquement. Il suffit d'utiliser `url` à la place de `options`.\n\n### Comment ça fonctionne\n\n1. Le composant détecte la propriété `url` sur le champ\n2. Il effectue un `GET` sur l'URL complète (`dataUrl` + `url`)\n3. Si la réponse n'est pas déjà un tableau, il essaie de l'extraire depuis `responseDataKey` (ou `'data'` par défaut) — voir [Réponse API attendue](#réponse-api-attendue) ← v1.4.4\n4. Il mappe chaque objet du tableau en `{ label, value }` en utilisant `displayName` et `displayValue`\n5. Pendant le chargement, le select affiche **\"Chargement…\"** avec un spinner\n\n### Configuration dans `app.config.ts`\n\n```typescript\nimport { provideHttpClient } from '@angular/common/http';\nimport { provideNgxForms } from '@suntelecoms/ngx-dynamic-form';\n\nproviders: [\n  provideHttpClient(),                    // requis pour les options depuis API\n  provideNgxForms({\n    storage: 'local',\n    dataUrl: 'https://api.monprojet.com', // base URL pour les options\n  }),\n]\n```\n\n### Exemples\n\n**Options depuis une API (URL relative) :**\n```typescript\n{\n  key: 'ville',\n  type: 'select',\n  label: 'Ville',\n  col: 6,\n  icon: 'location_city',\n  url: 'villes',           // → GET https://api.monprojet.com/villes\n  displayName: 'nom',      // propriété affichée dans la liste\n  displayValue: 'id',      // propriété utilisée comme valeur du formulaire\n  validation: { required: true },\n}\n```\n\n**Options depuis une API (URL absolue) :**\n```typescript\n{\n  key: 'compte',\n  type: 'select',\n  label: 'Compte',\n  col: 6,\n  url: 'https://autre-api.com/comptes', // URL absolue — dataUrl ignoré\n  displayName: 'numero',\n  displayValue: 'numero',\n  validation: { required: true },\n}\n```\n\n**Options depuis un backend différent, même origine (chemin racine-relatif) :** ← v1.4.4\n```typescript\n{\n  key: 'role',\n  type: 'select',\n  label: 'Rôle',\n  col: 12,\n  // Commence par '/' → traité comme dataUrl : résolu par le navigateur\n  // contre l'origine courante (donc via le même proxy/reverse-proxy déjà\n  // configuré pour cette autre API), sans coder en dur un hôte complet\n  // qui ne serait correct que dans un seul environnement.\n  url: '/tp-security-service/api/roles?size=1000&page=0',\n  responseDataKey: 'data',\n  displayName: 'nom',\n  displayValue: 'nom',\n  validation: { required: true },\n}\n```\n\n**Multi-sélection depuis une API :**\n```typescript\n{\n  key: 'categories',\n  type: 'multiselect',\n  label: 'Catégories',\n  col: 12,\n  url: 'categories',\n  displayName: 'libelle',\n  displayValue: 'code',\n}\n```\n\n### Réponse API attendue\n\nL'API peut retourner soit un **tableau JSON** brut :\n\n```json\n[\n  { \"id\": 1, \"nom\": \"Dakar\" },\n  { \"id\": 2, \"nom\": \"Thiès\" },\n  { \"id\": 3, \"nom\": \"Saint-Louis\" }\n]\n```\n\nsoit une réponse **enveloppée** (convention courante des API paginées : `{ data, total, ... }`) :\n\n```json\n{\n  \"data\": [\n    { \"id\": 1, \"nom\": \"Dakar\" },\n    { \"id\": 2, \"nom\": \"Thiès\" },\n    { \"id\": 3, \"nom\": \"Saint-Louis\" }\n  ],\n  \"total\": 3\n}\n```\n\nDans ce second cas, le tableau est automatiquement extrait depuis la clé `'data'` — aucune configuration requise. Si l'API utilise une autre clé (`'items'`, `'results'`, `'list'`…), indiquez-la explicitement avec `responseDataKey` ← v1.4.4 :\n\n```typescript\n{\n  key: 'ville',\n  type: 'select',\n  url: 'villes',\n  responseDataKey: 'items', // → extrait response.items au lieu de response.data\n  displayName: 'nom',\n  displayValue: 'id',\n}\n```\n\nAvec `displayName: 'nom'` et `displayValue: 'id'`, le select affichera `Dakar`, `Thiès`, `Saint-Louis` et soumettra `1`, `2`, `3`.\n\n### Résumé des propriétés\n\n| Propriété | Type | Description |\n|---|---|---|\n| `url` | `string` | Endpoint relatif (`'villes'`), absolu (`'https://...'`) ou racine-relatif (`'/autre-service/...'`, résolu contre l'origine courante) ← v1.4.4. Quand défini, `options` est ignoré. |\n| `displayName` | `string` | Propriété de l'objet API utilisée comme **label** affiché (défaut : `'label'`). Accepte un chemin pointé (`'personnePhysique.nom'`) ou un modèle de concaténation (`'{{codeClient}} - {{telephone}}'`) — voir [Label composé](#label-composé--displayname-concaténé) ← v1.7.17 |\n| `displayValue` | `string` | Propriété de l'objet API utilisée comme **valeur** du formulaire (défaut : `'value'`) |\n| `responseDataKey` | `string` | Clé du tableau si la réponse est enveloppée (défaut : essaie `'data'` automatiquement) ← v1.4.4 |\n| `dependsOn` | `string` | Clé d'un autre champ : recharge les options quand sa valeur change — voir [Listes en cascade](#listes-en-cascade--dependson) ← v1.4.5 |\n| `dependsOnMode` | `'server' \\| 'client'` | Défaut `'server'` (re-fetch de `url` à chaque changement). `'client'` : charge `url` une seule fois puis filtre localement ← v1.4.6 |\n| `dependsOnItemKey` | `string` | Mode `'client'` : propriété de chaque item API comparée à la valeur de `dependsOn` (défaut : la clé de `dependsOn`) ← v1.4.6 |\n| `dependsOnOffset` | `number` | Mode `'client'` : décalage numérique ajouté à la valeur de `dependsOn` avant comparaison ← v1.4.6 |\n| `remoteSearch` | `RemoteSearchConfig` | Transforme un `select` en typeahead distant au lieu de charger `url` intégralement — voir [Recherche distante (typeahead) — remoteSearch](#recherche-distante-typeahead--remotesearch) ← v1.7.5 |\n| `optionsFilter` | `FieldCondition \\| FieldCondition[]` | Ne garde que les items API dont une propriété correspond à une condition (ex: `status === 'ACTIF'`) — voir [Filtre des options API — optionsFilter](#filtre-des-options-api--optionsfilter) ← v1.7.10 |\n\n> **Note :** `url` et `options` sont mutuellement exclusifs. Si `url` est défini, `options` est ignoré.\n>\n> Si la réponse n'est ni un tableau, ni un objet contenant un tableau à la clé attendue, les options restent vides et un avertissement est loggé dans la console (`[ngx-dynamic-form] ...`).\n\n### Label composé — displayName concaténé\n\n_(v1.7.17)_ `displayName` peut combiner plusieurs propriétés de l'item API, y compris imbriquées, avec la syntaxe `{{chemin}}` (la même que l'interpolation de `url`) :\n\n```typescript\n// Item API : { id: '37d2…', codeClient: 'CLI-PP-3F2247FB', telephone: '+221771234567',\n//              personnePhysique: { nom: 'Diop', prenom: 'Amadou' }, personneMorale: null }\n\ndisplayName: 'codeClient'                                          // → CLI-PP-3F2247FB (inchangé)\ndisplayName: 'personnePhysique.nom'                                // → Diop\ndisplayName: '{{codeClient}} - {{telephone}}'                      // → CLI-PP-3F2247FB - +221771234567\ndisplayName: '{{personnePhysique.nom}} {{personnePhysique.prenom}}' // → Diop Amadou\n```\n\n- Une valeur absente (`null`/`undefined`) est remplacée par une chaîne vide et les espaces en trop sont réduits. On peut donc enchaîner des alternatives pour une liste mixte personnes physiques / morales : `'{{codeClient}} - {{personnePhysique.nom}} {{personnePhysique.prenom}}{{personneMorale.raisonSociale}}'`.\n- Fonctionne pour `select`, `multiselect`, `radio`, `dependsOnMode: 'client'` et `remoteSearch`.\n- `displayValue` reste une clé simple.\n\n---\n\n## Listes en cascade — dependsOn\n\n> **Nouveauté v1.4.5**\n\nCertains champs `select`/`multiselect`/`radio` doivent proposer des options différentes selon la valeur choisie dans un **autre** champ (ex : le champ « Rattaché à » d'un privilège ne doit proposer que les privilèges du niveau immédiatement inférieur au « Niveau » choisi). C'est le rôle de `dependsOn` : tant que le champ référencé n'a pas de valeur, les options restent vides ; à chaque changement de sa valeur, elles sont recalculées (statique) ou rechargées (`url`).\n\n### Options statiques dépendantes\n\nChaque option statique concernée déclare la valeur de `dependsOn` pour laquelle elle doit apparaître, via `dependsOnValue` :\n\n```typescript\n{\n  key: 'niveau',\n  type: 'select',\n  label: 'Niveau',\n  col: 6,\n  options: [\n    { label: '1', value: 1 },\n    { label: '2', value: 2 },\n    { label: '3', value: 3 },\n  ],\n  validation: { required: true },\n},\n{\n  key: 'parent',\n  type: 'select',\n  label: 'Rattaché à',\n  col: 6,\n  dependsOn: 'niveau',\n  options: [\n    { label: 'Tableau de bord',  value: 10, dependsOnValue: 2 },\n    { label: 'Rapports',         value: 11, dependsOnValue: 2 },\n    { label: 'Rapports mensuels', value: 20, dependsOnValue: 3 },\n  ],\n}\n```\n\nIci, choisir `niveau = 2` ne propose que « Tableau de bord » et « Rapports » ; choisir `niveau = 3` ne propose que « Rapports mensuels ».\n\n### Options distantes dépendantes\n\nPour des options chargées depuis une API, `url` peut référencer la valeur courante de **n'importe quel** champ du formulaire via `{{cléDuChamp}}` — la requête est automatiquement relancée à chaque changement du champ `dependsOn` :\n\n```typescript\n{\n  key: 'niveau',\n  type: 'select',\n  label: 'Niveau',\n  col: 6,\n  options: [\n    { label: '1', value: 1 }, { label: '2', value: 2 }, { label: '3', value: 3 }, { label: '4', value: 4 },\n  ],\n  validation: { required: true },\n},\n{\n  key: 'parent',\n  type: 'select',\n  label: 'Rattaché à',\n  col: 6,\n  dependsOn: 'niveau',\n  url: '/api/privileges/select-options?niveau={{niveau}}', // → re-fetch à chaque changement de niveau\n  responseDataKey: 'data',\n  displayName: 'libelle',\n  displayValue: 'id',\n}\n```\n\n> **Note :** `dependsOn` ne modifie pas automatiquement la valeur déjà sélectionnée du champ dépendant si elle devient invalide après un changement du champ parent — la validation du formulaire (`required`, etc.) s'en charge normalement à la soumission.\n\n### API distante qui ne filtre pas côté serveur — dependsOnMode: 'client'\n\n> **Nouveauté v1.4.6**\n\nCertaines API ne proposent pas de paramètre de filtre — le pattern classique côté client est alors de charger toute la liste **une seule fois**, puis de la filtrer localement à chaque changement du champ parent (c'est exactement ce que fait un formulaire écrit à la main avec `array.filter(...)` dans un handler `(selectionChange)`). `dependsOnMode: 'client'` reproduit ce pattern :\n\n```typescript\n{\n  key: 'niveau',\n  type: 'select',\n  label: 'Niveau',\n  col: 6,\n  options: [\n    { label: '1', value: 1 }, { label: '2', value: 2 }, { label: '3', value: 3 }, { label: '4', value: 4 },\n  ],\n  validation: { required: true },\n},\n{\n  key: 'parent',\n  type: 'select',\n  label: 'Rattaché à',\n  col: 6,\n  dependsOn: 'niveau',\n  dependsOnMode: 'client',       // charge tous les privilèges une seule fois\n  url: '/tp-security-service/api/privileges?size=1000&page=0',\n  responseDataKey: 'data',\n  dependsOnItemKey: 'niveau',    // compare item.niveau à …\n  dependsOnOffset: -1,           // … niveau - 1 (le niveau immédiatement inférieur)\n  displayName: 'libelle',\n  displayValue: 'id',\n}\n```\n\nÉquivalent à :\n```typescript\n// Chargé une seule fois, indépendamment de `niveau` :\nconst privileges = await fetchAll('/tp-security-service/api/privileges?...');\n// Recalculé à chaque changement de `niveau` :\nconst options = privileges.filter(p => p.niveau === niveau - 1);\n```\n\nSans `dependsOnOffset`, la comparaison est stricte (`item[dependsOnItemKey] === valeurDeDependsOn`) — utile quand l'item référence directement l'id du parent (ex : `item.paysId === pays` pour un couple pays/ville).\n\n> **`server` vs `client` :** utilisez `server` (par défaut) quand l'API accepte un paramètre de filtre — une seule requête pertinente par changement. Utilisez `client` quand elle ne le fait pas — une seule requête au total, filtrage en mémoire ensuite (à réserver aux listes de taille raisonnable).\n\n---\n\n## Recherche distante (typeahead) — remoteSearch\n\n> **Nouveauté v1.7.5**\n\nPour un champ `select` dont la liste d'options est trop grande pour être chargée entièrement (ex : recherche de client parmi plusieurs milliers), `remoteSearch` remplace le chargement eager de `url` par un **typeahead** : le rendu passe d'un `mat-select` classique à un `input` + `mat-autocomplete`, qui interroge `url` avec le texte tapé (debounce, requête annulée si l'utilisateur retape avant la réponse).\n\n### Interface RemoteSearchConfig\n\n```typescript\ninterface RemoteSearchConfig {\n  paramName?: string;   // nom du query param recevant le texte tapé (défaut : 'q')\n  minChars?: number;    // caractères minimum avant la première requête (défaut : 3)\n  debounceMs?: number;  // délai après la dernière frappe (défaut : 300)\n  params?: Record<string, string | number>; // params statiques additionnels, ex: { size: 20 }\n}\n```\n\n### Exemple\n\n```typescript\n{\n  key: 'clientId',\n  type: 'select',\n  label: 'Client',\n  url: 'clients/recherche',       // → GET clients/recherche?q=<saisie>&page=0&size=20\n  responseDataKey: 'content',     // réponse Spring Page : le tableau est sous \"content\"\n  displayName: 'codeClient',\n  displayValue: 'id',\n  remoteSearch: {\n    minChars: 3,\n    params: { page: 0, size: 20 },\n  },\n  validation: { required: true },\n}\n```\n\n- `url`, `displayName`, `displayValue` et `responseDataKey` sont **les mêmes propriétés** que pour un select classique chargé via API — `remoteSearch` ne fait que changer *quand* et *comment* `url` est appelée, pas comment la réponse est interprétée. Une API qui répond `{ data: [...] }` ou un tableau brut fonctionne donc aussi bien qu'une réponse `{ content: [...] }`.\n- Si l'API attend un nom de param différent de `q` (ex : recherche par `telephone` ou par `nom`), indiquez-le via `paramName`.\n- Aucune requête n'est envoyée tant que le texte tapé est plus court que `minChars` — évite les erreurs 400 des APIs qui imposent un minimum de caractères.\n- En cas d'échec de la requête (réseau, 4xx/5xx), le comportement est identique à un select classique : erreur loggée en console, liste d'options vide — l'utilisateur peut retaper pour relancer une recherche.\n- **Form Builder** _(v1.7.7)_ : une fois « Depuis une API » sélectionné pour un champ `select`, une case « Recherche à distance » expose `paramName`, `minChars` et `debounceMs` (`params` reste à définir en JSON brut pour l'instant, pas encore dans le Builder visuel).\n- **Limites v1.7.5** : `multiselect` avec `remoteSearch` n'est pas supporté (uniquement `select`, un choix unique) ; en mode édition (valeur déjà présente dans le formulaire), le texte affiché initialement est la valeur brute du champ, faute d'un endpoint de résolution par id — pas de label pré-rempli tant que l'utilisateur n'a pas retapé une recherche.\n\n---\n\n## Filtre des options API — optionsFilter\n\n> **Nouveauté v1.7.10**\n\nPour un champ `select`/`multiselect`/`radio` dont les options viennent d'une API (`url`), `optionsFilter` ne garde que les items dont une propriété correspond à une condition — avant leur mapping en `{ label, value }`. Utile pour exclure des lignes désactivées/supprimées d'une API qui renvoie tout (pas de paramètre de filtre côté serveur, ou pas confirmé).\n\n### Interface\n\n`optionsFilter` réutilise exactement la forme de [`FieldCondition`](#opérateurs-disponibles) (même 7 opérateurs que `showWhen`), avec `field` qui désigne ici une **propriété brute de l'item API** (ex: `'status'`), pas la clé d'un autre champ du formulaire :\n\n```typescript\noptionsFilter?: FieldCondition | FieldCondition[];\noptionsFilterLogic?: 'AND' | 'OR'; // défaut 'AND' — indépendant de conditionLogic (showWhen)\n```\n\n### Exemple — ne garder que les pays actifs\n\n```typescript\n{\n  key: 'paysId',\n  type: 'select',\n  label: 'Pays',\n  url: 'pays',\n  displayName: 'libelle',\n  displayValue: 'id',\n  optionsFilter: { field: 'status', operator: 'equals', value: 'ACTIF' },\n}\n```\n\nAvec une réponse API contenant des pays `ACTIF`, `INACTIF` et `SUPPRIME`, seuls les `ACTIF` apparaissent dans la liste déroulante.\n\n### Plusieurs conditions — ET / OU\n\n```typescript\n{\n  key: 'paysId',\n  type: 'select',\n  label: 'Pays',\n  url: 'pays',\n  displayName: 'libelle',\n  displayValue: 'id',\n  optionsFilter: [\n    { field: 'status', operator: 'equals', value: 'ACTIF' },\n    { field: 'indicatifTel', operator: 'exists' },\n  ],\n  optionsFilterLogic: 'AND', // les deux conditions doivent être vraies (défaut)\n}\n```\n\n- S'applique **avant** `dependsOnMode: 'client'` — le filtrage par `status` réduit la liste mise en cache, que `dependsOn` affine ensuite localement.\n- Ne s'applique qu'aux options chargées via `url` — les `options` statiques ne sont pas concernées (l'auteur du formulaire les contrôle déjà directement).\n- **Form Builder** _(v1.7.10)_ : section « Filtrer les résultats » dans le panneau « Depuis une API », avec le même éditeur de conditions ET/OU que « Afficher quand » (sauf que le nom de propriété se saisit en texte libre, pas dans un menu déroulant de champs du formulaire).\n\n---\n\n## Validation\n\n```typescript\ninterface FieldValidation {\n  required?: boolean;\n  email?: boolean;\n  minLength?: number;\n  maxLength?: number;\n  min?: number;\n  max?: number;\n  pattern?: string | RegExp;\n  custom?: (value: any) => string | null;\n  // Required conditionnel ← v1.6.0\n  requiredWhen?: FieldCondition | FieldCondition[];    // required activé si la condition est vraie\n  // Validation croisée ← v1.6.0\n  maxField?: string;   // clé d'un autre champ — erreur si this.value > otherField.value\n  minField?: string;   // clé d'un autre champ — erreur si this.value < otherField.value\n  messages?: {\n    required?: string;\n    email?: string;\n    minLength?: string;\n    maxLength?: string;\n    min?: string;\n    max?: string;\n    pattern?: string;\n    // Messages pour les nouvelles contraintes ← v1.6.0\n    requiredWhen?: string;\n    maxField?: string;\n    minField?: string;\n    // type: 'date' uniquement — affiché quand la date choisie est hors des bornes minDate/maxDate du champ ← v1.6.6\n    minDate?: string;\n    maxDate?: string;\n  };\n}\n```\n\n**Exemples :**\n\n```typescript\n// Validateur avec message personnalisé\n{\n  key: 'email',\n  type: 'email',\n  label: 'E-mail',\n  validation: {\n    required: true,\n    email: true,\n    messages: {\n      required: 'L\\'e-mail est obligatoire.',\n      email: 'Format e-mail invalide.',\n    },\n  },\n}\n\n// Validateur custom\n{\n  key: 'password',\n  type: 'password',\n  label: 'Mot de passe',\n  validation: {\n    required: true,\n    custom: (v) => {\n      if (!v || v.length < 8) return 'Minimum 8 caractères.';\n      if (!/[A-Z]/.test(v)) return 'Au moins une majuscule.';\n      return null;\n    },\n  },\n}\n```\n\n---\n\n## Validation par pattern — regex\n\nLa propriété `validation.pattern` accepte une chaîne de caractères (regex) ou un `RegExp`. Le **Form Builder** _(v1.4.0)_ expose un champ de saisie pour la regex et trois presets d'un clic :\n\n| Preset | Regex | Usage |\n|---|---|---|\n| Chiffres uniquement | `^\\d+$` | Numéro de commande, code |\n| Lettres uniquement | `^[a-zA-ZÀ-ÿ\\s]+$` | Nom, prénom |\n| Alphanumérique | `^[a-zA-Z0-9]+$` | Identifiant, code |\n\n```typescript\n{\n  key: 'code',\n  type: 'text',\n  label: 'Code article',\n  validation: {\n    required: true,\n    pattern: '^[A-Z0-9]{4,8}$',\n    messages: { pattern: 'Le code doit comporter 4 à 8 caractères majuscules ou chiffres.' },\n  },\n}\n```\n\n---\n\n## Vérification d'unicité — uniqueCheck\n\n> **Nouveauté v1.4.0**\n\nLa propriété `uniqueCheck` ajoute un **validateur asynchrone** à un champ : à chaque saisie (avec un debounce de 400 ms), le plugin envoie un `POST` à l'URL configurée et affiche une erreur si la valeur existe déjà.\n\n### Configuration du champ\n\n```typescript\n{\n  key: 'email',\n  type: 'email',\n  label: 'E-mail',\n  validation: { required: true, email: true },\n  uniqueCheck: {\n    url: 'https://api.monprojet.com/check/email',\n    message: 'Cet e-mail est déjà utilisé.',\n  },\n}\n```\n\n### Contrat de l'API\n\nLe plugin envoie :\n```json\nPOST /check/email\n{ \"value\": \"utilisateur@exemple.com\" }\n```\n\nL'API peut retourner :\n- Un **booléen brut** : `true` = valeur prise, `false` = disponible\n- Une **enveloppe SUNTELECOMS** : `{ \"data\": true }` ou `{ \"data\": false }`\n\nLes deux formats sont auto-détectés — aucune configuration supplémentaire.\n\n### UniquenessValidatorService\n\nLe service est exporté et peut être utilisé directement dans n'importe quel composant :\n\n```typescript\nimport { inject } from '@angular/core';\nimport { UniquenessValidatorService } from '@suntelecoms/ngx-dynamic-form';\n\nexport class MonComposant {\n  private uniqueness = inject(UniquenessValidatorService);\n\n  myControl = new FormControl('', {\n    asyncValidators: [\n      this.uniqueness.build('https://api.monprojet.com/check/username', 'Nom d\\'utilisateur déjà pris.'),\n    ],\n  });\n}\n```\n\n> **Prérequis** : `provideHttpClient()` doit être présent dans `app.config.ts`.\n\n---\n\n## Champ téléphone international — phone\n\n> **Nouveauté v1.4.0** · Sélecteur en menu avec recherche + apparence Material native _(v1.4.7)_ · Drapeaux en SVG _(v1.4.8)_\n\nLe type `phone` affiche un champ numérique masqué automatiquement selon le pays, précédé d'un **sélecteur de pays** (drapeau + indicatif). La valeur stockée dans le `FormGroup` est toujours au format **E.164** (ex : `+33612345678`).\n\nDeux rendus selon `appearance` :\n- **`outline` / `fill`** (par défaut) : un vrai `<mat-form-field>` — même apparence Material native que les autres champs. Le sélecteur de pays est un bouton `matPrefix` (drapeau + indicatif) qui ouvre un menu avec un champ de recherche et la liste des 135 pays (drapeau, nom, indicatif) — cliquer un pays met à jour l'indicatif sans effacer le numéro déjà saisi. Les drapeaux sont des SVG (package `flag-icons`), pas des emoji : sur Windows et dans certains webviews, les emoji drapeau (séquences de deux « regional indicator symbols ») retombent sur les deux lettres du code pays faute de police couleur adéquate — le SVG rend à l'identique partout.\n- **`simple`** : la liste déroulante HTML native `<select>` d'origine, pour rester sans dépendance à Angular Material. Les `<option>` ne peuvent afficher que du texte (aucune image/CSS possible dedans), donc ce mode garde l'emoji — limitation du `<select>` natif, pas du champ.\n\n> **Prérequis (apparence `outline`/`fill`)** : installer `flag-icons` et charger sa feuille de style globalement.\n> ```bash\n> npm install flag-icons\n> ```\n> N'ajoutez **pas** directement `node_modules/flag-icons/css/flag-icons.min.css` dans `angular.json` : ce fichier référence deux dossiers de drapeaux (`flags/4x3/xx.svg` rectangulaire et `flags/1x1/xx.svg` carré) qui partagent le **même nom de fichier** par pays. En configuration `development` (assets non hashés), Angular échoue avec `Two output files share the same path but have different contents`. Ce champ n'utilise que la variante rectangulaire (`.fis` carré jamais utilisé) — désactivez la variante carrée au niveau Sass à la place :\n> ```scss\n> // src/styles/vendor/flag-icons.scss\n> @use \"flag-icons/sass/flag-icons\" with (\n>   $flag-icons-use-square: false\n> );\n> ```\n> ```json\n> // angular.json → projects.<app>.architect.build.options.styles\n> \"styles\": [\"src/styles/vendor/flag-icons.scss\", \"src/styles.css\"]\n> ```\n\n### Exemple de champ\n\n```typescript\n{\n  key: 'mobile',\n  type: 'phone',\n  label: 'Téléphone mobile',\n  col: 6,\n  defaultCountry: 'SN',  // Sénégal par défaut\n  validation: { required: true },\n}\n```\n\n### Pays disponibles (135)\n\nTous les pays et territoires courants, classés par continent (Afrique, Amériques, Asie, Europe, Océanie), avec drapeau, indicatif et masque de saisie propre à chaque pays. Liste complète : `PHONE_COUNTRIES` dans `projects/ngx-dynamic-form/src/lib/data/phone-countries.ts`.\n\n### Interfaces et constantes exportées\n\n```typescript\nimport type { PhoneCountry } from '@suntelecoms/ngx-dynamic-form';\nimport { PHONE_COUNTRIES } from '@suntelecoms/ngx-dynamic-form';\n\n// PhoneCountry\ninterface PhoneCountry {\n  code: string;     // 'FR'\n  name: string;     // 'France'\n  dialCode: string; // '+33'\n  flag: string;     // '🇫🇷'\n  mask: string;     // '# ## ## ## ##'  (#=chiffre, autres chars=séparateurs)\n}\n```\n\n---\n\n## Affichage conditionnel — showWhen\n\nUn champ peut être affiché ou masqué en fonction de la valeur d'un autre champ, sans écrire de code Angular.\n\n```typescript\n// Condition unique — afficher \"Entreprise\" seulement si accountType === 'pro'\n{\n  key: 'company',\n  type: 'text',\n  label: 'Entreprise',\n  showWhen: { field: 'accountType', operator: 'equals', value: 'pro' },\n}\n\n// Conditions multiples — logique AND (défaut)\n{\n  key: 'discount',\n  type: 'number',\n  label: 'Remise (%)',\n  showWhen: [\n    { field: 'accountType', operator: 'equals',      value: 'pro' },\n    { field: 'orderTotal',  operator: 'greaterThan', value: 500 },\n  ],\n  // conditionLogic: 'AND',  // optionnel — AND est le défaut\n}\n\n// Conditions multiples — logique OU  ← v1.4.0\n{\n  key: 'promo',\n  type: 'text',\n  label: 'Code promo',\n  showWhen: [\n    { field: 'accountType', operator: 'equals', value: 'pro' },\n    { field: 'accountType', operator: 'equals', value: 'vip' },\n  ],\n  conditionLogic: 'OR',  // afficher si pro OU vip\n}\n```\n\n### Opérateurs disponibles\n\n| Opérateur | Description |\n|---|---|\n| `equals` | Valeur exactement égale |\n| `notEquals` | Valeur différente |\n| `contains` | Contient (string ou tableau) |\n| `greaterThan` | Valeur numérique supérieure |\n| `lessThan` | Valeur numérique inférieure |\n| `exists` | Champ renseigné (non vide, non null) |\n| `notExists` | Champ vide ou null |\n\n---\n\n## Auto-remplissage depuis une API — lookup\n\n> **Nouveauté v1.6.0**\n\nLa propriété `lookup` déclenche un appel HTTP à la perte de focus du champ et remplit d'autres champs du formulaire avec les données de la réponse.\n\n### Interface FieldLookup\n\n```typescript\ninterface FieldLookup {\n  url: string;           // Endpoint — supporte {{key}} pour interpoler la valeur du champ\n  method?: 'GET' | 'POST';  // défaut : 'GET'\n  populate: Record<string, string>;\n  // Clé = champ cible, Valeur = chemin dans la réponse (notation pointée)\n  // Ex : { 'nom': 'data.nom', 'typeCode': 'data.typeCode' }\n  triggerOn?: 'blur' | 'change'; // défaut : 'blur'\n}\n```\n\n### Exemple — lookup souscripteur par téléphone\n\n```typescript\n{\n  key: 'telephone',\n  type: 'phone',\n  label: 'Téléphone',\n  lookup: {\n    url: '/api/souscripteurs/check?telephone={{telephone}}',\n    method: 'GET',\n    populate: {\n      'prenom':  'data.prenom',\n      'nom':     'data.nom',\n      'email':   'data.email',\n      'typeCode':'data.typeCode',\n    },\n  },\n}\n```\n\nQuand l'utilisateur quitte le champ `telephone`, le plugin appelle `GET /api/souscripteurs/check?telephone=<valeur>` et utilise la réponse pour remplir automatiquement les champs `prenom`, `nom`, `email` et `typeCode` via `patchValue`.\n\n> Si l'API renvoie une erreur HTTP (4xx/5xx), le lookup est ignoré silencieusement — aucun champ n'est modifié.\n\n---\n\n## Required conditionnel — requiredWhen\n\n> **Nouveauté v1.6.0**\n\n`requiredWhen` active `Validators.required` uniquement si la condition est vraie — sans logique impérative dans le composant hôte.\n\n```typescript\n{\n  key: 'raisonSociale',\n  type: 'text',\n  label: 'Raison sociale',\n  validation: {\n    requiredWhen: { field: 'typeCode', operator: 'equals', value: '3' },\n    messages: { requiredWhen: 'La raison sociale est obligatoire pour une personne morale.' },\n  },\n}\n```\n\nLe validateur est réévalué à chaque changement du formulaire — si la condition devient fausse, l'erreur disparaît.\n\nAccepte aussi un tableau de conditions (avec `conditionLogic: 'AND' | 'OR'` hérité du champ) :\n\n```typescript\nvalidation: {\n  requiredWhen: [\n    { field: 'typeCode',  operator: 'equals', value: '3' },\n    { field: 'typeAssurance', operator: 'equals', value: 'PRO' },\n  ],\n}\n```\n\n---\n\n## Validation croisée — maxField / minField\n\n> **Nouveauté v1.6.0**\n\nLes propriétés `maxField` et `minField` sur `FieldValidation` créent un validateur de groupe qui compare deux champs numériques ou deux dates (voir [Période de dates](#période-de-dates--date-de-début--date-de-fin)).\n\n```typescript\n// Exemple : valeur vénale ne peut pas dépasser la valeur à neuf\n{\n  key: 'valeurVenal',\n  type: 'number',\n  label: 'Valeur vénale (FCFA)',\n  validation: {\n    maxField: 'valeurNeuf',\n    messages: { maxField: 'La valeur vénale ne peut pas dépasser la valeur à neuf.' },\n  },\n}\n```\n\n| Propriété | Comportement |\n|---|---|\n| `maxField: 'autreChamp'` | Erreur si `this.value > form.get('autreChamp').value` |\n| `minField: 'autreChamp'` | Erreur si `this.value < form.get('autreChamp').value` |\n\nL'erreur est posée directement sur le `FormControl` concerné (pas sur le groupe parent), ce qui l'affiche sous le champ comme une erreur de validation normale.\n\n### Période de dates — date de début ≤ date de fin\n\n_(v1.7.18)_ `maxField` / `minField` fonctionnent aussi sur les types `date`, `datetime-local`, `month`, `week` et `time`. Les valeurs peuvent être des `Date` (sélection au calendrier) ou des chaînes ISO (`'2026-06-01'`, valeurs pré-remplies depuis l'API en mode édition) ; la comparaison se fait au jour près pour une date.\n\n```typescript\n{\n  key: 'dateEffet',\n  type: 'date',\n  label: \"Date d'effet souhaitée\",\n  validation: { required: true, maxField: 'dateFinValidite' },\n},\n{\n  key: 'dateFinValidite',\n  type: 'date',\n  label: 'Date de fin de validité',\n  validation: { required: true, minField: 'dateEffet' },\n}\n```\n\n- **Calendrier** : les dates hors période sont grisées — le calendrier de la date d'effet s'arrête à la date de fin choisie, celui de la date de fin commence à la date d'effet. Si `minDate` / `maxDate` est aussi défini, la borne la plus stricte s'applique.\n- **Message par défaut** : `Doit être antérieure ou égale à « Date de fin de validité ».` (ou `postérieure ou égale à « … »` pour `minField`) — personnalisable via `messages.maxField` / `messages.minField`.\n- Déclarer les **deux côtés** (`maxField` sur le début, `minField` sur la fin) affiche l'erreur sous le champ que l'utilisateur vient de modifier, quel qu'il soit.\n- En Stepper, les deux champs doivent être dans la **même étape**.\n- **Form Builder** : section *Validation* d'un champ date → « Max basé sur champ » / « Min basé sur champ ».\n\n---\n\n## Au moins un champ obligatoire — atLeastOneOf\n\n> **Nouveauté v1.6.0**\n\n`atLeastOneOf` est un validateur de groupe qui exige qu'au moins un des champs listés soit renseigné. Disponible sur `DynamicFormConfig` (formulaire simple) et `FormStep` (par étape dans le stepper).\n\n```typescript\n// Sur DynamicFormConfig\nconst config: DynamicFormConfig = {\n  atLeastOneOf: ['email', 'telephone'],\n  atLeastOneOfMessage: 'Renseignez au moins un moyen de contact.',\n  fields: [\n    { key: 'email',     type: 'email', label: 'E-mail' },\n    { key: 'telephone', type: 'phone', label: 'Téléphone' },\n  ],\n};\n\n// Sur FormStep\nconst step: FormStep = {\n  label: 'Contact',\n  atLeastOneOf: ['email', 'telephone'],\n  atLeastOneOfMessage: 'Renseignez au moins un moyen de contact.',\n  fields: [ /* ... */ ],\n};\n```\n\nL'erreur est affichée sous le formulaire/l'étape jusqu'à ce qu'au moins un champ ait une valeur non vide.\n\n---\n\n## Guard de step — beforeNext\n\n> **Nouveauté v1.6.0**\n\n`beforeNext` sur `FormStep` effectue un appel HTTP avant d'autoriser l'avancement vers l'étape suivante. Une réponse HTTP 4xx bloque la navigation et affiche le message d'erreur retourné par le serveur.\n\n### Interface StepGuard\n\n```typescript\ninterface StepGuard {\n  url: string;            // Endpoint POST/GET appelé avant d'avancer\n  method?: 'GET' | 'POST'; // défaut : 'POST'\n  withFormValues?: boolean; // Envoie le formulaire complet de l'étape dans le corps (défaut : true)\n  resultKey?: string;     // Clé dans la réponse à stocker dans stepResults (défaut : aucun)\n  errorMessage?: string;  // Message d'erreur de fallback si le serveur n'en retourne pas\n}\n```\n\n### Exemple — vérification d'immatriculation\n\n```typescript\nconst step: FormStep = {\n  label: 'Véhicule',\n  fields: [\n    { key: 'immatriculation', type: 'text', label: 'Immatriculation' },\n    { key: 'puissance', type: 'number', label: 'Puissance (CV)' },\n  ],\n  beforeNext: {\n    url: '/api/souscriptions/check',\n    method: 'POST',\n    errorMessage: 'Vérification impossible, veuillez réessayer.',\n  },\n};\n```\n\nLe plugin envoie `POST /api/souscriptions/check` avec les valeurs de l'étape. Si le serveur répond `HTTP 400` avec `{ \"message\": \"Une souscription existe déjà…\" }`, ce message est affiché sous le stepper et la navigation est bloquée.\n\n> **`resultKey`** : si renseigné, la réponse HTTP 2xx est stockée dans `stepResults[resultKey]` accessible via `getStepForm()` ou dans `formSubmit`. Utile pour propager un ID ou un résultat de calcul aux étapes suivantes.\n\n### API publique StepperFormComponent\n\n```typescript\n@ViewChild('s') stepperRef!: StepperFormComponent;\n\n// Accéder au FormGroup d'une étape spécifique\nconst step0Form = this.stepperRef.getStepForm(0);\nconsole.log(step0Form.value);\n\n// Mettre à jour des champs d'une étape\nthis.stepperRef.getStepForm(1).patchValue({ primeRC: 45000 });\n```\n\n---\n\n## Icônes (Material Icons)\n\n```typescript\n{ key: 'email', type: 'email', label: 'E-mail', icon: 'email', iconSuffix: 'verified' }\n```\n\n| Champ | Icône recommandée |\n|---|---|\n| Nom, Prénom | `person`, `badge` |\n| E-mail | `email` |\n| Téléphone | `phone` |\n| Mot de passe | `lock` |\n| Adresse | `home`, `location_on` |\n| Entreprise | `business` |\n| Prix | `euro`, `attach_money` |\n| Date | `calendar_today` |\n| Pièce jointe | `attach_file` |\n\n---\n\n## Disposition en grille (col)\n\nLa propriété `col` détermine le nombre de colonnes sur 12 occupées par le champ.\n\n| `col` | Largeur | Usage |\n|---|---|---|\n| `12` | 100% | Pleine largeur (défaut) |\n| `6` | 50% | Deux champs côte à côte |\n| `4` | 33% | Trois champs côte à côte |\n| `3` | 25% | Quatre champs côte à côte |\n\n> En dessous de 600 px, tous les champs passent automatiquement en pleine largeur.\n\n**Exemple avec sections :**\n```typescript\nfields: [\n  { key: '_s1', type: 'heading', text: 'Informations', level: 3, col: 12 },\n  { key: 'name',  type: 'text',  label: 'Nom',    col: 6 },\n  { key: 'email', type: 'email', label: 'E-mail', col: 6 },\n  { key: '_div',  type: 'divider', col: 12 },\n  { key: '_s2', type: 'heading', text: 'Adresse', level: 3, col: 12 },\n]\n```\n\n---\n\n## API du composant DynamicForm\n\n### Inputs\n\n| Propriété | Type | Description |\n|---|---|---|\n| `[config]` | `DynamicFormConfig` | Configuration du formulaire (obligatoire) |\n| `[initialValues]` | `Record<string, any>` | Préremplissage des champs (mode édition) |\n\n### Outputs\n\n| Événement | Type | Description |\n|---|---|---|\n| `(formSubmit)` | `DynamicFormSubmitEvent` | Formulaire soumis et valide |\n| `(formChange)` | `Record<string, any>` | Émis à chaque modification |\n| `(formReset)` | `void` | Formulaire réinitialisé |\n| `(fieldChange)` | `{ key: string; value: any; form: Record<string, any> }` | Émis à chaque changement de champ, avec la valeur et l'état complet du formulaire _(v1.6.0)_ |\n\n### API publique via @ViewChild\n\n```typescript\n@ViewChild('f') formRef!: DynamicFormComponent;\n\n// Accéder au FormGroup Angular\nconst fg = this.formRef.getForm();\nconsole.log(fg.value, fg.valid);\n\n// Mettre à jour des valeurs sans réinitialiser\nthis.formRef.patchValues({ name: 'Nouveau nom' });\n```\n\n```html\n<ngx-dynamic-form\n  #f\n  [config]=\"config\"\n  [initialValues]=\"existingData\"\n  (formSubmit)=\"onSubmit($event)\"\n  (formChange)=\"onChange($event)\"\n/>\n```\n\n---\n\n## Formulaires multi-étapes — Stepper\n\n> **Nouveauté v1.2.0**\n\nUn formulaire stepper découpe la saisie en plusieurs **étapes** numérotées. L'utilisateur avance étape par étape — chaque étape est validée avant de passer à la suivante. À la fin, une étape **Récapitulatif** affiche toutes les valeurs saisies avec la possibilité de revenir corriger une étape.\n\n### Comment ça fonctionne\n\n```\nÉtape 1        Étape 2        Étape 3        Récapitulatif\nIdentité  ──►  Adresse  ──►  Documents ──►  Vérification + Envoi\n```\n\n- **Navigation linéaire** : impossible de passer à l'étape suivante si l'étape en cours est invalide.\n- **Bouton Modifier** dans le récapitulatif : permet de revenir à n'importe quelle étape.\n- **Un seul `formSubmit`** : les données de toutes les étapes sont fusionnées dans un seul objet au moment de l'envoi.\n\n### Utilisation du composant `<ngx-stepper-form>`\n\n```typescript\nimport { Component } from '@angular/core';\nimport { StepperFormComponent } from '@suntelecoms/ngx-dynamic-form';\nimport type { StepperFormConfig, DynamicFormSubmitEvent } from '@suntelecoms/ngx-dynamic-form';\n\n@Component({\n  selector: 'app-inscription',\n  standalone: true,\n  imports: [StepperFormComponent],\n  template: `\n    <ngx-stepper-form [config]=\"config\" (formSubmit)=\"onSubmit($event)\" />\n  `,\n})\nexport class InscriptionComponent {\n  config: StepperFormConfig = {\n    showSummary: true,\n    submitLabel: 'Valider',\n    steps: [\n      {\n        label: 'Identité',\n        icon: 'person',\n        fields: [\n          { key: 'firstName', type: 'text',  label: 'Prénom', col: 6, validation: { required: true } },\n          { key: 'lastName',  type: 'text',  label: 'Nom',    col: 6, validation: { required: true } },\n          { key: 'email',     type: 'email', label: 'E-mail', col: 12, validation: { required: true, email: true } },\n        ],\n      },\n      {\n        label: 'Adresse',\n        icon: 'home',\n        fields: [\n          { key: 'street', type: 'text',   label: 'Rue',         col: 12, validation: { required: true } },\n          { key: 'city',   type: 'text',   label: 'Ville',       col: 6,  validation: { required: true } },\n          { key: 'zip',    type: 'text',   label: 'Code postal', col: 6,  validation: { required: true } },\n        ],\n      },\n      {\n        label: 'Confirmation',\n        icon: 'check_circle',\n        fields: [\n          { key: 'terms', type: 'checkbox', placeholder: \"J'accepte les CGU\", col: 12,\n            validation: { required: true } },\n        ],\n      },\n    ],\n  };\n\n  onSubmit(event: DynamicFormSubmitEvent): void {\n    console.log(event.value);\n  }\n}\n```\n\n### Configuration — StepperFormConfig\n\n```typescript\ninterface StepperFormConfig {\n  steps: FormStep[];            // Liste des étapes (obligatoire)\n  submitLabel?: string;         // Libellé du bouton Envoyer (défaut : \"Envoyer\")\n  showReset?: boolean;          // Afficher Réinitialiser (défaut : false)\n  resetLabel?: string;          // Libellé du bouton Reset\n  linear?: boolean;             // Bloque la navigation si l'étape est invalide (défaut : true)\n  orientation?: 'horizontal' | 'vertical';\n  showSummary?: boolean;        // Ajoute une étape Récapitulatif à la fin (défaut : false)\n  summaryLabel?: string;        // Libellé de ","readmeFilename":"README.md"}