{"version":3,"file":"MarkdownProvider.mjs","names":[],"sources":["../../../src/markdown/MarkdownProvider.tsx"],"sourcesContent":["'use client';\n\nimport {\n  createContext,\n  type FC,\n  type HTMLAttributes,\n  type PropsWithChildren,\n  type ReactNode,\n  useContext,\n} from 'react';\nimport type { HTMLComponents } from '../html/HTMLComponentTypes';\nimport {\n  compileMarkdown,\n  type MarkdownRendererOptions,\n  type ParsedMarkdown,\n} from './processor';\n\nexport type MarkdownProviderOptions = {\n  /** Forces the compiler to always output content with a block-level wrapper. */\n  forceBlock?: boolean;\n  /** Forces the compiler to always output content with an inline wrapper. */\n  forceInline?: boolean;\n  /** Whether to preserve frontmatter in the markdown content. */\n  preserveFrontmatter?: boolean;\n  /** Whether to use the GitHub Tag Filter for security. */\n  tagfilter?: boolean;\n};\n\ntype MarkdownContextValue = {\n  components?: HTMLComponents<'permissive', {}>;\n  renderMarkdown: (\n    markdown: string | ParsedMarkdown,\n    options?: MarkdownProviderOptions,\n    components?: HTMLComponents<'permissive', {}>,\n    wrapper?: FC<HTMLAttributes<HTMLElement>>\n  ) => ReactNode | Promise<ReactNode>;\n};\n\ntype MarkdownProviderProps = PropsWithChildren<\n  MarkdownProviderOptions & {\n    components?: HTMLComponents<'permissive', {}>;\n    wrapper?: FC<HTMLAttributes<HTMLElement>>;\n    renderMarkdown?: (\n      markdown: string | ParsedMarkdown,\n      options?: MarkdownProviderOptions,\n      components?: HTMLComponents<'permissive', {}>,\n      wrapper?: FC<HTMLAttributes<HTMLElement>>\n    ) => ReactNode | Promise<ReactNode>;\n  }\n>;\n\nconst MarkdownContext = createContext<MarkdownContextValue | undefined>(\n  undefined\n);\n\n/**\n * Returns the raw `MarkdownProvider` context value — the active\n * `renderMarkdown` function plus any provider-level component overrides.\n * Returns `undefined` when called outside a `<MarkdownProvider>`.\n * Prefer `useMarkdownRenderer` for most use cases; use this hook only when\n * you need direct access to the context object itself.\n */\nexport const useMarkdownContext = () => useContext(MarkdownContext);\n\nconst mergeOptions = (\n  baseOptions: MarkdownRendererOptions,\n  options: MarkdownProviderOptions = {},\n  components: HTMLComponents<'permissive', {}> = {},\n  wrapper?: FC<HTMLAttributes<HTMLElement>>\n): MarkdownRendererOptions => {\n  return {\n    ...baseOptions,\n    ...options,\n    forceBlock: options.forceBlock ?? baseOptions.forceBlock,\n    forceInline: options.forceInline ?? baseOptions.forceInline,\n    preserveFrontmatter:\n      options.preserveFrontmatter ?? baseOptions.preserveFrontmatter,\n    tagfilter: options.tagfilter ?? baseOptions.tagfilter,\n    wrapper: wrapper || baseOptions.wrapper,\n\n    forceWrapper: !!(wrapper || baseOptions.wrapper),\n    components: { ...baseOptions.components, ...components },\n  };\n};\n\n/**\n * Provider for the MarkdownRenderer component.\n *\n * It will provide the `renderMarkdown` function to the context, which can be used to render markdown.\n *\n * ```tsx\n * const content = useIntlayer('app');\n *\n * return (\n *   <div>\n *     {content.markdown} // Will be rendered with the components and options provided to the MarkdownProvider\n *   </div>\n * );\n * ```\n *\n * @example\n * ```tsx\n * <MarkdownProvider components={{ h1: CustomHeading }}>\n *   <MarkdownRenderer>\n *     {markdownContent}\n *   </MarkdownRenderer>\n * </MarkdownProvider>\n * ```\n */\nexport const MarkdownProvider: FC<MarkdownProviderProps> = ({\n  children,\n  components,\n  wrapper,\n  forceBlock,\n  forceInline,\n  preserveFrontmatter,\n  tagfilter,\n  renderMarkdown: customRenderFn,\n}) => {\n  const baseOptions: MarkdownRendererOptions = {\n    components,\n    forceBlock,\n    forceInline,\n    wrapper,\n    forceWrapper: !!wrapper,\n    preserveFrontmatter,\n    tagfilter,\n  };\n\n  // Standard internal renderer\n  const defaultRenderMarkdown = (\n    markdown: string | ParsedMarkdown,\n    options?: MarkdownProviderOptions,\n    components?: HTMLComponents<'permissive', {}>,\n    wrapper?: FC<HTMLAttributes<HTMLElement>>\n  ) => {\n    const mergedOptions = mergeOptions(\n      baseOptions,\n      options,\n      components,\n      wrapper\n    );\n\n    return compileMarkdown(markdown, mergedOptions);\n  };\n\n  // Wrapper for user-provided custom renderer\n  // Note: We wrap in a clean Provider to prevent infinite recursion\n  const customRenderMarkdownWrapper = (\n    markdown: string | ParsedMarkdown,\n    options?: MarkdownProviderOptions,\n    components?: HTMLComponents<'permissive', {}>,\n    wrapper?: FC<HTMLAttributes<HTMLElement>>\n  ) => (\n    <MarkdownContext.Provider value={undefined}>\n      {customRenderFn?.(markdown, options, components, wrapper) as ReactNode}\n    </MarkdownContext.Provider>\n  );\n\n  return (\n    <MarkdownContext.Provider\n      value={{\n        components,\n        renderMarkdown: customRenderFn\n          ? customRenderMarkdownWrapper\n          : defaultRenderMarkdown,\n      }}\n    >\n      {children}\n    </MarkdownContext.Provider>\n  );\n};\n"],"mappings":";;;;;;;AAmDA,MAAM,kBAAkB,cACtB,OACD;;;;;;;;AASD,MAAa,2BAA2B,WAAW,gBAAgB;AAEnE,MAAM,gBACJ,aACA,UAAmC,EAAE,EACrC,aAA+C,EAAE,EACjD,YAC4B;AAC5B,QAAO;EACL,GAAG;EACH,GAAG;EACH,YAAY,QAAQ,cAAc,YAAY;EAC9C,aAAa,QAAQ,eAAe,YAAY;EAChD,qBACE,QAAQ,uBAAuB,YAAY;EAC7C,WAAW,QAAQ,aAAa,YAAY;EAC5C,SAAS,WAAW,YAAY;EAEhC,cAAc,CAAC,EAAE,WAAW,YAAY;EACxC,YAAY;GAAE,GAAG,YAAY;GAAY,GAAG;GAAY;EACzD;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BH,MAAa,oBAA+C,EAC1D,UACA,YACA,SACA,YACA,aACA,qBACA,WACA,gBAAgB,qBACZ;CACJ,MAAM,cAAuC;EAC3C;EACA;EACA;EACA;EACA,cAAc,CAAC,CAAC;EAChB;EACA;EACD;CAGD,MAAM,yBACJ,UACA,SACA,YACA,YACG;AAQH,SAAO,gBAAgB,UAPD,aACpB,aACA,SACA,YACA,QAG4C,CAAC;;CAKjD,MAAM,+BACJ,UACA,SACA,YACA,YAEA,oBAAC,gBAAgB,UAAjB;EAA0B,OAAO;YAC9B,iBAAiB,UAAU,SAAS,YAAY,QAAQ;EAChC;AAG7B,QACE,oBAAC,gBAAgB,UAAjB;EACE,OAAO;GACL;GACA,gBAAgB,iBACZ,8BACA;GACL;EAEA;EACwB"}