diff --git a/.changeset/bright-forms-submit.md b/.changeset/bright-forms-submit.md deleted file mode 100644 index a00c0fde4..000000000 --- a/.changeset/bright-forms-submit.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -'@conform-to/react': minor ---- - -feat: allow submit and form intents to share a field name - -`resolveSubmission()` now lets submit intents and form intents share the same `intentName`. Plain intent values are preserved as submit intent payloads: - -```ts -// submission.intent === 'delete' -resolveSubmission(submission).intent; -// { type: 'submit', payload: 'delete' } -``` - -Registered form intents continue to resolve through their handlers, while invalid form intents resolve to `undefined`. diff --git a/.changeset/clean-future-exports.md b/.changeset/clean-future-exports.md deleted file mode 100644 index 05b257158..000000000 --- a/.changeset/clean-future-exports.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -'@conform-to/dom': minor -'@conform-to/react': minor -'@conform-to/valibot': minor -'@conform-to/zod': minor ---- - -chore: remove deprecated Future APIs from the `/future` exports - -- The `stripEmptyValues` option from `parseSubmission()`, deprecated in [v1.18.0](https://github.com/edmundhung/conform/releases/tag/v1.18.0), is now removed. -- The `value` option from `report()`, deprecated in [v1.20.0](https://github.com/edmundhung/conform/releases/tag/v1.20.0), is now removed. Use `targetValue` instead. -- The `invalid` property from field and form metadata, deprecated in [v1.9.1](https://github.com/edmundhung/conform/releases/tag/v1.9.1), is now removed. Use `!valid` instead. -- The `getZodConstraint()` and `getValibotConstraint()` exports, deprecated in [v1.16.0](https://github.com/edmundhung/conform/releases/tag/v1.16.0), are now removed. Use `getConstraints()` instead. diff --git a/.changeset/fuzzy-pans-smile.md b/.changeset/fuzzy-pans-smile.md deleted file mode 100644 index d112bb851..000000000 --- a/.changeset/fuzzy-pans-smile.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -'@conform-to/react': minor ---- - -feat: accept URLSearchParams as the form default value - -`useForm` can now parse URL search parameters directly. The parameters are parsed only when the form is initialized or reset: - -```ts -const { form, fields } = useForm({ - defaultValue: new URLSearchParams(window.location.search), -}); -``` diff --git a/.changeset/olive-trees-narrow.md b/.changeset/olive-trees-narrow.md deleted file mode 100644 index 2fbb458cb..000000000 --- a/.changeset/olive-trees-narrow.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@conform-to/react': minor ---- - -Fix `DefaultValue` to preserve string literal types so `z.literal(...)` schemas infer their literal value instead of widening to `string`. diff --git a/.changeset/quiet-results-value.md b/.changeset/quiet-results-value.md deleted file mode 100644 index 5eb7342e2..000000000 --- a/.changeset/quiet-results-value.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -'@conform-to/zod': minor -'@conform-to/valibot': minor ---- - -Deprecated the `includeValue` option on the future `formatResult()` API. - -The option will be removed in the next minor release. `formatResult()` will then always return both `error` and `value`, equivalent to the current `includeValue: true` behavior. diff --git a/.changeset/soft-tools-serialize.md b/.changeset/soft-tools-serialize.md deleted file mode 100644 index 8569a382a..000000000 --- a/.changeset/soft-tools-serialize.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@conform-to/react': minor ---- - -feat: add intent serialization to intent dispatchers - -Intent dispatcher methods now expose a `serialize()` method with the same arguments. Use the returned value with `form.intentName` on a native submit button to trigger form intents for progressive enhancement. diff --git a/.changeset/tidy-submit-target.md b/.changeset/tidy-submit-target.md deleted file mode 100644 index e367d7297..000000000 --- a/.changeset/tidy-submit-target.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -'@conform-to/react': minor ---- - -Deprecated the `value` option on the `update()` function provided to the future `onSubmit` handler. Use `targetValue` instead: - -```diff - onSubmit(event, { value, update }) { - event.preventDefault(); - update({ - reset: true, -- value, -+ targetValue: value, - }); - } -``` - -`value` remains available as an alias and will be removed in the next minor version. If both options are provided, `targetValue` takes precedence. diff --git a/README.md b/README.md index d4b6af7a9..b14b60bef 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ ╚══════╝ ╚═════╝ ╚═╝ ╚══╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ``` -Version 1.20.2 / License MIT / Copyright (c) 2026 Edmund Hung +Version 1.21.0 / License MIT / Copyright (c) 2026 Edmund Hung Progressively enhance HTML forms with React. Build resilient, type-safe forms with no hassle using web standards. diff --git a/examples/chakra-ui/package.json b/examples/chakra-ui/package.json index cb5fd2e73..0b9d6a9b6 100644 --- a/examples/chakra-ui/package.json +++ b/examples/chakra-ui/package.json @@ -10,8 +10,8 @@ }, "dependencies": { "@chakra-ui/react": "^2.4.2", - "@conform-to/react": "^1.20.2", - "@conform-to/zod": "^1.20.2", + "@conform-to/react": "^1.21.0", + "@conform-to/zod": "^1.21.0", "@emotion/react": "^11.10.5", "@emotion/styled": "^11.10.5", "framer-motion": "^7.6.19", diff --git a/examples/material-ui/package.json b/examples/material-ui/package.json index 59c16c532..5bcedb116 100644 --- a/examples/material-ui/package.json +++ b/examples/material-ui/package.json @@ -9,8 +9,8 @@ "preview": "vite preview" }, "dependencies": { - "@conform-to/react": "^1.20.2", - "@conform-to/zod": "^1.20.2", + "@conform-to/react": "^1.21.0", + "@conform-to/zod": "^1.21.0", "@emotion/react": "^11.14.0", "@emotion/styled": "^11.14.0", "@mui/material": "^5.17.1", diff --git a/examples/nextjs/package.json b/examples/nextjs/package.json index e496c31d5..82858c622 100644 --- a/examples/nextjs/package.json +++ b/examples/nextjs/package.json @@ -9,8 +9,8 @@ "test": "playwright test" }, "dependencies": { - "@conform-to/react": "1.20.2", - "@conform-to/zod": "1.20.2", + "@conform-to/react": "1.21.0", + "@conform-to/zod": "1.21.0", "next": "16.2.11", "react": "19.2.7", "react-dom": "19.2.7", diff --git a/examples/radix-ui/package.json b/examples/radix-ui/package.json index d1b2c78d2..258e161f9 100644 --- a/examples/radix-ui/package.json +++ b/examples/radix-ui/package.json @@ -11,8 +11,8 @@ "typecheck": "tsc -b" }, "dependencies": { - "@conform-to/react": "^1.20.2", - "@conform-to/zod": "^1.20.2", + "@conform-to/react": "^1.21.0", + "@conform-to/zod": "^1.21.0", "@radix-ui/react-icons": "^1.3.2", "clsx": "^2.1.0", "radix-ui": "^1.6.4", diff --git a/examples/react-aria/package.json b/examples/react-aria/package.json index 77351e394..8f84f7887 100644 --- a/examples/react-aria/package.json +++ b/examples/react-aria/package.json @@ -10,8 +10,8 @@ "preview": "vite preview" }, "dependencies": { - "@conform-to/react": "^1.20.2", - "@conform-to/zod": "^1.20.2", + "@conform-to/react": "^1.21.0", + "@conform-to/zod": "^1.21.0", "@internationalized/date": "^3.8.0", "react": "^18.2.0", "react-aria-components": "^1.8.0", diff --git a/examples/react-router/package.json b/examples/react-router/package.json index a82ad8540..f3dd81b06 100644 --- a/examples/react-router/package.json +++ b/examples/react-router/package.json @@ -13,8 +13,8 @@ "typecheck": "react-router typegen && tsc" }, "dependencies": { - "@conform-to/react": "1.20.2", - "@conform-to/zod": "1.20.2", + "@conform-to/react": "1.21.0", + "@conform-to/zod": "1.21.0", "@react-router/node": "8.2.0", "@react-router/serve": "8.2.0", "isbot": "^5.1.36", diff --git a/examples/react-spa/package.json b/examples/react-spa/package.json index 71ee3917b..e8aa69465 100644 --- a/examples/react-spa/package.json +++ b/examples/react-spa/package.json @@ -11,8 +11,8 @@ "typecheck": "tsc -b" }, "dependencies": { - "@conform-to/react": "1.20.2", - "@conform-to/zod": "1.20.2", + "@conform-to/react": "1.21.0", + "@conform-to/zod": "1.21.0", "react": "^19.2.7", "react-dom": "^19.2.7", "react-router": "^8.3.0", diff --git a/examples/remix/package.json b/examples/remix/package.json index 4985cc423..78a041e5f 100644 --- a/examples/remix/package.json +++ b/examples/remix/package.json @@ -9,8 +9,8 @@ "start": "remix-serve build" }, "dependencies": { - "@conform-to/react": "1.20.2", - "@conform-to/zod": "1.20.2", + "@conform-to/react": "1.21.0", + "@conform-to/zod": "1.21.0", "@remix-run/node": "^1.19.3", "@remix-run/react": "^1.19.3", "@remix-run/serve": "^1.19.3", diff --git a/examples/shadcn-ui/package.json b/examples/shadcn-ui/package.json index 0bdfeb38f..50709887d 100644 --- a/examples/shadcn-ui/package.json +++ b/examples/shadcn-ui/package.json @@ -10,8 +10,8 @@ "preview": "vite preview" }, "dependencies": { - "@conform-to/react": "^1.20.2", - "@conform-to/zod": "^1.20.2", + "@conform-to/react": "^1.21.0", + "@conform-to/zod": "^1.21.0", "@radix-ui/react-checkbox": "^1.0.4", "@radix-ui/react-dialog": "^1.0.5", "@radix-ui/react-label": "^2.0.2", diff --git a/packages/conform-dom/package.json b/packages/conform-dom/package.json index 3a32fc87d..7000170bc 100644 --- a/packages/conform-dom/package.json +++ b/packages/conform-dom/package.json @@ -3,7 +3,7 @@ "description": "A set of opinionated helpers built on top of the Constraint Validation API", "homepage": "https://conform.guide", "license": "MIT", - "version": "1.20.2", + "version": "1.21.0", "main": "./dist/index.js", "module": "./dist/index.mjs", "types": "./dist/index.d.ts", diff --git a/packages/conform-react/package.json b/packages/conform-react/package.json index 04e93e3a3..afc6f8c79 100644 --- a/packages/conform-react/package.json +++ b/packages/conform-react/package.json @@ -3,7 +3,7 @@ "description": "Conform view adapter for react", "homepage": "https://conform.guide", "license": "MIT", - "version": "1.20.2", + "version": "1.21.0", "main": "./dist/index.js", "module": "./dist/index.mjs", "types": "./dist/index.d.ts", diff --git a/packages/conform-valibot/package.json b/packages/conform-valibot/package.json index 5229df544..4639d348b 100644 --- a/packages/conform-valibot/package.json +++ b/packages/conform-valibot/package.json @@ -3,7 +3,7 @@ "description": "Conform helpers for integrating with Valibot", "homepage": "https://conform.guide", "license": "MIT", - "version": "1.20.2", + "version": "1.21.0", "main": "./dist/index.js", "module": "./dist/index.mjs", "types": "./dist/index.d.ts", diff --git a/packages/conform-yup/package.json b/packages/conform-yup/package.json index bd8dbc5f8..7c890b410 100644 --- a/packages/conform-yup/package.json +++ b/packages/conform-yup/package.json @@ -3,7 +3,7 @@ "description": "Conform helpers for integrating with yup", "homepage": "https://conform.guide", "license": "MIT", - "version": "1.20.2", + "version": "1.21.0", "main": "./dist/index.js", "module": "./dist/index.mjs", "types": "./dist/index.d.ts", diff --git a/packages/conform-zod/package.json b/packages/conform-zod/package.json index e0598e1c4..9109bdb39 100644 --- a/packages/conform-zod/package.json +++ b/packages/conform-zod/package.json @@ -3,7 +3,7 @@ "description": "Conform helpers for integrating with Zod", "homepage": "https://conform.guide", "license": "MIT", - "version": "1.20.2", + "version": "1.21.0", "main": "./dist/default/index.js", "module": "./dist/default/index.mjs", "types": "./dist/default/index.d.ts", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index acff5677a..c453045f2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -118,10 +118,10 @@ importers: specifier: ^2.4.2 version: 2.8.2(@emotion/react@11.11.1(@types/react@18.3.23)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.23)(react@18.3.1))(@types/react@18.3.23)(react@18.3.1))(@types/react@18.3.23)(framer-motion@7.10.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@conform-to/react': - specifier: ^1.20.2 + specifier: ^1.21.0 version: link:../../packages/conform-react '@conform-to/zod': - specifier: ^1.20.2 + specifier: ^1.21.0 version: link:../../packages/conform-zod '@emotion/react': specifier: ^11.10.5 @@ -239,10 +239,10 @@ importers: examples/material-ui: dependencies: '@conform-to/react': - specifier: ^1.20.2 + specifier: ^1.21.0 version: link:../../packages/conform-react '@conform-to/zod': - specifier: ^1.20.2 + specifier: ^1.21.0 version: link:../../packages/conform-zod '@emotion/react': specifier: ^11.14.0 @@ -300,10 +300,10 @@ importers: examples/nextjs: dependencies: '@conform-to/react': - specifier: 1.20.2 + specifier: 1.21.0 version: file:packages/conform-react(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@conform-to/zod': - specifier: 1.20.2 + specifier: 1.21.0 version: file:packages/conform-zod(zod@4.4.3) next: specifier: 16.2.11 @@ -348,10 +348,10 @@ importers: examples/radix-ui: dependencies: '@conform-to/react': - specifier: ^1.20.2 + specifier: ^1.21.0 version: file:packages/conform-react(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@conform-to/zod': - specifier: ^1.20.2 + specifier: ^1.21.0 version: file:packages/conform-zod(zod@4.4.3) '@radix-ui/react-icons': specifier: ^1.3.2 @@ -411,10 +411,10 @@ importers: examples/react-aria: dependencies: '@conform-to/react': - specifier: ^1.20.2 + specifier: ^1.21.0 version: link:../../packages/conform-react '@conform-to/zod': - specifier: ^1.20.2 + specifier: ^1.21.0 version: link:../../packages/conform-zod '@internationalized/date': specifier: ^3.8.0 @@ -472,10 +472,10 @@ importers: examples/react-router: dependencies: '@conform-to/react': - specifier: 1.20.2 + specifier: 1.21.0 version: file:packages/conform-react(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@conform-to/zod': - specifier: 1.20.2 + specifier: 1.21.0 version: file:packages/conform-zod(zod@4.4.3) '@react-router/node': specifier: 8.2.0 @@ -529,10 +529,10 @@ importers: examples/react-spa: dependencies: '@conform-to/react': - specifier: 1.20.2 + specifier: 1.21.0 version: file:packages/conform-react(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@conform-to/zod': - specifier: 1.20.2 + specifier: 1.21.0 version: file:packages/conform-zod(zod@4.4.3) react: specifier: ^19.2.7 @@ -580,10 +580,10 @@ importers: examples/remix: dependencies: '@conform-to/react': - specifier: 1.20.2 + specifier: 1.21.0 version: link:../../packages/conform-react '@conform-to/zod': - specifier: 1.20.2 + specifier: 1.21.0 version: link:../../packages/conform-zod '@remix-run/node': specifier: ^1.19.3 @@ -635,10 +635,10 @@ importers: examples/shadcn-ui: dependencies: '@conform-to/react': - specifier: ^1.20.2 + specifier: ^1.21.0 version: link:../../packages/conform-react '@conform-to/zod': - specifier: ^1.20.2 + specifier: ^1.21.0 version: link:../../packages/conform-zod '@radix-ui/react-checkbox': specifier: ^1.0.4 @@ -11216,11 +11216,6 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - natural-compare-lite@1.4.0: resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} @@ -23414,7 +23409,7 @@ snapshots: eslint: 9.27.0(jiti@2.7.0) eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@8.64.0(eslint@9.27.0(jiti@2.7.0))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.64.0(eslint@9.27.0(jiti@2.7.0))(typescript@5.9.3))(eslint@9.27.0(jiti@2.7.0)))(eslint@9.27.0(jiti@2.7.0)) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.64.0(eslint@9.27.0(jiti@2.7.0))(typescript@5.9.3))(eslint-import-resolver-typescript@3.6.1)(eslint@9.27.0(jiti@2.7.0)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.64.0(eslint@9.27.0(jiti@2.7.0))(typescript@5.9.3))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@8.64.0(eslint@9.27.0(jiti@2.7.0))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.64.0(eslint@9.27.0(jiti@2.7.0))(typescript@5.9.3))(eslint@9.27.0(jiti@2.7.0)))(eslint@9.27.0(jiti@2.7.0)))(eslint@9.27.0(jiti@2.7.0)) eslint-plugin-jsx-a11y: 6.10.2(eslint@9.27.0(jiti@2.7.0)) eslint-plugin-react: 7.37.5(eslint@9.27.0(jiti@2.7.0)) eslint-plugin-react-hooks: 7.1.1(eslint@9.27.0(jiti@2.7.0)) @@ -23466,7 +23461,7 @@ snapshots: enhanced-resolve: 5.15.0 eslint: 9.27.0(jiti@2.7.0) eslint-module-utils: 2.8.0(@typescript-eslint/parser@8.64.0(eslint@9.27.0(jiti@2.7.0))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@8.64.0(eslint@9.27.0(jiti@2.7.0))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.64.0(eslint@9.27.0(jiti@2.7.0))(typescript@5.9.3))(eslint@9.27.0(jiti@2.7.0)))(eslint@9.27.0(jiti@2.7.0)))(eslint@9.27.0(jiti@2.7.0)) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.64.0(eslint@9.27.0(jiti@2.7.0))(typescript@5.9.3))(eslint-import-resolver-typescript@3.6.1)(eslint@9.27.0(jiti@2.7.0)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.64.0(eslint@9.27.0(jiti@2.7.0))(typescript@5.9.3))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@8.64.0(eslint@9.27.0(jiti@2.7.0))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.64.0(eslint@9.27.0(jiti@2.7.0))(typescript@5.9.3))(eslint@9.27.0(jiti@2.7.0)))(eslint@9.27.0(jiti@2.7.0)))(eslint@9.27.0(jiti@2.7.0)) fast-glob: 3.3.2 get-tsconfig: 4.14.0 is-core-module: 2.13.1 @@ -23554,7 +23549,7 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.64.0(eslint@9.27.0(jiti@2.7.0))(typescript@5.9.3))(eslint-import-resolver-typescript@3.6.1)(eslint@9.27.0(jiti@2.7.0)): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.64.0(eslint@9.27.0(jiti@2.7.0))(typescript@5.9.3))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@8.64.0(eslint@9.27.0(jiti@2.7.0))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.64.0(eslint@9.27.0(jiti@2.7.0))(typescript@5.9.3))(eslint@9.27.0(jiti@2.7.0)))(eslint@9.27.0(jiti@2.7.0)))(eslint@9.27.0(jiti@2.7.0)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -26292,8 +26287,6 @@ snapshots: nanoid@3.3.16: {} - nanoid@3.3.7: {} - natural-compare-lite@1.4.0: {} natural-compare@1.4.0: {}