@pantheon-systems/pcc-react-sdk
Version:
Pantheon Content Publisher React SDK
1 lines • 43.1 kB
Source Map (JSON)
{"version":3,"sources":["../../src/utils/react-element.ts","../../src/utils/cdn-domains.ts","../../src/components/ArticleRenderer/SmartComponentErrorBoundary.tsx","../../src/components/ArticleRenderer/Markdown.tsx","../../src/utils/attributes.ts","../../src/utils/styles.ts","../../src/components/ArticleRenderer/PantheonTreeV2Renderer.tsx","../../src/components/ArticleRenderer/useArticleTitle.tsx","../../src/components/ArticleRenderer/index.tsx"],"names":["getTextContent","node","isValidElement","CDNDomains","ErrorBoundary","Component","props","error","jsx","SuspenseErrorBoundary","children","Suspense","withSmartComponentErrorBoundary","WithSmartComponentErrorBoundary","__spreadValues","getDisplayName","MarkdownRenderer","smartComponentMap","componentMap","disableDefaultErrorBoundaries","cdnURLOverride","ReactMarkdown","rehypeRaw","fixComponentParentRehypePlugin","overrideCDNUrls","remarkHeaderId","__spreadProps","attrs","type","decodedAttrs","isomorphicBase64Decode","jsxs","str","stringifiedJSON","e","tree","visit","_","parent","src","url","Markdown_default","htmlAttributeToReactProp","convertAttributes","acc","attr","key","value","formatStringToCamelCase","splitted","word","getStyleObjectFromString","style","el","property","formattedProperty","PantheonTreeRenderer","element","disableAllStyles","preserveImageStyles","renderImageCaptions","_a","_b","_c","_d","_e","_f","child","idx","React","componentType","component","nodeChildren","convertedTagName","componentOverride","shouldPruneStyles","targetingClasses","styleObject","isImageContainer","imageChild","isOldImageContainer","imageTitle","srcUrl","PantheonTreeV2Renderer_default","getArticleTitle","article","jsonContent","titleContent","flattenDocumentTabs","x","flatMap","useArticleTitle","useMemo","UnboxContent","content","splitTitleAndBody","nodes","indexOfFirstHeader","indexOfFirstParagraph","resolvedTitleIndex","bodyNodes","i","ArticleRenderer","tabId","bodyClassName","containerClassName","headerClassName","renderTitle","renderBody","__experimentalFlags","useEffect","contentType","unboxedContent","contentToShow","findTab","splitBodyNodes","titleElement","bodyElement","ArticleRenderer_default"],"mappings":"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","file":"index.mjs","sourcesContent":["import { isValidElement, PropsWithChildren, type ReactNode } from \"react\";\n\nexport const getTextContent = (node: ReactNode): string => {\n // Handle all possible types that ReactNode can be, since it is a union of types.\n if (node == null) {\n return \"\";\n } else if (\n typeof node === \"string\" ||\n typeof node === \"number\" ||\n typeof node === \"bigint\"\n ) {\n return node.toString();\n } else if (typeof node === \"boolean\") {\n return \"\";\n } else if (Array.isArray(node)) {\n return node.map(getTextContent).join(\"\");\n } else if (isValidElement(node)) {\n return getTextContent((node.props as PropsWithChildren).children);\n }\n\n return \"\";\n};\n","export const CDNDomains = [\n \"staging.cdn.content.pantheon.io\",\n \"cdn.staging.content.pantheon.io\",\n \"cdn.content.pantheon.io\",\n \"cdn.prod.pcc.pantheon.io\",\n \"cdn.staging.pcc.pantheon.io\",\n];\n","import React, { Component, Suspense } from \"react\";\n\ninterface Props {\n children: React.ReactNode;\n}\n\nclass ErrorBoundary extends Component<\n Props,\n {\n hasError: boolean;\n }\n> {\n constructor(props: Props) {\n super(props);\n\n this.state = { hasError: false };\n }\n\n static getDerivedStateFromError() {\n return { hasError: true };\n }\n\n componentDidCatch(error: Error) {\n console.error(error);\n }\n\n render() {\n if (this.state.hasError) {\n return (\n <div>Something went wrong while rendering this smart component.</div>\n );\n }\n\n return this.props.children;\n }\n}\n\nconst SuspenseErrorBoundary = ({ children }: Props) => {\n return (\n <ErrorBoundary>\n <Suspense fallback={<div>Loading smart component...</div>}>\n {children}\n </Suspense>\n </ErrorBoundary>\n );\n};\n\nexport const withSmartComponentErrorBoundary = (\n Component: React.ComponentType<unknown>,\n) => {\n const WithSmartComponentErrorBoundary = (props: Record<string, unknown>) => (\n <SuspenseErrorBoundary>\n <Component {...props} />\n </SuspenseErrorBoundary>\n );\n\n WithSmartComponentErrorBoundary.displayName = `WithSmartComponentErrorBoundary(${getDisplayName(\n Component,\n )})`;\n\n return WithSmartComponentErrorBoundary;\n};\n\nfunction getDisplayName(Component: React.ComponentType<unknown>) {\n return Component.displayName || Component.name || \"Component\";\n}\n","import { ClassAttributes, HTMLAttributes } from \"react\";\nimport ReactMarkdown, { ExtraProps } from \"react-markdown\";\nimport { Components } from \"react-markdown/lib\";\nimport rehypeRaw from \"rehype-raw\";\nimport remarkHeaderId from \"remark-heading-id\";\nimport { visit } from \"unist-util-visit\";\nimport type { UnistParent } from \"unist-util-visit/lib\";\nimport type { ComponentMap, SmartComponentMap } from \".\";\nimport { CDNDomains } from \"../../utils/cdn-domains\";\nimport { withSmartComponentErrorBoundary } from \"./SmartComponentErrorBoundary\";\n\ninterface MarkdownRendererProps {\n children: string;\n smartComponentMap?: SmartComponentMap;\n componentMap?: ComponentMap;\n disableDefaultErrorBoundaries: boolean;\n cdnURLOverride?: string | ((url: string) => string);\n}\n\ninterface ComponentProperties {\n attrs: string;\n id: string;\n type: string;\n}\n\nconst MarkdownRenderer = ({\n children,\n smartComponentMap,\n componentMap,\n disableDefaultErrorBoundaries,\n cdnURLOverride,\n}: MarkdownRendererProps) => {\n return (\n <ReactMarkdown\n rehypePlugins={[\n rehypeRaw,\n fixComponentParentRehypePlugin,\n overrideCDNUrls(cdnURLOverride),\n ]}\n remarkPlugins={[remarkHeaderId]}\n components={{\n ...(componentMap as Components),\n [\"pcc-component\" as \"div\"]: ({\n node,\n }: ClassAttributes<HTMLDivElement> &\n HTMLAttributes<HTMLDivElement> &\n ExtraProps) => {\n if (!node) {\n console.warn(\"No replacement found\");\n return null;\n }\n\n const { attrs, type } = node.properties as typeof node.properties &\n ComponentProperties;\n\n if (smartComponentMap && smartComponentMap[type]) {\n const { reactComponent: Component } = smartComponentMap[type];\n const decodedAttrs = isomorphicBase64Decode(attrs);\n\n if (!Component) {\n return (\n <div>\n Error: Cannot render {type} because it was provided without a\n reactComponent property.\n </div>\n );\n }\n\n return (\n <div>\n {disableDefaultErrorBoundaries ? (\n <Component {...decodedAttrs} />\n ) : (\n withSmartComponentErrorBoundary(Component)(decodedAttrs)\n )}\n </div>\n );\n }\n\n return (\n <div className=\"pcc-component\">\n <u>PCC Component - {type}</u>\n </div>\n );\n },\n }}\n >\n {children}\n </ReactMarkdown>\n );\n};\n\nfunction isomorphicBase64Decode(str: string): Record<string, unknown> {\n try {\n let stringifiedJSON: string | undefined;\n if (typeof Buffer !== \"undefined\") {\n stringifiedJSON = Buffer.from(str, \"base64\").toString(\"utf8\");\n } else if (typeof atob !== \"undefined\") {\n stringifiedJSON = atob(str);\n }\n\n if (!stringifiedJSON) throw new Error(\"Failed to decode base64 string\");\n\n return JSON.parse(stringifiedJSON);\n } catch (e) {\n console.error(e);\n return {};\n }\n}\n\n/**\n * Rehype plugin to set the parent of a pcc-component node to a div\n * to fix hydration errors from the component being nested in an invalid parent.\n */\nfunction fixComponentParentRehypePlugin() {\n return (tree: UnistParent) => {\n visit(\n tree,\n { type: \"element\", tagName: \"pcc-component\" },\n (node, _, parent) => {\n if (\n parent &&\n \"tagName\" in parent &&\n // @ts-expect-error TODO: Type this properly\n parent.tagName !== \"div\"\n ) {\n // @ts-expect-error TODO: Type this properly\n parent.tagName = \"div\";\n }\n },\n );\n };\n}\n\n/**\n * Rehype plugin to override the CDN domain.\n */\nfunction overrideCDNUrls(cdnURLOverride?: string | ((url: string) => string)) {\n // If cdnURLOverride is not provided, return a no-op transformer:\n if (!cdnURLOverride) {\n return () => (tree: UnistParent) => tree;\n }\n\n return () => (tree: UnistParent) => {\n visit(\n tree,\n \"element\",\n (node: Element & { properties: { src: string } }) => {\n try {\n if (node.tagName === \"img\" && node.properties.src) {\n const src = node.properties.src;\n const url = new URL(src);\n\n if (CDNDomains.includes(url.hostname)) {\n if (typeof cdnURLOverride === \"function\") {\n node.properties.src = cdnURLOverride(url.toString());\n } else {\n url.hostname = cdnURLOverride;\n node.properties.src = url.toString();\n }\n }\n }\n } catch {\n // If it's not a valid URL (or cannot be parsed), leave it unchanged.\n }\n },\n );\n };\n}\n\nexport default MarkdownRenderer;\n","// Sourced from https://github.com/hatashiro/react-attr-converter/blob/master/index.js\nconst htmlAttributeToReactProp: Record<string, string> = {\n // Specials\n for: \"htmlFor\",\n class: \"className\",\n\n // HTML attributes\n cellpadding: \"cellPadding\",\n cellspacing: \"cellSpacing\",\n classname: \"className\",\n colspan: \"colSpan\",\n crossorigin: \"crossOrigin\",\n htmlfor: \"htmlFor\",\n marginheight: \"marginHeight\",\n marginwidth: \"marginWidth\",\n maxlength: \"maxLength\",\n minlength: \"minLength\",\n readonly: \"readOnly\",\n rowspan: \"rowSpan\",\n srcdoc: \"srcDoc\",\n srclang: \"srcLang\",\n srcset: \"srcSet\",\n};\n\nexport const convertAttributes = function (attrs: Record<string, unknown>) {\n return Object.keys(attrs).reduce(\n (acc, attr) => {\n const key = attr.toLowerCase();\n const value = attrs[attr];\n\n return {\n ...acc,\n [htmlAttributeToReactProp[key] || key]: value,\n };\n },\n {} as Record<string, unknown>,\n );\n};\n","const formatStringToCamelCase = (str?: string) => {\n const splitted = str?.split(\"-\") || [];\n if (splitted.length === 1) return splitted[0];\n return (\n splitted[0] +\n splitted\n .slice(1)\n .map((word) => word[0].toUpperCase() + word.slice(1))\n .join(\"\")\n );\n};\n\nexport const getStyleObjectFromString = (str?: string[] | null) => {\n if (!str || str.length < 1) return undefined;\n\n const style = {} as Record<string, string>;\n\n str.forEach((el) => {\n const [property, value] = el.split(\":\");\n if (!property && !value) return;\n\n if (property && value) {\n const formattedProperty = formatStringToCamelCase(property.trim());\n style[formattedProperty] = value.trim();\n return;\n }\n switch (property) {\n case \"underline\":\n style.textDecoration = \"underline\";\n break;\n case \"line-through\":\n style.textDecoration = \"line-through\";\n break;\n case \"italic\":\n style.fontStyle = \"italic\";\n break;\n case \"bold\":\n style.fontWeight = \"bold\";\n break;\n case \"strike-through\":\n style.textDecoration = \"line-through\";\n break;\n case \"superscript\":\n style.verticalAlign = \"super\";\n break;\n case \"subscript\":\n style.verticalAlign = \"sub\";\n break;\n default:\n break;\n }\n });\n\n return style;\n};\n","import { PantheonTreeNode } from \"@pantheon-systems/pcc-sdk-core/types\";\nimport React from \"react\";\nimport { ComponentMap, SmartComponentMap } from \".\";\nimport { convertAttributes } from \"../../utils/attributes\";\nimport { CDNDomains } from \"../../utils/cdn-domains\";\nimport { getStyleObjectFromString } from \"../../utils/styles\";\nimport { withSmartComponentErrorBoundary } from \"./SmartComponentErrorBoundary\";\n\ninterface Props {\n element: PantheonTreeNode;\n smartComponentMap?: SmartComponentMap;\n componentMap?: ComponentMap;\n disableAllStyles?: boolean;\n preserveImageStyles?: boolean;\n disableDefaultErrorBoundaries?: boolean;\n renderImageCaptions?: boolean;\n cdnURLOverride?: string | ((url: string) => string);\n}\n\nconst PantheonTreeRenderer = ({\n element,\n smartComponentMap,\n componentMap,\n disableAllStyles,\n preserveImageStyles,\n disableDefaultErrorBoundaries,\n renderImageCaptions,\n cdnURLOverride,\n}: Props): React.ReactElement | null => {\n const children =\n element.children?.map((child, idx) =>\n React.createElement(PantheonTreeRenderer, {\n key: idx,\n element: {\n ...child,\n prevNode: element.children[idx - 1],\n nextNode: element.children[idx + 1],\n },\n smartComponentMap,\n componentMap,\n disableAllStyles,\n preserveImageStyles,\n disableDefaultErrorBoundaries,\n renderImageCaptions,\n cdnURLOverride,\n }),\n ) ?? [];\n\n if (element.tag === \"component\") {\n const componentType = element.type?.toUpperCase();\n\n if (!componentType) {\n return null;\n }\n\n const component = smartComponentMap?.[componentType];\n\n if (component) {\n if (!component.reactComponent) {\n return (\n <div>\n Error: Cannot render {componentType} because it was provided without\n a reactComponent property.\n </div>\n );\n }\n\n return disableDefaultErrorBoundaries\n ? React.createElement(\n component.reactComponent,\n element.attrs as Record<string, unknown>,\n )\n : withSmartComponentErrorBoundary(component.reactComponent)(\n element.attrs as Record<string, unknown>,\n );\n }\n }\n\n if (element.tag === \"style\") {\n if (disableAllStyles) return null;\n\n // `renderToStaticMarkup` will escape the HTML entities in the style tag\n // https://github.com/facebook/react/issues/13838#issuecomment-470294454\n return React.createElement(\"style\", {\n dangerouslySetInnerHTML: {\n __html: element.data,\n },\n });\n }\n\n const nodeChildren = [element.data, ...children].filter(Boolean);\n const convertedTagName = element.tag === \"title\" ? \"h1\" : element.tag;\n const componentOverride = componentMap?.[element.tag as \"div\"];\n const shouldPruneStyles =\n disableAllStyles === true &&\n (element.tag !== \"img\" || !preserveImageStyles) &&\n (typeof componentOverride === \"string\" || componentOverride == null);\n\n const targetingClasses = [];\n const styleObject = shouldPruneStyles\n ? undefined\n : getStyleObjectFromString(element?.style);\n\n if (isImageContainer(element) && children.length === 1) {\n targetingClasses.push(\"pantheon-img-container\");\n\n if (styleObject?.float === \"left\") {\n targetingClasses.push(\"pantheon-img-container-breakleft\");\n } else if (styleObject?.float === \"right\") {\n targetingClasses.push(\"pantheon-img-container-breakright\");\n } else if (styleObject?.clear === \"both\") {\n targetingClasses.push(\"pantheon-img-container-breakboth\");\n } else {\n targetingClasses.push(\"pantheon-img-container-inline\");\n\n if (\n (element.prevNode == null || !isImageContainer(element.prevNode)) &&\n (element.nextNode == null || !isImageContainer(element.nextNode))\n ) {\n targetingClasses.push(\"pantheon-img-container-alone\");\n }\n }\n\n const imageChild = isOldImageContainer(element)\n ? element.children[0]\n : element.children[0].children[0];\n const imageTitle = imageChild.attrs?.title?.trim();\n\n if (imageChild.attrs.src && cdnURLOverride) {\n try {\n const srcUrl = new URL(imageChild.attrs.src);\n\n if (CDNDomains.includes(srcUrl.hostname)) {\n if (typeof cdnURLOverride === \"function\") {\n imageChild.attrs.src = cdnURLOverride(srcUrl.toString());\n } else {\n srcUrl.hostname = cdnURLOverride;\n imageChild.attrs.src = srcUrl.toString();\n }\n }\n } catch {\n // If it's not a valid URL (or cannot be parsed), leave it unchanged.\n }\n }\n\n if (renderImageCaptions !== false && imageTitle?.length) {\n nodeChildren.push(\n <span\n style={{\n width: \"100%\",\n display: \"flex\",\n justifyContent: \"center\",\n fontSize: \".75rem\",\n }}\n className=\"pantheon-caption\"\n >\n {imageTitle}\n </span>,\n );\n }\n }\n\n return React.createElement(\n componentOverride || convertedTagName,\n {\n style: styleObject,\n ...convertAttributes({\n ...element.attrs,\n class: [element.attrs?.class, ...targetingClasses]\n .filter(Boolean)\n .join(\" \"),\n }),\n },\n ...(nodeChildren.length ? nodeChildren : []),\n );\n};\n\nfunction isOldImageContainer(element: PantheonTreeNode<string>) {\n return (\n element.tag === \"span\" &&\n element.children?.[0].tag === \"img\" &&\n element.children.length === 1\n );\n}\n\nfunction isImageContainer(element: PantheonTreeNode<string>) {\n return (\n element.tag === \"span\" &&\n (isOldImageContainer(element) ||\n (element.children?.[0].tag === \"span\" &&\n element.children.length === 1 &&\n element.children?.[0].children?.[0].tag === \"img\" &&\n element.children[0].children?.length === 1))\n );\n}\n\nexport default PantheonTreeRenderer;\n","import { flattenDocumentTabs } from \"@pantheon-systems/pcc-sdk-core\";\nimport {\n Article,\n PantheonTree,\n PantheonTreeNode,\n TabTree,\n TreePantheonContent,\n} from \"@pantheon-systems/pcc-sdk-core/types\";\nimport _ from \"lodash\";\nimport { useMemo } from \"react\";\n\nexport function getArticleTitle(article: Article | undefined): string | null {\n if (!article?.resolvedContent) {\n return null;\n }\n\n const contentType = article?.contentType;\n\n if (contentType === \"TEXT_MARKDOWN\") {\n return null;\n }\n\n const jsonContent =\n typeof article.resolvedContent === \"string\"\n ? JSON.parse(article.resolvedContent)\n : (article.resolvedContent as PantheonTree | TabTree<PantheonTree>[]);\n\n const content: Array<PantheonTreeNode> = Array.isArray(jsonContent)\n ? _.flatMap(jsonContent, flattenDocumentTabs)\n : jsonContent.children;\n\n const titleContent = content.find((x) => x.tag === \"title\");\n\n if (titleContent != null) {\n const flatMap = titleContent.children\n ? _.flatMapDeep(\n titleContent.children,\n (x: PantheonTreeNode | TreePantheonContent) => x.data,\n )\n : [];\n\n return titleContent.data + flatMap.join(\"\");\n } else if (\n article?.metadata?.title != null &&\n typeof article?.metadata?.title === \"string\"\n ) {\n return article.metadata.title;\n } else {\n return article.title || \"\";\n }\n}\n\nexport function useArticleTitle(article: Article | undefined): string | null {\n return useMemo(() => getArticleTitle(article) || \"\", [article]);\n}\n","import { findTab } from \"@pantheon-systems/pcc-sdk-core\";\nimport {\n Article,\n PantheonTreeNode,\n TabTree,\n type SmartComponentMap as CoreSmartComponentMap,\n} from \"@pantheon-systems/pcc-sdk-core/types\";\nimport { Element } from \"hast\";\nimport React, { useEffect, useMemo } from \"react\";\nimport { getTextContent } from \"../../utils/react-element\";\nimport MarkdownRenderer from \"./Markdown\";\nimport PantheonTreeV2Renderer from \"./PantheonTreeV2Renderer\";\n\nexport { getArticleTitle, useArticleTitle } from \"./useArticleTitle\";\n\nexport type ServersideSmartComponentMap = {\n [K in keyof CoreSmartComponentMap]: CoreSmartComponentMap[K];\n};\n\nexport type SmartComponentMap = {\n [K in keyof CoreSmartComponentMap]: CoreSmartComponentMap[K] & {\n reactComponent: (props: unknown) => React.JSX.Element;\n };\n};\n\ntype ExtraProps = {\n // If Content type is Markdown\n node?: Element;\n};\n\nexport type ComponentMap = Partial<{\n [TagName in keyof React.JSX.IntrinsicElements]:\n | (new (\n props: React.JSX.IntrinsicElements[TagName] & ExtraProps,\n ) => React.JSX.ElementClass)\n // Function component:\n | ((\n props: React.JSX.IntrinsicElements[TagName] & ExtraProps,\n ) => React.JSX.Element)\n // Tag name:\n | keyof React.JSX.IntrinsicElements;\n}>;\n\ninterface Props {\n article?: Article;\n tabId?: string | null;\n bodyClassName?: string;\n containerClassName?: string;\n headerClassName?: string;\n renderTitle?: (\n titleElement: React.ReactElement,\n content: string,\n ) => React.ReactNode;\n smartComponentMap?: SmartComponentMap;\n componentMap?: ComponentMap;\n renderBody?: (bodyElement: React.ReactElement) => React.ReactNode;\n __experimentalFlags?: {\n disableAllStyles?: boolean;\n preserveImageStyles?: boolean;\n disableDefaultErrorBoundaries?: boolean;\n renderImageCaptions?: boolean;\n cdnURLOverride?: string | ((url: string) => string);\n };\n}\n\nfunction UnboxContent(content: string | unknown) {\n if (typeof content !== \"string\") return content;\n\n try {\n return JSON.parse(content);\n } catch {\n return content;\n }\n}\n\nfunction splitTitleAndBody(nodes: PantheonTreeNode[]): {\n titleContent: PantheonTreeNode | null;\n bodyNodes: PantheonTreeNode[];\n} {\n const indexOfFirstHeader = nodes.findIndex((x) =>\n [\"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\", \"h7\", \"title\"].includes(x.tag),\n );\n const indexOfFirstParagraph = nodes.findIndex((x) => x.tag === \"p\");\n const resolvedTitleIndex =\n indexOfFirstHeader === -1 ? indexOfFirstParagraph : indexOfFirstHeader;\n\n if (resolvedTitleIndex < 0) {\n return { titleContent: null, bodyNodes: nodes };\n }\n\n const titleContent = nodes[resolvedTitleIndex] ?? null;\n const bodyNodes = nodes.filter((_, i) => i !== resolvedTitleIndex);\n\n return { titleContent, bodyNodes };\n}\n\nconst ArticleRenderer = ({\n article,\n tabId,\n bodyClassName,\n containerClassName,\n headerClassName,\n renderTitle,\n smartComponentMap,\n componentMap,\n renderBody,\n __experimentalFlags,\n}: Props) => {\n useEffect(() => {\n if (renderTitle) {\n console.warn(\n \"PCC Deprecation Warning: ArticleRenderer's renderTitle will no longer be supported in a future release.\",\n );\n }\n }, [renderTitle]);\n\n const contentType = article?.contentType;\n const unboxedContent = useMemo(\n () =>\n article?.resolvedContent ? UnboxContent(article.resolvedContent) : null,\n [article?.resolvedContent],\n );\n\n const contentToShow = useMemo(() => {\n if (!unboxedContent) return null;\n\n const content =\n (tabId != null && findTab(unboxedContent, tabId)?.documentTab) ||\n unboxedContent;\n\n if (\n tabId == null &&\n typeof unboxedContent === \"object\" &&\n content?.children == null\n ) {\n return Array.isArray(unboxedContent)\n ? unboxedContent[0]?.documentTab\n : (unboxedContent as TabTree<unknown>)?.documentTab;\n }\n\n return content;\n }, [tabId, unboxedContent]);\n\n if (!contentToShow) {\n return null;\n }\n\n if (contentType === \"TEXT_MARKDOWN\") {\n return (\n <div className={containerClassName}>\n {contentToShow ? (\n <MarkdownRenderer\n smartComponentMap={smartComponentMap}\n componentMap={componentMap}\n disableDefaultErrorBoundaries={\n !!__experimentalFlags?.disableDefaultErrorBoundaries\n }\n cdnURLOverride={__experimentalFlags?.cdnURLOverride}\n >\n {contentToShow}\n </MarkdownRenderer>\n ) : (\n <span>No content to display</span>\n )}\n </div>\n );\n }\n\n const nodes: PantheonTreeNode[] = contentToShow.children || [];\n const { titleContent, bodyNodes: splitBodyNodes } = splitTitleAndBody(nodes);\n\n let titleElement = null;\n\n if (renderTitle != null && titleContent) {\n titleElement = React.createElement(PantheonTreeV2Renderer, {\n element: titleContent,\n componentMap,\n smartComponentMap,\n disableAllStyles: !!__experimentalFlags?.disableAllStyles,\n preserveImageStyles: !!__experimentalFlags?.preserveImageStyles,\n disableDefaultErrorBoundaries:\n !!__experimentalFlags?.disableDefaultErrorBoundaries,\n renderImageCaptions: __experimentalFlags?.renderImageCaptions !== false,\n cdnURLOverride: __experimentalFlags?.cdnURLOverride,\n });\n }\n\n const bodyNodes = renderTitle != null ? splitBodyNodes : nodes;\n\n const bodyElement = (\n <div className={bodyClassName}>\n {bodyNodes?.map((element, idx) =>\n React.createElement(PantheonTreeV2Renderer, {\n key: idx,\n element: {\n ...element,\n prevNode: bodyNodes[idx - 1],\n nextNode: bodyNodes[idx + 1],\n },\n smartComponentMap,\n componentMap,\n disableAllStyles: !!__experimentalFlags?.disableAllStyles,\n preserveImageStyles: !!__experimentalFlags?.preserveImageStyles,\n disableDefaultErrorBoundaries:\n !!__experimentalFlags?.disableDefaultErrorBoundaries,\n renderImageCaptions:\n __experimentalFlags?.renderImageCaptions !== false,\n cdnURLOverride: __experimentalFlags?.cdnURLOverride,\n }),\n )}\n </div>\n );\n\n return (\n <div className={containerClassName}>\n {titleElement != null ? (\n <div className={headerClassName}>\n {renderTitle\n ? renderTitle(titleElement, getTextContent(titleElement))\n : titleElement}\n </div>\n ) : null}\n {renderBody ? renderBody(bodyElement) : bodyElement}\n </div>\n );\n};\n\nexport default ArticleRenderer;\n"]}