import {CheckIcon, LinkIcon, TrashIcon} from '@heroicons/react/24/solid' import {Editor} from '@tiptap/core' import {BubbleMenu} from '@tiptap/react' import clsx from 'clsx' import {getUrl} from 'common/util/parse' import {Bold, Italic, Type} from 'lucide-react' import {useState} from 'react' // see https://tiptap.dev/guide/menus export function FloatingFormatMenu(props: { editor: Editor | null /** show more formatting options */ advanced?: boolean }) { const {editor, advanced} = props const [url, setUrl] = useState(null) if (!editor) return null const setLink = () => { const href = url && getUrl(url) if (href) { editor.chain().focus().extendMarkRange('link').setLink({href}).run() } } const unsetLink = () => editor.chain().focus().unsetLink().run() return ( {url === null ? ( <> {advanced && ( <> editor.chain().focus().toggleHeading({level: 1}).run()} isActive={editor.isActive('heading', {level: 1})} /> editor.chain().focus().toggleHeading({level: 2}).run()} isActive={editor.isActive('heading', {level: 2})} className="!h-4" /> )} editor.chain().focus().toggleBold().run()} isActive={editor.isActive('bold')} /> editor.chain().focus().toggleItalic().run()} isActive={editor.isActive('italic')} /> (editor.isActive('link') ? unsetLink() : setUrl(''))} isActive={editor.isActive('link')} /> ) : ( <> ) => setUrl(e.target.value)} /> )} ) } const IconButton = (props: { icon: React.FC> onClick: () => any isActive?: boolean className?: string }) => { const {icon: Icon, onClick, isActive, className} = props return ( ) } const Divider = () =>