{"_id":"@axenstudio/axen-form","_rev":"15-b8da6806383b896c32efb63414f8c07a","name":"@axenstudio/axen-form","dist-tags":{"latest":"0.1.17"},"versions":{"0.1.1":{"name":"@axenstudio/axen-form","version":"0.1.1","keywords":["react","form","config-driven","css-modules","a11y","enterprise","typescript","validation","yup","zod"],"license":"MIT","_id":"@axenstudio/axen-form@0.1.1","maintainers":[{"name":"hawkeye22","email":"axenproduction@gmail.com"}],"homepage":"https://github.com/axenstudio/axen-form#readme","bugs":{"url":"https://github.com/axenstudio/axen-form/issues"},"dist":{"shasum":"a6554a815248e5048708557e25a815579f928011","tarball":"https://registry.npmjs.org/@axenstudio/axen-form/-/axen-form-0.1.1.tgz","fileCount":210,"integrity":"sha512-r+UhtHfcRTuQWLfGXyFzDYpqMyOtDCp/IGo0NgOMiMm+FkZrh38mZ9LPnEyRNCfI12pj+6ZpBBcanC+gmaN36w==","signatures":[{"sig":"MEYCIQCEmqFH+/HAR0bXyQIbU0TUptp5WkpYNMpVml3c2HzAvQIhAP6FKf5KbsZigbs7iPLAiQA5BUbOc4H8C7EXvxnkh7Fp","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":332829},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./reset":"./dist/tokens/reset.css","./tokens":"./dist/tokens/tokens.css","./adapters/yup":{"types":"./dist/adapters/yupAdapter.d.ts","import":"./dist/adapters/yupAdapter.js","require":"./dist/adapters/yupAdapter.cjs"},"./adapters/zod":{"types":"./dist/adapters/zodAdapter.d.ts","import":"./dist/adapters/zodAdapter.js","require":"./dist/adapters/zodAdapter.cjs"}},"gitHead":"5cbebc2c9d169e724d881e36f1d7f719f0a7f78f","scripts":{"dev":"vite build --watch","lint":"eslint src/","test":"vitest run","build":"tsc -p tsconfig.build.json && vite build","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"hawkeye22","email":"axenproduction@gmail.com"},"repository":{"url":"git+https://github.com/axenstudio/axen-form.git","type":"git"},"_npmVersion":"11.4.2","description":"Lightweight, config-driven, enterprise-grade React form library. Zero UI dependency. CSS Modules. A11y-aware.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.12.0","_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","jsdom":"^25.0.0","react":"^19.0.0","vitest":"^3.0.0","react-dom":"^19.0.0","typescript":"^5.7.0","@types/node":"^25.3.5","@types/react":"^19.0.0","vite-plugin-dts":"^4.3.0","@types/react-dom":"^19.0.0","@testing-library/react":"^16.1.0","@testing-library/jest-dom":"^6.6.3","vite-plugin-css-injected-by-js":"^3.5.0"},"peerDependencies":{"react":">=19.0.0","react-dom":">=19.0.0"},"peerDependenciesMeta":{"yup":{"optional":true},"zod":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/axen-form_0.1.1_1772998987763_0.8785737960800519","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@axenstudio/axen-form","version":"0.1.3","keywords":["react","form","config-driven","css-modules","a11y","enterprise","typescript","validation","yup","zod"],"license":"MIT","_id":"@axenstudio/axen-form@0.1.3","maintainers":[{"name":"hawkeye22","email":"axenproduction@gmail.com"}],"homepage":"https://github.com/axenstudio/axen-form#readme","bugs":{"url":"https://github.com/axenstudio/axen-form/issues"},"dist":{"shasum":"c4d01fdf9864758455b23eec8e42a83985085653","tarball":"https://registry.npmjs.org/@axenstudio/axen-form/-/axen-form-0.1.3.tgz","fileCount":210,"integrity":"sha512-hG7sz40jN7xroRsDfdUhrmK0hefHRG8DbdgSQMiLOzFu99kWV1WO8l7ztio64K5ncq27wPBQvn1WOPzmkMk7hA==","signatures":[{"sig":"MEUCIQCmpd5RZGxxMJhr1wVDepiIu0W9gioQ4B6veaZUjzcDGQIgC2uK5Ujfty50Fsuk9ymmgqLC3wla/zRfBrAxaFHSrbA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":333423},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./reset":"./dist/tokens/reset.css","./tokens":"./dist/tokens/tokens.css","./adapters/yup":{"types":"./dist/adapters/yupAdapter.d.ts","import":"./dist/adapters/yupAdapter.js","require":"./dist/adapters/yupAdapter.cjs"},"./adapters/zod":{"types":"./dist/adapters/zodAdapter.d.ts","import":"./dist/adapters/zodAdapter.js","require":"./dist/adapters/zodAdapter.cjs"}},"gitHead":"82fc1b28364f4e3c9f5dde84d68594d19140444c","scripts":{"dev":"vite build --watch","lint":"eslint src/","test":"vitest run","build":"tsc -p tsconfig.build.json && vite build","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"hawkeye22","email":"axenproduction@gmail.com"},"repository":{"url":"git+https://github.com/axenstudio/axen-form.git","type":"git"},"_npmVersion":"11.4.2","description":"Lightweight, config-driven, enterprise-grade React form library. Zero UI dependency. CSS Modules. A11y-aware.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.12.0","_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","jsdom":"^25.0.0","react":"^19.0.0","vitest":"^3.0.0","react-dom":"^19.0.0","typescript":"^5.7.0","@types/node":"^25.3.5","@types/react":"^19.0.0","vite-plugin-dts":"^4.3.0","@types/react-dom":"^19.0.0","@testing-library/react":"^16.1.0","@testing-library/jest-dom":"^6.6.3","vite-plugin-css-injected-by-js":"^3.5.0"},"peerDependencies":{"react":">=19.0.0","react-dom":">=19.0.0"},"peerDependenciesMeta":{"yup":{"optional":true},"zod":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/axen-form_0.1.3_1773004102051_0.20717065174446003","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@axenstudio/axen-form","version":"0.1.4","keywords":["react","form","config-driven","css-modules","a11y","enterprise","typescript","validation","yup","zod"],"license":"MIT","_id":"@axenstudio/axen-form@0.1.4","maintainers":[{"name":"hawkeye22","email":"axenproduction@gmail.com"}],"homepage":"https://github.com/axenstudio/axen-form#readme","bugs":{"url":"https://github.com/axenstudio/axen-form/issues"},"dist":{"shasum":"1240d98ddb76e386a8ef9d564af449bbd77cfeaa","tarball":"https://registry.npmjs.org/@axenstudio/axen-form/-/axen-form-0.1.4.tgz","fileCount":215,"integrity":"sha512-1F1XvNNcN0GQGB84IqCWWd1JUG+OeJzfY+i95FXfkes5NAys78XRojtQ0N4m05sfnYJ2UM6Aaa9AX1HN0+NKLQ==","signatures":[{"sig":"MEUCIQD2b5ZFwV5ip1AV/WQdfytClwx9JNx17zloFZj+0zePgwIgGIIyOqF1PyCTIaCCQi2a7t+PUycJGoWyGBSseh9W1ec=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":344862},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./reset":"./dist/tokens/reset.css","./tokens":"./dist/tokens/tokens.css","./adapters/yup":{"types":"./dist/adapters/yupAdapter.d.ts","import":"./dist/adapters/yupAdapter.js","require":"./dist/adapters/yupAdapter.cjs"},"./adapters/zod":{"types":"./dist/adapters/zodAdapter.d.ts","import":"./dist/adapters/zodAdapter.js","require":"./dist/adapters/zodAdapter.cjs"}},"gitHead":"7d2e5b840f734a1b230b46d93e352ca78e5064f7","scripts":{"dev":"vite build --watch","lint":"eslint src/","test":"vitest run","build":"tsc -p tsconfig.build.json && vite build","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"hawkeye22","email":"axenproduction@gmail.com"},"repository":{"url":"git+https://github.com/axenstudio/axen-form.git","type":"git"},"_npmVersion":"11.4.2","description":"Lightweight, config-driven, enterprise-grade React form library. Zero UI dependency. CSS Modules. A11y-aware.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.12.0","_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","jsdom":"^25.0.0","react":"^19.0.0","vitest":"^3.0.0","react-dom":"^19.0.0","typescript":"^5.7.0","@types/node":"^25.3.5","@types/react":"^19.0.0","vite-plugin-dts":"^4.3.0","@types/react-dom":"^19.0.0","@testing-library/react":"^16.1.0","@testing-library/jest-dom":"^6.6.3","vite-plugin-css-injected-by-js":"^3.5.0"},"peerDependencies":{"react":">=19.0.0","react-dom":">=19.0.0"},"peerDependenciesMeta":{"yup":{"optional":true},"zod":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/axen-form_0.1.4_1773008084775_0.425916971346862","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@axenstudio/axen-form","version":"0.1.5","keywords":["react","form","config-driven","css-modules","a11y","enterprise","typescript","validation","yup","zod"],"license":"MIT","_id":"@axenstudio/axen-form@0.1.5","maintainers":[{"name":"hawkeye22","email":"axenproduction@gmail.com"}],"homepage":"https://github.com/axenstudio/axen-form#readme","bugs":{"url":"https://github.com/axenstudio/axen-form/issues"},"dist":{"shasum":"db661347c64490fcf213b0907a0303732635a780","tarball":"https://registry.npmjs.org/@axenstudio/axen-form/-/axen-form-0.1.5.tgz","fileCount":233,"integrity":"sha512-RVbQk+wbTkq3C5sKPXvNxGM6uWmk2sO77v3Ug3Wg60OM9R4WRtoSJI/z88fzzR4beJUquhfNczhnQWE64iyYYw==","signatures":[{"sig":"MEUCIQCtq/U/PIAWnaBsgw18I7qi1sBuckRmgot/NQthqX9j0QIgSOu8y37cbEX73fTrY37sRm05b0yv3NZMohlZr5gevuQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":372496},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./reset":"./dist/tokens/reset.css","./tokens":"./dist/tokens/tokens.css","./adapters/yup":{"types":"./dist/adapters/yupAdapter.d.ts","import":"./dist/adapters/yupAdapter.js","require":"./dist/adapters/yupAdapter.cjs"},"./adapters/zod":{"types":"./dist/adapters/zodAdapter.d.ts","import":"./dist/adapters/zodAdapter.js","require":"./dist/adapters/zodAdapter.cjs"}},"gitHead":"38c474bc132208488cbbbe89e65e33203cb55467","scripts":{"dev":"vite build --watch","lint":"eslint src/","test":"vitest run","build":"tsc -p tsconfig.build.json && vite build","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"hawkeye22","email":"axenproduction@gmail.com"},"repository":{"url":"git+https://github.com/axenstudio/axen-form.git","type":"git"},"_npmVersion":"11.4.2","description":"Lightweight, config-driven, enterprise-grade React form library. Zero UI dependency. CSS Modules. A11y-aware.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.12.0","_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","jsdom":"^25.0.0","react":"^19.0.0","vitest":"^3.0.0","react-dom":"^19.0.0","typescript":"^5.7.0","@types/node":"^25.3.5","@types/react":"^19.0.0","vite-plugin-dts":"^4.3.0","@types/react-dom":"^19.0.0","@testing-library/react":"^16.1.0","@testing-library/jest-dom":"^6.6.3","vite-plugin-css-injected-by-js":"^3.5.0"},"peerDependencies":{"react":">=19.0.0","react-dom":">=19.0.0"},"peerDependenciesMeta":{"yup":{"optional":true},"zod":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/axen-form_0.1.5_1773011112285_0.8822777456997277","host":"s3://npm-registry-packages-npm-production"}},"0.1.6":{"name":"@axenstudio/axen-form","version":"0.1.6","keywords":["react","form","config-driven","css-modules","a11y","enterprise","typescript","validation","yup","zod"],"license":"MIT","_id":"@axenstudio/axen-form@0.1.6","maintainers":[{"name":"hawkeye22","email":"axenproduction@gmail.com"}],"homepage":"https://github.com/axenstudio/axen-form#readme","bugs":{"url":"https://github.com/axenstudio/axen-form/issues"},"dist":{"shasum":"7cf4e265f99321e325c6e06dcdf7865216cf1c69","tarball":"https://registry.npmjs.org/@axenstudio/axen-form/-/axen-form-0.1.6.tgz","fileCount":233,"integrity":"sha512-hmnEIq4Z3KNqU6qjN5J0mOUioIGClBb3CSrjpubMgtSqKmK0GFxNG/Ugd8SlmOrk3fScwLfrvtdZAWQ4JjXmWA==","signatures":[{"sig":"MEUCIQD8w6sIzGV1tQoZyOFo6pKpDpJlbg5LzTr7qilvDdCuAwIgLHnF6eo5KmnMMFUVlD2nankdPmAq609G/ZRqW+/vnEk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":372548},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./reset":"./dist/tokens/reset.css","./tokens":"./dist/tokens/tokens.css","./adapters/yup":{"types":"./dist/adapters/yupAdapter.d.ts","import":"./dist/adapters/yupAdapter.js","require":"./dist/adapters/yupAdapter.cjs"},"./adapters/zod":{"types":"./dist/adapters/zodAdapter.d.ts","import":"./dist/adapters/zodAdapter.js","require":"./dist/adapters/zodAdapter.cjs"}},"gitHead":"b2bdb44360cf812a71df5db70ca907fb33fb424b","scripts":{"dev":"vite build --watch","lint":"eslint src/","test":"vitest run","build":"tsc -p tsconfig.build.json && vite build","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"hawkeye22","email":"axenproduction@gmail.com"},"repository":{"url":"git+https://github.com/axenstudio/axen-form.git","type":"git"},"_npmVersion":"11.4.2","description":"Lightweight, config-driven, enterprise-grade React form library. Zero UI dependency. CSS Modules. A11y-aware.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.12.0","_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","jsdom":"^25.0.0","react":"^19.0.0","vitest":"^3.0.0","react-dom":"^19.0.0","typescript":"^5.7.0","@types/node":"^25.3.5","@types/react":"^19.0.0","vite-plugin-dts":"^4.3.0","@types/react-dom":"^19.0.0","@testing-library/react":"^16.1.0","@testing-library/jest-dom":"^6.6.3","vite-plugin-css-injected-by-js":"^3.5.0"},"peerDependencies":{"react":">=19.0.0","react-dom":">=19.0.0"},"peerDependenciesMeta":{"yup":{"optional":true},"zod":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/axen-form_0.1.6_1773011691383_0.8280329088451148","host":"s3://npm-registry-packages-npm-production"}},"0.1.7":{"name":"@axenstudio/axen-form","version":"0.1.7","keywords":["react","form","config-driven","css-modules","a11y","enterprise","typescript","validation","yup","zod"],"license":"MIT","_id":"@axenstudio/axen-form@0.1.7","maintainers":[{"name":"hawkeye22","email":"axenproduction@gmail.com"}],"homepage":"https://github.com/axenstudio/axen-form#readme","bugs":{"url":"https://github.com/axenstudio/axen-form/issues"},"dist":{"shasum":"8e1bde4fc86920065405519a58efff52e163c5f7","tarball":"https://registry.npmjs.org/@axenstudio/axen-form/-/axen-form-0.1.7.tgz","fileCount":233,"integrity":"sha512-/CB/h1iEGlxfPwBUwrKsnzqWQtxVIQucMuudUwhOh2eyqZ/M8LahmvEhRq/Gp1uxz23Cq8kY0hQql5hZ9DhpWA==","signatures":[{"sig":"MEUCIQClUKndidb9j0ShN5L/kgn+G2KRScdbcKLZcbtu3vp65gIgSlvor3ZS7AC5HisNSyd3E/2ReSUFeI7cww6S0+m7xlM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":372592},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./reset":"./dist/tokens/reset.css","./themes":"./dist/tokens/themes.css","./tokens":"./dist/tokens/tokens.css","./adapters/yup":{"types":"./dist/adapters/yupAdapter.d.ts","import":"./dist/adapters/yupAdapter.js","require":"./dist/adapters/yupAdapter.cjs"},"./adapters/zod":{"types":"./dist/adapters/zodAdapter.d.ts","import":"./dist/adapters/zodAdapter.js","require":"./dist/adapters/zodAdapter.cjs"}},"gitHead":"b2bdb44360cf812a71df5db70ca907fb33fb424b","scripts":{"dev":"vite build --watch","lint":"eslint src/","test":"vitest run","build":"tsc -p tsconfig.build.json && vite build","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"hawkeye22","email":"axenproduction@gmail.com"},"repository":{"url":"git+https://github.com/axenstudio/axen-form.git","type":"git"},"_npmVersion":"11.4.2","description":"Lightweight, config-driven, enterprise-grade React form library. Zero UI dependency. CSS Modules. A11y-aware.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.12.0","_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","jsdom":"^25.0.0","react":"^19.0.0","vitest":"^3.0.0","react-dom":"^19.0.0","typescript":"^5.7.0","@types/node":"^25.3.5","@types/react":"^19.0.0","vite-plugin-dts":"^4.3.0","@types/react-dom":"^19.0.0","@testing-library/react":"^16.1.0","@testing-library/jest-dom":"^6.6.3","vite-plugin-css-injected-by-js":"^3.5.0"},"peerDependencies":{"react":">=19.0.0","react-dom":">=19.0.0"},"peerDependenciesMeta":{"yup":{"optional":true},"zod":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/axen-form_0.1.7_1773012293492_0.37937453586018655","host":"s3://npm-registry-packages-npm-production"}},"0.1.8":{"name":"@axenstudio/axen-form","version":"0.1.8","keywords":["react","form","config-driven","css-modules","a11y","enterprise","typescript","validation","yup","zod"],"license":"MIT","_id":"@axenstudio/axen-form@0.1.8","maintainers":[{"name":"hawkeye22","email":"axenproduction@gmail.com"}],"homepage":"https://github.com/axenstudio/axen-form#readme","bugs":{"url":"https://github.com/axenstudio/axen-form/issues"},"dist":{"shasum":"dddc40336b7591d61305f0979b9bd8e975abbd28","tarball":"https://registry.npmjs.org/@axenstudio/axen-form/-/axen-form-0.1.8.tgz","fileCount":233,"integrity":"sha512-YXobV6Yv++YK+Z0+0b2NWaBWQePKJM13d7hl0vdwbDs8YQgzbRmnXXX3aJCskYXxTlkUdkTceGhQRZye+rz8GQ==","signatures":[{"sig":"MEUCIQDm/gwQqUo/DDIb30XAOm1sAZUo4juJhpkAatFTE74emwIgWOqGo249vxvN6zZOrvNYBJngrJuNjuVT0g0aya5BudM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":372806},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./reset":"./dist/tokens/reset.css","./themes":"./dist/tokens/themes.css","./tokens":"./dist/tokens/tokens.css","./adapters/yup":{"types":"./dist/adapters/yupAdapter.d.ts","import":"./dist/adapters/yupAdapter.js","require":"./dist/adapters/yupAdapter.cjs"},"./adapters/zod":{"types":"./dist/adapters/zodAdapter.d.ts","import":"./dist/adapters/zodAdapter.js","require":"./dist/adapters/zodAdapter.cjs"}},"gitHead":"b2bdb44360cf812a71df5db70ca907fb33fb424b","scripts":{"dev":"vite build --watch","lint":"eslint src/","test":"vitest run","build":"tsc -p tsconfig.build.json && vite build","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"hawkeye22","email":"axenproduction@gmail.com"},"repository":{"url":"git+https://github.com/axenstudio/axen-form.git","type":"git"},"_npmVersion":"11.4.2","description":"Lightweight, config-driven, enterprise-grade React form library. Zero UI dependency. CSS Modules. A11y-aware.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.12.0","_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","jsdom":"^25.0.0","react":"^19.0.0","vitest":"^3.0.0","react-dom":"^19.0.0","typescript":"^5.7.0","@types/node":"^25.3.5","@types/react":"^19.0.0","vite-plugin-dts":"^4.3.0","@types/react-dom":"^19.0.0","@testing-library/react":"^16.1.0","@testing-library/jest-dom":"^6.6.3","vite-plugin-css-injected-by-js":"^3.5.0"},"peerDependencies":{"react":">=19.0.0","react-dom":">=19.0.0"},"peerDependenciesMeta":{"yup":{"optional":true},"zod":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/axen-form_0.1.8_1773012982052_0.0328419074189481","host":"s3://npm-registry-packages-npm-production"}},"0.1.9":{"name":"@axenstudio/axen-form","version":"0.1.9","keywords":["react","form","config-driven","css-modules","a11y","enterprise","typescript","validation","yup","zod"],"license":"MIT","_id":"@axenstudio/axen-form@0.1.9","maintainers":[{"name":"hawkeye22","email":"axenproduction@gmail.com"}],"homepage":"https://github.com/axenstudio/axen-form#readme","bugs":{"url":"https://github.com/axenstudio/axen-form/issues"},"dist":{"shasum":"cd5b0b34296e0612fa2ac24c47026e433f3454ec","tarball":"https://registry.npmjs.org/@axenstudio/axen-form/-/axen-form-0.1.9.tgz","fileCount":233,"integrity":"sha512-qk5ctHbtYE6p9lKOhb1pxKIEjgAzf2/1eL7vf1a0PMzYwOYZQGm9XYTSg9lnN6bXYNexwDtwEZajF7XFRAW69Q==","signatures":[{"sig":"MEUCIQDFyvclTeC+kt4jsASw/s4Z1NJHixXOEYogB13EoGB1QgIgXUsbhWGIGpnKDb5Hq1iEwFIsHcNrRe2Hr7q7PpdcsjA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":373371},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./reset":"./dist/tokens/reset.css","./themes":"./dist/tokens/themes.css","./tokens":"./dist/tokens/tokens.css","./adapters/yup":{"types":"./dist/adapters/yupAdapter.d.ts","import":"./dist/adapters/yupAdapter.js","require":"./dist/adapters/yupAdapter.cjs"},"./adapters/zod":{"types":"./dist/adapters/zodAdapter.d.ts","import":"./dist/adapters/zodAdapter.js","require":"./dist/adapters/zodAdapter.cjs"},"./axen-form.css":"./dist/axen-form.css","./dist/axen-form.css":"./dist/axen-form.css","./react/gridCell.module.css":"./dist/react/gridCell.module.css","./fields/fieldBase.module.css":"./dist/fields/fieldBase.module.css"},"gitHead":"b2bdb44360cf812a71df5db70ca907fb33fb424b","scripts":{"dev":"vite build --watch","lint":"eslint src/","test":"vitest run","build":"tsc -p tsconfig.build.json && vite build","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"hawkeye22","email":"axenproduction@gmail.com"},"repository":{"url":"git+https://github.com/axenstudio/axen-form.git","type":"git"},"_npmVersion":"11.4.2","description":"Lightweight, config-driven, enterprise-grade React form library. Zero UI dependency. CSS Modules. A11y-aware.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.12.0","_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","jsdom":"^25.0.0","react":"^19.0.0","vitest":"^3.0.0","react-dom":"^19.0.0","typescript":"^5.7.0","@types/node":"^25.3.5","@types/react":"^19.0.0","vite-plugin-dts":"^4.3.0","@types/react-dom":"^19.0.0","@testing-library/react":"^16.1.0","@testing-library/jest-dom":"^6.6.3","vite-plugin-css-injected-by-js":"^3.5.0"},"peerDependencies":{"react":">=19.0.0","react-dom":">=19.0.0"},"peerDependenciesMeta":{"yup":{"optional":true},"zod":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/axen-form_0.1.9_1773016840155_0.27947556278658947","host":"s3://npm-registry-packages-npm-production"}},"0.1.10":{"name":"@axenstudio/axen-form","version":"0.1.10","keywords":["react","form","config-driven","css-modules","a11y","enterprise","typescript","validation","yup","zod"],"license":"MIT","_id":"@axenstudio/axen-form@0.1.10","maintainers":[{"name":"hawkeye22","email":"axenproduction@gmail.com"}],"homepage":"https://github.com/axenstudio/axen-form#readme","bugs":{"url":"https://github.com/axenstudio/axen-form/issues"},"dist":{"shasum":"359ecd561121ee1b9f8bddc4bfe6af6a7ffacce0","tarball":"https://registry.npmjs.org/@axenstudio/axen-form/-/axen-form-0.1.10.tgz","fileCount":217,"integrity":"sha512-Q6jz9lFWaXCLrtU5k/q16juV+R+TD8GKhT7UtXUtPmg/5O09GuT0EhPcOdRUMqhXb6JCJJYKZsRgAgzP3PZUIQ==","signatures":[{"sig":"MEUCIQCUuGfHuSowG+cRL9fTgpsB7qmR+XCeZCL4vx7wt1/g4gIgOAR0JRsRJAbE/s+Ovoveunn2KY3B1+e2x0JKBg+4F3A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":373372},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./reset":"./dist/tokens/reset.css","./themes":"./dist/tokens/themes.css","./tokens":"./dist/tokens/tokens.css","./adapters/yup":{"types":"./dist/adapters/yupAdapter.d.ts","import":"./dist/adapters/yupAdapter.js","require":"./dist/adapters/yupAdapter.cjs"},"./adapters/zod":{"types":"./dist/adapters/zodAdapter.d.ts","import":"./dist/adapters/zodAdapter.js","require":"./dist/adapters/zodAdapter.cjs"},"./axen-form.css":"./dist/axen-form.css","./dist/axen-form.css":"./dist/axen-form.css","./react/gridCell.module.css":"./dist/react/gridCell.module.css","./fields/fieldBase.module.css":"./dist/fields/fieldBase.module.css"},"gitHead":"b2bdb44360cf812a71df5db70ca907fb33fb424b","scripts":{"dev":"vite build --watch","lint":"eslint src/","test":"vitest run","build":"tsc -p tsconfig.build.json && vite build","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"hawkeye22","email":"axenproduction@gmail.com"},"repository":{"url":"git+https://github.com/axenstudio/axen-form.git","type":"git"},"_npmVersion":"11.4.2","description":"Lightweight, config-driven, enterprise-grade React form library. Zero UI dependency. CSS Modules. A11y-aware.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.12.0","_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","jsdom":"^25.0.0","react":"^19.0.0","vitest":"^3.0.0","react-dom":"^19.0.0","typescript":"^5.7.0","@types/node":"^25.3.5","@types/react":"^19.0.0","vite-plugin-dts":"^4.3.0","@types/react-dom":"^19.0.0","@testing-library/react":"^16.1.0","@testing-library/jest-dom":"^6.6.3","vite-plugin-css-injected-by-js":"^3.5.0"},"peerDependencies":{"react":">=19.0.0","react-dom":">=19.0.0"},"peerDependenciesMeta":{"yup":{"optional":true},"zod":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/axen-form_0.1.10_1773016980543_0.4936408226807316","host":"s3://npm-registry-packages-npm-production"}},"0.1.11":{"name":"@axenstudio/axen-form","version":"0.1.11","keywords":["react","form","config-driven","css-modules","a11y","enterprise","typescript","validation","yup","zod"],"license":"MIT","_id":"@axenstudio/axen-form@0.1.11","maintainers":[{"name":"hawkeye22","email":"axenproduction@gmail.com"}],"homepage":"https://github.com/axenstudio/axen-form#readme","bugs":{"url":"https://github.com/axenstudio/axen-form/issues"},"dist":{"shasum":"dd7d515586830ab825cf2852c7c76f2581797834","tarball":"https://registry.npmjs.org/@axenstudio/axen-form/-/axen-form-0.1.11.tgz","fileCount":228,"integrity":"sha512-9PqQAbw1iYFC/W6crVnr78bnQbjiVNNvivRF1md+b6nkJWMLgj2XQ1TC8tSG/kAOJ8iW7nf+k+KyPkWuGtAjnA==","signatures":[{"sig":"MEUCIFpTHV42Av6sevaznBawmZ5mA/Iq689twDNA4AAP1NBEAiEAqrakQ89K0iNBDLq5I82Tzpo8jS0ECDUmMCfeJiZ5tJY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":531280},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./adapters/yup":{"types":"./dist/adapters/yupAdapter.d.ts","import":"./dist/adapters/yupAdapter.js","require":"./dist/adapters/yupAdapter.cjs"},"./adapters/zod":{"types":"./dist/adapters/zodAdapter.d.ts","import":"./dist/adapters/zodAdapter.js","require":"./dist/adapters/zodAdapter.cjs"}},"gitHead":"ee25e5634344c8e9833309127719d25c63fde07b","scripts":{"dev":"vite build --watch","lint":"eslint src/","test":"vitest run","build":"tsc -p tsconfig.build.json && vite build","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"hawkeye22","email":"axenproduction@gmail.com"},"repository":{"url":"git+https://github.com/axenstudio/axen-form.git","type":"git"},"_npmVersion":"11.4.2","description":"Lightweight, config-driven, enterprise-grade React form library. Zero UI dependency. CSS Modules. A11y-aware.","directories":{},"sideEffects":["**/*.css","**/*.css.js","**/*.css.cjs"],"_nodeVersion":"22.12.0","_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","jsdom":"^25.0.0","react":"^19.0.0","vitest":"^3.0.0","react-dom":"^19.0.0","typescript":"^5.7.0","@types/node":"^25.3.5","@types/react":"^19.0.0","vite-plugin-dts":"^4.3.0","@types/react-dom":"^19.0.0","@testing-library/react":"^16.1.0","@testing-library/jest-dom":"^6.6.3","vite-plugin-css-injected-by-js":"^3.5.0"},"peerDependencies":{"react":">=19.0.0","react-dom":">=19.0.0"},"peerDependenciesMeta":{"yup":{"optional":true},"zod":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/axen-form_0.1.11_1773085688786_0.8946474635067769","host":"s3://npm-registry-packages-npm-production"}},"0.1.12":{"name":"@axenstudio/axen-form","version":"0.1.12","keywords":["react","form","config-driven","css-modules","a11y","enterprise","typescript","validation","yup","zod"],"license":"MIT","_id":"@axenstudio/axen-form@0.1.12","maintainers":[{"name":"hawkeye22","email":"axenproduction@gmail.com"}],"homepage":"https://github.com/axenstudio/axen-form#readme","bugs":{"url":"https://github.com/axenstudio/axen-form/issues"},"dist":{"shasum":"03632c8d9e3f151384f03d141e78bf295982205d","tarball":"https://registry.npmjs.org/@axenstudio/axen-form/-/axen-form-0.1.12.tgz","fileCount":228,"integrity":"sha512-Yz0W0LV052wTiZE2LbQ44WSnE97/4gxWRVpKktJLBVApTGlnMTwGepMOuBX/KqctUpduttY9TTMV4jbYJjMJGQ==","signatures":[{"sig":"MEUCIC/pTiK3s2Q+g2PdRrkcekzyh2////iBY1zuhVy4bKxJAiEA0um77laR/ToxCXer3R7pTN+2k0fv9L0Dh1XLhzzes/U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":531868},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./adapters/yup":{"types":"./dist/adapters/yupAdapter.d.ts","import":"./dist/adapters/yupAdapter.js","require":"./dist/adapters/yupAdapter.cjs"},"./adapters/zod":{"types":"./dist/adapters/zodAdapter.d.ts","import":"./dist/adapters/zodAdapter.js","require":"./dist/adapters/zodAdapter.cjs"}},"gitHead":"ee25e5634344c8e9833309127719d25c63fde07b","scripts":{"dev":"vite build --watch","lint":"eslint src/","test":"vitest run","build":"tsc -p tsconfig.build.json && vite build","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"hawkeye22","email":"axenproduction@gmail.com"},"repository":{"url":"git+https://github.com/axenstudio/axen-form.git","type":"git"},"_npmVersion":"11.4.2","description":"Lightweight, config-driven, enterprise-grade React form library. Zero UI dependency. CSS Modules. A11y-aware.","directories":{},"sideEffects":["**/*.css","**/*.css.js","**/*.css.cjs"],"_nodeVersion":"22.12.0","_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","jsdom":"^25.0.0","react":"^19.0.0","vitest":"^3.0.0","react-dom":"^19.0.0","typescript":"^5.7.0","@types/node":"^25.3.5","@types/react":"^19.0.0","vite-plugin-dts":"^4.3.0","@types/react-dom":"^19.0.0","@testing-library/react":"^16.1.0","@testing-library/jest-dom":"^6.6.3","vite-plugin-css-injected-by-js":"^3.5.0"},"peerDependencies":{"react":">=19.0.0","react-dom":">=19.0.0"},"peerDependenciesMeta":{"yup":{"optional":true},"zod":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/axen-form_0.1.12_1773088336176_0.4290288272214928","host":"s3://npm-registry-packages-npm-production"}},"0.1.13":{"name":"@axenstudio/axen-form","version":"0.1.13","keywords":["react","form","config-driven","css-modules","a11y","enterprise","typescript","validation","yup","zod"],"license":"MIT","_id":"@axenstudio/axen-form@0.1.13","maintainers":[{"name":"hawkeye22","email":"axenproduction@gmail.com"}],"homepage":"https://github.com/axenstudio/axen-form#readme","bugs":{"url":"https://github.com/axenstudio/axen-form/issues"},"dist":{"shasum":"736715c7cf0b83dd052f750671a128c64c8236ee","tarball":"https://registry.npmjs.org/@axenstudio/axen-form/-/axen-form-0.1.13.tgz","fileCount":228,"integrity":"sha512-GZKnvSJH/DK72mfsoL/qD1UIYTIBWJ0yqlwJFWvtNNg94VKDfVB8SCkq8kMaT7KAx6JjfDA68mKOdeBMsLa24g==","signatures":[{"sig":"MEUCIFYWUr/t6ZSwrk0RL/AjJZ4JfaK0PLn2rfez4E2LilXPAiEAt626ZZBrGRvIXO1LWKFkYqFlzfMZHKs02i5Z6SdQvWY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":532555},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./adapters/yup":{"types":"./dist/adapters/yupAdapter.d.ts","import":"./dist/adapters/yupAdapter.js","require":"./dist/adapters/yupAdapter.cjs"},"./adapters/zod":{"types":"./dist/adapters/zodAdapter.d.ts","import":"./dist/adapters/zodAdapter.js","require":"./dist/adapters/zodAdapter.cjs"}},"gitHead":"ee25e5634344c8e9833309127719d25c63fde07b","scripts":{"dev":"vite build --watch","lint":"eslint src/","test":"vitest run","build":"tsc -p tsconfig.build.json && vite build","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"hawkeye22","email":"axenproduction@gmail.com"},"repository":{"url":"git+https://github.com/axenstudio/axen-form.git","type":"git"},"_npmVersion":"11.4.2","description":"Lightweight, config-driven, enterprise-grade React form library. Zero UI dependency. CSS Modules. A11y-aware.","directories":{},"sideEffects":["**/*.css","**/*.css.js","**/*.css.cjs"],"_nodeVersion":"22.12.0","_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","jsdom":"^25.0.0","react":"^19.0.0","vitest":"^3.0.0","react-dom":"^19.0.0","typescript":"^5.7.0","@types/node":"^25.3.5","@types/react":"^19.0.0","vite-plugin-dts":"^4.3.0","@types/react-dom":"^19.0.0","@testing-library/react":"^16.1.0","@testing-library/jest-dom":"^6.6.3","vite-plugin-css-injected-by-js":"^3.5.0"},"peerDependencies":{"react":">=19.0.0","react-dom":">=19.0.0"},"peerDependenciesMeta":{"yup":{"optional":true},"zod":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/axen-form_0.1.13_1773088851297_0.08826703990192342","host":"s3://npm-registry-packages-npm-production"}},"0.1.14":{"name":"@axenstudio/axen-form","version":"0.1.14","keywords":["react","form","config-driven","css-modules","a11y","enterprise","typescript","validation","yup","zod"],"license":"MIT","_id":"@axenstudio/axen-form@0.1.14","maintainers":[{"name":"hawkeye22","email":"axenproduction@gmail.com"}],"homepage":"https://github.com/axenstudio/axen-form#readme","bugs":{"url":"https://github.com/axenstudio/axen-form/issues"},"dist":{"shasum":"6b54d605c25af9ccf34e4ff7f3842454319dce4a","tarball":"https://registry.npmjs.org/@axenstudio/axen-form/-/axen-form-0.1.14.tgz","fileCount":228,"integrity":"sha512-1uvRTMFGda2CV6YT/8T+iE141xZSYtmVtXScNyFnSaeeJWYxE39WNQLb8fBWgtXJYcXuW4qRFqoFTM7K+/Hz6w==","signatures":[{"sig":"MEUCIQCAS1nTeOtrECZrGVZ0BaisTWzACtiZnIw0HnKRPAKjeQIgdYbr71xGn/067kz/+4SRFUs4IEvKtvBg3MAGlrDTIMw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":534866},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./adapters/yup":{"types":"./dist/adapters/yupAdapter.d.ts","import":"./dist/adapters/yupAdapter.js","require":"./dist/adapters/yupAdapter.cjs"},"./adapters/zod":{"types":"./dist/adapters/zodAdapter.d.ts","import":"./dist/adapters/zodAdapter.js","require":"./dist/adapters/zodAdapter.cjs"}},"gitHead":"69f21bcd4bf4a6db7153a301b2d6f7c4727ce24d","scripts":{"dev":"vite build --watch","lint":"eslint src/","test":"vitest run","build":"tsc -p tsconfig.build.json && vite build","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"hawkeye22","email":"axenproduction@gmail.com"},"repository":{"url":"git+https://github.com/axenstudio/axen-form.git","type":"git"},"_npmVersion":"11.4.2","description":"Lightweight, config-driven, enterprise-grade React form library. Zero UI dependency. CSS Modules. A11y-aware.","directories":{},"sideEffects":["**/*.css","**/*.css.js","**/*.css.cjs"],"_nodeVersion":"22.12.0","_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","jsdom":"^25.0.0","react":"^19.0.0","vitest":"^3.0.0","react-dom":"^19.0.0","typescript":"^5.7.0","@types/node":"^25.3.5","@types/react":"^19.0.0","vite-plugin-dts":"^4.3.0","@types/react-dom":"^19.0.0","@testing-library/react":"^16.1.0","@testing-library/jest-dom":"^6.6.3","vite-plugin-css-injected-by-js":"^3.5.0"},"peerDependencies":{"react":">=19.0.0","react-dom":">=19.0.0"},"peerDependenciesMeta":{"yup":{"optional":true},"zod":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/axen-form_0.1.14_1773091821602_0.00305059800012919","host":"s3://npm-registry-packages-npm-production"}},"0.1.16":{"name":"@axenstudio/axen-form","version":"0.1.16","keywords":["react","form","config-driven","css-modules","a11y","enterprise","typescript","validation","yup","zod"],"license":"MIT","_id":"@axenstudio/axen-form@0.1.16","maintainers":[{"name":"hawkeye22","email":"axenproduction@gmail.com"}],"homepage":"https://github.com/axenstudio/axen-form#readme","bugs":{"url":"https://github.com/axenstudio/axen-form/issues"},"dist":{"shasum":"7f33a67fae71866ac6239d55387f09b460618c62","tarball":"https://registry.npmjs.org/@axenstudio/axen-form/-/axen-form-0.1.16.tgz","fileCount":228,"integrity":"sha512-pEVykHzuG+2RYDHeAdsYAc5jtiMgoKQ3Dl9VdT+Sa16jBNtjMAbfwJ3BJiozKhsPE4+LnoeHLhO8c/Tklqqyxg==","signatures":[{"sig":"MEUCICvaFL+1jFc19ZKApiMMhmtESvOA1DZhivU+HQCGshLbAiEAi6G8q/4m3iUvUGx2LB3QDM0U/qVHybVooYzUry3LhEI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":534902},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./adapters/yup":{"types":"./dist/adapters/yupAdapter.d.ts","import":"./dist/adapters/yupAdapter.js","require":"./dist/adapters/yupAdapter.cjs"},"./adapters/zod":{"types":"./dist/adapters/zodAdapter.d.ts","import":"./dist/adapters/zodAdapter.js","require":"./dist/adapters/zodAdapter.cjs"}},"gitHead":"4fbf5768c5ab8e11c1379ce858b8c7582068ca8d","scripts":{"dev":"vite build --watch","lint":"eslint src/","test":"vitest run","build":"tsc -p tsconfig.build.json && vite build","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"hawkeye22","email":"axenproduction@gmail.com"},"repository":{"url":"git+https://github.com/axenstudio/axen-form.git","type":"git"},"_npmVersion":"11.4.2","description":"Lightweight, config-driven, enterprise-grade React form library. Zero UI dependency. CSS Modules. A11y-aware.","directories":{},"sideEffects":["**/*.css","**/*.css.js","**/*.css.cjs"],"_nodeVersion":"22.12.0","_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","jsdom":"^25.0.0","react":"^19.0.0","vitest":"^3.0.0","react-dom":"^19.0.0","typescript":"^5.7.0","@types/node":"^25.3.5","@types/react":"^19.0.0","vite-plugin-dts":"^4.3.0","@types/react-dom":"^19.0.0","@testing-library/react":"^16.1.0","@testing-library/jest-dom":"^6.6.3","vite-plugin-css-injected-by-js":"^3.5.0"},"peerDependencies":{"react":">=19.0.0","react-dom":">=19.0.0"},"peerDependenciesMeta":{"yup":{"optional":true},"zod":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/axen-form_0.1.16_1773093319958_0.19692831387056198","host":"s3://npm-registry-packages-npm-production"}},"0.1.17":{"name":"@axenstudio/axen-form","version":"0.1.17","description":"Lightweight, config-driven, enterprise-grade React form library. Zero UI dependency. CSS Modules. A11y-aware.","type":"module","main":"./dist/index.cjs","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./adapters/yup":{"types":"./dist/adapters/yupAdapter.d.ts","import":"./dist/adapters/yupAdapter.js","require":"./dist/adapters/yupAdapter.cjs"},"./adapters/zod":{"types":"./dist/adapters/zodAdapter.d.ts","import":"./dist/adapters/zodAdapter.js","require":"./dist/adapters/zodAdapter.cjs"}},"sideEffects":["**/*.css","**/*.css.js","**/*.css.cjs"],"scripts":{"dev":"vite build --watch","build":"tsc -p tsconfig.build.json && vite build","test":"vitest run","test:watch":"vitest","lint":"eslint src/","typecheck":"tsc --noEmit"},"peerDependencies":{"react":">=19.0.0","react-dom":">=19.0.0"},"peerDependenciesMeta":{"yup":{"optional":true},"zod":{"optional":true}},"devDependencies":{"@testing-library/jest-dom":"^6.6.3","@testing-library/react":"^16.1.0","@types/node":"^25.3.5","@types/react":"^19.0.0","@types/react-dom":"^19.0.0","jsdom":"^25.0.0","react":"^19.0.0","react-dom":"^19.0.0","typescript":"^5.7.0","vite":"^6.0.0","vite-plugin-css-injected-by-js":"^3.5.0","vite-plugin-dts":"^4.3.0","vitest":"^3.0.0"},"keywords":["react","form","config-driven","css-modules","a11y","enterprise","typescript","validation","yup","zod"],"license":"MIT","repository":{"type":"git","url":"git+https://github.com/axenstudio/axen-form.git"},"_id":"@axenstudio/axen-form@0.1.17","gitHead":"b6ce05b416f462a3c81cfe5af83fdb291f68816f","bugs":{"url":"https://github.com/axenstudio/axen-form/issues"},"homepage":"https://github.com/axenstudio/axen-form#readme","_nodeVersion":"22.12.0","_npmVersion":"11.4.2","dist":{"integrity":"sha512-w2JAYqVMvA02HA6eTvZCQhKtXmQTIhaVJNtW777c+i7IF23GauEI3EZRvMrMTcLcLSLUz8PoNg4q6sq8LvFj5Q==","shasum":"0b52b6dea35f7c2a8ff0cefe0233b870744fc246","tarball":"https://registry.npmjs.org/@axenstudio/axen-form/-/axen-form-0.1.17.tgz","fileCount":228,"unpackedSize":536105,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIEvCSQRefkhBt14ajzWExwJRcNe2JXDzjjsYOvVFCSdvAiEAztEeonYmGTWz0fxRF2CEFMHkHvHE/xWfV6RmNYlc4Ss="}]},"_npmUser":{"name":"hawkeye22","email":"axenproduction@gmail.com"},"directories":{},"maintainers":[{"name":"hawkeye22","email":"axenproduction@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/axen-form_0.1.17_1773102707339_0.09735729933635073"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-08T19:43:07.643Z","modified":"2026-03-10T00:31:47.654Z","0.1.1":"2026-03-08T19:43:07.939Z","0.1.3":"2026-03-08T21:08:22.200Z","0.1.4":"2026-03-08T22:14:44.936Z","0.1.5":"2026-03-08T23:05:12.412Z","0.1.6":"2026-03-08T23:14:51.530Z","0.1.7":"2026-03-08T23:24:53.685Z","0.1.8":"2026-03-08T23:36:22.218Z","0.1.9":"2026-03-09T00:40:40.308Z","0.1.10":"2026-03-09T00:43:00.742Z","0.1.11":"2026-03-09T19:48:08.949Z","0.1.12":"2026-03-09T20:32:16.352Z","0.1.13":"2026-03-09T20:40:51.480Z","0.1.14":"2026-03-09T21:30:21.753Z","0.1.16":"2026-03-09T21:55:20.115Z","0.1.17":"2026-03-10T00:31:47.512Z"},"bugs":{"url":"https://github.com/axenstudio/axen-form/issues"},"license":"MIT","homepage":"https://github.com/axenstudio/axen-form#readme","keywords":["react","form","config-driven","css-modules","a11y","enterprise","typescript","validation","yup","zod"],"repository":{"type":"git","url":"git+https://github.com/axenstudio/axen-form.git"},"description":"Lightweight, config-driven, enterprise-grade React form library. Zero UI dependency. CSS Modules. A11y-aware.","maintainers":[{"name":"hawkeye22","email":"axenproduction@gmail.com"}],"readme":"# @axenstudio/axen-form\n\nLightweight, config-driven, enterprise-grade React form library.  \nZero UI dependency. CSS Modules. A11y-aware. TypeScript strict.\n\n[![npm](https://img.shields.io/npm/v/@axenstudio/axen-form)](https://www.npmjs.com/package/@axenstudio/axen-form)\n[![license](https://img.shields.io/npm/l/@axenstudio/axen-form)](LICENSE)\n[![react](https://img.shields.io/badge/react-%E2%89%A519-blue)](https://react.dev)\n\n---\n\n## Table of Contents\n\n- [@axenstudio/axen-form](#axenstudioaxen-form)\n  - [Table of Contents](#table-of-contents)\n  - [Why axen-form?](#why-axen-form)\n  - [Installation](#installation)\n  - [Quick Start](#quick-start)\n  - [10 Scenarios — Basic → Expert](#10-scenarios--basic--expert)\n    - [BASIC](#basic)\n      - [01 · Basic Form](#01--basic-form)\n      - [02 · All 19 Field Types](#02--all-19-field-types)\n    - [INTERMEDIATE](#intermediate)\n      - [03 · Layout System](#03--layout-system)\n      - [04 · Yup / Zod Validation](#04--yup--zod-validation)\n      - [05 · Conditional / Hidden Fields](#05--conditional--hidden-fields)\n    - [ADVANCED](#advanced)\n      - [06 · Array Fields](#06--array-fields)\n      - [07 · Ref Control](#07--ref-control)\n      - [08 · Payload Mapping](#08--payload-mapping)\n    - [EXPERT](#expert)\n      - [09 · Form Context](#09--form-context)\n      - [10 · Custom Component](#10--custom-component)\n  - [Built-in Field Types (19)](#built-in-field-types-19)\n    - [Text Inputs](#text-inputs)\n    - [Numeric Inputs](#numeric-inputs)\n    - [Date \\& Time](#date--time)\n    - [Selection](#selection)\n    - [Autocomplete](#autocomplete)\n    - [Miscellaneous](#miscellaneous)\n  - [Enterprise Features](#enterprise-features)\n    - [Built-in Icon System](#built-in-icon-system)\n    - [Default Placeholders](#default-placeholders)\n    - [Field Groups / Sections](#field-groups--sections)\n    - [Theme System](#theme-system)\n  - [Layout System](#layout-system)\n    - [Grid Layout (12-column)](#grid-layout-12-column)\n    - [Responsive colSpan](#responsive-colspan)\n    - [Layout Components](#layout-components)\n      - [Grid](#grid)\n      - [Box](#box)\n      - [Stack](#stack)\n      - [Divider](#divider)\n      - [Spacer](#spacer)\n  - [Core Concepts](#core-concepts)\n    - [Config-Driven Forms](#config-driven-forms)\n    - [Reactive Form State](#reactive-form-state)\n    - [Validation Adapters](#validation-adapters)\n  - [Advanced Features](#advanced-features)\n    - [Payload Whitelist](#payload-whitelist)\n    - [Headless Usage](#headless-usage)\n    - [Custom Field Components](#custom-field-components)\n  - [API Reference](#api-reference)\n    - [`<AxenForm>`](#axenform)\n    - [`FieldConfig`](#fieldconfig)\n    - [`FieldGroupConfig`](#fieldgroupconfig)\n    - [Hooks](#hooks)\n    - [Utilities](#utilities)\n  - [Architecture](#architecture)\n  - [Theming with CSS Custom Properties](#theming-with-css-custom-properties)\n  - [Browser Support](#browser-support)\n  - [License](#license)\n\n---\n\n## Why axen-form?\n\n| Feature       | axen-form                             | Formik + MUI          | React Hook Form  |\n| ------------- | ------------------------------------- | --------------------- | ---------------- |\n| UI Dependency | **None** — native HTML                | MUI (~350KB)          | None             |\n| Form Engine   | **Built-in** reactive store           | Formik rerender-heavy | Ref-based        |\n| Validation    | **Plugin-based** (Yup / Zod / custom) | Yup only              | Resolver pattern |\n| Styling       | **CSS Modules** + design tokens       | Emotion runtime       | BYO              |\n| Config-Driven | **Yes** — one config = one form       | No                    | No               |\n| Bundle Size   | **< 15KB** gzipped                    | ~350KB+ with MUI      | ~10KB            |\n| React Version | **≥ 19**                              | ≥ 16                  | ≥ 16             |\n| TypeScript    | **Strict** end-to-end                 | Partial               | Good             |\n\n---\n\n## Installation\n\n```bash\nnpm install @axenstudio/axen-form\n# or\npnpm add @axenstudio/axen-form\n```\n\n**Peer dependencies:** `react ≥ 19`, `react-dom ≥ 19`\n\n**Optional validation libraries:**\n\n```bash\n# Pick one (or both)\npnpm add yup        # Yup adapter\npnpm add zod        # Zod adapter\n```\n\n---\n\n## Quick Start\n\n```tsx\nimport { AxenForm, defaultComponentMap } from '@axenstudio/axen-form';\n\nconst config = {\n  initialValues: { name: '', email: '', role: 'user' },\n  fields: [\n    { name: 'name', type: 'text', label: 'Full Name', required: true, colSpan: 6 },\n    { name: 'email', type: 'email', label: 'Email', required: true, colSpan: 6 },\n    {\n      name: 'role',\n      type: 'select',\n      label: 'Role',\n      options: [\n        { value: 'user', label: 'User' },\n        { value: 'admin', label: 'Admin' },\n      ],\n    },\n  ],\n};\n\nfunction App() {\n  return (\n    <AxenForm\n      config={config}\n      components={defaultComponentMap}\n      onSubmit={(values) => console.log(values)}\n    />\n  );\n}\n```\n\nThat's it. One config, one component — a full form with theme, icons, placeholders, grid layout, validation, and accessibility out of the box.\n\n---\n\n## 10 Scenarios — Basic → Expert\n\naxen-form is designed to scale from a quick contact form to a complex enterprise workflow. The following 10 scenarios illustrate the full capability range, from basic to expert-level usage.\n\n### BASIC\n\n#### 01 · Basic Form\n\nThe simplest form: a few fields, default layout, built-in validation.\n\n```tsx\nimport { AxenForm, defaultComponentMap } from '@axenstudio/axen-form';\n\nconst config = {\n  initialValues: { name: '', email: '' },\n  fields: [\n    { name: 'name', type: 'text', label: 'Name', required: true },\n    { name: 'email', type: 'email', label: 'Email', required: true },\n  ],\n};\n\n<AxenForm config={config} components={defaultComponentMap} onSubmit={console.log} />;\n```\n\n- Fields are full-width by default (colSpan = 12)\n- Built-in `simpleValidator` validates `required` fields\n- Enterprise styling applied automatically (icons, tinted inputs, themed labels)\n\n#### 02 · All 19 Field Types\n\nRender every built-in field type in a single form to explore the full component palette.\n\n```tsx\nconst config = {\n  initialValues: {\n    name: '',\n    email: '',\n    password: '',\n    phone: '',\n    bio: '',\n    age: 0,\n    price: 0,\n    rating: 50,\n    birthday: '',\n    alarm: '',\n    meeting: '',\n    country: '',\n    agree: false,\n    priority: 'medium',\n    darkMode: false,\n    city: '',\n    tags: [],\n    suggestion: '',\n    color: '#1976d2',\n  },\n  fields: [\n    // Text inputs\n    { name: 'name', type: 'text', label: 'Full Name', colSpan: 6 },\n    { name: 'email', type: 'email', label: 'Email', colSpan: 6 },\n    { name: 'password', type: 'password', label: 'Password', colSpan: 6 },\n    { name: 'phone', type: 'phone', label: 'Phone', colSpan: 6 },\n    { name: 'bio', type: 'textarea', label: 'Biography', rows: 3 },\n\n    // Numeric\n    { name: 'age', type: 'number', label: 'Age', min: 0, max: 150, colSpan: 4 },\n    {\n      name: 'price',\n      type: 'currency',\n      label: 'Price',\n      currency: 'USD',\n      locale: 'en-US',\n      colSpan: 4,\n    },\n    { name: 'rating', type: 'slider', label: 'Rating', min: 0, max: 100, step: 5, colSpan: 4 },\n\n    // Date & Time\n    { name: 'birthday', type: 'date', label: 'Birthday', colSpan: 4 },\n    { name: 'alarm', type: 'time', label: 'Alarm', ampm: true, colSpan: 4 },\n    { name: 'meeting', type: 'datetime', label: 'Meeting', colSpan: 4 },\n\n    // Selection\n    {\n      name: 'country',\n      type: 'select',\n      label: 'Country',\n      options: [\n        { value: 'us', label: 'United States' },\n        { value: 'id', label: 'Indonesia' },\n      ],\n      colSpan: 6,\n    },\n    {\n      name: 'priority',\n      type: 'radio',\n      label: 'Priority',\n      options: [\n        { value: 'low', label: 'Low' },\n        { value: 'medium', label: 'Medium' },\n        { value: 'high', label: 'High' },\n      ],\n      colSpan: 6,\n    },\n    { name: 'agree', type: 'checkbox', label: 'I agree to terms', colSpan: 6 },\n    { name: 'darkMode', type: 'switch', label: 'Dark Mode', colSpan: 6 },\n\n    // Autocomplete\n    { name: 'city', type: 'autocomplete', label: 'City', fetchOptions: searchCities, colSpan: 4 },\n    { name: 'tags', type: 'autocomplete-multi', label: 'Tags', options: tagOptions, colSpan: 4 },\n    {\n      name: 'suggestion',\n      type: 'autocomplete-predict',\n      label: 'Suggestion',\n      fetchOptions: fetchSuggestions,\n      colSpan: 4,\n    },\n\n    // Miscellaneous\n    { name: 'color', type: 'color', label: 'Theme Color', colSpan: 4 },\n  ],\n};\n```\n\n### INTERMEDIATE\n\n#### 03 · Layout System\n\nControl column spans per breakpoint for responsive form layouts.\n\n```tsx\nconst config = {\n  initialValues: { firstName: '', lastName: '', email: '', address: '', city: '', zip: '' },\n  fields: [\n    // Side-by-side on tablet+, stacked on mobile\n    { name: 'firstName', type: 'text', label: 'First Name', colSpan: { xs: 12, sm: 6 } },\n    { name: 'lastName', type: 'text', label: 'Last Name', colSpan: { xs: 12, sm: 6 } },\n    // Full width\n    { name: 'email', type: 'email', label: 'Email' },\n    { name: 'address', type: 'text', label: 'Address' },\n    // Three across on desktop\n    { name: 'city', type: 'text', label: 'City', colSpan: { xs: 12, sm: 6, md: 4 } },\n    {\n      name: 'state',\n      type: 'select',\n      label: 'State',\n      colSpan: { xs: 12, sm: 6, md: 4 },\n      options: stateOptions,\n    },\n    { name: 'zip', type: 'text', label: 'ZIP', colSpan: { xs: 12, md: 4 } },\n  ],\n};\n\n// colSpan breakpoints: xs (<600px), sm (≥600px), md (≥900px), lg (≥1200px), xl (≥1536px)\n```\n\nSee [Layout System](#layout-system) for `Grid`, `Box`, `Stack`, `Divider`, and `Spacer` components.\n\n#### 04 · Yup / Zod Validation\n\nBring your own validation library via adapters.\n\n**Yup Adapter:**\n\n```tsx\nimport { yupAdapter } from '@axenstudio/axen-form/adapters/yup';\nimport * as yup from 'yup';\n\n// Fields with required: true auto-generate schema.\n// For custom rules, use the validation prop:\nconst config = {\n  initialValues: { email: '', age: 0 },\n  fields: [\n    { name: 'email', type: 'email', label: 'Email', required: true },\n    { name: 'age', type: 'number', label: 'Age', required: true, min: 18, max: 120 },\n  ],\n};\n\n<AxenForm\n  config={config}\n  components={defaultComponentMap}\n  validationAdapter={yupAdapter}\n  onSubmit={handleSubmit}\n/>;\n```\n\n**Zod Adapter:**\n\n```tsx\nimport { zodAdapter } from '@axenstudio/axen-form/adapters/zod';\n\n<AxenForm\n  config={config}\n  components={defaultComponentMap}\n  validationAdapter={zodAdapter}\n  onSubmit={handleSubmit}\n/>;\n```\n\n**Built-in (zero-dep):**\n\nWithout any adapter, axen-form uses `simpleValidator` — validates `required` fields automatically.\n\n#### 05 · Conditional / Hidden Fields\n\nHide fields dynamically based on form values. Hidden fields are excluded from validation and rendering.\n\n```tsx\nconst config = {\n  initialValues: { accountType: 'personal', companyName: '', taxId: '' },\n  fields: [\n    {\n      name: 'accountType',\n      type: 'select',\n      label: 'Account Type',\n      options: [\n        { value: 'personal', label: 'Personal' },\n        { value: 'business', label: 'Business' },\n      ],\n    },\n    {\n      name: 'companyName',\n      type: 'text',\n      label: 'Company Name',\n      required: true,\n      hidden: (values) => values.accountType !== 'business',\n    },\n    {\n      name: 'taxId',\n      type: 'text',\n      label: 'Tax ID',\n      hidden: (values) => values.accountType !== 'business',\n    },\n  ],\n};\n```\n\n### ADVANCED\n\n#### 06 · Array Fields\n\nRepeating field groups with add/remove controls.\n\n```tsx\nimport type { ArrayFieldConfig } from '@axenstudio/axen-form';\n\nconst config = {\n  initialValues: { contacts: [{ name: '', email: '' }] },\n  fields: [\n    {\n      name: 'contacts',\n      type: 'text',\n      isArray: true,\n      label: 'Contacts',\n      addLabel: '+ Add Contact',\n      removeLabel: 'Remove',\n      minItems: 1,\n      maxItems: 5,\n      fields: [\n        { name: 'name', type: 'text', label: 'Name', colSpan: 6 },\n        { name: 'email', type: 'email', label: 'Email', colSpan: 6 },\n      ],\n    } satisfies ArrayFieldConfig,\n  ],\n};\n```\n\n**Array helpers** available via `arrayRef`:\n\n- `push(value)` — add item at end\n- `remove(index)` — remove item\n- `swap(a, b)` — swap two items\n- `insert(index, value)` — insert at position\n- `replace(index, value)` — replace item\n- `move(from, to)` — move item\n\n#### 07 · Ref Control\n\nAccess the form imperatively from parent components.\n\n```tsx\nimport { useRef } from 'react';\nimport type { AxenFormRef } from '@axenstudio/axen-form';\n\nfunction MyPage() {\n  const formRef = useRef<AxenFormRef>(null);\n\n  return (\n    <>\n      <AxenForm\n        ref={formRef}\n        config={config}\n        components={defaultComponentMap}\n        onSubmit={handleSubmit}\n      />\n      <div>\n        <button onClick={() => formRef.current?.submit()}>Submit from Outside</button>\n        <button onClick={() => formRef.current?.resetForm()}>Reset</button>\n        <button onClick={() => console.log(formRef.current?.getValues())}>Inspect Values</button>\n        <button onClick={() => console.log(formRef.current?.isValid())}>Check Valid</button>\n      </div>\n    </>\n  );\n}\n```\n\n| Method               | Return                    | Description                             |\n| -------------------- | ------------------------- | --------------------------------------- |\n| `submit()`           | `void`                    | Trigger form submission                 |\n| `resetForm(values?)` | `void`                    | Reset form (optionally with new values) |\n| `getValues()`        | `Record<string, unknown>` | Get current form values                 |\n| `getErrors()`        | `Record<string, string>`  | Get current validation errors           |\n| `isValid()`          | `boolean`                 | Check if form has no errors             |\n| `isDirty()`          | `boolean`                 | Check if values differ from initial     |\n\n#### 08 · Payload Mapping\n\nControl which fields are sent to `onSubmit` — prevent hidden/irrelevant fields from leaking to your API.\n\n```tsx\n// Static whitelist — only name and email are submitted\n<AxenForm\n  config={config}\n  components={defaultComponentMap}\n  payloadFields={['name', 'email']}\n  onSubmit={(values) => {\n    // values: { name, email } — nothing else\n  }}\n/>\n\n// Dynamic whitelist — different fields per accountType\n<AxenForm\n  config={config}\n  components={defaultComponentMap}\n  payloadFields={{\n    personal: ['firstName', 'lastName', 'ssn'],\n    business: ['companyName', 'taxId', 'industry'],\n  }}\n  payloadDiscriminator=\"accountType\"\n  onSubmit={handleSubmit}\n/>\n```\n\n### EXPERT\n\n#### 09 · Form Context\n\nAccess form state from deeply nested child components using context hooks.\n\n```tsx\nimport { useFormContext, useField } from '@axenstudio/axen-form';\n\nfunction StatusBadge() {\n  const { store } = useFormContext();\n  const state = store.getState();\n\n  return (\n    <span>\n      {state.dirty ? '● Unsaved changes' : '✓ Saved'}\n      {' | '}\n      Errors: {Object.keys(state.errors).length}\n    </span>\n  );\n}\n\nfunction InlineFieldDisplay({ name }: { name: string }) {\n  const { value, error, touched } = useField(name);\n  return (\n    <div>\n      <strong>{name}:</strong> {String(value)}\n      {touched && error && <span style={{ color: 'red' }}> — {error}</span>}\n    </div>\n  );\n}\n\n// Nest these inside AxenForm's children\n<AxenForm config={config} components={defaultComponentMap} onSubmit={handleSubmit}>\n  <StatusBadge />\n  <InlineFieldDisplay name=\"email\" />\n</AxenForm>;\n```\n\n**Headless usage with `useAxenForm`:**\n\n```tsx\nimport { useAxenForm } from '@axenstudio/axen-form';\n\nfunction FullyCustomForm() {\n  const { store, formApi } = useAxenForm({\n    config: {\n      initialValues: { name: '' },\n      fields: [{ name: 'name', type: 'text', required: true }],\n    },\n    onSubmit: async (values) => {\n      /* ... */\n    },\n  });\n\n  return (\n    <form onSubmit={formApi.handleSubmit}>\n      <input\n        name=\"name\"\n        value={formApi.values.name as string}\n        onChange={formApi.handleChange}\n        onBlur={formApi.handleBlur}\n      />\n      {formApi.errors.name && <span>{formApi.errors.name}</span>}\n      <button type=\"submit\">Submit</button>\n    </form>\n  );\n}\n```\n\n#### 10 · Custom Component\n\nOverride any built-in field with your own component.\n\n```tsx\nimport type { FieldComponentProps } from '@axenstudio/axen-form';\n\n// Custom star-rating component\nfunction StarRating({ name, value, onChange, label, error, helperText }: FieldComponentProps) {\n  const stars = [1, 2, 3, 4, 5];\n  const current = Number(value) || 0;\n\n  return (\n    <div>\n      <label>{label}</label>\n      <div>\n        {stars.map((star) => (\n          <button\n            key={star}\n            type=\"button\"\n            onClick={() => {\n              const syntheticEvent = { target: { name, value: star } };\n              onChange(syntheticEvent as any);\n            }}\n            style={{\n              color: star <= current ? 'gold' : '#ccc',\n              fontSize: '1.5rem',\n              background: 'none',\n              border: 'none',\n            }}\n          >\n            ★\n          </button>\n        ))}\n      </div>\n      {error && <span style={{ color: 'red', fontSize: '0.75rem' }}>{helperText}</span>}\n    </div>\n  );\n}\n\n// Per-field override\nconst config = {\n  initialValues: { rating: 0 },\n  fields: [{ name: 'rating', type: 'text', label: 'Your Rating', component: StarRating }],\n};\n\n// Or type-level override via components prop\n<AxenForm\n  config={config}\n  components={{ ...defaultComponentMap, 'star-rating': StarRating }}\n  onSubmit={handleSubmit}\n/>;\n```\n\n---\n\n## Built-in Field Types (19)\n\nEvery field renders enterprise-grade out of the box — with icons, placeholders, themed styling, and WCAG-compliant focus rings.\n\n### Text Inputs\n\n| Type       | Component       | Icon        | Default Placeholder    | Description                        |\n| ---------- | --------------- | ----------- | ---------------------- | ---------------------------------- |\n| `text`     | `TextField`     | ✏️ Pencil   | `Enter text...`        | Standard text input                |\n| `email`    | `EmailField`    | ✉️ Envelope | `user@example.com`     | Email input with `type=\"email\"`    |\n| `password` | `PasswordField` | 🔒 Lock     | `Enter password...`    | Password with show/hide toggle     |\n| `phone`    | `PhoneField`    | 📞 Phone    | `+1 (555) 000-0000`    | Phone input with `type=\"tel\"`      |\n| `textarea` | `TextareaField` | —           | `Enter description...` | Multi-line text, configurable rows |\n\n### Numeric Inputs\n\n| Type       | Component       | Icon       | Default Placeholder | Description                                           |\n| ---------- | --------------- | ---------- | ------------------- | ----------------------------------------------------- |\n| `number`   | `NumberField`   | `#` Hash   | `0`                 | Locale-aware thousand separator + cursor preservation |\n| `currency` | `CurrencyField` | `$` Dollar | `0.00`              | Intl currency formatting with prefix/suffix           |\n| `slider`   | `SliderField`   | —          | —                   | Range slider with value display                       |\n\n**NumberField** preserves cursor position after reformatting. Set `locale` (e.g., `'id-ID'` for dot-thousands, comma-decimal) and `min`/`max`/`step` for constraints.\n\n**CurrencyField** uses `Intl.NumberFormat` with `currency` (e.g., `'USD'`, `'IDR'`) and `locale` for automatic symbol and formatting.\n\n### Date & Time\n\n| Type       | Component       | Icon        | Default Placeholder    | Description                                                   |\n| ---------- | --------------- | ----------- | ---------------------- | ------------------------------------------------------------- |\n| `date`     | `DateField`     | 📅 Calendar | `Select date`          | Custom date picker — displays locale, stores ISO `YYYY-MM-DD` |\n| `time`     | `TimeField`     | 🕐 Clock    | `Select time`          | Custom time picker — 12h/24h, stores ISO `HH:mm`              |\n| `datetime` | `DateTimeField` | 📅 Calendar | `Select date and time` | Combined date+time, stores ISO `YYYY-MM-DDTHH:mm`             |\n\nAll date/time fields store ISO strings internally and display locale-formatted values. Set `ampm: true` for 12-hour mode, `showSeconds: true` to include seconds.\n\n### Selection\n\n| Type       | Component       | Description                |\n| ---------- | --------------- | -------------------------- |\n| `select`   | `SelectField`   | Native `<select>` dropdown |\n| `checkbox` | `CheckboxField` | Styled checkbox with label |\n| `radio`    | `RadioField`    | Radio group from `options` |\n| `switch`   | `SwitchField`   | Toggle switch (on/off)     |\n\n### Autocomplete\n\n| Type                   | Component                  | Icon      | Default Placeholder | Description                        |\n| ---------------------- | -------------------------- | --------- | ------------------- | ---------------------------------- |\n| `autocomplete`         | `AutocompleteField`        | 🔍 Search | `Search...`         | Server-side search with debounce   |\n| `autocomplete-multi`   | `AutocompleteMultiField`   | —         | `Search...`         | Multi-select with chip/tag display |\n| `autocomplete-predict` | `AutocompletePredictField` | 🔍 Search | `Search...`         | Ghost text prediction + Tab accept |\n\n**AutocompleteField** accepts `fetchOptions: (query, signal?) => Promise<Option[]>` for server-side search with built-in debounce and keyboard navigation (↑↓ Enter Esc).\n\n**AutocompletePredictField** shows ghost text predictions that users accept with Tab — similar to AI autocomplete in code editors.\n\n### Miscellaneous\n\n| Type    | Component    | Description              |\n| ------- | ------------ | ------------------------ |\n| `color` | `ColorField` | Color swatch + hex input |\n\n---\n\n## Enterprise Features\n\nThese features are active by default without extra configuration.\n\n### Built-in Icon System\n\nEvery field that accepts text input has a built-in SVG icon rendered inside the input (left side). Icons are inline SVGs (~200 bytes each), zero-dependency, tree-shakeable.\n\n```tsx\n// Default icon (auto per field type)\n{ name: 'email', type: 'email', label: 'Email' }\n\n// Custom icon override\n{ name: 'search', type: 'text', label: 'Search', icon: <MySearchIcon /> }\n\n// Disable icon\n{ name: 'plain', type: 'text', label: 'Plain', icon: false }\n```\n\n**Icon map:**\n\n| Field Type             | Icon             |\n| ---------------------- | ---------------- |\n| `text`                 | Pencil / Edit    |\n| `email`                | Envelope         |\n| `password`             | Lock             |\n| `phone`                | Phone            |\n| `number`               | Hash `#`         |\n| `currency`             | Dollar `$`       |\n| `date`, `datetime`     | Calendar         |\n| `time`                 | Clock            |\n| `autocomplete`         | Magnifying glass |\n| `autocomplete-predict` | Magnifying glass |\n\nFields without icons: `textarea`, `slider`, `select`, `checkbox`, `radio`, `switch`, `autocomplete-multi`, `color`.\n\n### Default Placeholders\n\nFields without an explicit `placeholder` receive a sensible default based on their type (`Enter text...`, `user@example.com`, `Select date`, etc.). Override with a custom string or set `placeholder: ''` to clear.\n\n### Field Groups / Sections\n\nGroup related fields under a visual section header. Groups are purely visual — they don't create nested data structures.\n\n```tsx\nimport type { FieldGroupConfig } from '@axenstudio/axen-form';\n\nconst config = {\n  initialValues: { firstName: '', lastName: '', email: '', phone: '', street: '', city: '' },\n  fields: [\n    {\n      group: 'Personal Information',\n      fields: [\n        { name: 'firstName', type: 'text', label: 'First Name', colSpan: 6 },\n        { name: 'lastName', type: 'text', label: 'Last Name', colSpan: 6 },\n        { name: 'email', type: 'email', label: 'Email' },\n        { name: 'phone', type: 'phone', label: 'Phone' },\n      ],\n    } satisfies FieldGroupConfig,\n    {\n      group: 'Address',\n      fields: [\n        { name: 'street', type: 'text', label: 'Street' },\n        { name: 'city', type: 'text', label: 'City', colSpan: 6 },\n      ],\n    } satisfies FieldGroupConfig,\n  ],\n};\n```\n\nGroup headers render as bold, themed labels with a subtle bottom border, spanning the full grid width.\n\n### Theme System\n\naxen-form ships with 3 built-in themes applied via CSS custom properties. The `default` theme is auto-applied when no `theme` prop is set.\n\n```tsx\n// Default blue theme (auto-applied)\n<AxenForm config={config} components={defaultComponentMap} onSubmit={handleSubmit} />\n\n// Subtle gray theme\n<AxenForm config={config} components={defaultComponentMap} theme=\"subtle\" onSubmit={handleSubmit} />\n\n// Green theme\n<AxenForm config={config} components={defaultComponentMap} theme=\"green\" onSubmit={handleSubmit} />\n```\n\n**Built-in presets:**\n\n| Theme     | Primary           | Input Background | Label Color |\n| --------- | ----------------- | ---------------- | ----------- |\n| `default` | `#1976d2` (Blue)  | `#f0f7ff`        | `#1565c0`   |\n| `subtle`  | `#546e7a` (Gray)  | `#f5f5f5`        | `#37474f`   |\n| `green`   | `#2e7d32` (Green) | `#f1f8e9`        | `#1b5e20`   |\n\n**Custom themes:** Create your own by adding a CSS rule targeting `[data-axen-theme='yourTheme']`:\n\n```css\n[data-axen-theme='coral'] {\n  --axen-color-primary: #e74c3c;\n  --axen-color-primary-hover: #c0392b;\n  --axen-color-primary-light: #fde8e8;\n  --axen-color-input-bg: #fef5f5;\n  --axen-color-label: #c0392b;\n}\n```\n\nThen: `<AxenForm theme=\"coral\" ... />`\n\n---\n\n## Layout System\n\n### Grid Layout (12-column)\n\nAxenForm renders fields inside a 12-column CSS Grid. Each field occupies columns based on its `colSpan` property. Default is full-width (`colSpan: 12`).\n\n```\n┌────────────────────────────────────────────────┐\n│ colSpan: 12 (full width)                       │\n├────────────────────────┬───────────────────────┤\n│ colSpan: 6 (half)      │ colSpan: 6 (half)     │\n├────────────┬───────────┼───────────────────────┤\n│ colSpan: 4 │ colSpan: 4│ colSpan: 4            │\n└────────────┴───────────┴───────────────────────┘\n```\n\nThe grid maxes out at `900px` width and auto-centers — no external container needed.\n\n### Responsive colSpan\n\nUse an object to set different spans per breakpoint. Values cascade upward (xs → sm → md → lg → xl).\n\n```tsx\n{\n  name: 'city',\n  type: 'text',\n  label: 'City',\n  colSpan: {\n    xs: 12,   // Full width on mobile (<600px)\n    sm: 6,    // Half width on tablet (≥600px)\n    md: 4,    // Third on desktop (≥900px)\n  },\n}\n```\n\n**Breakpoints:**\n\n| Key  | Min Width | Typical Device   |\n| ---- | --------- | ---------------- |\n| `xs` | 0         | Mobile           |\n| `sm` | 600px     | Tablet portrait  |\n| `md` | 900px     | Tablet landscape |\n| `lg` | 1200px    | Desktop          |\n| `xl` | 1536px    | Large desktop    |\n\nOr use a number for all breakpoints: `colSpan: 6` = half-width on all screens.\n\n### Layout Components\n\nIn addition to config-driven form layout, axen-form exports standalone layout components with a MUI-like API, powered by CSS Grid/Flexbox.\n\n#### Grid\n\n12-column responsive grid — independent layout component.\n\n```tsx\nimport { Grid } from '@axenstudio/axen-form';\n\n<Grid container spacing={2}>\n  <Grid size={{ xs: 12, md: 6 }}>Left half</Grid>\n  <Grid size={{ xs: 12, md: 6 }}>Right half</Grid>\n</Grid>;\n```\n\n**Props:** `container`, `columns` (default 12), `spacing`, `rowSpacing`, `columnSpacing`, `size`, `xs`/`sm`/`md`/`lg`/`xl`, `offset`.\n\n#### Box\n\nGeneric flex/block container with spacing shortcuts.\n\n```tsx\nimport { Box } from '@axenstudio/axen-form';\n\n<Box display=\"flex\" gap=\"16px\" p={2} justifyContent=\"space-between\">\n  <span>Left</span>\n  <span>Right</span>\n</Box>;\n```\n\n**Props:** `display`, `flexDirection`, `justifyContent`, `alignItems`, `flexWrap`, `gap`, `p`/`px`/`py`, `m`/`mx`/`my`.\n\n#### Stack\n\nVertical/horizontal stack with consistent gap.\n\n```tsx\nimport { Stack } from '@axenstudio/axen-form';\n\n<Stack direction=\"column\" spacing={2}>\n  <div>Item 1</div>\n  <div>Item 2</div>\n</Stack>;\n```\n\n**Props:** `direction` (row/column), `spacing`, `alignItems`, `justifyContent`, `divider`.\n\n#### Divider\n\nHorizontal or vertical separator line.\n\n```tsx\nimport { Divider } from '@axenstudio/axen-form';\n\n<Stack direction=\"column\" spacing={2}>\n  <div>Above</div>\n  <Divider />\n  <div>Below</div>\n</Stack>;\n```\n\n#### Spacer\n\nInvisible spacing element. Uses 8px unit multiplier.\n\n```tsx\nimport { Spacer } from '@axenstudio/axen-form';\n\n// Horizontal 16px gap\n<Spacer x={2} />\n\n// Push items apart (flex grow)\n<Stack direction=\"row\"><Logo /><Spacer grow /><NavLinks /></Stack>\n```\n\n| Prop    | Type      | Description                          |\n| ------- | --------- | ------------------------------------ |\n| `x`     | `number`  | Horizontal spacing (width = x × 8px) |\n| `y`     | `number`  | Vertical spacing (height = y × 8px)  |\n| `basis` | `number`  | Flex basis (basis × 8px)             |\n| `grow`  | `boolean` | Grow to fill remaining space         |\n\n---\n\n## Core Concepts\n\n### Config-Driven Forms\n\nDefine your entire form with a single configuration object — fields, layout, validation, and behavior:\n\n```typescript\nimport type { FormConfig } from '@axenstudio/axen-form';\n\nconst config: FormConfig = {\n  initialValues: { name: '', email: '', age: 0 },\n  fields: [\n    { name: 'name', type: 'text', label: 'Name', required: true },\n    {\n      name: 'email',\n      type: 'email',\n      label: 'Email',\n      required: true,\n      requiredMessage: 'Email wajib diisi',\n    },\n    { name: 'age', type: 'number', label: 'Age', min: 0, max: 150, locale: 'en-US' },\n  ],\n};\n```\n\n### Reactive Form State\n\naxen-form uses a built-in reactive store (no Formik dependency). State is managed via `useSyncExternalStore` — only the fields that change re-render.\n\n- **Field-level subscription:** components subscribe to specific field paths\n- **Dirty detection:** deep comparison against initial values\n- **Sync validation:** runs on change/blur (configurable)\n\n### Validation Adapters\n\nPlug in any validation library:\n\n| Adapter           | Import Path                          | Library |\n| ----------------- | ------------------------------------ | ------- |\n| `yupAdapter`      | `@axenstudio/axen-form/adapters/yup` | Yup     |\n| `zodAdapter`      | `@axenstudio/axen-form/adapters/zod` | Zod     |\n| `simpleValidator` | Built-in (default)                   | None    |\n\nBoth adapters auto-generate schemas from `FieldConfig` (required, min, max, type-aware schema). You can also provide custom `validation` on individual fields.\n\n---\n\n## Advanced Features\n\n### Payload Whitelist\n\nControl which fields are sent to `onSubmit`. See [Scenario 08](#08--payload-mapping).\n\n### Headless Usage\n\nUse `useAxenForm` for full rendering control. See [Scenario 09](#09--form-context).\n\n### Custom Field Components\n\nOverride any built-in field. See [Scenario 10](#10--custom-component).\n\n---\n\n## API Reference\n\n### `<AxenForm>`\n\nMain config-driven form component.\n\n| Prop                   | Type                                   | Default           | Description                                 |\n| ---------------------- | -------------------------------------- | ----------------- | ------------------------------------------- |\n| `config`               | `FormConfig`                           | **required**      | Form configuration (fields + initialValues) |\n| `onSubmit`             | `(values, meta) => void`               | **required**      | Submit handler                              |\n| `components`           | `FieldTypeComponentMap`                | `{}`              | Component map (use `defaultComponentMap`)   |\n| `validationAdapter`    | `ValidationAdapter`                    | `simpleValidator` | Validation library adapter                  |\n| `ref`                  | `Ref<AxenFormRef>`                     | —                 | Imperative handle                           |\n| `theme`                | `'default' \\| 'subtle' \\| string`      | `'default'`       | Theme preset or custom name                 |\n| `columns`              | `number`                               | `12`              | Grid columns                                |\n| `gap`                  | `string \\| number`                     | `'1rem'`          | Grid gap                                    |\n| `disabled`             | `boolean`                              | `false`           | Disable all fields                          |\n| `className`            | `string`                               | —                 | Additional CSS class                        |\n| `payloadFields`        | `string[] \\| Record<string, string[]>` | —                 | Payload whitelist                           |\n| `payloadDiscriminator` | `string`                               | —                 | Discriminator field for dynamic payload     |\n| `validateOnChange`     | `boolean`                              | `true`            | Validate on field change                    |\n| `validateOnBlur`       | `boolean`                              | `true`            | Validate on field blur                      |\n| `children`             | `ReactNode`                            | —                 | Extra content inside form (buttons, etc.)   |\n\n### `FieldConfig`\n\nConfiguration for a single field.\n\n| Property           | Type                                    | Description                                        |\n| ------------------ | --------------------------------------- | -------------------------------------------------- |\n| `name`             | `string`                                | Field name (supports nested paths: `address.city`) |\n| `type`             | `BuiltInFieldType \\| string`            | Field type identifier                              |\n| `label`            | `string`                                | Field label                                        |\n| `placeholder`      | `string`                                | Input placeholder (auto-filled if not set)         |\n| `required`         | `boolean`                               | Mark as required                                   |\n| `requiredMessage`  | `string`                                | Custom required error message                      |\n| `disabled`         | `boolean`                               | Disable this field                                 |\n| `readOnly`         | `boolean`                               | Read-only mode                                     |\n| `hidden`           | `boolean \\| (values) => boolean`        | Conditional hiding                                 |\n| `component`        | `ComponentType`                         | Override component for this field                  |\n| `options`          | `FieldOption[]`                         | Options for select/radio/autocomplete              |\n| `icon`             | `ReactNode \\| false`                    | Custom icon, or `false` to disable                 |\n| `colSpan`          | `number \\| { xs?, sm?, md?, lg?, xl? }` | Grid column span (default: 12)                     |\n| `helperText`       | `string`                                | Helper text below field                            |\n| `min`, `max`       | `number`                                | Numeric/date constraints                           |\n| `step`             | `number`                                | Numeric step value                                 |\n| `prefix`, `suffix` | `string`                                | Display prefix/suffix (currency)                   |\n| `locale`           | `string`                                | Locale for number/date formatting                  |\n| `currency`         | `string`                                | Currency code (e.g., `'USD'`, `'IDR'`)             |\n| `rows`             | `number`                                | Textarea rows                                      |\n| `ampm`             | `boolean`                               | 12-hour mode for time/datetime                     |\n| `showSeconds`      | `boolean`                               | Show seconds in time picker                        |\n| `fetchOptions`     | `(query, signal?) => Promise<Option[]>` | Async option fetcher (autocomplete)                |\n| `optionLabel`      | `string`                                | Template: `'{name} - {email}'`                     |\n| `multiple`         | `boolean`                               | Multi-select for autocomplete                      |\n| `fieldProps`       | `Record<string, unknown>`               | Extra props forwarded to component                 |\n| `className`        | `string`                                | Additional CSS class for field wrapper             |\n\n### `FieldGroupConfig`\n\n| Property    | Type                                    | Description                 |\n| ----------- | --------------------------------------- | --------------------------- |\n| `group`     | `string`                                | Section header label        |\n| `fields`    | `FieldConfig[]`                         | Fields within the group     |\n| `columns`   | `number`                                | Sub-grid columns (optional) |\n| `colSpan`   | `number \\| { xs?, sm?, md?, lg?, xl? }` | Group wrapper column span   |\n| `className` | `string`                                | Additional CSS class        |\n\n### Hooks\n\n| Hook             | Signature                                                                 | Description                     |\n| ---------------- | ------------------------------------------------------------------------- | ------------------------------- |\n| `useAxenForm`    | `(opts) => { store, formApi }`                                            | Create a headless form instance |\n| `useField`       | `(name) => { value, error, touched, onChange, onBlur }`                   | Subscribe to a single field     |\n| `useFieldArray`  | `(name) => { fields, push, remove, swap, insert, replace, move, length }` | Array field operations          |\n| `useFormContext` | `() => { store, fields, components, disabled }`                           | Access form context             |\n\n### Utilities\n\n| Utility                             | Description                            |\n| ----------------------------------- | -------------------------------------- |\n| `mapPayload(values, fields, disc)`  | Apply payload whitelist to form values |\n| `pickFields(values, names)`         | Pick specific fields from values       |\n| `getStrippedFields(values, names)`  | Get fields that would be stripped      |\n| `get(obj, path, default?)`          | Deep get via dot path                  |\n| `set(obj, path, value)`             | Immutable deep set                     |\n| `formatNumber(value, opts)`         | Format number with locale              |\n| `formatDateLocale(isoDate, locale)` | Format ISO date for display            |\n| `formatTimeLocale(isoTime, ...)`    | Format ISO time for display            |\n| `isFieldGroup(item)`                | Type guard for FieldGroupConfig        |\n\n---\n\n## Architecture\n\n```\nsrc/\n├── core/                  # Framework-agnostic form engine\n│   ├── formStore.ts       # Reactive state (useSyncExternalStore)\n│   ├── validation.ts      # Adapter interface + simpleValidator\n│   ├── pathUtils.ts       # Nested path get/set/toArray\n│   ├── numberUtils.ts     # Locale-aware number formatting\n│   ├── dateUtils.ts       # ISO ↔ locale date conversion\n│   └── payloadUtils.ts    # Payload whitelist filter\n│\n├── react/                 # React 19+ bindings\n│   ├── AxenForm.tsx       # Main config-driven renderer\n│   ├── AxenField.tsx      # Standalone field wrapper\n│   ├── AxenArrayField.tsx # Array field renderer\n│   ├── useAxenForm.ts     # Headless form hook\n│   ├── useField.ts        # Single field subscription\n│   ├── useFieldArray.ts   # Array field operations\n│   └── FormContext.ts     # React context\n│\n├── fields/                # 19 built-in field components\n│   ├── icons.tsx          # Inline SVG icons\n│   ├── iconUtils.ts       # Icon resolution logic\n│   ├── defaultPlaceholders.ts  # Default placeholder map\n│   ├── defaultComponentMap.ts  # Type → Component registry\n│   ├── fieldUtils.ts      # Shared utilities (cx, aria)\n│   ├── fieldBase.module.css    # Shared field styles\n│   ├── TextField/\n│   ├── EmailField/\n│   ├── PasswordField/     # Show/hide toggle\n│   ├── PhoneField/\n│   ├── TextareaField/\n│   ├── NumberField/        # Cursor-preserving formatting\n│   ├── CurrencyField/     # Intl currency\n│   ├── SliderField/\n│   ├── DateField/          # Custom DatePicker\n│   ├── TimeField/          # Custom TimePicker\n│   ├── DateTimeField/\n│   ├── SelectField/\n│   ├── CheckboxField/\n│   ├── RadioField/\n│   ├── SwitchField/\n│   ├── AutocompleteField/  # Server search + debounce\n│   ├── AutocompleteMultiField/  # Multi-select chips\n│   ├── AutocompletePredictField/  # Ghost text\n│   └── ColorField/\n│\n├── layout/                # Grid, Box, Stack, Divider, Spacer\n├── tokens/                # CSS tokens, themes, reset\n├── adapters/              # yupAdapter, zodAdapter\n├── types.ts               # All TypeScript definitions\n└── index.ts               # Public API barrel\n```\n\n---\n\n## Theming with CSS Custom Properties\n\naxen-form uses CSS Custom Properties (design tokens) for fine-grained theming.\n\n**Key token categories:**\n\n| Category   | Example Tokens                                                        |\n| ---------- | --------------------------------------------------------------------- |\n| Colors     | `--axen-color-primary`, `--axen-color-error`, `--axen-color-input-bg` |\n| Typography | `--axen-font-family`, `--axen-font-size-sm`/`md`/`lg`                 |\n| Spacing    | `--axen-space-xs`/`sm`/`md`/`lg`/`xl`                                 |\n| Borders    | `--axen-color-border`, `--axen-border-radius`                         |\n| Focus      | `--axen-shadow-focus`, `--axen-color-border-focus`                    |\n| Fields     | `--axen-field-height`, `--axen-field-min-height` (44px touch target)  |\n\n**Built-in A11y support:**\n\n- `@media (prefers-color-scheme: dark)` — dark mode tokens\n- `@media (prefers-contrast: more)` — high contrast overrides\n- `@media (prefers-reduced-motion: reduce)` — reduced motion\n- `focus-visible` rings for keyboard navigation\n- `aria-invalid`, `aria-describedby` on all fields\n- Minimum 44px touch targets (WCAG 2.1 AA)\n\n---\n\n## Browser Support\n\n| Browser | Version         |\n| ------- | --------------- |\n| Chrome  | Last 2 versions |\n| Firefox | Last 2 versions |\n| Safari  | 15.4+           |\n| Edge    | Last 2 versions |\n\nRequires React 19+ and ES2022+ environment.\n\n---\n\n## License\n\nMIT © [Axen Studio](https://github.com/axenstudio)\n","readmeFilename":"README.md"}