"use client"; import type { ReactNode } from "react"; import type { Editor } from "@tiptap/react"; import { Bold, Italic, Underline, Strikethrough, Code, Highlighter, ChevronDown, List, ListOrdered, ListTodo, AlignLeft, AlignCenter, AlignRight, ImageIcon, Minus, Table2, Undo2, Redo2, Heading1, Heading2, Heading3, Pilcrow, SquareCode, } from "lucide-react"; import { cn } from "@/lib/utils"; import { Button } from "@/components/ui/button"; import { Separator } from "@/components/ui/separator"; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, } from "@/components/ui/tooltip"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; function ch(editor: Editor) { // eslint-disable-next-line @typescript-eslint/no-explicit-any return editor.chain().focus() as any; } type EditorToolbarProps = { editor: Editor | null; className?: string; }; export function EditorToolbar({ editor, className }: EditorToolbarProps) { if (!editor) return null; const blockLabel = editor.isActive("heading", { level: 1 }) ? "Heading 1" : editor.isActive("heading", { level: 2 }) ? "Heading 2" : editor.isActive("heading", { level: 3 }) ? "Heading 3" : "Paragraph"; return (
ch(editor).toggleBold().run()} > ch(editor).toggleItalic().run()} > ch(editor).toggleUnderline().run()} > ch(editor).toggleStrike().run()} > ch(editor).toggleCode().run()} > ch(editor).toggleHighlight().run()} >
ch(editor).setParagraph().run()} className="gap-2" > Paragraph ch(editor).setHeading({ level: 1 }).run()} className="gap-2" > Heading 1 ch(editor).setHeading({ level: 2 }).run()} className="gap-2" > Heading 2 ch(editor).setHeading({ level: 3 }).run()} className="gap-2" > Heading 3
ch(editor).toggleBulletList().run()} > ch(editor).toggleOrderedList().run()} > ch(editor).toggleTaskList().run()} >
ch(editor).setTextAlign("left").run()} > ch(editor).setTextAlign("center").run()} > ch(editor).setTextAlign("right").run()} >
{ const src = window.prompt("Image URL"); if (src) ch(editor).setImage({ src }).run(); }} > ch(editor).setHorizontalRule().run()} > ch(editor) .insertTable({ rows: 3, cols: 3, withHeaderRow: true }) .run() } > ch(editor).toggleCodeBlock().run()} >
ch(editor).undo().run()} > ch(editor).redo().run()} >
); } function ToolbarIcon({ label, shortcut, active, onClick, children, }: { label: string; shortcut: string; active: boolean; onClick: () => void; children: ReactNode; }) { return ( {label} {shortcut ? ( {shortcut} ) : null} ); }