import React from "react"; import { Editor } from "@tiptap/react"; import { AlignCenter, AlignJustify, AlignLeft, AlignRight, BoldIcon, CodeIcon, Heading1, Heading2, Heading3, Heading4, Heading5, Heading6, ItalicIcon, ListIcon, ListOrderedIcon, QuoteIcon, UnderlineIcon, Strikethrough, Highlighter, Link, Image, Table, CheckSquare, Minus, Type, Palette, AlignVerticalJustifyCenter, AlignVerticalJustifyStart, AlignVerticalJustifyEnd, Code2, List, Hash, Quote, Bold, Italic, Underline, Strikethrough as StrikeIcon, Highlighter as HighlightIcon, Link as LinkIcon, Image as ImageIcon, Table as TableIcon, CheckSquare as CheckIcon, Minus as MinusIcon, Type as TypeIcon, Palette as PaletteIcon, } from "lucide-react"; import classNames from "classnames"; import { ToolbarButtonProps } from "./types"; const ToolbarButton: React.FC = ({ onClick, isActive, disabled = false, children, title, }) => ( ); interface ToolbarProps { editor: Editor | null; } export const Toolbar: React.FC = ({ editor }) => { if (!editor) { return null; } return (
{/* Text formatting */} editor.chain().focus().toggleBold().run()} isActive={editor.isActive("bold")} title="Bold (Ctrl+B)" > editor.chain().focus().toggleItalic().run()} isActive={editor.isActive("italic")} title="Italic (Ctrl+I)" > editor.chain().focus().toggleUnderline().run()} isActive={editor.isActive("underline")} title="Underline (Ctrl+U)" > editor.chain().focus().toggleStrike().run()} isActive={editor.isActive("strike")} title="Strikethrough" > editor.chain().focus().toggleCode().run()} isActive={editor.isActive("code")} title="Code (Ctrl+`)" > editor.chain().focus().toggleHighlight().run()} isActive={editor.isActive("highlight")} title="Highlight" >
{/* Headings */} editor.chain().focus().toggleHeading({ level: 1 }).run()} isActive={editor.isActive("heading", { level: 1 })} title="Heading 1" > editor.chain().focus().toggleHeading({ level: 2 }).run()} isActive={editor.isActive("heading", { level: 2 })} title="Heading 2" > editor.chain().focus().toggleHeading({ level: 3 }).run()} isActive={editor.isActive("heading", { level: 3 })} title="Heading 3" > editor.chain().focus().toggleHeading({ level: 4 }).run()} isActive={editor.isActive("heading", { level: 4 })} title="Heading 4" > editor.chain().focus().toggleHeading({ level: 5 }).run()} isActive={editor.isActive("heading", { level: 5 })} title="Heading 5" > editor.chain().focus().toggleHeading({ level: 6 }).run()} isActive={editor.isActive("heading", { level: 6 })} title="Heading 6" >
{/* Lists and blocks */} editor.chain().focus().toggleBulletList().run()} isActive={editor.isActive("bulletList")} title="Bullet List" > editor.chain().focus().toggleOrderedList().run()} isActive={editor.isActive("orderedList")} title="Numbered List" > editor.chain().focus().toggleTaskList().run()} isActive={editor.isActive("taskList")} title="Task List" > editor.chain().focus().toggleBlockquote().run()} isActive={editor.isActive("blockquote")} title="Blockquote" > editor.chain().focus().setHorizontalRule().run()} isActive={false} title="Horizontal Rule" >
{/* Text alignment */} editor.chain().focus().setTextAlign("left").run()} isActive={editor.isActive({ textAlign: "left" })} title="Align Left" > editor.chain().focus().setTextAlign("center").run()} isActive={editor.isActive({ textAlign: "center" })} title="Align Center" > editor.chain().focus().setTextAlign("right").run()} isActive={editor.isActive({ textAlign: "right" })} title="Align Right" > editor.chain().focus().setTextAlign("justify").run()} isActive={editor.isActive({ textAlign: "justify" })} title="Justify" >
{/* Media and links */} { const url = window.prompt("Enter URL:"); if (url) { editor.chain().focus().setLink({ href: url }).run(); } }} isActive={editor.isActive("link")} title="Add Link" > { const url = window.prompt("Enter image URL:"); if (url) { editor.chain().focus().setImage({ src: url }).run(); } }} isActive={false} title="Add Image" > editor .chain() .focus() .insertTable({ rows: 3, cols: 3, withHeaderRow: true }) .run() } isActive={editor.isActive("table")} title="Insert Table" >
{/* Code blocks */} editor.chain().focus().toggleCodeBlock().run()} isActive={editor.isActive("codeBlock")} title="Code Block" > {/* Font styling */} { editor.chain().focus().setColor(e.target.value).run(); }} title="Text Color" /> { editor.chain().focus().setHighlight({ color: e.target.value }).run(); }} title="Highlight Color" />
); };