{"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"]}