{"_id":"@airlib/react-form","_rev":"8-d51fd07ecc394b37b2acbfe8b97536c4","name":"@airlib/react-form","dist-tags":{"latest":"2.1.0"},"versions":{"1.0.0":{"name":"@airlib/react-form","version":"1.0.0","author":"Nanang Mahdaen El Agung <mahdaen@gmail.com>","license":"MIT","_id":"@airlib/react-form@1.0.0","maintainers":[{"name":"mahdaen","email":"mahdaen@gmail.com"}],"bugs":{"url":"https://github.com/beerush-id/airlib/issues"},"dist":{"shasum":"49a51fa4076e9cbfab77fefa95bcdb280095d1b2","tarball":"https://registry.npmjs.org/@airlib/react-form/-/react-form-1.0.0.tgz","fileCount":48,"integrity":"sha512-2ckYlL2pdu9ZWhczV6WJR5OtJkEBcbOSQDQBOFipqc2I6TEsOobaRuw6hF1vqKts+c8Sd7l07yTLpLZGW2OjXw==","signatures":[{"sig":"MEUCIQDhvtZysx6Bwfbi0nPTdTEaSrDHJ75mNH9xefRbKWqevgIgT6eUn5NWQswKGn2xiOIaodwtFckkQuzvhwwXckgwGMM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":34240},"type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","shasum":"49a51fa4076e9cbfab77fefa95bcdb280095d1b2","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsdown --watch","test":"rimraf coverage && vitest --run","build":"bun run clean && tsdown && publint","clean":"rimraf dist","format":"biome format --write","prepublish":"bun run format && bun run build","test:preview":"rimraf coverage && vitest --run && vite preview --outDir coverage"},"_npmUser":{"name":"mahdaen","email":"mahdaen@gmail.com"},"_integrity":"sha512-2ckYlL2pdu9ZWhczV6WJR5OtJkEBcbOSQDQBOFipqc2I6TEsOobaRuw6hF1vqKts+c8Sd7l07yTLpLZGW2OjXw==","repository":{"url":"git+https://github.com/beerush-id/airlib.git","type":"git"},"_npmVersion":"10.8.3","directories":{"dist":"dist"},"sideEffects":false,"_nodeVersion":"24.3.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.0.0","jsdom":"^27.0.0","rimraf":"^6.0.0","tsdown":"^0.15.0","vitest":"^3.2.0","publint":"^0.3.0","@types/bun":"^1.3.0","@biomejs/biome":"^2.3.0","@testing-library/react":"^16.3.0","@testing-library/user-event":"^14.6.0"},"peerDependencies":{"zod":"^4.1.5","react":"^19.1.0","react-dom":"^19.1.0","typescript":"6.0.3","@airlib/form":"^1.0.0","@anchorlib/react":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/react-form_1.0.0_1780534756574_0.8933702141704831","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@airlib/react-form","version":"1.0.1","keywords":["react","form","validation","zod","reactive","air-stack","anchor","typescript"],"author":"Nanang Mahdaen El Agung <mahdaen@gmail.com>","license":"MIT","_id":"@airlib/react-form@1.0.1","maintainers":[{"name":"mahdaen","email":"mahdaen@gmail.com"}],"bugs":{"url":"https://github.com/beerush-id/airlib/issues"},"dist":{"shasum":"9a14c84ad103bf42f79873ac62a42ad53f38eb0f","tarball":"https://registry.npmjs.org/@airlib/react-form/-/react-form-1.0.1.tgz","fileCount":48,"integrity":"sha512-Tdrl8NWliGtFH/bBXPQwZ3tUIPgAHtt8FyMd8dDEzuaJUDg4HGNPBqOGLcYU+QQ7bVdhWJ5XGic1knedruY2Cg==","signatures":[{"sig":"MEUCIQDszwAiz9NCLsNGwVPKy3kJzTQagKQjZyzpJ0oVLJOkwgIgVVDFKha7YiYReHFAyjeqOTYBBt3WuSgk4Tm0e+Q4dcU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":34559},"type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","shasum":"9a14c84ad103bf42f79873ac62a42ad53f38eb0f","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsdown --watch","test":"rimraf coverage && vitest --run","build":"bun run clean && tsdown && publint","clean":"rimraf dist","format":"biome format --write","prepublish":"bun run format && bun run build","test:preview":"rimraf coverage && vitest --run && vite preview --outDir coverage"},"_npmUser":{"name":"mahdaen","email":"mahdaen@gmail.com"},"_integrity":"sha512-Tdrl8NWliGtFH/bBXPQwZ3tUIPgAHtt8FyMd8dDEzuaJUDg4HGNPBqOGLcYU+QQ7bVdhWJ5XGic1knedruY2Cg==","repository":{"url":"git+https://github.com/beerush-id/airlib.git","type":"git"},"_npmVersion":"10.8.3","description":"Reactive and declarative React form components built on AIR Stack. Typed forms, field validation, cross-field matching, and array fields with zero boilerplate.","directories":{"dist":"dist"},"sideEffects":false,"_nodeVersion":"24.3.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.0.0","jsdom":"^27.0.0","rimraf":"^6.0.0","tsdown":"^0.15.0","vitest":"^3.2.0","publint":"^0.3.0","@types/bun":"^1.3.0","@biomejs/biome":"^2.3.0","@testing-library/react":"^16.3.0","@testing-library/user-event":"^14.6.0"},"peerDependencies":{"zod":"^4.1.5","react":"^19.1.0","react-dom":"^19.1.0","typescript":"6.0.3","@airlib/form":"^1.0.1","@anchorlib/react":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/react-form_1.0.1_1780534981237_0.2816739048068153","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@airlib/react-form","version":"1.1.0","keywords":["react","form","validation","zod","reactive","air-stack","anchor","typescript"],"author":"Nanang Mahdaen El Agung <mahdaen@gmail.com>","license":"MIT","_id":"@airlib/react-form@1.1.0","maintainers":[{"name":"mahdaen","email":"mahdaen@gmail.com"}],"bugs":{"url":"https://github.com/beerush-id/airlib/issues"},"dist":{"shasum":"cd4506ac58f0fbbcfca95602ae1c16c6ed5abb11","tarball":"https://registry.npmjs.org/@airlib/react-form/-/react-form-1.1.0.tgz","fileCount":50,"integrity":"sha512-9Q+wlflabhyGSBwQxZMve29aY30ER09o7hnhQCro1FZKxMqcUf84t8abA8XgzYC4IiG1yrkJLk8XW10/MBpPWg==","signatures":[{"sig":"MEUCIGW8yLnTL9stmcRlY9PS6QF+Tb/ps8O/LuQx6RB48kSkAiEA8cjCjW1qwFeHrEtdAhUSa/bzoT/kFCt+xLwVaonmHKo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":54921},"type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","shasum":"cd4506ac58f0fbbcfca95602ae1c16c6ed5abb11","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsdown --watch","test":"rimraf coverage && vitest --run","build":"bun run clean && tsdown && publint","clean":"rimraf dist","format":"biome format --write","prepublish":"bun run format && bun run build","test:preview":"rimraf coverage && vitest --run && vite preview --outDir coverage"},"_npmUser":{"name":"mahdaen","email":"mahdaen@gmail.com"},"_integrity":"sha512-9Q+wlflabhyGSBwQxZMve29aY30ER09o7hnhQCro1FZKxMqcUf84t8abA8XgzYC4IiG1yrkJLk8XW10/MBpPWg==","repository":{"url":"git+https://github.com/beerush-id/airlib.git","type":"git"},"_npmVersion":"10.8.3","description":"Reactive and declarative React form components built on AIR Stack. Typed forms, field validation, cross-field matching, and array fields with zero boilerplate.","directories":{"dist":"dist"},"sideEffects":false,"_nodeVersion":"24.3.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.0.0","jsdom":"^27.0.0","rimraf":"^6.0.0","tsdown":"^0.15.0","vitest":"^3.2.0","publint":"^0.3.0","@types/bun":"^1.3.0","@biomejs/biome":"^2.3.0","@testing-library/react":"^16.3.0","@testing-library/user-event":"^14.6.0"},"peerDependencies":{"zod":"^4.1.5","react":"^19.1.0","react-dom":"^19.1.0","typescript":"6.0.3","@airlib/form":"1.1.0","@anchorlib/react":"1.2.0"},"_npmOperationalInternal":{"tmp":"tmp/react-form_1.1.0_1780843766170_0.3943891521925065","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"@airlib/react-form","version":"1.1.1","keywords":["react","form","validation","zod","reactive","air-stack","anchor","typescript"],"author":"Nanang Mahdaen El Agung <mahdaen@gmail.com>","license":"MIT","_id":"@airlib/react-form@1.1.1","maintainers":[{"name":"mahdaen","email":"mahdaen@gmail.com"}],"bugs":{"url":"https://github.com/beerush-id/airlib/issues"},"dist":{"shasum":"1aa78eae51147b87725a41b79fdb7a5d70d8b64d","tarball":"https://registry.npmjs.org/@airlib/react-form/-/react-form-1.1.1.tgz","fileCount":50,"integrity":"sha512-LgAIo/M6jOBZzhCqVkovWqv0xUsQ9ifsx2UrItJOZPtcwIBl3KoowSWB52bjdXrx138TUJZ/5JfxggMtgKb6Lw==","signatures":[{"sig":"MEQCIHU3eMQLf1JBYJAn3jFfMlKyrPkowlL0BooBs1srYTObAiBeUAYxo37QKHFy6MmqfANPC1OWXDmXnO9P1m3PrkGmqQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":54921},"type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","shasum":"1aa78eae51147b87725a41b79fdb7a5d70d8b64d","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsdown --watch","test":"rimraf coverage && vitest --run","build":"bun run clean && tsdown && publint","clean":"rimraf dist","format":"biome format --write","prepublish":"bun run format && bun run build","test:preview":"rimraf coverage && vitest --run && vite preview --outDir coverage"},"_npmUser":{"name":"mahdaen","email":"mahdaen@gmail.com"},"_integrity":"sha512-LgAIo/M6jOBZzhCqVkovWqv0xUsQ9ifsx2UrItJOZPtcwIBl3KoowSWB52bjdXrx138TUJZ/5JfxggMtgKb6Lw==","repository":{"url":"git+https://github.com/beerush-id/airlib.git","type":"git"},"_npmVersion":"10.8.3","description":"Reactive and declarative React form components built on AIR Stack. Typed forms, field validation, cross-field matching, and array fields with zero boilerplate.","directories":{"dist":"dist"},"sideEffects":false,"_nodeVersion":"24.3.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.0.0","jsdom":"^27.0.0","rimraf":"^6.0.0","tsdown":"^0.15.0","vitest":"^3.2.0","publint":"^0.3.0","@types/bun":"^1.3.0","@biomejs/biome":"^2.3.0","@testing-library/react":"^16.3.0","@testing-library/user-event":"^14.6.0"},"peerDependencies":{"zod":"^4.1.5","react":"^19.1.0","react-dom":"^19.1.0","typescript":"6.0.3","@airlib/form":"1.1.1","@anchorlib/react":"1.2.0"},"_npmOperationalInternal":{"tmp":"tmp/react-form_1.1.1_1780846508037_0.1788443253225931","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@airlib/react-form","version":"1.2.0","keywords":["react","form","validation","zod","reactive","air-stack","anchor","typescript"],"author":"Nanang Mahdaen El Agung <mahdaen@gmail.com>","license":"MIT","_id":"@airlib/react-form@1.2.0","maintainers":[{"name":"mahdaen","email":"mahdaen@gmail.com"}],"bugs":{"url":"https://github.com/beerush-id/airlib/issues"},"dist":{"shasum":"fc700aab440ff700c24d16d418a8053b8f1cf2cb","tarball":"https://registry.npmjs.org/@airlib/react-form/-/react-form-1.2.0.tgz","fileCount":50,"integrity":"sha512-2rFRMI5crsn5mj5NQ5PIFa9wfQRMcbo85NilvF1mgJPDIzZA1fjtOXlZv2HYWNjNfep7iiC9JhnfKvIXbMTsew==","signatures":[{"sig":"MEUCIQCaiJ/pOY/OiqY1CEZfx/zb8STJAQigeMEUa2KOsHjYWwIgbE5SZmaqvVVRnc9plew8yuI67Ga1DMwF2T3mt3zDLr4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":55589},"type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","shasum":"fc700aab440ff700c24d16d418a8053b8f1cf2cb","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsdown --watch","test":"rimraf coverage && vitest --run","build":"bun run clean && tsdown && publint","clean":"rimraf dist","format":"biome format --write","prepublish":"bun run format && bun run build","test:preview":"rimraf coverage && vitest --run && vite preview --outDir coverage"},"_npmUser":{"name":"mahdaen","email":"mahdaen@gmail.com"},"_integrity":"sha512-2rFRMI5crsn5mj5NQ5PIFa9wfQRMcbo85NilvF1mgJPDIzZA1fjtOXlZv2HYWNjNfep7iiC9JhnfKvIXbMTsew==","repository":{"url":"git+https://github.com/beerush-id/airlib.git","type":"git"},"_npmVersion":"10.8.3","description":"Reactive and declarative React form components built on AIR Stack. Typed forms, field validation, cross-field matching, and array fields with zero boilerplate.","directories":{"dist":"dist"},"sideEffects":false,"_nodeVersion":"24.3.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.0.0","jsdom":"^27.0.0","rimraf":"^6.0.0","tsdown":"^0.15.0","vitest":"^3.2.0","publint":"^0.3.0","@types/bun":"^1.3.0","@biomejs/biome":"^2.3.0","@testing-library/react":"^16.3.0","@testing-library/user-event":"^14.6.0"},"peerDependencies":{"zod":"^4.1.5","react":"^19.1.0","react-dom":"^19.1.0","typescript":"6.0.3","@airlib/form":"1.2.0","@anchorlib/react":"1.2.0"},"_npmOperationalInternal":{"tmp":"tmp/react-form_1.2.0_1780954089414_0.8828088321126248","host":"s3://npm-registry-packages-npm-production"}},"1.2.1":{"name":"@airlib/react-form","version":"1.2.1","keywords":["react","form","validation","zod","reactive","air-stack","anchor","typescript"],"author":"Nanang Mahdaen El Agung <mahdaen@gmail.com>","license":"MIT","_id":"@airlib/react-form@1.2.1","maintainers":[{"name":"mahdaen","email":"mahdaen@gmail.com"}],"bugs":{"url":"https://github.com/beerush-id/airlib/issues"},"dist":{"shasum":"7a1d2701c63dc9715e58892d362191b1e6bddd91","tarball":"https://registry.npmjs.org/@airlib/react-form/-/react-form-1.2.1.tgz","fileCount":50,"integrity":"sha512-kq8+QdRXA33240VWFsZyO6Y9SW+8stFroCktO1I3ReBQwnWBOvsdB3bFCEf/JxSf+eG5OoOYDeYxH2pmDZPedg==","signatures":[{"sig":"MEYCIQDyvET0H+0HTd67BBReUakI0jmYyINelFA4QAciIfJnIAIhAM9dbw3rVV6hBlkzDip6CG8X8nmnMF6Fj7ZevbeGDyCp","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":58875},"type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","shasum":"7a1d2701c63dc9715e58892d362191b1e6bddd91","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsdown --watch","test":"rimraf coverage && vitest --run","build":"bun run clean && tsdown && publint","clean":"rimraf dist","format":"biome format --write","prepublish":"bun run format && bun run build","test:preview":"rimraf coverage && vitest --run && vite preview --outDir coverage"},"_npmUser":{"name":"mahdaen","email":"mahdaen@gmail.com"},"_integrity":"sha512-kq8+QdRXA33240VWFsZyO6Y9SW+8stFroCktO1I3ReBQwnWBOvsdB3bFCEf/JxSf+eG5OoOYDeYxH2pmDZPedg==","repository":{"url":"git+https://github.com/beerush-id/airlib.git","type":"git"},"_npmVersion":"10.8.3","description":"Reactive and declarative React form components built on AIR Stack. Typed forms, field validation, cross-field matching, and array fields with zero boilerplate.","directories":{"dist":"dist"},"sideEffects":false,"_nodeVersion":"24.3.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.0.0","jsdom":"^27.0.0","rimraf":"^6.0.0","tsdown":"^0.15.0","vitest":"^3.2.0","publint":"^0.3.0","@types/bun":"^1.3.0","@biomejs/biome":"^2.3.0","@testing-library/react":"^16.3.0","@testing-library/user-event":"^14.6.0"},"peerDependencies":{"zod":"^4.1.5","react":"^19.1.0","react-dom":"^19.1.0","typescript":"6.0.3","@airlib/form":"1.2.1","@anchorlib/react":"1.2.1"},"_npmOperationalInternal":{"tmp":"tmp/react-form_1.2.1_1781087274413_0.5016661200665198","host":"s3://npm-registry-packages-npm-production"}},"1.2.2":{"name":"@airlib/react-form","version":"1.2.2","keywords":["react","form","validation","zod","reactive","air-stack","anchor","typescript"],"author":"Nanang Mahdaen El Agung <mahdaen@gmail.com>","license":"MIT","_id":"@airlib/react-form@1.2.2","maintainers":[{"name":"mahdaen","email":"mahdaen@gmail.com"}],"bugs":{"url":"https://github.com/beerush-id/airlib/issues"},"dist":{"shasum":"1e9adc1b6efec1cf812e4a449db64ee6c15ffa64","tarball":"https://registry.npmjs.org/@airlib/react-form/-/react-form-1.2.2.tgz","fileCount":50,"integrity":"sha512-MsMoQy/Kk48IAG8L2H70YQDjMqCcEYx6GV5YVNRcmcWmmxaC57e59ZSA54WpNK9Ss9n5dI0UbB6GORSG2+4DQQ==","signatures":[{"sig":"MEUCIEhXMI4XV3sTxxz7x9jVEw+3s08vDWl3ZtfIdE7YBrAoAiEArurBMfpgY/nEI93v5iICRvSpiuYJXIclZMC8lF0NeEI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":59048},"type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","shasum":"1e9adc1b6efec1cf812e4a449db64ee6c15ffa64","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsdown --watch ./src","build":"bun run clean && tsdown && publint","clean":"rimraf dist","format":"biome format --write","test:run":"rimraf coverage && vitest --run","prepublish":"bun run format && bun run build","test:preview":"rimraf coverage && vitest --run && vite preview --outDir coverage"},"_npmUser":{"name":"mahdaen","email":"mahdaen@gmail.com"},"_integrity":"sha512-MsMoQy/Kk48IAG8L2H70YQDjMqCcEYx6GV5YVNRcmcWmmxaC57e59ZSA54WpNK9Ss9n5dI0UbB6GORSG2+4DQQ==","repository":{"url":"git+https://github.com/beerush-id/airlib.git","type":"git"},"_npmVersion":"10.8.3","description":"Reactive and declarative React form components built on AIR Stack. Typed forms, field validation, cross-field matching, and array fields with zero boilerplate.","directories":{"dist":"dist"},"sideEffects":false,"_nodeVersion":"24.3.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.0.0","jsdom":"^27.0.0","rimraf":"^6.0.0","tsdown":"^0.15.0","vitest":"^3.2.0","publint":"^0.3.0","@types/bun":"^1.3.0","@biomejs/biome":"^2.3.0","@testing-library/react":"^16.3.0","@testing-library/user-event":"^14.6.0"},"peerDependencies":{"zod":"^4.1.5","react":"^19.1.0","react-dom":"^19.1.0","typescript":"6.0.3","@airlib/form":"^1.2.2","@anchorlib/react":"1.2.8"},"_npmOperationalInternal":{"tmp":"tmp/react-form_1.2.2_1783111761218_0.22691088353524802","host":"s3://npm-registry-packages-npm-production"}},"2.1.0":{"type":"module","name":"@airlib/react-form","version":"2.1.0","description":"Reactive and declarative React form components built on AirLib. Typed forms, field validation, cross-field matching, and array fields with zero boilerplate.","keywords":["react","form","validation","zod","reactive","airlib","anchor","typescript"],"author":"Nanang Mahdaen El Agung <mahdaen@gmail.com>","repository":{"type":"git","url":"git+https://github.com/beerush-id/airstack.git"},"bugs":{"url":"https://github.com/beerush-id/airstack/issues"},"sideEffects":false,"types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"directories":{"dist":"dist"},"publishConfig":{"access":"public"},"devDependencies":{"@biomejs/biome":"^2.5.6","@testing-library/react":"^16.3.0","@testing-library/user-event":"^14.6.1","@types/bun":"^1.3.1","jsdom":"^27.0.1","publint":"^0.3.15","rimraf":"^6.0.1","tsdown":"^0.15.9","vite":"^8.0.10","vitest":"^4.1.11"},"dependencies":{"@airlib/form":"2.1.0"},"peerDependencies":{"@airlib/react":"2.1.0","react":"^19.2.0","react-dom":"^19.2.0","typescript":"^5.9.3","zod":"^4.4.3"},"scripts":{"dev":"tsdown --watch ./src","clean":"rimraf dist","build":"bun run clean && tsdown && publint","prepublish":"bun run format && bun run build","format":"biome format --write","test:run":"rimraf coverage && vitest --run","test:preview":"rimraf coverage && vitest --run && vite preview --outDir coverage"},"license":"MIT","_id":"@airlib/react-form@2.1.0","_integrity":"sha512-TkzbuhC1zEoYM+Qj6fnbuuf53bKeURFtgenckOJWlMUrkHoJ+gwUr1VzY/Z8Ai8hYQG2jxcSltGomZWc3F+4OQ==","_nodeVersion":"24.3.0","_npmVersion":"10.8.3","shasum":"8b25cca7b475f20fb2350e3de20325bac121341f","dist":{"integrity":"sha512-TkzbuhC1zEoYM+Qj6fnbuuf53bKeURFtgenckOJWlMUrkHoJ+gwUr1VzY/Z8Ai8hYQG2jxcSltGomZWc3F+4OQ==","shasum":"8b25cca7b475f20fb2350e3de20325bac121341f","tarball":"https://registry.npmjs.org/@airlib/react-form/-/react-form-2.1.0.tgz","fileCount":50,"unpackedSize":70464,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIFLnSkEdtysrbmI5ocofPwYI6RTZVw1zpcpiqRc6YBo0AiBJo39P0izOq1g7HlVR+cTxg0+Hz2K+VWb0SwZzsMzxRQ=="}]},"_npmUser":{"name":"mahdaen","email":"mahdaen@gmail.com"},"maintainers":[{"name":"mahdaen","email":"mahdaen@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/react-form_2.1.0_1788182571447_0.09634726803776172"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-04T00:59:16.404Z","modified":"2026-08-31T13:22:51.765Z","1.0.0":"2026-06-04T00:59:16.713Z","1.0.1":"2026-06-04T01:03:01.470Z","1.1.0":"2026-06-07T14:49:26.302Z","1.1.1":"2026-06-07T15:35:08.206Z","1.2.0":"2026-06-08T21:28:09.578Z","1.2.1":"2026-06-10T10:27:54.597Z","1.2.2":"2026-07-03T20:49:21.360Z","2.1.0":"2026-08-31T13:22:51.602Z"},"bugs":{"url":"https://github.com/beerush-id/airstack/issues"},"author":"Nanang Mahdaen El Agung <mahdaen@gmail.com>","license":"MIT","keywords":["react","form","validation","zod","reactive","airlib","anchor","typescript"],"repository":{"type":"git","url":"git+https://github.com/beerush-id/airstack.git"},"description":"Reactive and declarative React form components built on AirLib. Typed forms, field validation, cross-field matching, and array fields with zero boilerplate.","maintainers":[{"name":"mahdaen","email":"mahdaen@gmail.com"}],"readme":"# AirLib React Form\n\nHandling form states, validations, and complex data structures like arrays and nested objects in standard React can be verbose and hard to optimize for performance. `@airlib/react-form` provides reactive form components built on top of `@airlib/react` to solve this, ensuring high performance without unnecessary re-renders while giving a deep type-safe structure.\n\n## Creating Typed Forms\n\nBuilding robust forms requires strict schema validation and type safety. Here how we define a schema and create a typed form.\n\n```tsx\nimport { z } from 'zod';\nimport { createForm } from '@airlib/react-form';\n\nconst userSchema = z.object({\n  name: z.string().min(3),\n  email: z.string().email(),\n});\n\nexport const UserForm = createForm(userSchema);\n```\n\nThe `createForm` function returns form components (`Form`, `Field`, `FieldList`) typed against the provided Zod schema, ensuring autocompletion and compile-time checks for all field names.\n\n## Building Form Interfaces\n\nBuilding the UI requires binding inputs to the form state. The typed form provides everything needed to structure the form with type safety.\n\n```tsx\nimport { UserForm } from './form';\nimport { TextInput, EmailInput, FormSubmit, FormReset } from '@airlib/react-form';\n\nexport function ProfileEditor() {\n  return (\n    <UserForm onSubmit={(data) => console.log(data)}>\n      <UserForm.Field name=\"name\" label=\"Name\" errorClass=\"text-red-500\">\n        <TextInput placeholder=\"Enter name\" />\n      </UserForm.Field>\n\n      <UserForm.Field name=\"email\" label=\"Email\" errorClass=\"text-red-500\">\n        <EmailInput placeholder=\"Enter email\" />\n      </UserForm.Field>\n\n      <div>\n        <FormReset>Reset</FormReset>\n        <FormSubmit>Save Profile</FormSubmit>\n      </div>\n    </UserForm>\n  );\n}\n```\n\nThe `UserForm.Field` wrapper tracks errors and provides them to the UI, while components like `TextInput` and `EmailInput` connect to the form state under the hood. The `FormSubmit` and `FormReset` buttons track form changes and validation status, enabling or disabling based on the form's readiness.\n\n## Cross-Field Matching\n\nFields that must match another field (like confirm password) use the `match` prop.\n\n```tsx\nconst passwordSchema = z.object({\n  password: z.string().min(6),\n  confirmPassword: z.string().min(6),\n});\n\nconst PasswordForm = createForm(passwordSchema);\n\nexport function ChangePassword() {\n  return (\n    <PasswordForm onSubmit={save}>\n      <PasswordForm.Field name=\"password\" label=\"Password\">\n        <PasswordInput />\n      </PasswordForm.Field>\n\n      <PasswordForm.Field name=\"confirmPassword\" match=\"password\">\n        {(field) => (\n          <div>\n            <PasswordInput />\n            {field.touched && field.error?.map(err => <span key={err}>{err}</span>)}\n            {!field.matched && <span>Passwords don't match</span>}\n          </div>\n        )}\n      </PasswordForm.Field>\n\n      <FormSubmit>Change Password</FormSubmit>\n    </PasswordForm>\n  );\n}\n```\n\nThe `match` prop accepts a field path for equality checks, or a function for custom cross-field logic. `valid` and `matched` are separate signals — `valid` is schema-only, `matched` is match-only — the view layer decides how to compose them.\n\nFor custom logic beyond equality:\n\n```tsx\n<RangeForm.Field name=\"max\" match={(form) => form.fields['max'] > form.fields['min']}>\n```\n\n## Accessibility\n\n`Field` and input components handle accessibility attributes out of the box:\n\n- `<label>` gets `htmlFor` linked to the input's auto-generated `id`\n- Error messages render with `role=\"alert\"` and a stable `id`\n- Inputs get `aria-invalid` when errors exist\n- Inputs get `aria-describedby` pointing to the error element\n\nDot-path field names are sanitized to dashes for valid HTML ids (`address.city` → `address-city`).\n\n## Handling Form Arrays\n\nDealing with dynamic lists, such as arrays of objects, in a form is often complicated. The `FieldList` component abstracts this complexity.\n\n```tsx\nimport { z } from 'zod';\nimport { createForm, TextInput } from '@airlib/react-form';\n\nconst teamSchema = z.object({\n  members: z.array(z.object({ name: z.string(), role: z.string() }))\n});\n\nconst TeamForm = createForm(teamSchema);\n\nexport function TeamEditor() {\n  return (\n    <TeamForm>\n      <TeamForm.FieldList name=\"members\">\n        {(items) => (\n          <div>\n            {items.map((member, i) => (\n              <div key={i}>\n                <TeamForm.Field name={`members.${i}.name`}>\n                  <TextInput placeholder=\"Name\" />\n                </TeamForm.Field>\n                <TeamForm.Field name={`members.${i}.role`}>\n                  <TextInput placeholder=\"Role\" />\n                </TeamForm.Field>\n              </div>\n            ))}\n            <button type=\"button\" onClick={() => items.push({ name: '', role: '' })}>\n              Add Member\n            </button>\n          </div>\n        )}\n      </TeamForm.FieldList>\n    </TeamForm>\n  );\n}\n```\n\nThe `FieldList` exposes the array items to the render function, allowing direct reactive mutations like `.push()` on the array. Because this uses `@airlib/react` under the hood, these mutations are tracked without the need for verbose state management hooks.\n\n## Working With Custom Inputs\n\nSometimes standard inputs are not enough. Building custom inputs that integrate with the form state is trivial using the built-in `formInput` hook or the `createInput` factory.\n\n```tsx\nimport { setup, render } from '@airlib/react';\nimport { formInput } from '@airlib/form';\n\nexport const CustomInput = setup<{ name: string }>((props) => {\n  const input = formInput(props);\n\n  return render(() => (\n    <div>\n      <input \n        name={input.name}\n        value={input.value || ''} \n        onInput={(e) => input.value = e.currentTarget.value} \n        onBlur={() => input.settled()}\n      />\n      {input.error?.map(err => <span key={err} className=\"error\">{err}</span>)}\n    </div>\n  ));\n});\n```\n\nUsing `formInput()` wires up the input state, validation rules, and error tracking based on the provided `name` prop. For simpler standard inputs, use the `createInput('text')` factory.","readmeFilename":"readme.md"}