{"version":3,"sources":["../src/vue/content/ContentstackRichText.ts"],"sourcesContent":["import { type PropType, type VNode, defineComponent, h } from \"vue\"\nimport type { RTEDocNode, RTENode, RTETextNode } from \"../../index.js\"\n\nexport type RichTextNodeRenderer = (node: RTENode, children: VNode[]) => VNode | null\n\nexport interface RichTextRenderers {\n  nodes?: Partial<Record<string, RichTextNodeRenderer>>\n  renderEntry?: (attrs: Record<string, unknown>, node: RTENode) => VNode | null\n  renderAsset?: (attrs: Record<string, unknown>, node: RTENode) => VNode | null\n}\n\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): VNode | string | null {\n  if (!node.text) return null\n  let content: VNode | string = node.text\n\n  if (node.bold) content = h(\"strong\", { key: `mark-b-${index}` }, content)\n  if (node.italic) content = h(\"em\", { key: `mark-i-${index}` }, content)\n  if (node.underline) content = h(\"u\", { key: `mark-u-${index}` }, content)\n  if (node.strikethrough) content = h(\"s\", { key: `mark-s-${index}` }, content)\n  if (node.code) content = h(\"code\", { key: `mark-c-${index}` }, content)\n  if (node.superscript) content = h(\"sup\", { key: `mark-sup-${index}` }, content)\n  if (node.subscript) content = h(\"sub\", { key: `mark-sub-${index}` }, content)\n\n  return content\n}\n\nconst DEFAULT_RENDERERS: Record<string, (node: RTENode, children: VNode[]) => VNode> = {\n  doc: (_node, children) => h(\"div\", { style: \"display:contents\" }, children),\n  p: (node, children) => h(\"p\", { key: node.uid }, children),\n  h1: (node, children) => h(\"h1\", { key: node.uid }, children),\n  h2: (node, children) => h(\"h2\", { key: node.uid }, children),\n  h3: (node, children) => h(\"h3\", { key: node.uid }, children),\n  h4: (node, children) => h(\"h4\", { key: node.uid }, children),\n  h5: (node, children) => h(\"h5\", { key: node.uid }, children),\n  h6: (node, children) => h(\"h6\", { key: node.uid }, children),\n  blockquote: (node, children) => h(\"blockquote\", { key: node.uid }, children),\n  ol: (node, children) => h(\"ol\", { key: node.uid }, children),\n  ul: (node, children) => h(\"ul\", { key: node.uid }, children),\n  li: (node, children) => h(\"li\", { key: node.uid }, children),\n  hr: (node) => h(\"hr\", { key: node.uid }),\n  img: (node) =>\n    h(\"img\", {\n      key: node.uid,\n      src: node.attrs?.src as string,\n      alt: (node.attrs?.alt as string) ?? \"\",\n    }),\n  a: (node, children) =>\n    h(\n      \"a\",\n      {\n        key: node.uid,\n        href: node.attrs?.href as string,\n        target: node.attrs?.target as string,\n      },\n      children,\n    ),\n  code: (node, children) => h(\"pre\", { key: node.uid }, [h(\"code\", null, children)]),\n  table: (node, children) => h(\"table\", { key: node.uid }, children),\n  thead: (node, children) => h(\"thead\", { key: node.uid }, children),\n  tbody: (node, children) => h(\"tbody\", { key: node.uid }, children),\n  tr: (node, children) => h(\"tr\", { key: node.uid }, children),\n  th: (node, children) => h(\"th\", { key: node.uid }, children),\n  td: (node, children) => h(\"td\", { key: node.uid }, children),\n}\n\nfunction renderNode(\n  node: RTENode | RTETextNode,\n  renderers: RichTextRenderers,\n  index: number,\n): VNode | string | null {\n  if (isTextNode(node)) {\n    return renderTextNode(node, index)\n  }\n\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  const childElements = node.children?.map((child, i) => renderNode(child, renderers, i)) ?? []\n  const children = childElements.filter((c): c is VNode | string => c !== null)\n\n  const customRenderer = renderers.nodes?.[node.type]\n  if (customRenderer) {\n    return customRenderer(node, children as VNode[])\n  }\n\n  const defaultRenderer = DEFAULT_RENDERERS[node.type]\n  if (defaultRenderer) {\n    return defaultRenderer(node, children as VNode[])\n  }\n\n  return children.length > 0 ? h(\"span\", null, children) : null\n}\n\nexport const ContentstackRichText = defineComponent({\n  name: \"ContentstackRichText\",\n  props: {\n    document: {\n      type: Object as PropType<RTEDocNode | null | undefined>,\n      default: undefined,\n    },\n    renderers: {\n      type: Object as PropType<RichTextRenderers>,\n      default: () => EMPTY_RENDERERS,\n    },\n    class: {\n      type: String,\n      default: undefined,\n    },\n  },\n  setup(props, { slots }) {\n    return () => {\n      if (!props.document) {\n        return slots.fallback?.() ?? null\n      }\n\n      const children =\n        props.document.children?.map((child, i) =>\n          renderNode(child, props.renderers ?? EMPTY_RENDERERS, i),\n        ) ?? []\n      const filtered = children.filter((c): c is VNode | string => c !== null)\n\n      if (props.class) {\n        return h(\"div\", { class: props.class }, filtered)\n      }\n\n      return filtered.length > 0 ? h(\"div\", { style: \"display:contents\" }, filtered) : null\n    }\n  },\n})\n"],"mappings":"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","names":[]}