{"version":3,"sources":["../src/react/content/ContentstackRichText.tsx"],"sourcesContent":["import type { ReactNode } from \"react\"\nimport type { RTEDocNode, RTENode, RTETextNode } from \"../../index.js\"\n\nexport type RichTextNodeRenderer = (node: RTENode, children: ReactNode) => ReactNode\n\nexport interface RichTextRenderers {\n  /** Override rendering for specific node types */\n  nodes?: Partial<Record<string, RichTextNodeRenderer>>\n  /** Render entry references */\n  renderEntry?: (attrs: Record<string, unknown>, node: RTENode) => ReactNode\n  /** Render asset references */\n  renderAsset?: (attrs: Record<string, unknown>, node: RTENode) => ReactNode\n}\n\nexport interface ContentstackRichTextProps {\n  /** The RTE document node from a CDA or CMA response */\n  document: RTEDocNode | null | undefined\n  /** Custom renderers for node types, entries, and assets */\n  renderers?: RichTextRenderers\n  /** Fallback content when document is null/undefined */\n  fallback?: ReactNode\n  /** CSS class applied to the wrapper div */\n  className?: string\n}\n\n/** Hoisted empty object to avoid new reference on every render (rerender-memo-with-default-value) */\nconst EMPTY_RENDERERS: RichTextRenderers = {}\n\nfunction isTextNode(node: RTENode | RTETextNode): node is RTETextNode {\n  return \"text\" in node\n}\n\nfunction renderTextNode(node: RTETextNode, index: number): ReactNode {\n  let content: ReactNode = node.text\n\n  if (!content) return null\n\n  if (node.bold) content = <strong key={`mark-b-${index}`}>{content}</strong>\n  if (node.italic) content = <em key={`mark-i-${index}`}>{content}</em>\n  if (node.underline) content = <u key={`mark-u-${index}`}>{content}</u>\n  if (node.strikethrough) content = <s key={`mark-s-${index}`}>{content}</s>\n  if (node.code) content = <code key={`mark-c-${index}`}>{content}</code>\n  if (node.superscript) content = <sup key={`mark-sup-${index}`}>{content}</sup>\n  if (node.subscript) content = <sub key={`mark-sub-${index}`}>{content}</sub>\n\n  return content\n}\n\nconst DEFAULT_RENDERERS: Record<string, (node: RTENode, children: ReactNode) => ReactNode> = {\n  doc: (_node, children) => <>{children}</>,\n  p: (node, children) => <p key={node.uid}>{children}</p>,\n  h1: (node, children) => <h1 key={node.uid}>{children}</h1>,\n  h2: (node, children) => <h2 key={node.uid}>{children}</h2>,\n  h3: (node, children) => <h3 key={node.uid}>{children}</h3>,\n  h4: (node, children) => <h4 key={node.uid}>{children}</h4>,\n  h5: (node, children) => <h5 key={node.uid}>{children}</h5>,\n  h6: (node, children) => <h6 key={node.uid}>{children}</h6>,\n  blockquote: (node, children) => <blockquote key={node.uid}>{children}</blockquote>,\n  ol: (node, children) => <ol key={node.uid}>{children}</ol>,\n  ul: (node, children) => <ul key={node.uid}>{children}</ul>,\n  li: (node, children) => <li key={node.uid}>{children}</li>,\n  hr: (node) => <hr key={node.uid} />,\n  img: (node) => (\n    <img key={node.uid} src={node.attrs?.src as string} alt={(node.attrs?.alt as string) ?? \"\"} />\n  ),\n  a: (node, children) => (\n    <a key={node.uid} href={node.attrs?.href as string} target={node.attrs?.target as string}>\n      {children}\n    </a>\n  ),\n  code: (node, children) => (\n    <pre key={node.uid}>\n      <code>{children}</code>\n    </pre>\n  ),\n  table: (node, children) => <table key={node.uid}>{children}</table>,\n  thead: (node, children) => <thead key={node.uid}>{children}</thead>,\n  tbody: (node, children) => <tbody key={node.uid}>{children}</tbody>,\n  tr: (node, children) => <tr key={node.uid}>{children}</tr>,\n  th: (node, children) => <th key={node.uid}>{children}</th>,\n  td: (node, children) => <td key={node.uid}>{children}</td>,\n}\n\nfunction renderNode(\n  node: RTENode | RTETextNode,\n  renderers: RichTextRenderers,\n  index: number,\n): ReactNode {\n  if (isTextNode(node)) {\n    return renderTextNode(node, index)\n  }\n\n  // Handle reference nodes\n  if (node.type === \"reference\" && node.attrs) {\n    if (node.attrs.type === \"entry\" && renderers.renderEntry) {\n      return renderers.renderEntry(node.attrs, node)\n    }\n    if (node.attrs.type === \"asset\" && renderers.renderAsset) {\n      return renderers.renderAsset(node.attrs, node)\n    }\n    return null\n  }\n\n  // Render children recursively\n  const childElements = node.children?.map((child, i) => renderNode(child, renderers, i))\n  const children: ReactNode = childElements ? <>{childElements}</> : null\n\n  // Check for custom renderer\n  const customRenderer = renderers.nodes?.[node.type]\n  if (customRenderer) {\n    return customRenderer(node, children)\n  }\n\n  // Fall back to defaults\n  const defaultRenderer = DEFAULT_RENDERERS[node.type]\n  if (defaultRenderer) {\n    return defaultRenderer(node, children)\n  }\n\n  // Unknown node type: render children only\n  return children\n}\n\nexport function ContentstackRichText({\n  document,\n  renderers = EMPTY_RENDERERS,\n  fallback = null,\n  className,\n}: ContentstackRichTextProps): React.JSX.Element {\n  if (!document) {\n    return <>{fallback}</>\n  }\n\n  const children = document.children?.map((child, i) => renderNode(child, renderers, i))\n\n  if (className) {\n    return <div className={className}>{children}</div>\n  }\n\n  return <>{children}</>\n}\n"],"mappings":"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","names":[]}