import { useEditor, EditorContent } from "@tiptap/react"; import StarterKit from "@tiptap/starter-kit"; import Placeholder from "@tiptap/extension-placeholder"; import { Markdown } from "tiptap-markdown"; import { ListKit } from "@tiptap/extension-list"; import "./tiptap.css"; // @ts-ignore import BoldIcon from "../assets/fontawesome/svg/bold.svg?react"; // @ts-ignore import ItalicIcon from "../assets/fontawesome/svg/italic.svg?react"; // @ts-ignore import StrikethroughIcon from "../assets/fontawesome/svg/strikethrough.svg?react"; // @ts-ignore import CodeIcon from "../assets/fontawesome/svg/code.svg?react"; // @ts-ignore import ListUlIcon from "../assets/fontawesome/svg/list-ul.svg?react"; // @ts-ignore import ListOlIcon from "../assets/fontawesome/svg/list-ol.svg?react"; // @ts-ignore import SquareCheckIcon from "../assets/fontawesome/svg/square-check.svg?react"; // @ts-ignore import CodeBracketIcon from "../assets/fontawesome/svg/code-simple.svg?react"; // @ts-ignore import QuoteLeftIcon from "../assets/fontawesome/svg/quote-left.svg?react"; interface TiptapEditorProps { content: string; onChange: (markdown: string) => void; placeholder?: string; } export const TiptapEditor = ({ placeholder, content, onChange, }: TiptapEditorProps) => { const editor = useEditor({ extensions: [ ListKit, StarterKit.configure({ heading: { levels: [1, 2, 3, 4, 5, 6], }, codeBlock: { HTMLAttributes: { class: "code-block", }, }, bulletList: false, orderedList: false, listItem: false, listKeymap: false, }), Placeholder.configure({ placeholder: placeholder || "Start writing...", }), Markdown.configure({ html: false, transformPastedText: true, transformCopiedText: true, }), ], content, editorProps: { attributes: { class: "prose prose-invert max-w-none focus:outline-none", }, }, onUpdate: ({ editor }) => { const markdown = ( editor.storage as Record ).markdown.getMarkdown(); onChange(markdown); }, }); if (!editor) { return null; } return (
{/* Toolbar */} {/*
*/} {/* Editor content */}
); };