{"_id":"form-graph","_rev":"9-fc87c17cec958e68bec3f62f5c2bfa68","name":"form-graph","dist-tags":{"latest":"0.4.2"},"versions":{"0.1.0":{"name":"form-graph","version":"0.1.0","keywords":["forms","form","state","zod","discriminated-union","svelte","react","validation","isomorphic"],"author":{"url":"https://github.com/bkdiehl","name":"Briant Diehl"},"license":"MIT","_id":"form-graph@0.1.0","maintainers":[{"name":"bkdiehl","email":"bkdiehl@gmail.com"}],"homepage":"https://github.com/bkdiehl/form-graph#readme","bugs":{"url":"https://github.com/bkdiehl/form-graph/issues"},"dist":{"shasum":"93a4abee43bf7418794982dc8ceaee4fcb881985","tarball":"https://registry.npmjs.org/form-graph/-/form-graph-0.1.0.tgz","fileCount":76,"integrity":"sha512-FXCTPn+0K56gwJG1/W5+uhJ62ua44LFJ/dfnGrL74xKjE8DjFQrgkUcHQKT/Ld1wkaJNAuAumO92fTRtWmEGYw==","signatures":[{"sig":"MEQCICu7ziWYHiVtH8oAAYj4wcKCUYEF7DBo2zAidKkUtIaWAiAlEsM6G5Oe/XRtpkPDSjWw+5Ru0YPm10YlgigU+j743A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":168172},"type":"module","_from":"file:form-graph-0.1.0.tgz","types":"./dist/index.d.ts","svelte":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./react":{"types":"./dist/react/index.d.ts","import":"./dist/react/index.js"},"./codecs":{"types":"./dist/codecs/index.d.ts","import":"./dist/codecs/index.js"},"./svelte":{"types":"./dist/svelte/index.d.ts","import":"./dist/svelte/index.js","svelte":"./dist/svelte/index.js"}},"scripts":{"dev":"vite dev","test":"vitest run","build":"vite build && npm run prepack","check":"svelte-kit sync && svelte-check --tsconfig ./tsconfig.json","preview":"vite preview","typecheck":"tsc --noEmit -p tsconfig.lib.json","test:watch":"vitest","check:watch":"svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch","typecheck:v1":"tsc --noEmit -p tsconfig.v1.json"},"_npmUser":{"name":"bkdiehl","email":"bkdiehl@gmail.com"},"_resolved":"C:\\Users\\Briant\\AppData\\Local\\Temp\\9dedc63515a5750e61001d26cb6b5a13\\form-graph-0.1.0.tgz","_integrity":"sha512-FXCTPn+0K56gwJG1/W5+uhJ62ua44LFJ/dfnGrL74xKjE8DjFQrgkUcHQKT/Ld1wkaJNAuAumO92fTRtWmEGYw==","repository":{"url":"git+https://github.com/bkdiehl/form-graph.git","type":"git"},"_npmVersion":"10.9.3","description":"Branch-routed forms with one definition, both sides: a contract engine for forms whose shape depends on their own values.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.18.0","_hasShrinkwrap":false,"devDependencies":{"zod":"^4.4.3","vite":"^8.0.16","react":"^19.2.8","svelte":"^5.56.1","vitest":"^4.1.11","publint":"^0.3.21","happy-dom":"^20.11.7","lodash-es":"^4.18.1","react-dom":"^19.2.8","vite-node":"^6.0.0","typescript":"^6.0.3","@types/node":"^26.4.0","tailwindcss":"^4.3.3","@types/react":"^18.3.31","svelte-check":"^4.6.0","@sveltejs/kit":"^2.63.0","@types/lodash-es":"^4.17.12","@types/react-dom":"^18.3.7","@sveltejs/package":"^2.5.8","@tailwindcss/vite":"^4.3.3","@vitejs/plugin-react":"^6.1.0","@sveltejs/adapter-auto":"^7.0.1","@testing-library/react":"^16.3.2","@tailwindcss/typography":"^0.5.20","@sveltejs/vite-plugin-svelte":"^7.1.2"},"peerDependencies":{"zod":"^3.25.0 || ^4.0.0","react":"^18.0.0 || ^19.0.0","svelte":"^5.0.0"},"peerDependenciesMeta":{"zod":{"optional":true},"react":{"optional":true},"svelte":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/form-graph_0.1.0_1787856882288_0.9247023349482009","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"form-graph","version":"0.2.0","keywords":["forms","form","state","zod","discriminated-union","svelte","react","validation","isomorphic"],"author":{"url":"https://github.com/bkdiehl","name":"Briant Diehl"},"license":"MIT","_id":"form-graph@0.2.0","maintainers":[{"name":"bkdiehl","email":"bkdiehl@gmail.com"}],"homepage":"https://github.com/bkdiehl/form-graph#readme","bugs":{"url":"https://github.com/bkdiehl/form-graph/issues"},"dist":{"shasum":"00a41bd6851c979ccdb85b4657512e6b7e7283b3","tarball":"https://registry.npmjs.org/form-graph/-/form-graph-0.2.0.tgz","fileCount":60,"integrity":"sha512-5SPFzM90QowQh4W8EuhorpK9hhb4mG40MtfnLzMcY0XPQaNbs+8whI3OOJxrGQKpKtIIGTcYWTsmp9bpjSNpJA==","signatures":[{"sig":"MEQCIELeYnZKIXukwkz34In6ojPmImBEeIaYrj0jckhbIQK8AiBxOSbqqv6X5HiezOUVgA79onLuJGSdFmYUY35VDWw7nw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":148406},"type":"module","_from":"file:form-graph-0.2.0.tgz","types":"./dist/index.d.ts","svelte":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./defs":{"types":"./dist/defs/index.d.ts","import":"./dist/defs/index.js"},"./react":{"types":"./dist/react/index.d.ts","import":"./dist/react/index.js"},"./svelte":{"types":"./dist/svelte/index.d.ts","import":"./dist/svelte/index.js","svelte":"./dist/svelte/index.js"}},"scripts":{"dev":"vite dev","test":"vitest run","build":"vite build && npm run prepack","check":"svelte-kit sync && svelte-check --tsconfig ./tsconfig.json","preview":"vite preview","docs:api":"typedoc","typecheck":"tsc --noEmit -p tsconfig.lib.json","test:watch":"vitest","check:watch":"svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch","typecheck:v1":"tsc --noEmit -p tsconfig.v1.json","check:types-budget":"node scripts/type-budget.mjs"},"_npmUser":{"name":"bkdiehl","email":"bkdiehl@gmail.com"},"_resolved":"C:\\Users\\Briant\\AppData\\Local\\Temp\\cfa94fd4778f440cb6c27beea2b6a867\\form-graph-0.2.0.tgz","_integrity":"sha512-5SPFzM90QowQh4W8EuhorpK9hhb4mG40MtfnLzMcY0XPQaNbs+8whI3OOJxrGQKpKtIIGTcYWTsmp9bpjSNpJA==","repository":{"url":"git+https://github.com/bkdiehl/form-graph.git","type":"git"},"_npmVersion":"10.9.3","description":"Branch-routed forms with one definition, both sides: a contract engine for forms whose shape depends on their own values.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.18.0","_hasShrinkwrap":false,"devDependencies":{"zod":"^4.4.3","vite":"^8.0.16","react":"^19.2.8","shiki":"^4.4.3","svelte":"^5.56.1","vitest":"^4.1.11","publint":"^0.3.21","typedoc":"^0.28.20","happy-dom":"^20.11.7","lodash-es":"^4.18.1","react-dom":"^19.2.8","vite-node":"^6.0.0","typescript":"^6.0.3","@types/node":"^26.4.0","tailwindcss":"^4.3.3","@types/react":"^18.3.31","svelte-check":"^4.6.0","@sveltejs/kit":"^2.63.0","@types/lodash-es":"^4.17.12","@types/react-dom":"^18.3.7","@sveltejs/package":"^2.5.8","@tailwindcss/vite":"^4.3.3","@vitejs/plugin-react":"^6.1.0","@sveltejs/adapter-auto":"^7.0.1","@testing-library/react":"^16.3.2","@tailwindcss/typography":"^0.5.20","@sveltejs/adapter-static":"^3.0.10","@sveltejs/vite-plugin-svelte":"^7.1.2"},"peerDependencies":{"zod":"^3.25.0 || ^4.0.0","react":"^18.0.0 || ^19.0.0","svelte":"^5.0.0"},"peerDependenciesMeta":{"zod":{"optional":true},"react":{"optional":true},"svelte":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/form-graph_0.2.0_1788218176718_0.30699057242901717","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"form-graph","version":"0.3.0","keywords":["forms","form","state","zod","discriminated-union","svelte","react","validation","isomorphic"],"author":{"url":"https://github.com/bkdiehl","name":"Briant Diehl"},"license":"MIT","_id":"form-graph@0.3.0","maintainers":[{"name":"bkdiehl","email":"bkdiehl@gmail.com"}],"homepage":"https://github.com/bkdiehl/form-graph#readme","bugs":{"url":"https://github.com/bkdiehl/form-graph/issues"},"dist":{"shasum":"8f64c064d92266fb209687be1fe966b004be2b1a","tarball":"https://registry.npmjs.org/form-graph/-/form-graph-0.3.0.tgz","fileCount":60,"integrity":"sha512-6IxiWNkHzFTRECbHJvWsHtv9zoDFmfEnIRrI8JET8uGANlcHY8RIcLdsGC9osKhOJJuNh/lcFNmjl4mWrGw1yw==","signatures":[{"sig":"MEUCIA4otVgaxKukEnGe8KXUaP4bNMeNwC7PW97DIsAvNp90AiEA2d+lCsTRWvYnn4J5qcuHTAqRT5mRt9h2VPL7t+vYKoc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":172235},"type":"module","_from":"file:form-graph-0.3.0.tgz","types":"./dist/index.d.ts","svelte":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./defs":{"types":"./dist/defs/index.d.ts","import":"./dist/defs/index.js","default":"./dist/defs/index.js"},"./react":{"types":"./dist/react/index.d.ts","import":"./dist/react/index.js","default":"./dist/react/index.js"},"./svelte":{"types":"./dist/svelte/index.d.ts","import":"./dist/svelte/index.js","svelte":"./dist/svelte/index.js","default":"./dist/svelte/index.js"}},"scripts":{"dev":"vite dev","test":"vitest run","build":"vite build && npm run prepack","check":"svelte-kit sync && svelte-check --tsconfig ./tsconfig.json","preview":"vite preview","release":"npm version patch && pnpm publish && git push --follow-tags","docs:api":"typedoc","typecheck":"tsc --noEmit -p tsconfig.lib.json","test:watch":"vitest","check:watch":"svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch","typecheck:v1":"tsc --noEmit -p tsconfig.v1.json","release:major":"npm version major && pnpm publish && git push --follow-tags","release:minor":"npm version minor && pnpm publish && git push --follow-tags","check:types-budget":"node scripts/type-budget.mjs"},"_npmUser":{"name":"bkdiehl","email":"bkdiehl@gmail.com"},"_resolved":"C:\\Users\\Briant\\AppData\\Local\\Temp\\44b299a32d3596bf619c1727cffcbb63\\form-graph-0.3.0.tgz","_integrity":"sha512-6IxiWNkHzFTRECbHJvWsHtv9zoDFmfEnIRrI8JET8uGANlcHY8RIcLdsGC9osKhOJJuNh/lcFNmjl4mWrGw1yw==","repository":{"url":"git+https://github.com/bkdiehl/form-graph.git","type":"git"},"_npmVersion":"10.9.3","description":"Branch-routed forms with one definition, both sides: a contract engine for forms whose shape depends on their own values.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.18.0","_hasShrinkwrap":false,"devDependencies":{"zod":"^4.4.3","vite":"^8.0.16","react":"^19.2.8","shiki":"^4.4.3","svelte":"^5.56.1","vitest":"^4.1.11","publint":"^0.3.21","typedoc":"^0.28.20","happy-dom":"^20.11.7","lodash-es":"^4.18.1","react-dom":"^19.2.8","vite-node":"^6.0.0","typescript":"^6.0.3","@types/node":"^26.4.0","tailwindcss":"^4.3.3","@types/react":"^18.3.31","svelte-check":"^4.6.0","@sveltejs/kit":"^2.63.0","@types/lodash-es":"^4.17.12","@types/react-dom":"^18.3.7","@sveltejs/package":"^2.5.8","@tailwindcss/vite":"^4.3.3","@vitejs/plugin-react":"^6.1.0","@sveltejs/adapter-auto":"^7.0.1","@testing-library/react":"^16.3.2","@tailwindcss/typography":"^0.5.20","@sveltejs/adapter-static":"^3.0.10","@sveltejs/vite-plugin-svelte":"^7.1.2"},"peerDependencies":{"zod":"^3.25.0 || ^4.0.0","react":"^18.0.0 || ^19.0.0","svelte":"^5.0.0"},"peerDependenciesMeta":{"zod":{"optional":true},"react":{"optional":true},"svelte":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/form-graph_0.3.0_1788401434016_0.04287103473408593","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"form-graph","version":"0.3.1","keywords":["forms","form","state","zod","discriminated-union","svelte","react","validation","isomorphic"],"author":{"url":"https://github.com/bkdiehl","name":"Briant Diehl"},"license":"MIT","_id":"form-graph@0.3.1","maintainers":[{"name":"bkdiehl","email":"bkdiehl@gmail.com"}],"homepage":"https://github.com/bkdiehl/form-graph#readme","bugs":{"url":"https://github.com/bkdiehl/form-graph/issues"},"dist":{"shasum":"1b3d316ef454c84bf2c137a29dadabfd622eb99b","tarball":"https://registry.npmjs.org/form-graph/-/form-graph-0.3.1.tgz","fileCount":60,"integrity":"sha512-T1kIUmY3vhgjvgjkaReVFHxlabCSLjk8iW1WfTqN5ZWWKBEUmEmfh/JnfhZYo5aXksPyVx39pBjd9yJxSqhwoA==","signatures":[{"sig":"MEQCICDYwn82qVQVpsO6lT/XziCpRm2GUMN7fMiU6xhXR5awAiAu6bgQAhNTy8C3mAwGvUZXVOWztVena8mEr9uPepjgKA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":175659},"type":"module","_from":"file:form-graph-0.3.1.tgz","types":"./dist/index.d.ts","svelte":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./defs":{"types":"./dist/defs/index.d.ts","import":"./dist/defs/index.js","default":"./dist/defs/index.js"},"./react":{"types":"./dist/react/index.d.ts","import":"./dist/react/index.js","default":"./dist/react/index.js"},"./svelte":{"types":"./dist/svelte/index.d.ts","import":"./dist/svelte/index.js","svelte":"./dist/svelte/index.js","default":"./dist/svelte/index.js"}},"scripts":{"dev":"vite dev","test":"vitest run","build":"vite build && npm run prepack","check":"svelte-kit sync && svelte-check --tsconfig ./tsconfig.json","preview":"vite preview","release":"npm version patch && pnpm publish && git push --follow-tags","docs:api":"typedoc","typecheck":"tsc --noEmit -p tsconfig.lib.json","test:watch":"vitest","check:watch":"svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch","typecheck:v1":"tsc --noEmit -p tsconfig.v1.json","release:major":"npm version major && pnpm publish && git push --follow-tags","release:minor":"npm version minor && pnpm publish && git push --follow-tags","check:types-budget":"node scripts/type-budget.mjs"},"_npmUser":{"name":"bkdiehl","email":"bkdiehl@gmail.com"},"_resolved":"C:\\Users\\Briant\\AppData\\Local\\Temp\\1b52799983d4e2cb7d4a359f44d886f8\\form-graph-0.3.1.tgz","_integrity":"sha512-T1kIUmY3vhgjvgjkaReVFHxlabCSLjk8iW1WfTqN5ZWWKBEUmEmfh/JnfhZYo5aXksPyVx39pBjd9yJxSqhwoA==","repository":{"url":"git+https://github.com/bkdiehl/form-graph.git","type":"git"},"_npmVersion":"10.9.3","description":"Branch-routed forms with one definition, both sides: a contract engine for forms whose shape depends on their own values.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.18.0","_hasShrinkwrap":false,"devDependencies":{"zod":"^4.4.3","vite":"^8.0.16","react":"^19.2.8","shiki":"^4.4.3","svelte":"^5.56.1","vitest":"^4.1.11","publint":"^0.3.21","typedoc":"^0.28.20","happy-dom":"^20.11.7","lodash-es":"^4.18.1","react-dom":"^19.2.8","vite-node":"^6.0.0","typescript":"^6.0.3","@types/node":"^26.4.0","tailwindcss":"^4.3.3","@types/react":"^18.3.31","svelte-check":"^4.6.0","@sveltejs/kit":"^2.63.0","@types/lodash-es":"^4.17.12","@types/react-dom":"^18.3.7","@sveltejs/package":"^2.5.8","@tailwindcss/vite":"^4.3.3","@vitejs/plugin-react":"^6.1.0","@sveltejs/adapter-auto":"^7.0.1","@testing-library/react":"^16.3.2","@tailwindcss/typography":"^0.5.20","@sveltejs/adapter-static":"^3.0.10","@sveltejs/vite-plugin-svelte":"^7.1.2"},"peerDependencies":{"zod":"^3.25.0 || ^4.0.0","react":"^18.0.0 || ^19.0.0","svelte":"^5.0.0"},"peerDependenciesMeta":{"zod":{"optional":true},"react":{"optional":true},"svelte":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/form-graph_0.3.1_1788417806418_0.37162099706878293","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"name":"form-graph","version":"0.3.2","keywords":["forms","form","state","zod","discriminated-union","svelte","react","validation","isomorphic"],"author":{"url":"https://github.com/bkdiehl","name":"Briant Diehl"},"license":"MIT","_id":"form-graph@0.3.2","maintainers":[{"name":"bkdiehl","email":"bkdiehl@gmail.com"}],"homepage":"https://github.com/bkdiehl/form-graph#readme","bugs":{"url":"https://github.com/bkdiehl/form-graph/issues"},"dist":{"shasum":"8884bab46610c75060efbe6b87b413bf49450959","tarball":"https://registry.npmjs.org/form-graph/-/form-graph-0.3.2.tgz","fileCount":60,"integrity":"sha512-TQV9Ogdx7SvqIP4tmoS12IDZqC7eJfcb/uQ3iPE1QOp9XDopK9Wn/xf2T+wYOPrvWYacujOo0hwFyvkJCbSwvQ==","signatures":[{"sig":"MEYCIQCPBiW2hRZlSdvNJOLTD/G62yetv4gEkTL/FyEUe2S9UQIhAMXm8fQp1XE8vyHyNJ5uE6xASACouLCSixDAMLE7gMeH","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":179823},"type":"module","_from":"file:form-graph-0.3.2.tgz","types":"./dist/index.d.ts","svelte":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./defs":{"types":"./dist/defs/index.d.ts","import":"./dist/defs/index.js","default":"./dist/defs/index.js"},"./react":{"types":"./dist/react/index.d.ts","import":"./dist/react/index.js","default":"./dist/react/index.js"},"./svelte":{"types":"./dist/svelte/index.d.ts","import":"./dist/svelte/index.js","svelte":"./dist/svelte/index.js","default":"./dist/svelte/index.js"}},"scripts":{"dev":"vite dev","test":"vitest run","build":"vite build && npm run prepack","check":"svelte-kit sync && svelte-check --tsconfig ./tsconfig.json","preview":"vite preview","release":"npm version patch && pnpm publish && git push --follow-tags","docs:api":"typedoc","typecheck":"tsc --noEmit -p tsconfig.lib.json","test:watch":"vitest","check:watch":"svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch","typecheck:v1":"tsc --noEmit -p tsconfig.v1.json","release:major":"npm version major && pnpm publish && git push --follow-tags","release:minor":"npm version minor && pnpm publish && git push --follow-tags","release:publish":"pnpm publish && git push --follow-tags","check:types-budget":"node scripts/type-budget.mjs"},"_npmUser":{"name":"bkdiehl","email":"bkdiehl@gmail.com"},"_resolved":"C:\\Users\\Briant\\AppData\\Local\\Temp\\b6a6098d86f872b62f0ed767ca4ea05c\\form-graph-0.3.2.tgz","_integrity":"sha512-TQV9Ogdx7SvqIP4tmoS12IDZqC7eJfcb/uQ3iPE1QOp9XDopK9Wn/xf2T+wYOPrvWYacujOo0hwFyvkJCbSwvQ==","repository":{"url":"git+https://github.com/bkdiehl/form-graph.git","type":"git"},"_npmVersion":"10.9.3","description":"Branch-routed forms with one definition, both sides: a contract engine for forms whose shape depends on their own values.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.18.0","_hasShrinkwrap":false,"devDependencies":{"zod":"^4.4.3","vite":"^8.0.16","react":"^19.2.8","shiki":"^4.4.3","svelte":"^5.56.1","vitest":"^4.1.11","publint":"^0.3.21","typedoc":"^0.28.20","happy-dom":"^20.11.7","lodash-es":"^4.18.1","react-dom":"^19.2.8","vite-node":"^6.0.0","typescript":"^6.0.3","@types/node":"^26.4.0","tailwindcss":"^4.3.3","@types/react":"^18.3.31","svelte-check":"^4.6.0","@sveltejs/kit":"^2.63.0","@types/lodash-es":"^4.17.12","@types/react-dom":"^18.3.7","@sveltejs/package":"^2.5.8","@tailwindcss/vite":"^4.3.3","@vitejs/plugin-react":"^6.1.0","@sveltejs/adapter-auto":"^7.0.1","@testing-library/react":"^16.3.2","@tailwindcss/typography":"^0.5.20","@sveltejs/adapter-static":"^3.0.10","@sveltejs/vite-plugin-svelte":"^7.1.2"},"peerDependencies":{"zod":"^3.25.0 || ^4.0.0","react":"^18.0.0 || ^19.0.0","svelte":"^5.0.0"},"peerDependenciesMeta":{"zod":{"optional":true},"react":{"optional":true},"svelte":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/form-graph_0.3.2_1788458947165_0.14595750145449404","host":"s3://npm-registry-packages-npm-production"}},"0.3.3":{"name":"form-graph","version":"0.3.3","keywords":["forms","form","state","zod","discriminated-union","svelte","react","validation","isomorphic"],"author":{"url":"https://github.com/bkdiehl","name":"Briant Diehl"},"license":"MIT","_id":"form-graph@0.3.3","maintainers":[{"name":"bkdiehl","email":"bkdiehl@gmail.com"}],"homepage":"https://github.com/bkdiehl/form-graph#readme","bugs":{"url":"https://github.com/bkdiehl/form-graph/issues"},"dist":{"shasum":"2794ae9f0e44971fe62eb67d8ec58d879a1746b2","tarball":"https://registry.npmjs.org/form-graph/-/form-graph-0.3.3.tgz","fileCount":60,"integrity":"sha512-V6QS8TwMxYhCCmiU8pkogmmUMJheT+weSCwwv92D/3ft6jBxO1zEd3BDJ548MB6UWFyKpnhOTwss5YDtvOLNFA==","signatures":[{"sig":"MEYCIQCYchkcE/rrpVs3DN+2HaEQdkvyBn0Nhl56ju3Hfl39NwIhALttsAy882k01DjVeAItLNqmiwInYH2BzMT3B783OAgC","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":179440},"type":"module","_from":"file:form-graph-0.3.3.tgz","types":"./dist/index.d.ts","svelte":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./defs":{"types":"./dist/defs/index.d.ts","import":"./dist/defs/index.js","default":"./dist/defs/index.js"},"./react":{"types":"./dist/react/index.d.ts","import":"./dist/react/index.js","default":"./dist/react/index.js"},"./svelte":{"types":"./dist/svelte/index.d.ts","import":"./dist/svelte/index.js","svelte":"./dist/svelte/index.js","default":"./dist/svelte/index.js"}},"scripts":{"dev":"vite dev","test":"vitest run","build":"vite build && npm run prepack","check":"svelte-kit sync && svelte-check --tsconfig ./tsconfig.json","preview":"vite preview","release":"npm version patch && pnpm publish && git push --follow-tags","docs:api":"typedoc","typecheck":"tsc --noEmit -p tsconfig.lib.json","test:watch":"vitest","check:watch":"svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch","typecheck:v1":"tsc --noEmit -p tsconfig.v1.json","release:major":"npm version major && pnpm publish && git push --follow-tags","release:minor":"npm version minor && pnpm publish && git push --follow-tags","release:publish":"pnpm publish && git push --follow-tags","check:types-budget":"node scripts/type-budget.mjs"},"_npmUser":{"name":"bkdiehl","email":"bkdiehl@gmail.com"},"_resolved":"C:\\Users\\Briant\\AppData\\Local\\Temp\\b3421fdef8d03778f6bad5e1fc102b42\\form-graph-0.3.3.tgz","_integrity":"sha512-V6QS8TwMxYhCCmiU8pkogmmUMJheT+weSCwwv92D/3ft6jBxO1zEd3BDJ548MB6UWFyKpnhOTwss5YDtvOLNFA==","repository":{"url":"git+https://github.com/bkdiehl/form-graph.git","type":"git"},"_npmVersion":"10.9.3","description":"Branch-routed forms with one definition, both sides: a contract engine for forms whose shape depends on their own values.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.18.0","_hasShrinkwrap":false,"devDependencies":{"zod":"^4.4.3","vite":"^8.0.16","react":"^19.2.8","shiki":"^4.4.3","svelte":"^5.56.1","vitest":"^4.1.11","publint":"^0.3.21","typedoc":"^0.28.20","happy-dom":"^20.11.7","lodash-es":"^4.18.1","react-dom":"^19.2.8","vite-node":"^6.0.0","typescript":"^6.0.3","@types/node":"^26.4.0","tailwindcss":"^4.3.3","@types/react":"^18.3.31","svelte-check":"^4.6.0","@sveltejs/kit":"^2.63.0","@types/lodash-es":"^4.17.12","@types/react-dom":"^18.3.7","@sveltejs/package":"^2.5.8","@tailwindcss/vite":"^4.3.3","@vitejs/plugin-react":"^6.1.0","@sveltejs/adapter-auto":"^7.0.1","@testing-library/react":"^16.3.2","@tailwindcss/typography":"^0.5.20","@sveltejs/adapter-static":"^3.0.10","@sveltejs/vite-plugin-svelte":"^7.1.2"},"peerDependencies":{"zod":"^3.25.0 || ^4.0.0","react":"^18.0.0 || ^19.0.0","svelte":"^5.0.0"},"peerDependenciesMeta":{"zod":{"optional":true},"react":{"optional":true},"svelte":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/form-graph_0.3.3_1788467687945_0.059550061838849366","host":"s3://npm-registry-packages-npm-production"}},"0.3.4":{"name":"form-graph","version":"0.3.4","keywords":["forms","form","state","zod","discriminated-union","svelte","react","validation","isomorphic"],"author":{"url":"https://github.com/bkdiehl","name":"Briant Diehl"},"license":"MIT","_id":"form-graph@0.3.4","maintainers":[{"name":"bkdiehl","email":"bkdiehl@gmail.com"}],"homepage":"https://github.com/bkdiehl/form-graph#readme","bugs":{"url":"https://github.com/bkdiehl/form-graph/issues"},"dist":{"shasum":"ce9fa859723b1610f5df6717380a955476415f65","tarball":"https://registry.npmjs.org/form-graph/-/form-graph-0.3.4.tgz","fileCount":60,"integrity":"sha512-kfFLzsNhEEF3XPIpMYevZB0tFArkPcASuPkSll6Ddwyzcnkw2eE6vVXgR1JejW+6jhPNx/HFyZ8IFKdqDdla8g==","signatures":[{"sig":"MEUCIQCtqJGq8VmMhBJQ7Mp+30bA61fEOymfKZN8BxMro0WnHAIgI8cHTzF5rq3F5L/2WMtlQ1iMLjSiCDnVHCbs4q/jbCA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":179665},"type":"module","_from":"file:form-graph-0.3.4.tgz","types":"./dist/index.d.ts","svelte":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./defs":{"types":"./dist/defs/index.d.ts","import":"./dist/defs/index.js","default":"./dist/defs/index.js"},"./react":{"types":"./dist/react/index.d.ts","import":"./dist/react/index.js","default":"./dist/react/index.js"},"./svelte":{"types":"./dist/svelte/index.d.ts","import":"./dist/svelte/index.js","svelte":"./dist/svelte/index.js","default":"./dist/svelte/index.js"}},"scripts":{"dev":"vite dev","test":"vitest run","build":"vite build && npm run prepack","check":"svelte-kit sync && svelte-check --tsconfig ./tsconfig.json","preview":"vite preview","release":"npm version patch && pnpm publish && git push --follow-tags","docs:api":"typedoc","typecheck":"tsc --noEmit -p tsconfig.lib.json","test:watch":"vitest","check:watch":"svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch","typecheck:v1":"tsc --noEmit -p tsconfig.v1.json","release:major":"npm version major && pnpm publish && git push --follow-tags","release:minor":"npm version minor && pnpm publish && git push --follow-tags","release:publish":"pnpm publish && git push --follow-tags","check:types-budget":"node scripts/type-budget.mjs"},"_npmUser":{"name":"bkdiehl","email":"bkdiehl@gmail.com"},"_resolved":"C:\\Users\\Briant\\AppData\\Local\\Temp\\c39183deb66490c80ea3ede430c96299\\form-graph-0.3.4.tgz","_integrity":"sha512-kfFLzsNhEEF3XPIpMYevZB0tFArkPcASuPkSll6Ddwyzcnkw2eE6vVXgR1JejW+6jhPNx/HFyZ8IFKdqDdla8g==","repository":{"url":"git+https://github.com/bkdiehl/form-graph.git","type":"git"},"_npmVersion":"10.9.3","description":"Branch-routed forms with one definition, both sides: a contract engine for forms whose shape depends on their own values.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.18.0","_hasShrinkwrap":false,"devDependencies":{"zod":"^4.4.3","vite":"^8.0.16","react":"^19.2.8","shiki":"^4.4.3","svelte":"^5.56.1","vitest":"^4.1.11","publint":"^0.3.21","typedoc":"^0.28.20","happy-dom":"^20.11.7","lodash-es":"^4.18.1","react-dom":"^19.2.8","vite-node":"^6.0.0","typescript":"^6.0.3","@types/node":"^26.4.0","tailwindcss":"^4.3.3","@types/react":"^18.3.31","svelte-check":"^4.6.0","@sveltejs/kit":"^2.63.0","@types/lodash-es":"^4.17.12","@types/react-dom":"^18.3.7","@sveltejs/package":"^2.5.8","@tailwindcss/vite":"^4.3.3","@vitejs/plugin-react":"^6.1.0","@sveltejs/adapter-auto":"^7.0.1","@testing-library/react":"^16.3.2","@tailwindcss/typography":"^0.5.20","@sveltejs/adapter-static":"^3.0.10","@sveltejs/vite-plugin-svelte":"^7.1.2"},"peerDependencies":{"zod":"^3.25.0 || ^4.0.0","react":"^18.0.0 || ^19.0.0","svelte":"^5.0.0"},"peerDependenciesMeta":{"zod":{"optional":true},"react":{"optional":true},"svelte":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/form-graph_0.3.4_1788474925281_0.7790656348277509","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"form-graph","version":"0.4.0","keywords":["forms","form","state","zod","discriminated-union","svelte","react","validation","isomorphic"],"author":{"url":"https://github.com/bkdiehl","name":"Briant Diehl"},"license":"MIT","_id":"form-graph@0.4.0","maintainers":[{"name":"bkdiehl","email":"bkdiehl@gmail.com"}],"homepage":"https://github.com/bkdiehl/form-graph#readme","bugs":{"url":"https://github.com/bkdiehl/form-graph/issues"},"dist":{"shasum":"a3af5c463cfd2ee2517484d29de8863b6dc04ca7","tarball":"https://registry.npmjs.org/form-graph/-/form-graph-0.4.0.tgz","fileCount":68,"integrity":"sha512-mwW4hgK3XiI7F1gWf6VzkEt0sfULggBcenocX38aUz3QymirNB7mD88Ei/haojQTT3hSqLnx4mXg+WRCpspmhA==","signatures":[{"sig":"MEYCIQDAwusokfDFH//akjo5dKk23s0PRNKnTlzmsVVzAWe9lAIhAOcM6CQCfwIuhD1f/xOaJ8iGv+lJHiJD3D23OzdJgrNp","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":219436},"type":"module","_from":"file:form-graph-0.4.0.tgz","types":"./dist/index.d.ts","svelte":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./defs":{"types":"./dist/defs/index.d.ts","import":"./dist/defs/index.js","default":"./dist/defs/index.js"},"./react":{"types":"./dist/react/index.d.ts","import":"./dist/react/index.js","default":"./dist/react/index.js"},"./svelte":{"types":"./dist/svelte/index.d.ts","import":"./dist/svelte/index.js","svelte":"./dist/svelte/index.js","default":"./dist/svelte/index.js"}},"scripts":{"dev":"vite dev","test":"vitest run","build":"vite build && npm run prepack","check":"svelte-kit sync && svelte-check --tsconfig ./tsconfig.json","preview":"vite preview","release":"npm version patch && pnpm publish && git push --follow-tags","docs:api":"typedoc","typecheck":"tsc --noEmit -p tsconfig.lib.json","test:watch":"vitest","check:watch":"svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch","typecheck:v1":"tsc --noEmit -p tsconfig.v1.json","release:major":"npm version major && pnpm publish && git push --follow-tags","release:minor":"npm version minor && pnpm publish && git push --follow-tags","release:publish":"pnpm publish && git push --follow-tags","check:types-budget":"node scripts/type-budget.mjs"},"_npmUser":{"name":"bkdiehl","email":"bkdiehl@gmail.com"},"_resolved":"C:\\Users\\Briant\\AppData\\Local\\Temp\\29456d51816191d2fd89bb8e4f45b9d2\\form-graph-0.4.0.tgz","_integrity":"sha512-mwW4hgK3XiI7F1gWf6VzkEt0sfULggBcenocX38aUz3QymirNB7mD88Ei/haojQTT3hSqLnx4mXg+WRCpspmhA==","repository":{"url":"git+https://github.com/bkdiehl/form-graph.git","type":"git"},"_npmVersion":"10.9.3","description":"Branch-routed forms with one definition, both sides: a contract engine for forms whose shape depends on their own values.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.18.0","_hasShrinkwrap":false,"devDependencies":{"zod":"^4.4.3","vite":"^8.0.16","react":"^19.2.8","shiki":"^4.4.3","svelte":"^5.56.1","vitest":"^4.1.11","publint":"^0.3.21","typedoc":"^0.28.20","happy-dom":"^20.11.7","lodash-es":"^4.18.1","react-dom":"^19.2.8","vite-node":"^6.0.0","typescript":"^6.0.3","@types/node":"^26.4.0","tailwindcss":"^4.3.3","@types/react":"^18.3.31","svelte-check":"^4.6.0","@sveltejs/kit":"^2.63.0","@types/lodash-es":"^4.17.12","@types/react-dom":"^18.3.7","@sveltejs/package":"^2.5.8","@tailwindcss/vite":"^4.3.3","@vitejs/plugin-react":"^6.1.0","@sveltejs/adapter-auto":"^7.0.1","@testing-library/react":"^16.3.2","@tailwindcss/typography":"^0.5.20","@sveltejs/adapter-static":"^3.0.10","@sveltejs/vite-plugin-svelte":"^7.1.2"},"peerDependencies":{"zod":"^3.25.0 || ^4.0.0","react":"^18.0.0 || ^19.0.0","svelte":"^5.0.0"},"peerDependenciesMeta":{"zod":{"optional":true},"react":{"optional":true},"svelte":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/form-graph_0.4.0_1788814472250_0.4523339951370131","host":"s3://npm-registry-packages-npm-production"}},"0.4.2":{"name":"form-graph","version":"0.4.2","sideEffects":["**/*.css"],"svelte":"./dist/index.js","types":"./dist/index.d.ts","type":"module","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./svelte":{"types":"./dist/svelte/index.d.ts","svelte":"./dist/svelte/index.js","import":"./dist/svelte/index.js","default":"./dist/svelte/index.js"},"./react":{"types":"./dist/react/index.d.ts","import":"./dist/react/index.js","default":"./dist/react/index.js"},"./defs":{"types":"./dist/defs/index.d.ts","import":"./dist/defs/index.js","default":"./dist/defs/index.js"}},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","svelte":"^5.0.0","zod":"^3.25.0 || ^4.0.0"},"devDependencies":{"@sveltejs/adapter-auto":"^7.0.1","@sveltejs/adapter-static":"^3.0.10","@sveltejs/kit":"^2.63.0","@sveltejs/package":"^2.5.8","@sveltejs/vite-plugin-svelte":"^7.1.2","@tailwindcss/typography":"^0.5.20","@tailwindcss/vite":"^4.3.3","@testing-library/react":"^16.3.2","@types/lodash-es":"^4.17.12","@types/node":"^26.4.0","@types/react":"^18.3.31","@types/react-dom":"^18.3.7","@vitejs/plugin-react":"^6.1.0","happy-dom":"^20.11.7","lodash-es":"^4.18.1","publint":"^0.3.21","react":"^19.2.8","react-dom":"^19.2.8","shiki":"^4.4.3","svelte":"^5.56.1","svelte-check":"^4.6.0","tailwindcss":"^4.3.3","typedoc":"^0.28.20","typescript":"^6.0.3","vite":"^8.0.16","vite-node":"^6.0.0","vitest":"^4.1.11","zod":"^4.4.3"},"keywords":["forms","form","state","zod","discriminated-union","svelte","react","validation","isomorphic"],"peerDependenciesMeta":{"svelte":{"optional":true},"react":{"optional":true},"zod":{"optional":true}},"description":"Branch-routed forms with one definition, both sides: a contract engine for forms whose shape depends on their own values.","license":"MIT","author":{"name":"Briant Diehl","url":"https://github.com/bkdiehl"},"repository":{"type":"git","url":"git+https://github.com/bkdiehl/form-graph.git"},"homepage":"https://github.com/bkdiehl/form-graph#readme","bugs":{"url":"https://github.com/bkdiehl/form-graph/issues"},"engines":{"node":">=20"},"scripts":{"dev":"vite dev","build":"vite build && npm run prepack","preview":"vite preview","check":"svelte-kit sync && svelte-check --tsconfig ./tsconfig.json","check:watch":"svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch","test":"vitest run","test:watch":"vitest","typecheck":"tsc --noEmit -p tsconfig.lib.json","typecheck:v1":"tsc --noEmit -p tsconfig.v1.json","release":"npm version patch && pnpm publish && git push --follow-tags","release:minor":"npm version minor && pnpm publish && git push --follow-tags","release:major":"npm version major && pnpm publish && git push --follow-tags","release:publish":"pnpm publish && git push --follow-tags","docs:api":"typedoc","check:types-budget":"node scripts/type-budget.mjs"},"_id":"form-graph@0.4.2","_integrity":"sha512-VrcQ0AsyYGw31lMSG7QRS42Q82EWrk/dtOzkiT/JMt1jfS/A2yf2ueRgsZYzac3NruPnZNJj/PIiqzjlnnKzKQ==","_resolved":"C:\\Users\\Briant\\AppData\\Local\\Temp\\2f2e118ffc58042b4911aacda19261bb\\form-graph-0.4.2.tgz","_from":"file:form-graph-0.4.2.tgz","_nodeVersion":"22.18.0","_npmVersion":"10.9.3","dist":{"integrity":"sha512-VrcQ0AsyYGw31lMSG7QRS42Q82EWrk/dtOzkiT/JMt1jfS/A2yf2ueRgsZYzac3NruPnZNJj/PIiqzjlnnKzKQ==","shasum":"f759923d340eea383acaa189607c5cce5969ee6b","tarball":"https://registry.npmjs.org/form-graph/-/form-graph-0.4.2.tgz","fileCount":70,"unpackedSize":228410,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCDQ2Ed8kZSOwqgkzNJKF0X4OvGH5M9/mszMY1BMyc/nAIgY7PeIZLfk8qVClzD84LDijuXEUcSMPKKJDI8EjV6RLo="}]},"_npmUser":{"name":"bkdiehl","email":"bkdiehl@gmail.com"},"directories":{},"maintainers":[{"name":"bkdiehl","email":"bkdiehl@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/form-graph_0.4.2_1788883760169_0.6839924242051616"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-27T18:54:42.236Z","modified":"2026-09-08T16:09:20.442Z","0.1.0":"2026-08-27T18:54:42.516Z","0.2.0":"2026-08-31T23:16:16.842Z","0.3.0":"2026-09-03T02:10:34.166Z","0.3.1":"2026-09-03T06:43:26.555Z","0.3.2":"2026-09-03T18:09:07.363Z","0.3.3":"2026-09-03T20:34:48.085Z","0.3.4":"2026-09-03T22:35:25.411Z","0.4.0":"2026-09-07T20:54:32.414Z","0.4.2":"2026-09-08T16:09:20.303Z"},"bugs":{"url":"https://github.com/bkdiehl/form-graph/issues"},"author":{"name":"Briant Diehl","url":"https://github.com/bkdiehl"},"license":"MIT","homepage":"https://github.com/bkdiehl/form-graph#readme","keywords":["forms","form","state","zod","discriminated-union","svelte","react","validation","isomorphic"],"repository":{"type":"git","url":"git+https://github.com/bkdiehl/form-graph.git"},"description":"Branch-routed forms with one definition, both sides: a contract engine for forms whose shape depends on their own values.","maintainers":[{"name":"bkdiehl","email":"bkdiehl@gmail.com"}],"readme":"# form-graph\n\nBranch-routed forms with one definition, both sides.\n\nform-graph is a contract engine for forms whose **shape depends on their own values** — picking\none option changes which fields exist, with defaults, per-branch memory, and coupling rules. You\ndeclare the fields as a graph; TypeScript infers the discriminated union from it; the same\ndefinition IS the client store and parses raw input on the server. No second schema, no drift.\n\n**[Documentation](https://bkdiehl.github.io/form-graph/docs)** ·\n**[Live demos](https://bkdiehl.github.io/form-graph/demo)**\n\n```ts\nimport { z } from 'zod';\nimport { defineGraph } from 'form-graph';\nimport { slider, enumOf } from 'form-graph/defs';\n\n// A field is ONE definition — schemas, default, meta, conditions, together.\n// Conditional fields are functions of (c, ext); null = doesn't exist this pass.\nconst graph = defineGraph<{ maxSteps: number }>()\n  .field('mode', enumOf({\n    options: [\n      { value: 'create', label: 'Create' },\n      { value: 'upscale', label: 'Upscale' },\n    ],\n    default: 'create',\n  }))\n  .field('prompt', {\n    input: z.string().optional(),                    // lenient: storage, URLs, raw input\n    output: z.string().min(1, 'Prompt is required'), // strict: submit / server parse\n    default: '',\n  })\n  .field('steps', ({ mode, _ext }) =>\n    mode === 'create' ? slider({ min: 1, max: _ext.maxSteps, default: 25 }) : null)\n  .field('scale', ({ mode }) =>\n    mode === 'upscale' ? slider({ min: 2, max: 4, default: 2 }) : null);\n\n// The graph IS the form — the runtime lives on the definition.\nconst store = graph.createStore({ ext: { maxSteps: 50 } });\n\n// Server: the same pipeline over raw input.\nconst result = graph.parse(rawBody, { maxSteps: 50 });\n```\n\n## Why it exists\n\nGeneral-purpose form libraries assume a static shape. A value-dependent form breaks them: the\nbranching leaks into every layer as its own copy of the same conditional — a `watch()` here to\nhide a field, an `if` in the validator to skip it, an effect to reset it, a guard in the submit\nhandler. form-graph gives the shape exactly one home — the resolver — and everything else\nderives from it: what the UI renders, what the output contains, what validation runs over, and\nwhat the types say.\n\n## What it does that form libraries don't\n\n- **The union is inferred, not annotated.** Each resolver branch returns a different shape;\n  consumers narrow with plain `if`/`switch`. Type cost scales with branch *width*, not nesting\n  depth — measured linear at 120 branches.\n- **Identical output client and server.** `parse()` runs the same resolve → validate pipeline\n  the store runs.\n- **Scoped, persistent intent.** Choices are remembered per scope (`steps@flux` vs `steps@sd`)\n  and survive branch switches — return to a branch and your values are back. The persisted\n  format has supported readers, not ad-hoc key parsing.\n- **Lenient boundaries, strict output.** Dual schemas per field: stored/remixed/raw values parse\n  leniently and fall back to defaults; submit validates strictly, reporting every issue with its\n  path. Nothing schema-shaped runs on the keystroke path.\n- **Auditable corrections.** A definition's `correct: (v) => ({ value, reason })` policy\n  replaces a value the system invalidated — a visible statement in the definition, not a hidden\n  hook — and the reason rides to the server as a note on every parse (failures included) and\n  onto the field's snapshot for inline display.\n- **Dynamic contracts in zod's own vocabulary.** `refine: (s) => s.refine(...)` narrows a\n  field's output schema under the current conditions, deps-cached so typing never constructs a\n  schema, with a per-field error at validate/parse — live for written fields under\n  `revalidate: 'touched'`.\n- **Cross-field couplings without effect soup.** Rules are records keyed by the triggering\n  field, run in one ordered pass per `set()` — cycles are unrepresentable, not detected.\n- **Collections as a combinator.** `list(key, memberGraph, {min, max})` mounts a member graph\n  per element — each row with its own branches, computeds, errors, and persistence, addressed\n  by stable ids (`runs[a1b2].engine`). A root computed aggregates the rows like any upstream\n  value; render isolation (an edit wakes only its row, a reorder only the shell) is pinned by\n  render-count tests on both bindings.\n- **Wizards without a step registry.** `validate(step.keys)` judges only that step's fields —\n  a key list declared next to the step's UI, inactive branch arms vacuously valid, a whole\n  list as a single gate. The graph never learns what a step is.\n- **Async validity, sync engine.** `setError(key, {message})` is the door for server verdicts\n  (an audit refusal, a failed cost check): live on the field, fails validate, cleared the\n  moment the user writes — never persisted.\n- **RHF-grade form UX, opt-in.** `isDirty`/`dirtyFields` (the intent map IS the dirty\n  tracker), `focusFirstError` (first offender in declaration order, wizard-step scoped),\n  and `revalidate: 'touched'` — live errors for fields the user has written, pristine\n  fields never scolded, measured at ~6µs worst-case on a 35-field form.\n- **Full recompute, isolated renders.** Every change recomputes the whole snapshot; a\n  reference-preserving diff means only controls whose data moved re-render.\n- **Framework-free core, first-class bindings.** All semantics live in the core store; the\n  React and Svelte bindings are each a thin bridge over the same per-field subscriptions.\n\n## Framework bindings\n\n**Svelte** (`form-graph/svelte`):\n\n```svelte\n<script lang=\"ts\">\n  import { typedFields, Field } from 'form-graph/svelte';\n  const store = form.createStore({ ext });\n  const f = typedFields(store); // every key, typed from the form — no annotations\n</script>\n\n<!-- Placed flat: the FORM decides whether this renders -->\n<Field {store} name=\"steps\">\n  {#snippet children(snap, setValue)}\n    <input type=\"range\" min={snap.meta.min} max={snap.meta.max}\n      value={snap.value} oninput={(e) => setValue(Number(e.currentTarget.value))} />\n  {/snippet}\n</Field>\n```\n\n**React** (`form-graph/react`):\n\n```tsx\nimport { useForm, useTypedField, Controller } from 'form-graph/react';\n\nconst store = useForm(form, { ext });\nconst steps = useTypedField(store, 'steps'); // typed from the form\n\n<Controller name=\"steps\" render={({ value, meta, onChange }) => (\n  <Slider min={meta.min} max={meta.max} value={value} onChange={onChange} />\n)} />\n```\n\nPersistence is one line — JSON web storage, debounced writes, flush on tab close, SSR-safe:\n\n```ts\nimport { persistedStorage } from 'form-graph';\nconst store = form.createStore({ ext, storage: persistedStorage('my-form') });\n```\n\n## Entry points\n\n| Import | Contents |\n| --- | --- |\n| `form-graph` | core: `defineGraph`, `branch`, `list`, store (incl. `setError`, scoped `validate`, `store.list`, `isDirty`), `focusFirstError`, introspection, `persistedStorage`, intent readers |\n| `form-graph/svelte` | `typedFields`, `<Field>`, `field`, `formState`, `list`, `elementPath`, `syncExt` |\n| `form-graph/react` | `useForm`, `useField`, `useTypedField`, `useFormState`, `Controller`, `MultiController`, `createTypedController`, `FormProvider`, `useList`, `<ListElement>` |\n| `form-graph/defs` | the definition helpers: sliders, enums, text, booleans — schemas cached automatically |\n\n## Docs and demos\n\nThe full documentation and a ladder of live demos are published from this repository:\n\n- **Docs** — [bkdiehl.github.io/form-graph/docs](https://bkdiehl.github.io/form-graph/docs):\n  getting started, core concepts, the graph model, rules, server parsing, both bindings.\n- **Demos** — [bkdiehl.github.io/form-graph/demo](https://bkdiehl.github.io/form-graph/demo):\n  from a teaching form up to a production-scale generation form with dozens of branches,\n  verified against its legacy implementation by a differential parity harness.\n\nLocally, `pnpm dev` serves the same site.\n\n## Status\n\nPre-1.0. The API has been through several deliberate revisions and is settling, but every\nrelease before 1.0 may break it. Battle-testing is ongoing against a large production form\n(40+ branch families); the core engine, both bindings, and the persistence layer are covered\nby ~430 tests including compile-time type assertions, render-isolation contracts on both\nframeworks, and a differential parity suite against the production implementation it replaces.\n\nEngineering history — the design decisions, measurements, and dead ends — lives in\n[docs/DEVLOG.md](docs/DEVLOG.md).\n","readmeFilename":"README.md"}