import { Node, mergeAttributes } from '@tiptap/core' import { ReactNodeViewRenderer, NodeViewWrapper, ReactNodeViewProps } from '@tiptap/react' import { motion, AnimatePresence } from 'framer-motion' import { useState } from 'react' interface CharacterAttributes { id: string | null; name: string; avatar: string; gender: string; age: string; } export function CharacterToken(props: ReactNodeViewProps) { const [showCard, setShowCard] = useState(false) const { name, avatar, gender, age } = props.node.attrs as CharacterAttributes const handleClick = () => { console.log('点击角色:', name) alert(`点击角色:${name}`) } return ( setShowCard(true)} onMouseLeave={() => setShowCard(false)} onClick={handleClick} > {name} {showCard && (
{name}
{name}
{gender} / {age}岁
)}
) } export const CharacterTokenExtension = Node.create({ name: 'characterToken', group: 'inline', inline: true, atom: true, addAttributes() { return { name: {}, gender: {}, age: {}, avatar: {}, }; }, parseHTML() { return [{ tag: 'character-token' }]; }, renderHTML({ HTMLAttributes }) { return ['character-token', mergeAttributes(HTMLAttributes)]; }, addNodeView() { return ReactNodeViewRenderer(CharacterToken); }, });