{"_id":"@bernierllc/contentful-rich-text","_rev":"6-7dd02db5824adbd8faea5b6346518f92","name":"@bernierllc/contentful-rich-text","dist-tags":{"latest":"1.3.0"},"versions":{"1.0.1":{"name":"@bernierllc/contentful-rich-text","version":"1.0.1","author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/contentful-rich-text@1.0.1","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"dist":{"shasum":"c6ed6219720a3f14812173a759eae14d32de5316","tarball":"https://registry.npmjs.org/@bernierllc/contentful-rich-text/-/contentful-rich-text-1.0.1.tgz","fileCount":19,"integrity":"sha512-RdoiqixcX/RD9CIL0kVR+WaTz0180M/vVGhmYPCGZ/MRysujSrzdwSd8n10kNdFOitj1iR9VgBQ32g9Ne7Lirg==","signatures":[{"sig":"MEQCIE6/oFkzAYBPLSHBlb/F2aTYfjiI5DKe17tcyywEuYJBAiBgb2f35hcwiFVLy+4mqBd+5xWg7GPj4CC9wcECYJag+w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":116475},"main":"dist/index.js","_from":"file:bernierllc-contentful-rich-text-1.0.1.tgz","types":"dist/index.d.ts","scripts":{"lint":"eslint \"{src,__tests__}/**/*.{ts,tsx}\" --max-warnings 0","test":"jest --runInBand","build":"tsc","test:run":"jest --runInBand --collectCoverage","test:coverage":"jest --runInBand --collectCoverage"},"_npmUser":{"name":"mkbernier","email":"mkbernier@gmail.com"},"_resolved":"/private/var/folders/r0/wspnzd1s18sfjy10ffyv2qxw0000gn/T/a245d48a9c382462e6dd27eb6229b6cf/bernierllc-contentful-rich-text-1.0.1.tgz","_integrity":"sha512-RdoiqixcX/RD9CIL0kVR+WaTz0180M/vVGhmYPCGZ/MRysujSrzdwSd8n10kNdFOitj1iR9VgBQ32g9Ne7Lirg==","_npmVersion":"11.6.2","description":"Rich text rendering for Contentful content to HTML, Markdown, and React components","directories":{},"_nodeVersion":"25.2.1","dependencies":{"turndown":"^7.2.0","@contentful/rich-text-types":"^16.0.0","@bernierllc/contentful-types":"1.0.4","@contentful/rich-text-html-renderer":"^16.0.0","@contentful/rich-text-plain-text-renderer":"^16.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","eslint":"^8.57.0","ts-jest":"^29.1.2","prettier":"^3.2.5","typescript":"^5.4.5","@types/jest":"^29.5.12","@types/node":"^20.12.12","@types/react":"^18.3.3","@types/turndown":"^5.0.5","eslint-config-prettier":"^9.1.0","eslint-plugin-prettier":"^5.1.3","@typescript-eslint/parser":"^7.9.0","@typescript-eslint/eslint-plugin":"^7.9.0"},"peerDependencies":{"react":"^18.0.0"},"optionalDependencies":{"@contentful/rich-text-react-renderer":"^15.0.0"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/contentful-rich-text_1.0.1_1764703285057_0.6701159435808932","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@bernierllc/contentful-rich-text","version":"1.0.3","author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/contentful-rich-text@1.0.3","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"dist":{"shasum":"cb5386caa8910f5e90f59e9351eca3e551b48677","tarball":"https://registry.npmjs.org/@bernierllc/contentful-rich-text/-/contentful-rich-text-1.0.3.tgz","fileCount":19,"integrity":"sha512-ayT0xTa5TOpf/bVxMttjmslqIwArTbxOyDxDt6a5+A90YSMLSBs/5qUhnw9zygQERtPZVoHN58/Z4hRJZoSrCA==","signatures":[{"sig":"MEUCIFTcWKg1nW/bL7Z1WAOzK8f2me4X5K5tsrjo/cjKw8CWAiEAzCfApzhNGSfo7y70wNxWheRp0Zpoizcq32kX9V+UPEQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":116580},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"af7e74b3715d56d3a193e1bb6743b337c2b0df6d","scripts":{"lint":"eslint \"{src,__tests__}/**/*.{ts,tsx}\" --max-warnings 0","test":"jest --runInBand","build":"tsc","test:run":"jest --runInBand --collectCoverage","test:coverage":"jest --runInBand --collectCoverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:19e0a07e-f02c-4dfa-930c-a277a98c9259"}},"_npmVersion":"lerna/9.0.3/node@v20.19.6+x64 (linux)","description":"Rich text rendering for Contentful content to HTML, Markdown, and React components","directories":{},"_nodeVersion":"20.19.6","dependencies":{"turndown":"^7.2.0","@contentful/rich-text-types":"^16.0.0","@bernierllc/contentful-types":"1.2.0","@contentful/rich-text-html-renderer":"^16.0.0","@contentful/rich-text-plain-text-renderer":"^16.0.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","eslint":"^8.57.0","ts-jest":"^29.1.2","prettier":"^3.2.5","typescript":"^5.4.5","@types/jest":"^29.5.12","@types/node":"^20.12.12","@types/react":"^18.3.3","@types/turndown":"^5.0.5","eslint-config-prettier":"^9.1.0","eslint-plugin-prettier":"^5.1.3","@typescript-eslint/parser":"^7.9.0","@typescript-eslint/eslint-plugin":"^7.9.0"},"peerDependencies":{"react":"^18.0.0"},"optionalDependencies":{"@contentful/rich-text-react-renderer":"^15.0.0"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/contentful-rich-text_1.0.3_1767642382177_0.6398640901338888","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"@bernierllc/contentful-rich-text","version":"1.0.4","author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/contentful-rich-text@1.0.4","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"dist":{"shasum":"e6ff28c3c34c570a915625186524e6b1994631b9","tarball":"https://registry.npmjs.org/@bernierllc/contentful-rich-text/-/contentful-rich-text-1.0.4.tgz","fileCount":19,"integrity":"sha512-0SV/cQU6zbr04WjqFB+GcKaGZF0rtpUJCJcM1kqG0adf7P9SaNck+x16KcMMcy+WrdGfYHOlnhLh0T/KeSI8Yw==","signatures":[{"sig":"MEQCICeHynWGAvsnX8dTogSfPFMi+zNiYWLn8GWsSNEOtuQcAiAx4Ni+sPqUVwfgk1fayAwcnyj2uK946JLQikWfO4+8VA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":116522},"main":"dist/index.js","_from":"file:bernierllc-contentful-rich-text-1.0.4.tgz","types":"dist/index.d.ts","scripts":{"lint":"eslint \"{src,__tests__}/**/*.{ts,tsx}\" --max-warnings 0","test":"jest --runInBand","build":"tsc","test:run":"jest --runInBand --collectCoverage","test:coverage":"jest --runInBand --collectCoverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:19e0a07e-f02c-4dfa-930c-a277a98c9259"}},"_resolved":"/tmp/f0e6191d743adf30c45ce3c41352e0b1/bernierllc-contentful-rich-text-1.0.4.tgz","_integrity":"sha512-0SV/cQU6zbr04WjqFB+GcKaGZF0rtpUJCJcM1kqG0adf7P9SaNck+x16KcMMcy+WrdGfYHOlnhLh0T/KeSI8Yw==","_npmVersion":"11.11.0","description":"Rich text rendering for Contentful content to HTML, Markdown, and React components","directories":{},"_nodeVersion":"20.20.0","dependencies":{"turndown":"^7.2.0","@contentful/rich-text-types":"^16.0.0","@bernierllc/contentful-types":"1.2.1","@contentful/rich-text-html-renderer":"^16.0.0","@contentful/rich-text-plain-text-renderer":"^16.0.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","eslint":"^8.57.0","ts-jest":"^29.1.2","prettier":"^3.2.5","typescript":"^5.4.5","@types/jest":"^29.5.12","@types/node":"^20.12.12","@types/react":"^18.3.3","@types/turndown":"^5.0.5","eslint-config-prettier":"^9.1.0","eslint-plugin-prettier":"^5.1.3","@typescript-eslint/parser":"^7.9.0","@typescript-eslint/eslint-plugin":"^7.9.0"},"peerDependencies":{"react":"^18.0.0"},"optionalDependencies":{"@contentful/rich-text-react-renderer":"^15.0.0"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/contentful-rich-text_1.0.4_1773078172981_0.5190882177526555","host":"s3://npm-registry-packages-npm-production"}},"1.0.5":{"name":"@bernierllc/contentful-rich-text","version":"1.0.5","author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/contentful-rich-text@1.0.5","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"dist":{"shasum":"6fed5c7b9e934dd4784ce59c04ddcfb712c1ddc2","tarball":"https://registry.npmjs.org/@bernierllc/contentful-rich-text/-/contentful-rich-text-1.0.5.tgz","fileCount":19,"integrity":"sha512-62mZBcRUPW+jo/asfxm+mKlcabz3foNuPHtNvdCq+GuvOPZAenHN/rx8y2NKz3JjqwrlfvY6zAfRlL2ykMASgg==","signatures":[{"sig":"MEUCIQCAGpUSUZQ7aE0g+df+C9EoR4hlDIk0G2ntKoOPWidZGAIgA62mBUJa8Ej011KG+0JU5Pjx4xa9rxvTC8XxQpCle64=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":116522},"main":"dist/index.js","_from":"file:bernierllc-contentful-rich-text-1.0.5.tgz","types":"dist/index.d.ts","scripts":{"lint":"eslint \"{src,__tests__}/**/*.{ts,tsx}\" --max-warnings 0","test":"jest --runInBand","build":"tsc","test:run":"jest --runInBand --collectCoverage","test:coverage":"jest --runInBand --collectCoverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:19e0a07e-f02c-4dfa-930c-a277a98c9259"}},"_resolved":"/home/runner/work/tools/tools/packages/core/contentful-rich-text/bernierllc-contentful-rich-text-1.0.5.tgz","_integrity":"sha512-62mZBcRUPW+jo/asfxm+mKlcabz3foNuPHtNvdCq+GuvOPZAenHN/rx8y2NKz3JjqwrlfvY6zAfRlL2ykMASgg==","_npmVersion":"11.11.0","description":"Rich text rendering for Contentful content to HTML, Markdown, and React components","directories":{},"_nodeVersion":"20.20.0","dependencies":{"turndown":"^7.2.0","@contentful/rich-text-types":"^16.0.0","@bernierllc/contentful-types":"1.2.2","@contentful/rich-text-html-renderer":"^16.0.0","@contentful/rich-text-plain-text-renderer":"^16.0.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","eslint":"^8.57.0","ts-jest":"^29.1.2","prettier":"^3.2.5","typescript":"^5.4.5","@types/jest":"^29.5.12","@types/node":"^20.12.12","@types/react":"^18.3.3","@types/turndown":"^5.0.5","eslint-config-prettier":"^9.1.0","eslint-plugin-prettier":"^5.1.3","@typescript-eslint/parser":"^7.9.0","@typescript-eslint/eslint-plugin":"^7.9.0"},"peerDependencies":{"react":"^18.0.0"},"optionalDependencies":{"@contentful/rich-text-react-renderer":"^15.0.0"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/contentful-rich-text_1.0.5_1773163123791_0.42104477139381813","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@bernierllc/contentful-rich-text","version":"1.2.0","author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/contentful-rich-text@1.2.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"dist":{"shasum":"8cff4f11a1b6cf53fa24a03e9e77edaf606a2bcc","tarball":"https://registry.npmjs.org/@bernierllc/contentful-rich-text/-/contentful-rich-text-1.2.0.tgz","fileCount":27,"integrity":"sha512-GpBCpTQVRdaIE9iiHfuAZMcfwRHQc/67ttrb6TDfV5py9kxUvx1j4UwJEpAPhQ2E8XkuKPizuOwkFwfit6MV2A==","signatures":[{"sig":"MEUCIQDQLpCeT6TvTbKRLljGT0wC/3alYuaZIsL01evCCmm33gIgWj9SevME8nxHNDw8iLoOw/6hLjCg0wvZmB4JWGoKyUw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":122462},"main":"dist/index.js","_from":"file:bernierllc-contentful-rich-text-1.2.0.tgz","types":"dist/index.d.ts","scripts":{"lint":"eslint \"{src,__tests__}/**/*.{ts,tsx}\" --max-warnings 0","test":"jest --runInBand","build":"tsc","test:run":"jest --runInBand --collectCoverage","test:coverage":"jest --runInBand --collectCoverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:19e0a07e-f02c-4dfa-930c-a277a98c9259"}},"_resolved":"/home/runner/work/tools/tools/packages/core/contentful-rich-text/bernierllc-contentful-rich-text-1.2.0.tgz","_integrity":"sha512-GpBCpTQVRdaIE9iiHfuAZMcfwRHQc/67ttrb6TDfV5py9kxUvx1j4UwJEpAPhQ2E8XkuKPizuOwkFwfit6MV2A==","_npmVersion":"11.14.1","description":"Rich text rendering for Contentful content to HTML, Markdown, and React components","directories":{},"_nodeVersion":"20.20.2","dependencies":{"turndown":"^7.2.0","@contentful/rich-text-types":"^16.0.0","@bernierllc/contentful-types":"1.4.0","@contentful/rich-text-html-renderer":"^16.0.0","@contentful/rich-text-plain-text-renderer":"^16.0.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","eslint":"^8.57.0","ts-jest":"^29.1.2","prettier":"^3.2.5","typescript":"^5.4.5","@types/jest":"^29.5.12","@types/node":"^20.12.12","@types/react":"^18.3.3","@types/turndown":"^5.0.5","eslint-config-prettier":"^9.1.0","eslint-plugin-prettier":"^5.1.3","@typescript-eslint/parser":"^7.9.0","@typescript-eslint/eslint-plugin":"^7.9.0"},"peerDependencies":{"react":"^18.0.0"},"optionalDependencies":{"@contentful/rich-text-react-renderer":"^15.0.0"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/contentful-rich-text_1.2.0_1779241058796_0.5391970366445389","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@bernierllc/contentful-rich-text","version":"1.3.0","description":"Rich text rendering for Contentful content to HTML, Markdown, and React components","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"dependencies":{"@contentful/rich-text-html-renderer":"^16.0.0","@contentful/rich-text-plain-text-renderer":"^16.0.0","@contentful/rich-text-types":"^16.0.0","turndown":"^7.2.0","@bernierllc/contentful-types":"1.5.0"},"optionalDependencies":{"@contentful/rich-text-react-renderer":"^15.0.0"},"devDependencies":{"@types/jest":"^29.5.12","@types/node":"^20.12.12","@types/react":"^18.3.3","@types/turndown":"^5.0.5","@typescript-eslint/eslint-plugin":"^7.9.0","@typescript-eslint/parser":"^7.9.0","eslint":"^8.57.0","eslint-config-prettier":"^9.1.0","eslint-plugin-prettier":"^5.1.3","jest":"^29.7.0","prettier":"^3.2.5","ts-jest":"^29.1.2","typescript":"^5.4.5"},"peerDependencies":{"react":"^18.0.0"},"peerDependenciesMeta":{"react":{"optional":true}},"scripts":{"build":"tsc","test":"jest --runInBand","test:run":"jest --runInBand --collectCoverage","test:coverage":"jest --runInBand --collectCoverage","lint":"eslint \"{src,__tests__}/**/*.{ts,tsx}\" --max-warnings 0"},"_id":"@bernierllc/contentful-rich-text@1.3.0","_integrity":"sha512-E/z0VYL9yg4w80+xDZslKnkFl1i1rDdNTwFIwH8usf0Xbag920sG2Ju8HGLvoYu+n+RR79/5gwVdeojPW4XfzQ==","_resolved":"/home/runner/work/tools/tools/packages/core/contentful-rich-text/bernierllc-contentful-rich-text-1.3.0.tgz","_from":"file:bernierllc-contentful-rich-text-1.3.0.tgz","_nodeVersion":"20.20.2","_npmVersion":"11.14.1","dist":{"integrity":"sha512-E/z0VYL9yg4w80+xDZslKnkFl1i1rDdNTwFIwH8usf0Xbag920sG2Ju8HGLvoYu+n+RR79/5gwVdeojPW4XfzQ==","shasum":"8157e7e21be8cf91cd97dfebcc774e81205c20d6","tarball":"https://registry.npmjs.org/@bernierllc/contentful-rich-text/-/contentful-rich-text-1.3.0.tgz","fileCount":27,"unpackedSize":122462,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCssnhOFjb/YCRquY1iN4yj+rtnEJVhOglYgtjSEOST/wIgHLgAtJ8NJ2RKlfmEWEvU9kicEqjf9YDhW3UVc3suC8g="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:19e0a07e-f02c-4dfa-930c-a277a98c9259"}},"directories":{},"maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/contentful-rich-text_1.3.0_1779249800982_0.63071125444882"},"_hasShrinkwrap":false}},"time":{"created":"2025-12-02T19:21:24.922Z","modified":"2026-05-20T04:03:21.254Z","1.0.1":"2025-12-02T19:21:25.281Z","1.0.3":"2026-01-05T19:46:22.328Z","1.0.4":"2026-03-09T17:42:53.125Z","1.0.5":"2026-03-10T17:18:43.942Z","1.2.0":"2026-05-20T01:37:38.981Z","1.3.0":"2026-05-20T04:03:21.133Z"},"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","description":"Rich text rendering for Contentful content to HTML, Markdown, and React components","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"readme":"# @bernierllc/contentful-rich-text\n\nRich text rendering for Contentful content to HTML, Markdown, and React components.\n\n## Installation\n\n```bash\nnpm install @bernierllc/contentful-rich-text\n```\n\nFor React rendering support:\n```bash\nnpm install @bernierllc/contentful-rich-text react\n```\n\n## Features\n\n- **HTML Rendering**: Convert Contentful rich text to HTML strings\n- **Markdown Rendering**: Convert Contentful rich text to Markdown\n- **React Rendering**: Convert Contentful rich text to React components (requires React peer dependency)\n- **Plain Text Extraction**: Extract plain text from rich text documents\n- **Custom Renderers**: Override default rendering for specific node types\n- **Embedded Content**: Handle embedded entries and assets\n- **Hyperlink Support**: Full support for hyperlinks, entry links, and asset links\n- **Text Marks**: Handle bold, italic, underline, and code formatting\n\n## Usage\n\n### Basic HTML Rendering\n\n```typescript\nimport { ContentfulRichTextRenderer } from '@bernierllc/contentful-rich-text';\nimport { Document } from '@contentful/rich-text-types';\n\nconst renderer = new ContentfulRichTextRenderer();\n\nconst document: Document = {\n  nodeType: 'document',\n  data: {},\n  content: [\n    {\n      nodeType: 'paragraph',\n      data: {},\n      content: [\n        {\n          nodeType: 'text',\n          value: 'Hello, world!',\n          marks: [],\n          data: {}\n        }\n      ]\n    }\n  ]\n};\n\nconst html = renderer.toHTML(document);\nconsole.log(html); // <p>Hello, world!</p>\n```\n\n### Markdown Rendering\n\n```typescript\nconst markdown = renderer.toMarkdown(document);\nconsole.log(markdown); // Hello, world!\n```\n\n### Plain Text Extraction\n\n```typescript\nconst plainText = renderer.toPlainText(document);\nconsole.log(plainText); // Hello, world!\n```\n\n### React Rendering\n\n```typescript\nimport React from 'react';\n\n// React must be installed as a peer dependency\nconst reactComponent = renderer.toReact(document);\n\n// Use in your React app\nfunction MyComponent() {\n  return <div>{reactComponent}</div>;\n}\n```\n\n### Custom Node Renderers\n\n```typescript\nimport { BLOCKS, INLINES } from '@bernierllc/contentful-rich-text';\n\nconst html = renderer.toHTML(document, {\n  renderNode: {\n    [BLOCKS.EMBEDDED_ENTRY]: (node) => {\n      const id = node.data?.target?.sys?.id;\n      return `<div class=\"custom-entry\" data-id=\"${id}\">Custom Entry</div>`;\n    },\n    [BLOCKS.EMBEDDED_ASSET]: (node) => {\n      const asset = node.data?.target;\n      const url = asset?.fields?.file?.url;\n      return url ? `<figure><img src=\"${url}\" /></figure>` : '';\n    }\n  }\n});\n```\n\n### Custom Text Renderer\n\n```typescript\nconst html = renderer.toHTML(document, {\n  renderText: (text) => text.toUpperCase()\n});\n```\n\n### Custom Mark Renderer\n\n```typescript\nimport { MARKS } from '@bernierllc/contentful-rich-text';\n\nconst html = renderer.toHTML(document, {\n  renderMark: {\n    [MARKS.BOLD]: (text) => `<strong class=\"custom-bold\">${text}</strong>`\n  }\n});\n```\n\n### Renderer with Default Options\n\n```typescript\nimport { createRenderer } from '@bernierllc/contentful-rich-text';\n\nconst customRenderer = createRenderer({\n  renderNode: {\n    [BLOCKS.PARAGRAPH]: (node, next) => {\n      return `<p class=\"custom-paragraph\">${next(node.content)}</p>`;\n    }\n  }\n});\n\n// All renders will use the custom paragraph renderer\nconst html = customRenderer.toHTML(document);\n```\n\n### Using withOptions\n\n```typescript\nconst baseRenderer = new ContentfulRichTextRenderer();\n\nconst customRenderer = baseRenderer.withOptions({\n  renderText: (text) => text.trim()\n});\n\n// Override default options for specific renders\nconst html = customRenderer.toHTML(document, {\n  renderText: (text) => text.toUpperCase()\n});\n```\n\n## API Reference\n\n### ContentfulRichTextRenderer\n\n#### Methods\n\n##### `toHTML(document: Document, options?: RichTextRenderOptions): string`\n\nConverts a Contentful rich text document to an HTML string.\n\n**Parameters:**\n- `document`: Contentful rich text document\n- `options`: Optional custom rendering options\n\n**Returns:** HTML string\n\n##### `toMarkdown(document: Document, options?: RichTextRenderOptions): string`\n\nConverts a Contentful rich text document to Markdown.\n\n**Parameters:**\n- `document`: Contentful rich text document\n- `options`: Optional custom rendering options\n\n**Returns:** Markdown string\n\n##### `toReact(document: Document, options?: RichTextRenderOptions): React.ReactNode`\n\nConverts a Contentful rich text document to React components.\n\n**Requires:** React peer dependency\n\n**Parameters:**\n- `document`: Contentful rich text document\n- `options`: Optional custom rendering options\n\n**Returns:** React node\n\n**Throws:** Error if React is not installed\n\n##### `toPlainText(document: Document): string`\n\nExtracts plain text from a Contentful rich text document.\n\n**Parameters:**\n- `document`: Contentful rich text document\n\n**Returns:** Plain text string\n\n##### `withOptions(defaultOptions: RichTextRenderOptions): ContentfulRichTextRenderer`\n\nCreates a new renderer instance with default options applied.\n\n**Parameters:**\n- `defaultOptions`: Default rendering options\n\n**Returns:** New renderer instance\n\n### RichTextRenderOptions\n\n```typescript\ninterface RichTextRenderOptions {\n  renderNode?: {\n    [nodeType: string]: (node: Node, next: (nodes: Node[]) => string | React.ReactNode) => string | React.ReactNode;\n  };\n  renderMark?: {\n    [markType: string]: (text: string) => string | React.ReactNode;\n  };\n  renderText?: (text: string) => string;\n}\n```\n\n### createRenderer\n\n```typescript\nfunction createRenderer(options?: RichTextRenderOptions): ContentfulRichTextRenderer\n```\n\nFactory function to create a new renderer instance with optional default options.\n\n## Embedded Content\n\n### Embedded Entries\n\nBy default, embedded entries are rendered as:\n\n```html\n<div class=\"embedded-entry\" data-id=\"entry-id\">Embedded Entry: entry-id</div>\n```\n\nInline embedded entries:\n\n```html\n<span class=\"embedded-entry-inline\" data-id=\"entry-id\">Embedded Entry: entry-id</span>\n```\n\n### Embedded Assets\n\nBy default, embedded assets with images are rendered as:\n\n```html\n<img src=\"asset-url\" alt=\"asset-title\" class=\"embedded-asset\" />\n```\n\n### Hyperlinks\n\nStandard hyperlinks:\n\n```html\n<a href=\"url\" target=\"_blank\" rel=\"noopener noreferrer\">Link Text</a>\n```\n\nEntry hyperlinks:\n\n```html\n<a href=\"/entry/entry-id\" class=\"entry-link\">Link Text</a>\n```\n\nAsset hyperlinks:\n\n```html\n<a href=\"/asset/asset-id\" class=\"asset-link\">Link Text</a>\n```\n\n## Supported Node Types\n\n- **Blocks**: `DOCUMENT`, `PARAGRAPH`, `HEADING_1` through `HEADING_6`, `UL_LIST`, `OL_LIST`, `LIST_ITEM`, `BLOCKQUOTE`, `HR`, `EMBEDDED_ENTRY`, `EMBEDDED_ASSET`\n- **Inlines**: `HYPERLINK`, `ENTRY_HYPERLINK`, `ASSET_HYPERLINK`, `EMBEDDED_ENTRY`\n- **Marks**: `BOLD`, `ITALIC`, `UNDERLINE`, `CODE`\n\n## TypeScript Support\n\nThis package is written in TypeScript and includes full type definitions.\n\n```typescript\nimport {\n  ContentfulRichTextRenderer,\n  RichTextRenderOptions,\n  RichTextDocument,\n  BLOCKS,\n  INLINES,\n  MARKS\n} from '@bernierllc/contentful-rich-text';\n```\n\n## Integration Documentation\n\nThis is a **core package** that provides pure rich text rendering functionality with zero external dependencies beyond Contentful types. As a core package, it does not include logger or NeverHub integrations.\n\n### Logger Integration\n\nNot applicable - this is a stateless rendering library that does not perform operations requiring logging. Applications consuming this package may add their own logging around render operations if needed.\n\n### NeverHub Integration\n\nNot applicable - this package provides pure rendering functions without side effects or external service interactions. It operates entirely in-memory and does not require NeverHub coordination.\n\n### Design Philosophy\n\nThis package follows the **core package** pattern:\n- **Zero side effects**: Pure functions only\n- **Minimal dependencies**: Only Contentful types required\n- **Stateless operations**: No internal state management\n- **Framework agnostic**: Works in any JavaScript/TypeScript environment\n\nApplications integrating this package can wrap rendering operations with their own:\n- Error logging via `@bernierllc/logger`\n- Performance monitoring\n- Analytics tracking\n- Cache management\n\n## Related Packages\n\n- [@bernierllc/contentful-types](https://www.npmjs.com/package/@bernierllc/contentful-types) - TypeScript types for Contentful\n- [@contentful/rich-text-types](https://www.npmjs.com/package/@contentful/rich-text-types) - Contentful rich text types\n\n## License\n\nCopyright (c) 2025 Bernier LLC. See LICENSE file for details.\n","readmeFilename":"README.md"}