{"version":3,"sources":["../../../src/renderers/react/functions/build-renderer-config.ts","../../../src/renderers/react/functions/resolve-config.ts","../../../src/renderers/react/types/react-props.ts","../../../src/renderers/react/react-renderer.ts"],"names":["createElement","getLayoutClasses","resolveCodeBlockLines","DEFAULT_MARK_PRIORITIES","getHeaderLevel","resolveCodeBlockMeta","resolveCheckedState","getListType","getTableRow","resolveImageData","resolveVideoSrc","resolveFormulaText","resolveMentionData","boldMark","italicMark","underlineMark","strikeMark","codeMark","scriptMark","resolveLinkMeta","isValidElement","cloneElement","BaseRenderer"],"mappings":"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","file":"index.cjs","sourcesContent":["import { type ComponentType, createElement, type ReactNode } from 'react';\nimport { DEFAULT_MARK_PRIORITIES } from '../../../common/default-mark-priorities';\nimport type { RendererConfig, TNode } from '../../../core/ast-types';\nimport { getHeaderLevel, getListType, getTableRow } from '../../common/node-attributes';\nimport {\n  resolveCheckedState,\n  resolveCodeBlockMeta,\n  resolveLinkMeta,\n} from '../../common/resolve-block-meta';\nimport { resolveCodeBlockLines } from '../../common/resolve-code-block-lines';\nimport {\n  resolveFormulaText,\n  resolveImageData,\n  resolveVideoSrc,\n} from '../../common/resolve-embed-data';\nimport { resolveMentionData } from '../../common/resolve-mention-data';\nimport {\n  boldMark,\n  codeMark,\n  italicMark,\n  scriptMark,\n  strikeMark,\n  underlineMark,\n} from '../../common/simple-marks';\nimport { getLayoutClasses } from '../../html/common/get-layout-classes';\nimport type { BlockComponentProps, ResolvedReactConfig } from '../types/react-config';\nimport type { ReactProps } from '../types/react-props';\n\n// ─── Helpers ────────────────────────────────────────────────────────────────\n\n/**\n * Resolve the tag name for a block, checking customTag first.\n */\nfunction resolveTag(\n  cfg: ResolvedReactConfig,\n  format: string,\n  node: TNode,\n  defaultTag: string,\n): string {\n  return cfg.customTag?.(format, node) ?? defaultTag;\n}\n\ntype BlockFn = (node: TNode, children: ReactNode, resolvedAttrs: ReactProps) => ReactNode;\n\n/**\n * Configuration for a block handler that extracts data once and shares it\n * between the default render path and the custom-component path.\n */\ninterface BlockWithData<TData> {\n  /** Extract block-specific data from the node. Called exactly once per render. */\n  resolve: (node: TNode, children: ReactNode) => TData;\n  /** Default render using extracted data. */\n  render: (data: TData, node: TNode, children: ReactNode, resolvedAttrs: ReactProps) => ReactNode;\n  /** Convert extracted data to extra props for a custom component. */\n  toProps?: (data: TData) => Record<string, unknown> | undefined;\n}\n\n/**\n * Wrap a block handler so that a custom component (if registered) is rendered\n * instead of the default element.\n *\n * Simple form: `withCustomComponent(cfg, type, handler)` — no data extraction.\n * Data form: `withCustomComponent(cfg, type, { resolve, render, toProps })` —\n * extracts data once and passes it to both the default and custom-component paths.\n */\nfunction withCustomComponent<TData>(\n  cfg: ResolvedReactConfig,\n  type: string,\n  configOrHandler: BlockWithData<TData> | BlockFn,\n): BlockFn {\n  if (typeof configOrHandler === 'function') {\n    const handler = configOrHandler;\n    return (node, children, resolvedAttrs) => {\n      const Component: ComponentType<BlockComponentProps> | undefined = cfg.components[type];\n      if (Component) {\n        return createElement(Component, { node, children });\n      }\n      return handler(node, children, resolvedAttrs);\n    };\n  }\n\n  const { resolve, render, toProps } = configOrHandler;\n  return (node, children, resolvedAttrs) => {\n    const data = resolve(node, children);\n    const Component: ComponentType<BlockComponentProps> | undefined = cfg.components[type];\n    if (Component) {\n      const extra = toProps?.(data);\n      return createElement(Component, { node, children, ...extra });\n    }\n    return render(data, node, children, resolvedAttrs);\n  };\n}\n\n/**\n * Run the configured URL sanitizer, returning `undefined` for rejected URLs.\n * If no sanitizer is configured, all URLs pass through unchanged.\n */\nfunction sanitizeUrl(url: string, cfg: ResolvedReactConfig): string | undefined {\n  if (cfg.urlSanitizer) {\n    return cfg.urlSanitizer(url);\n  }\n  return url;\n}\n\n/**\n * React equivalent of HTML renderers' `children || '<br/>'` behavior.\n * Keeps empty block lines visible and structurally consistent.\n */\nfunction withEmptyBlockPlaceholder(children: ReactNode): ReactNode {\n  if (children === null || children === undefined || children === false || children === '') {\n    return createElement('br');\n  }\n  return children;\n}\n\n/**\n * Build a props object with layout classes (indent, align, direction) for a block node.\n * Returns `null` when there are no layout classes.\n */\nfunction buildLayoutProps(\n  node: TNode,\n  cfg: ResolvedReactConfig,\n  skipIndent?: boolean,\n): Record<string, unknown> | null {\n  let classes = getLayoutClasses(node, cfg.classPrefix);\n  if (skipIndent) {\n    const indentPrefix = `${cfg.classPrefix}-indent-`;\n    classes = classes.filter((c) => !c.startsWith(indentPrefix));\n  }\n  return classes.length > 0 ? { className: classes.join(' ') } : null;\n}\n\n// ─── Node Override Helpers ─────────────────────────────────────────────────\n\nfunction renderCodeBlockContainer(node: TNode): ReactNode {\n  const { language, lines } = resolveCodeBlockLines(node);\n\n  const linesWithNewlines = lines.map((text, i) => (i < lines.length - 1 ? `${text}\\n` : text));\n\n  const props: Record<string, unknown> = {};\n  if (language) {\n    props.className = `language-${language}`;\n    props['data-language'] = language;\n  }\n\n  return createElement('pre', Object.keys(props).length > 0 ? props : null, ...linesWithNewlines);\n}\n\n// ─── Builder ────────────────────────────────────────────────────────────────\n\n/**\n * Build a full `RendererConfig<ReactNode, ReactProps>` from the resolved config.\n *\n * Defines all block handlers (paragraph, header, blockquote, code-block,\n * list, list-item, table, image, video, formula, mention) and mark handlers\n * (bold, italic, underline, strike, link, script, code, font, size).\n *\n * Marks reuse the framework-agnostic `SimpleTagMark` descriptors from\n * `renderers/common/simple-marks.ts` — the `BaseRenderer` calls `renderSimpleTag()`\n * which the React renderer implements with `createElement`.\n *\n * Color and background are defined as `attributors` — they contribute\n * styles to the nearest element mark rather than wrapping.\n *\n * Node overrides handle `code-block-container` which needs custom rendering\n * not expressible as a simple block handler.\n */\nexport function buildRendererConfig(\n  cfg: ResolvedReactConfig,\n): RendererConfig<ReactNode, ReactProps> {\n  return {\n    markPriorities: DEFAULT_MARK_PRIORITIES,\n\n    nodeOverrides: {\n      'line-break': () => createElement('br'),\n\n      'code-block-container': (node) => renderCodeBlockContainer(node),\n    },\n\n    blocks: {\n      paragraph: withCustomComponent(cfg, 'paragraph', (node, children) => {\n        const tag = resolveTag(cfg, 'paragraph', node, 'p');\n        return createElement(tag, buildLayoutProps(node, cfg), withEmptyBlockPlaceholder(children));\n      }),\n\n      header: withCustomComponent(cfg, 'header', (node, children) => {\n        const level = getHeaderLevel(node);\n        const tag = resolveTag(cfg, 'header', node, `h${level}`);\n        return createElement(tag, buildLayoutProps(node, cfg), withEmptyBlockPlaceholder(children));\n      }),\n\n      blockquote: withCustomComponent(cfg, 'blockquote', (node, children) => {\n        const tag = resolveTag(cfg, 'blockquote', node, 'blockquote');\n        return createElement(tag, buildLayoutProps(node, cfg), withEmptyBlockPlaceholder(children));\n      }),\n\n      'code-block': withCustomComponent(cfg, 'code-block', {\n        resolve: (node) => resolveCodeBlockMeta(node, cfg.classPrefix),\n        render: (meta, node, children) => {\n          const props: Record<string, unknown> = { className: meta.className };\n          if (meta.language) props['data-language'] = meta.language;\n          const tag = resolveTag(cfg, 'code-block', node, 'pre');\n          return createElement(tag, props, withEmptyBlockPlaceholder(children));\n        },\n        toProps: (meta) => {\n          const props: Record<string, unknown> = { className: meta.className };\n          if (meta.language) props['data-language'] = meta.language;\n          return props;\n        },\n      }),\n\n      'list-item': withCustomComponent(cfg, 'list-item', {\n        resolve: (node) => resolveCheckedState(node),\n        render: (checked, node, children) => {\n          const props: Record<string, unknown> = {\n            ...buildLayoutProps(node, cfg, true),\n          };\n          if (checked !== undefined) props['data-checked'] = checked;\n          const tag = resolveTag(cfg, 'list-item', node, 'li');\n          return createElement(\n            tag,\n            Object.keys(props).length > 0 ? props : null,\n            withEmptyBlockPlaceholder(children),\n          );\n        },\n        toProps: (checked) => {\n          if (checked !== undefined) return { 'data-checked': checked };\n          return undefined;\n        },\n      }),\n\n      list: withCustomComponent(cfg, 'list', (node, children) => {\n        const listType = getListType(node);\n        const tag = listType === 'ordered' ? 'ol' : 'ul';\n        return createElement(tag, null, children);\n      }),\n\n      table: withCustomComponent(cfg, 'table', (_node, children) => {\n        return createElement('table', null, createElement('tbody', null, children));\n      }),\n\n      'table-row': withCustomComponent(cfg, 'table-row', (_node, children) => {\n        return createElement('tr', null, children);\n      }),\n\n      'table-cell': withCustomComponent(cfg, 'table-cell', {\n        resolve: (node) => getTableRow(node),\n        render: (row, _node, children) => {\n          const props: Record<string, unknown> = {};\n          if (row) props['data-row'] = row;\n          return createElement('td', Object.keys(props).length > 0 ? props : null, children);\n        },\n        toProps: (row) => {\n          if (row) return { 'data-row': row };\n          return undefined;\n        },\n      }),\n\n      image: withCustomComponent(cfg, 'image', {\n        resolve: (node) => resolveImageData(node),\n        render: (img) => {\n          if (!img) return null;\n\n          const imgProps: Record<string, unknown> = {\n            className: `${cfg.classPrefix}-image`,\n            src: img.src,\n          };\n          if (img.alt) imgProps.alt = img.alt;\n          if (img.width) imgProps.width = img.width;\n          if (img.height) imgProps.height = img.height;\n\n          const imgElement = createElement('img', imgProps);\n\n          if (img.linkHref) {\n            const sanitizedLink = sanitizeUrl(img.linkHref, cfg);\n            if (!sanitizedLink) return imgElement;\n            const linkProps: Record<string, unknown> = { href: sanitizedLink };\n            if (cfg.linkTarget) linkProps.target = cfg.linkTarget;\n            if (cfg.linkRel) linkProps.rel = cfg.linkRel;\n            return createElement('a', linkProps, imgElement);\n          }\n\n          return imgElement;\n        },\n        toProps: (img) => {\n          if (!img) return undefined;\n          const props: Record<string, unknown> = { src: img.src };\n          if (img.alt) props.alt = img.alt;\n          if (img.width) props.width = img.width;\n          if (img.height) props.height = img.height;\n          return props;\n        },\n      }),\n\n      video: withCustomComponent(cfg, 'video', {\n        resolve: (node) => resolveVideoSrc(node),\n        render: (src) => {\n          if (!src) return null;\n          return createElement('iframe', {\n            className: `${cfg.classPrefix}-video`,\n            src,\n            frameBorder: '0',\n            allowFullScreen: true,\n          });\n        },\n        toProps: (src) => {\n          if (!src) return undefined;\n          return { src, className: `${cfg.classPrefix}-video` };\n        },\n      }),\n\n      formula: withCustomComponent(cfg, 'formula', {\n        resolve: (node) => resolveFormulaText(node),\n        render: (text) => {\n          const formulaClass = `${cfg.classPrefix}-formula`;\n          return createElement('span', { className: formulaClass }, text);\n        },\n        toProps: (text) => ({ className: `${cfg.classPrefix}-formula`, text }),\n      }),\n\n      mention: withCustomComponent(cfg, 'mention', {\n        resolve: (node) => resolveMentionData(node),\n        render: (mention) => {\n          const linkProps: Record<string, unknown> = { href: mention.href };\n          if (mention.className) linkProps.className = mention.className;\n          if (mention.target) linkProps.target = mention.target;\n          return createElement('a', linkProps, mention.name);\n        },\n        toProps: (mention) => {\n          const props: Record<string, unknown> = { href: mention.href };\n          if (mention.className) props.className = mention.className;\n          if (mention.target) props.target = mention.target;\n          return props;\n        },\n      }),\n    },\n\n    // ─── Element Marks (create wrapper elements) ─────────────────────────\n    // Reuse SimpleTagMark descriptors — BaseRenderer calls renderSimpleTag()\n    marks: {\n      bold: boldMark,\n      italic: italicMark,\n      underline: underlineMark,\n      strike: strikeMark,\n      code: codeMark,\n      script: scriptMark,\n\n      link: (content, value, node) => {\n        const rawHref = String(value);\n        if (!rawHref) return content;\n\n        const href = sanitizeUrl(rawHref, cfg);\n        if (!href) return content;\n\n        const meta = resolveLinkMeta(node, cfg.linkTarget, cfg.linkRel);\n        const linkProps: Record<string, unknown> = { href };\n        if (meta.target) linkProps.target = meta.target;\n        if (meta.rel) linkProps.rel = meta.rel;\n\n        return createElement('a', linkProps, content);\n      },\n\n      font: (content, value) => {\n        const className = `${cfg.classPrefix}-font-${String(value)}`;\n        return createElement('span', { className }, content);\n      },\n\n      size: (content, value) => {\n        const className = `${cfg.classPrefix}-size-${String(value)}`;\n        return createElement('span', { className }, content);\n      },\n    },\n\n    // ─── Attributor Marks (contribute attrs to parent element) ───────────\n    attributors: {\n      color: (value) => ({\n        style: { color: String(value) },\n      }),\n\n      background: (value) => ({\n        style: { backgroundColor: String(value) },\n      }),\n    },\n  };\n}\n","import type { ReactRendererConfig, ResolvedReactConfig } from '../types/react-config';\n\n/**\n * Resolves a partial `ReactRendererConfig` into a fully-populated\n * `ResolvedReactConfig` by applying defaults for all missing values.\n */\nexport function resolveConfig(config?: ReactRendererConfig): ResolvedReactConfig {\n  const c = config ?? {};\n\n  return {\n    classPrefix: c.classPrefix ?? 'ql',\n    linkTarget: c.linkTarget ?? '_blank',\n    linkRel: c.linkRel,\n    components: c.components ?? {},\n    customTag: c.customTag,\n    urlSanitizer: c.urlSanitizer,\n  };\n}\n","import type { CSSProperties } from 'react';\n\n/**\n * React-specific collected attributes.\n *\n * Used by the inline attributor system (marks that contribute styles/classes\n * to the parent element) and block attribute resolvers in React renderers.\n *\n * Analogous to {@link ResolvedAttrs} in the HTML renderers, but uses\n * React conventions (`className`, camelCase `CSSProperties`).\n */\nexport interface ReactProps {\n  /** React inline styles (camelCase keys). */\n  style?: CSSProperties;\n  /** CSS class names (space-separated string). */\n  className?: string;\n  /** Arbitrary props for extensibility (`data-*`, `aria-*`, etc.). */\n  [key: string]: unknown;\n}\n\n/**\n * An empty `ReactProps` constant — avoids allocating a new object\n * every time a resolver has nothing to contribute.\n */\nexport const EMPTY_REACT_PROPS: ReactProps = Object.freeze({});\n\n/**\n * Merge two `ReactProps` objects. Styles are shallow-merged (source wins on\n * conflict). ClassNames are concatenated. Other props are shallow-merged.\n *\n * Returns a new object — inputs are not mutated.\n */\nexport function mergeReactProps(target: ReactProps, source: ReactProps): ReactProps {\n  const result: ReactProps = { ...target };\n\n  // Merge styles\n  if (source.style || target.style) {\n    result.style = { ...target.style, ...source.style };\n  }\n\n  // Concatenate classNames\n  if (source.className || target.className) {\n    const parts = [target.className, source.className].filter(Boolean);\n    result.className = parts.join(' ');\n  }\n\n  // Merge remaining props (skip style/className as they're handled above)\n  for (const [key, value] of Object.entries(source)) {\n    if (key !== 'style' && key !== 'className') {\n      result[key] = value;\n    }\n  }\n\n  return result;\n}\n\n/**\n * Check whether a `ReactProps` object has any meaningful content.\n */\nexport function hasReactProps(props: ReactProps): boolean {\n  if (props.style && Object.keys(props.style).length > 0) return true;\n  if (props.className) return true;\n\n  for (const key of Object.keys(props)) {\n    if (key !== 'style' && key !== 'className') return true;\n  }\n\n  return false;\n}\n","import { cloneElement, createElement, isValidElement, type ReactNode } from 'react';\nimport type { BlockDescriptor, TNode } from '../../core/ast-types';\nimport { BaseRenderer } from '../../core/base-renderer';\nimport { buildRendererConfig } from './functions/build-renderer-config';\nimport { resolveConfig } from './functions/resolve-config';\nimport type { ReactRendererConfig } from './types/react-config';\nimport type { ReactProps } from './types/react-props';\nimport { EMPTY_REACT_PROPS, hasReactProps, mergeReactProps } from './types/react-props';\n\n// ─── Helpers ────────────────────────────────────────────────────────────────\n\n/**\n * Assign a React key to an element. Strings and other non-element\n * children are returned as-is (React handles them natively in arrays).\n */\nfunction withKey(child: ReactNode, index: number): ReactNode {\n  return isValidElement(child) ? cloneElement(child, { key: index }) : child;\n}\n\n// ─── Renderer ───────────────────────────────────────────────────────────────\n\n/**\n * Renders an AST into React elements (no `dangerouslySetInnerHTML`).\n *\n * Produces elements structurally equivalent to the SemanticHtmlRenderer\n * output, using standard HTML tag names and React conventions\n * (`className`, camelCase styles).\n *\n * Requires `react` as a peer dependency.\n *\n * @example\n * ```tsx\n * import { ReactRenderer } from 'quill-delta-renderer/react';\n *\n * const renderer = new ReactRenderer();\n * const element = renderer.render(ast);\n * return <div>{element}</div>;\n * ```\n *\n * @example\n * ```tsx\n * // With custom components\n * const renderer = new ReactRenderer({\n *   components: {\n *     paragraph: ({ children }) => <div className=\"my-p\">{children}</div>,\n *     image: ({ node }) => <CustomImage src={node.data} />,\n *   },\n * });\n * ```\n *\n * @example\n * ```tsx\n * // Extend with custom embed\n * const renderer = new ReactRenderer().withBlock('user_mention', (node) => {\n *   const data = node.data as Record<string, unknown>;\n *   return createElement('a', { href: `#user_mention#${data.id}` }, `@${data.name}`);\n * });\n * ```\n */\nexport class ReactRenderer extends BaseRenderer<ReactNode, ReactProps> {\n  constructor(config?: ReactRendererConfig) {\n    const cfg = resolveConfig(config);\n    super(buildRendererConfig(cfg));\n  }\n\n  // ─── BaseRenderer Abstract Methods ────────────────────────────────────────\n\n  protected joinChildren(children: ReactNode[]): ReactNode {\n    if (children.length === 0) return null;\n    if (children.length === 1) return children[0]!;\n\n    // Assign keys to React elements in arrays to avoid React warnings\n    return children.map(withKey);\n  }\n\n  protected renderText(text: string): ReactNode {\n    // React handles text escaping natively\n    return text;\n  }\n\n  protected emptyAttrs(): ReactProps {\n    return EMPTY_REACT_PROPS;\n  }\n\n  protected mergeAttrs(target: ReactProps, source: ReactProps): ReactProps {\n    return mergeReactProps(target, source);\n  }\n\n  protected hasAttrs(attrs: ReactProps): boolean {\n    return hasReactProps(attrs);\n  }\n\n  protected wrapWithAttrs(content: ReactNode, attrs: ReactProps): ReactNode {\n    return createElement('span', attrs, content);\n  }\n\n  protected renderSimpleTag(\n    tag: string,\n    content: ReactNode,\n    collectedAttrs?: ReactProps,\n  ): ReactNode {\n    const props = collectedAttrs && hasReactProps(collectedAttrs) ? collectedAttrs : null;\n    return createElement(tag, props, content);\n  }\n\n  protected renderBlockFromDescriptor(\n    descriptor: BlockDescriptor,\n    node: TNode,\n    childrenOutput: ReactNode,\n    resolvedAttrs: ReactProps,\n  ): ReactNode {\n    const tag = typeof descriptor.tag === 'function' ? descriptor.tag(node) : descriptor.tag;\n    const props = hasReactProps(resolvedAttrs) ? resolvedAttrs : null;\n\n    if (descriptor.selfClosing) {\n      return createElement(tag, props);\n    }\n\n    return createElement(tag, props, childrenOutput || null);\n  }\n}\n"]}