Typix
Loading preview…
import {  createEditorConfig,  defaultExtensionNodes,  defaultTheme,  EditorContent,  EditorRoot,  useActiveFormats,  useBlockType,  useTypixEditor,} from "@typix-editor/react";import {  ContextMenuExtension,  type TypixContextMenuItem,} from "@typix-editor/extension-context-menu";import {  Bold, Italic, Underline, Code,  Heading1, Heading2, Quote, Undo, Redo,} from "lucide-react";import { Toolbar } from "./Toolbar";const config = createEditorConfig({  extensionNodes: defaultExtensionNodes,  theme: defaultTheme,});// Options live inside the component so `disabled` reflects current state.function EditorWithContextMenu() {  const editor = useTypixEditor();  const { isActive } = useActiveFormats({    formats: ["bold", "italic", "underline", "code"],  });  const blockType = useBlockType();  const options: TypixContextMenuItem[] = [    {      type: "item",      label: "Bold",      icon: <Bold size={14} />,      disabled: isActive("bold"),      onSelect: (ed) => ed.toggleBold(),    },    {      type: "item",      label: "Italic",      icon: <Italic size={14} />,      disabled: isActive("italic"),      onSelect: (ed) => ed.toggleItalic(),    },    {      type: "item",      label: "Inline Code",      icon: <Code size={14} />,      disabled: isActive("code"),      onSelect: (ed) => ed.toggleCode(),    },    { type: "separator" },    {      type: "item",      label: "Heading 1",      icon: <Heading1 size={14} />,      disabled: blockType === "h1",      onSelect: (ed) => ed.toggleHeading({ level: 1 }),    },    {      type: "item",      label: "Quote",      icon: <Quote size={14} />,      disabled: blockType === "quote",      onSelect: (ed) => ed.toggleQuote(),    },    { type: "separator" },    {      type: "item",      label: "Undo",      icon: <Undo size={14} />,      onSelect: (ed) => ed.undo(),    },    {      type: "item",      label: "Redo",      icon: <Redo size={14} />,      onSelect: (ed) => ed.redo(),    },  ];  return <ContextMenuExtension options={options} />;}export default function ContextMenuExample() {  return (    <EditorRoot config={config}>      <div className="editor-container">        <Toolbar />        <EditorContent placeholder="Right-click to see the context menu..." />      </div>      <EditorWithContextMenu />    </EditorRoot>  );}