{"_id":"@acf-kit/react","_rev":"8-c8c3e59c6654c86bab913c4d7ed39c0c","name":"@acf-kit/react","dist-tags":{"latest":"1.0.0"},"versions":{"0.0.1":{"name":"@acf-kit/react","version":"0.0.1","_id":"@acf-kit/react@0.0.1","maintainers":[{"name":"codeideal","email":"shayanpng@gmail.com"}],"dist":{"shasum":"9b77d5bdbd06760a119017228491f512e1265dea","tarball":"https://registry.npmjs.org/@acf-kit/react/-/react-0.0.1.tgz","fileCount":4,"integrity":"sha512-5AsEszBuh0VNfBtE3IpO7IxrZOslpAFFS9k8/N8+FNO0YzFBIWf+UqB29qzQscdljDhN4Q1BjcOgHW5uGEAbQg==","signatures":[{"sig":"MEUCIGARN5Z3U4i4fS/nW46Txmr9cd1OqSMCp+NdcU9ciCkmAiEAi+bBYfnwUQn1dhvs2RiusEz8b+oNem5IpwBbCWZj86Y=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":780},"main":"dist/index.js","_from":"file:acf-kit-react-0.0.1.tgz","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"build":"tsc"},"_npmUser":{"name":"codeideal","email":"shayanpng@gmail.com"},"_resolved":"/private/var/folders/3s/k0yt28694fg59q27mt7vltdw0000gn/T/38a66b49cdddfc5be5c8d247d1820a5a/acf-kit-react-0.0.1.tgz","_integrity":"sha512-5AsEszBuh0VNfBtE3IpO7IxrZOslpAFFS9k8/N8+FNO0YzFBIWf+UqB29qzQscdljDhN4Q1BjcOgHW5uGEAbQg==","_npmVersion":"10.8.2","description":"React field components for acf-kit.","directories":{},"_nodeVersion":"20.19.0","dependencies":{},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/react_0.0.1_1747906525540_0.0631868118395087","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@acf-kit/react","version":"0.1.1","license":"MIT","_id":"@acf-kit/react@0.1.1","maintainers":[{"name":"codeideal","email":"shayanpng@gmail.com"}],"homepage":"https://github.com/novincode/acf-kit#readme","bugs":{"url":"https://github.com/novincode/acf-kit/issues"},"dist":{"shasum":"cb45da91b4c536fbaa280f5aeff9ef058e63ec1e","tarball":"https://registry.npmjs.org/@acf-kit/react/-/react-0.1.1.tgz","fileCount":20,"integrity":"sha512-3Gn4HGEItj97168xcDqSLjqQYWJvfJS2Re5+nqqYXh5IDHaNU+QLYj0Yc3Nbbc97bNUJH+6cfaiHRR2hG4JpYg==","signatures":[{"sig":"MEQCIGDKLNONsL8O3yvhk1pSR0V+YZaRl53x6mzxyuZNOS1kAiBemchoKLAhcwX3BF7kqcwLmcVYWsf30QM8giddypI7Fw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":23178},"main":"dist/index.js","_from":"file:acf-kit-react-0.1.1.tgz","types":"dist/index.d.ts","private":false,"scripts":{"build":"tsc -p tsconfig.json"},"_npmUser":{"name":"codeideal","email":"shayanpng@gmail.com"},"_resolved":"/private/var/folders/3s/k0yt28694fg59q27mt7vltdw0000gn/T/e0173769a832753972fc7e8bbbb94e3d/acf-kit-react-0.1.1.tgz","_integrity":"sha512-3Gn4HGEItj97168xcDqSLjqQYWJvfJS2Re5+nqqYXh5IDHaNU+QLYj0Yc3Nbbc97bNUJH+6cfaiHRR2hG4JpYg==","repository":{"url":"git+https://github.com/novincode/acf-kit.git","type":"git"},"_npmVersion":"10.8.2","description":"Headless, type-safe React bindings for acf-kit core","directories":{},"_nodeVersion":"20.19.0","dependencies":{"@acf-kit/core":"1.0.2"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.0.0","@types/react":"^19"},"peerDependencies":{"react":"^18.0.0"},"_npmOperationalInternal":{"tmp":"tmp/react_0.1.1_1747943134489_0.6282546162907969","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@acf-kit/react","version":"0.2.0","license":"MIT","_id":"@acf-kit/react@0.2.0","maintainers":[{"name":"codeideal","email":"shayanpng@gmail.com"}],"homepage":"https://github.com/novincode/acf-kit#readme","bugs":{"url":"https://github.com/novincode/acf-kit/issues"},"dist":{"shasum":"fd25cb3e7543c2fadf3f72318106d5723f0c958d","tarball":"https://registry.npmjs.org/@acf-kit/react/-/react-0.2.0.tgz","fileCount":20,"integrity":"sha512-nAUkQT2Iq5ScFVW4cqMzB5iwLuxLRUymGbj1BPHnMU1r9xJ4sFlh9wyL2C0gH20C+ObUZAq1sv/OI1sSCUEMIw==","signatures":[{"sig":"MEQCIAhMyr28+SlWepqgFEhPj23lhDDx4IvYVfwBhXHeouwqAiAXcrNOqCuRfY4fIrs94/ACfQd7mLTIIXfZ1tUwUDuelg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":23178},"main":"dist/index.js","_from":"file:acf-kit-react-0.2.0.tgz","types":"dist/index.d.ts","private":false,"scripts":{"build":"tsc -p tsconfig.json"},"_npmUser":{"name":"codeideal","email":"shayanpng@gmail.com"},"_resolved":"/private/var/folders/3s/k0yt28694fg59q27mt7vltdw0000gn/T/f71509182a2365ba93d87eb6678b8ed2/acf-kit-react-0.2.0.tgz","_integrity":"sha512-nAUkQT2Iq5ScFVW4cqMzB5iwLuxLRUymGbj1BPHnMU1r9xJ4sFlh9wyL2C0gH20C+ObUZAq1sv/OI1sSCUEMIw==","repository":{"url":"git+https://github.com/novincode/acf-kit.git","type":"git"},"_npmVersion":"10.8.2","description":"Headless, type-safe React bindings for acf-kit core","directories":{},"_nodeVersion":"20.19.0","dependencies":{"@acf-kit/core":"1.1.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.0.0","@types/react":"^19"},"peerDependencies":{"react":"^18.0.0"},"_npmOperationalInternal":{"tmp":"tmp/react_0.2.0_1747944116889_0.3675543841452922","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@acf-kit/react","version":"0.2.1","license":"MIT","_id":"@acf-kit/react@0.2.1","maintainers":[{"name":"codeideal","email":"shayanpng@gmail.com"}],"homepage":"https://github.com/novincode/acf-kit#readme","bugs":{"url":"https://github.com/novincode/acf-kit/issues"},"dist":{"shasum":"c92141b0b9edf2995a892cddf4700604599ea4d9","tarball":"https://registry.npmjs.org/@acf-kit/react/-/react-0.2.1.tgz","fileCount":20,"integrity":"sha512-FKs8by7EpilQFNEyc4YCCr1Yw8zWjzCXMBmW9n7mXyirq445G/Obc1h5N067qZOtzU9dud93DvmceCUDkB2WTQ==","signatures":[{"sig":"MEUCIG7gdn6J25OzQGBu1dGXGryFq5cUcjslf5CGq5f17yQsAiEAsc8DwjO4F9mMeFiJTEnX5gUo5uUQrpbE/VCgQLZRiVo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":23178},"main":"dist/index.js","_from":"file:acf-kit-react-0.2.1.tgz","types":"dist/index.d.ts","private":false,"scripts":{"build":"tsc -p tsconfig.json"},"_npmUser":{"name":"codeideal","email":"shayanpng@gmail.com"},"_resolved":"/private/var/folders/3s/k0yt28694fg59q27mt7vltdw0000gn/T/19e19ba0292c13c501f07d168933bd03/acf-kit-react-0.2.1.tgz","_integrity":"sha512-FKs8by7EpilQFNEyc4YCCr1Yw8zWjzCXMBmW9n7mXyirq445G/Obc1h5N067qZOtzU9dud93DvmceCUDkB2WTQ==","repository":{"url":"git+https://github.com/novincode/acf-kit.git","type":"git"},"_npmVersion":"10.8.2","description":"Headless, type-safe React bindings for acf-kit core","directories":{},"_nodeVersion":"20.19.0","dependencies":{"@acf-kit/core":"1.1.1"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.0.0","@types/react":"^19"},"peerDependencies":{"react":"^18.0.0"},"_npmOperationalInternal":{"tmp":"tmp/react_0.2.1_1747944879610_0.26510308438331043","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@acf-kit/react","version":"0.2.2","license":"MIT","_id":"@acf-kit/react@0.2.2","maintainers":[{"name":"codeideal","email":"shayanpng@gmail.com"}],"homepage":"https://github.com/novincode/acf-kit#readme","bugs":{"url":"https://github.com/novincode/acf-kit/issues"},"dist":{"shasum":"930dc55e918d617d1d408957ebe45e6558a55d64","tarball":"https://registry.npmjs.org/@acf-kit/react/-/react-0.2.2.tgz","fileCount":20,"integrity":"sha512-GOLRrPEQubXpHqruWVct1DJkrLYg74xEZe6O3nT3jDRyp9abiOCjzC9Ti91OnW1XlAAVZLTrFNsu2n6JJPZEWA==","signatures":[{"sig":"MEQCIHt83SdCjPMVu/5J/34JQWNUikATsTnD6fbBXGNQgvhmAiB6/Pl+ELn5mz2sYonxSP24rf+rSJ58IotuTEyRvcMXjw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":23178},"main":"dist/index.js","_from":"file:acf-kit-react-0.2.2.tgz","types":"dist/index.d.ts","private":false,"scripts":{"build":"tsc -p tsconfig.json"},"_npmUser":{"name":"codeideal","email":"shayanpng@gmail.com"},"_resolved":"/private/var/folders/3s/k0yt28694fg59q27mt7vltdw0000gn/T/7f2c0f099d3721b20405b5f4859cba7f/acf-kit-react-0.2.2.tgz","_integrity":"sha512-GOLRrPEQubXpHqruWVct1DJkrLYg74xEZe6O3nT3jDRyp9abiOCjzC9Ti91OnW1XlAAVZLTrFNsu2n6JJPZEWA==","repository":{"url":"git+https://github.com/novincode/acf-kit.git","type":"git"},"_npmVersion":"10.8.2","description":"Headless, type-safe React bindings for acf-kit core","directories":{},"_nodeVersion":"20.19.0","dependencies":{"@acf-kit/core":"1.1.2"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.0.0","@types/react":"^19"},"peerDependencies":{"react":"^18.0.0"},"_npmOperationalInternal":{"tmp":"tmp/react_0.2.2_1747945559331_0.6884176283297747","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@acf-kit/react","version":"0.3.0","license":"MIT","_id":"@acf-kit/react@0.3.0","maintainers":[{"name":"codeideal","email":"shayanpng@gmail.com"}],"homepage":"https://github.com/novincode/acf-kit#readme","bugs":{"url":"https://github.com/novincode/acf-kit/issues"},"dist":{"shasum":"ae5fcec0ff696a689507679a0213c99c95d10f87","tarball":"https://registry.npmjs.org/@acf-kit/react/-/react-0.3.0.tgz","fileCount":20,"integrity":"sha512-15MNqausuQREBnRcnTI1xdyWB3bB37igpAR5JUzY6bI14trp+oqviKH+Kqvk2TlqR9fHbmYw+ZTaWz24NxsWrg==","signatures":[{"sig":"MEUCIBvLF55Dv77bYIz0Lj9I7xr3kcxNTmuNdxtsmj/tToVLAiEAkNS3M6z+eMb8pK7fnfwtTJiJ+4wd83T6IhEbWiEPlcA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":23178},"main":"dist/index.js","_from":"file:acf-kit-react-0.3.0.tgz","types":"dist/index.d.ts","private":false,"scripts":{"build":"tsc -p tsconfig.json"},"_npmUser":{"name":"codeideal","email":"shayanpng@gmail.com"},"_resolved":"/private/var/folders/3s/k0yt28694fg59q27mt7vltdw0000gn/T/2cd48646bf873604a6cc8bd116b895dd/acf-kit-react-0.3.0.tgz","_integrity":"sha512-15MNqausuQREBnRcnTI1xdyWB3bB37igpAR5JUzY6bI14trp+oqviKH+Kqvk2TlqR9fHbmYw+ZTaWz24NxsWrg==","repository":{"url":"git+https://github.com/novincode/acf-kit.git","type":"git"},"_npmVersion":"10.8.2","description":"Headless, type-safe React bindings for acf-kit core","directories":{},"_nodeVersion":"20.19.0","dependencies":{"@acf-kit/core":"1.2.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.0.0","@types/react":"^19"},"peerDependencies":{"react":"^18.0.0"},"_npmOperationalInternal":{"tmp":"tmp/react_0.3.0_1747986771237_0.692507285438571","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@acf-kit/react","version":"0.4.0","license":"MIT","_id":"@acf-kit/react@0.4.0","maintainers":[{"name":"codeideal","email":"shayanpng@gmail.com"}],"homepage":"https://github.com/novincode/acf-kit#readme","bugs":{"url":"https://github.com/novincode/acf-kit/issues"},"dist":{"shasum":"e441344cf17a18963c26f027fb44b111e1cc0dab","tarball":"https://registry.npmjs.org/@acf-kit/react/-/react-0.4.0.tgz","fileCount":20,"integrity":"sha512-owEVQN0+aoyMKMNqHMVG4UvIM4UA/nW5fedeaA7KT4MW3J8aYq1REDN0u/hGeznqy9ow9rvkVdiSetezgyYfBw==","signatures":[{"sig":"MEYCIQDfuD+xpj+r910yccGo026eb0sFFtagbJFNSVqbDvE2MgIhALkULr/+ohwlOx4qm/nCZD0AX7Pi+6IaoEQWuvVP/NVx","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":23561},"main":"dist/index.js","_from":"file:acf-kit-react-0.4.0.tgz","types":"dist/index.d.ts","private":false,"scripts":{"build":"tsc -p tsconfig.json"},"_npmUser":{"name":"codeideal","email":"shayanpng@gmail.com"},"_resolved":"/private/var/folders/3s/k0yt28694fg59q27mt7vltdw0000gn/T/02cc0bab4b943e5a2a0e623e96847585/acf-kit-react-0.4.0.tgz","_integrity":"sha512-owEVQN0+aoyMKMNqHMVG4UvIM4UA/nW5fedeaA7KT4MW3J8aYq1REDN0u/hGeznqy9ow9rvkVdiSetezgyYfBw==","repository":{"url":"git+https://github.com/novincode/acf-kit.git","type":"git"},"_npmVersion":"10.8.2","description":"Headless, type-safe React bindings for acf-kit core","directories":{},"_nodeVersion":"20.19.0","dependencies":{"@acf-kit/core":"1.3.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.0.0","@types/react":"^19"},"peerDependencies":{"react":"^18.0.0"},"_npmOperationalInternal":{"tmp":"tmp/react_0.4.0_1748008042501_0.30916433906462704","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"@acf-kit/react","version":"1.0.0","private":false,"main":"dist/index.js","types":"dist/index.d.ts","peerDependencies":{"react":"^18.0.0"},"dependencies":{"@acf-kit/core":"1.3.1"},"devDependencies":{"@types/react":"^19","typescript":"^5.0.0"},"description":"Headless, type-safe React bindings for acf-kit core","repository":{"type":"git","url":"git+https://github.com/novincode/acf-kit.git"},"license":"MIT","scripts":{"build":"tsc -p tsconfig.json"},"_id":"@acf-kit/react@1.0.0","bugs":{"url":"https://github.com/novincode/acf-kit/issues"},"homepage":"https://github.com/novincode/acf-kit#readme","_integrity":"sha512-HqG/SgHAWIbSBHdCmshpY2MlS0Rl7oFqxocQmZDWnog6yp2EiPBkTgW6941sA/hPgWc9IO067y0ipfWUv4BBAA==","_resolved":"/private/var/folders/3s/k0yt28694fg59q27mt7vltdw0000gn/T/a04956746d7e22ec0a37137ede54d93b/acf-kit-react-1.0.0.tgz","_from":"file:acf-kit-react-1.0.0.tgz","_nodeVersion":"20.19.0","_npmVersion":"10.8.2","dist":{"integrity":"sha512-HqG/SgHAWIbSBHdCmshpY2MlS0Rl7oFqxocQmZDWnog6yp2EiPBkTgW6941sA/hPgWc9IO067y0ipfWUv4BBAA==","shasum":"002f83f32ddde4a41728d1496ed67ca786d70ddf","tarball":"https://registry.npmjs.org/@acf-kit/react/-/react-1.0.0.tgz","fileCount":20,"unpackedSize":21756,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDYhk3XgGyW6srpH354Zx0ZweU8b1u5ay4utHetwpugowIhAMNVy3JJOzRBslYbrvy6litI0PcEVHWf/qQDsbz5oWsM"}]},"_npmUser":{"name":"codeideal","email":"shayanpng@gmail.com"},"directories":{},"maintainers":[{"name":"codeideal","email":"shayanpng@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/react_1.0.0_1748014064619_0.006576462420619045"},"_hasShrinkwrap":false}},"time":{"created":"2025-05-22T09:35:25.457Z","modified":"2025-05-23T15:27:44.986Z","0.0.1":"2025-05-22T09:35:25.729Z","0.1.1":"2025-05-22T19:45:34.666Z","0.2.0":"2025-05-22T20:01:57.067Z","0.2.1":"2025-05-22T20:14:39.846Z","0.2.2":"2025-05-22T20:25:59.508Z","0.3.0":"2025-05-23T07:52:51.405Z","0.4.0":"2025-05-23T13:47:22.722Z","1.0.0":"2025-05-23T15:27:44.796Z"},"bugs":{"url":"https://github.com/novincode/acf-kit/issues"},"license":"MIT","homepage":"https://github.com/novincode/acf-kit#readme","repository":{"type":"git","url":"git+https://github.com/novincode/acf-kit.git"},"description":"Headless, type-safe React bindings for acf-kit core","maintainers":[{"name":"codeideal","email":"shayanpng@gmail.com"}],"readme":"# @acf-kit/react\n\n> **Headless, type-safe React bindings for [acf-kit/core](../core)**\n\n---\n\n## Why @acf-kit/react?\n\n- **Headless & UI-agnostic:** Bring your own UI, design system, and layout.\n- **TypeScript-first:** All hooks, context, and renderers are fully typed and infer your schema.\n- **Composable:** Use hooks, context, and a flexible recursive renderer for any form structure.\n- **Advanced Field Support:** Works with all core field types—group, repeater, flexible, and custom fields.\n- **Maximum DX:** Ergonomic APIs, JSDoc, and full type inference for field values, errors, and configs.\n- **Extensible:** Map any field type to your own React components, override rendering, and extend as needed.\n\n---\n\n## Installation\n\n```sh\npnpm add @acf-kit/core @acf-kit/react react\n# or\nnpm install @acf-kit/core @acf-kit/react react\n# or\nyarn add @acf-kit/core @acf-kit/react react\n```\n\n---\n\n## Quick Start\n\n```tsx\nimport {\n  AcfFormProvider,\n  AcfFormRenderer,\n  FieldComponentMap,\n  useAcfField\n} from \"@acf-kit/react\";\nimport { Form } from \"@acf-kit/core\";\nimport { registerAllBuiltins } from \"@acf-kit/core/fields/builtins\";\n\nregisterAllBuiltins();\n\nconst form = new Form({\n  fields: [\n    { name: \"username\", type: \"text\", required: true },\n    { name: \"age\", type: \"number\" }\n  ]\n});\n\nconst mapping: FieldComponentMap = {\n  text: ({ value, set }) => <input value={value || \"\"} onChange={e => set(e.target.value)} />,\n  number: ({ value, set }) => <input type=\"number\" value={value ?? \"\"} onChange={e => set(Number(e.target.value))} />,\n};\n\nexport function MyForm() {\n  return (\n    <AcfFormProvider form={form}>\n      <AcfFormRenderer form={form} mapping={mapping} />\n    </AcfFormProvider>\n  );\n}\n```\n\n---\n\n## Concepts & Architecture\n\n- **Form Context:** Wrap your form in `AcfFormProvider` to provide context to all hooks and components.\n- **Hooks:** Use `useAcfField` or `useAcfFields` for headless field logic, value, and error state.\n- **Component Mapping:** Map field types (e.g. `text`, `select`) to your own React components for full UI control.\n- **Renderer:** Use `AcfFormRenderer` for rapid prototyping, recursive/nested rendering, and layout control.\n- **Custom Rendering:** Pass a `render` function or override any field’s rendering for maximum flexibility.\n- **Full Support for Advanced Fields:** Group, repeater, and flexible fields are handled recursively and type-safely.\n\n---\n\n## API Reference\n\n### `<AcfFormProvider form={form}>`\nWraps your form and provides context to all hooks/components.\n\n### `useAcfField(fieldName)`\nHeadless hook for a single field. Returns value, setter, field instance, and error.\n\n```tsx\nconst { value, set, field, error } = useAcfField(\"username\");\n```\n\n### `useAcfFields(fieldNames)`\nHeadless hook for multiple fields at once. Returns an array of field states.\n\n```tsx\nconst fields = useAcfFields([\"username\", \"age\"]);\nfields[0].value; // value for \"username\"\n```\n\n### `<AcfFormRenderer />`\nFlexible, recursive renderer for forms. Handles nested, group, repeater, and flexible fields.\n\nProps:\n- `form`: The form instance\n- `mapping`: Field type to component map\n- `fields`: (optional) Array of field names or config objects\n- `wrapper`: (optional) Function to wrap each field node\n\n### `FieldComponentMap`\nType for mapping field types (e.g. `text`, `select`) to React components.\n\n### `RenderFieldConfig`\nType for field-level layout and rendering config. Supports custom renderers, layout, and style props.\n\n---\n\n## Recipes & Usage\n\n### Custom Field Components\n\n```tsx\nexport function MyInput({ value, set, error }) {\n  return (\n    <div>\n      <input value={value || \"\"} onChange={e => set(e.target.value)} />\n      {error && <span className=\"error\">{error}</span>}\n    </div>\n  );\n}\n```\n\n### Nested/Repeater/Group Fields\n\n`AcfFormRenderer` automatically handles group, repeater, and flexible fields recursively. You can also use hooks directly for custom rendering:\n\n```tsx\nconst { value, set } = useAcfField(\"profile\"); // group field\n// value is an object of nested values\n```\n\n### Custom Layouts & Wrappers\n\nUse the `wrapper` prop to control layout, grid, or add custom wrappers:\n\n```tsx\n<AcfFormRenderer\n  form={form}\n  mapping={mapping}\n  wrapper={(field, config) => (\n    <div className={config.className}>{field}</div>\n  )}\n/>\n```\n\n### Advanced: Custom Renderers\n\nOverride rendering for any field with the `render` prop in `RenderFieldConfig`:\n\n```tsx\nconst fields = [\n  {\n    name: \"description\",\n    render: ({ value, set }) => (\n      <textarea value={value} onChange={e => set(e.target.value)} />\n    ),\n  },\n];\n```\n\n---\n\n## TypeScript & DX Tips\n\n- All hooks and components are fully typed. Use generics for maximum type safety.\n- Use `FieldComponentMap` and `RenderFieldConfig` for type-safe mapping and layout.\n- Hover any exported symbol for instant JSDoc and type info in your editor.\n- Use `useAcfField<YourSchema, \"fieldName\">(\"fieldName\")` for advanced type inference.\n- All field values, errors, and configs are type-safe and autocompleted.\n- Works seamlessly with React 18+ and strict TypeScript settings.\n\n---\n\n## Example: Custom Field Components\n\n```tsx\nexport function MySelect({ value, set, error, field }) {\n  return (\n    <div>\n      <select value={value} onChange={e => set(e.target.value)}>\n        {field.options.map(opt => (\n          <option key={opt.value} value={opt.value}>{opt.label}</option>\n        ))}\n      </select>\n      {error && <span className=\"error\">{error}</span>}\n    </div>\n  );\n}\n```\n\n---\n\n## Testing\n\n- All logic is headless and easily testable with Jest, Vitest, or your favorite runner.\n- Example:\n\n```ts\nimport { renderHook, act } from \"@testing-library/react\";\nimport { AcfFormProvider, useAcfField } from \"@acf-kit/react\";\n\n// ...setup form and provider...\n\nconst { result } = renderHook(() => useAcfField(\"title\"), {\n  wrapper: ({ children }) => <AcfFormProvider form={form}>{children}</AcfFormProvider>\n});\n\nact(() => result.current.set(\"Hello\"));\nexpect(result.current.value).toBe(\"Hello\");\n```\n\n---\n\n## Roadmap\n\n- More built-in field components for rapid prototyping\n- Storybook and live examples\n- More advanced type inference and DX helpers\n- Recipes for integrating with design systems (MUI, Chakra, etc.)\n- More docs and guides\n\n---\n\n## Support & Community\n\n- [GitHub Issues](https://github.com/novincode/acf-kit/issues) — Bug reports & feature requests\n- [Discussions](https://github.com/novincode/acf-kit/discussions) — Ask questions, share ideas\n- [Contributing Guide](../core/CONTRIBUTING.md) — How to get involved\n\n---\n\n## License\n\nMIT\n\n---\n\n## Credits\n\n- Built with ❤️ by the acf-kit team and contributors.\n- Inspired by [Advanced Custom Fields](https://www.advancedcustomfields.com/), [Formik](https://formik.org/), and modern headless CMSs.\n","readmeFilename":"README.md"}