mirror of
https://github.com/siteboon/claudecodeui.git
synced 2026-06-16 20:32:00 +08:00
53 lines
1.8 KiB
TypeScript
53 lines
1.8 KiB
TypeScript
import { useMemo } from 'react';
|
|
import type { Components } from 'react-markdown';
|
|
import ReactMarkdown from 'react-markdown';
|
|
import rehypeKatex from 'rehype-katex';
|
|
import remarkGfm from 'remark-gfm';
|
|
import remarkMath from 'remark-math';
|
|
import MarkdownCodeBlock from './MarkdownCodeBlock';
|
|
|
|
type MarkdownPreviewProps = {
|
|
content: string;
|
|
};
|
|
|
|
const markdownPreviewComponents: Components = {
|
|
code: MarkdownCodeBlock,
|
|
blockquote: ({ children }) => (
|
|
<blockquote className="border-l-4 border-gray-300 dark:border-gray-600 pl-4 italic text-gray-600 dark:text-gray-400 my-2">
|
|
{children}
|
|
</blockquote>
|
|
),
|
|
a: ({ href, children }) => (
|
|
<a href={href} className="text-blue-600 dark:text-blue-400 hover:underline" target="_blank" rel="noopener noreferrer">
|
|
{children}
|
|
</a>
|
|
),
|
|
table: ({ children }) => (
|
|
<div className="overflow-x-auto my-2">
|
|
<table className="min-w-full border-collapse border border-gray-200 dark:border-gray-700">{children}</table>
|
|
</div>
|
|
),
|
|
thead: ({ children }) => <thead className="bg-gray-50 dark:bg-gray-800">{children}</thead>,
|
|
th: ({ children }) => (
|
|
<th className="px-3 py-2 text-left text-sm font-semibold border border-gray-200 dark:border-gray-700">{children}</th>
|
|
),
|
|
td: ({ children }) => (
|
|
<td className="px-3 py-2 align-top text-sm border border-gray-200 dark:border-gray-700">{children}</td>
|
|
),
|
|
};
|
|
|
|
export default function MarkdownPreview({ content }: MarkdownPreviewProps) {
|
|
const remarkPlugins = useMemo(() => [remarkGfm, remarkMath], []);
|
|
const rehypePlugins = useMemo(() => [rehypeKatex], []);
|
|
|
|
return (
|
|
<ReactMarkdown
|
|
remarkPlugins={remarkPlugins}
|
|
rehypePlugins={rehypePlugins}
|
|
components={markdownPreviewComponents}
|
|
>
|
|
{content}
|
|
</ReactMarkdown>
|
|
);
|
|
}
|