From caf19f4c09754a023bc7ac74dc03657ece338292 Mon Sep 17 00:00:00 2001 From: gaoziman <2942894660@qq.com> Date: Wed, 24 Dec 2025 00:07:58 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E5=BF=AB=E6=8D=B7=E7=9F=AD=E8=AF=AD):=20?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=BF=AB=E6=8D=B7=E7=9F=AD=E8=AF=ADUI?= =?UTF-8?q?=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit QuickPhraseItem: - 快捷短语列表项组件 - 支持图标显示和内容预览 - 提供悬停时的编辑和删除操作 QuickPhrasesPopover: - 快捷短语弹出层组件 - 包含触发按钮和数量徽章 - 支持快速插入、编辑和删除短语 QuickPhrasesModal: - 快捷短语管理模态框 - 左侧列表右侧编辑的双栏布局 - 支持图标选择器和分类设置 --- src/components/features/QuickPhraseItem.tsx | 123 +++++++ src/components/features/QuickPhrasesModal.tsx | 327 ++++++++++++++++++ .../features/QuickPhrasesPopover.tsx | 144 ++++++++ 3 files changed, 594 insertions(+) create mode 100644 src/components/features/QuickPhraseItem.tsx create mode 100644 src/components/features/QuickPhrasesModal.tsx create mode 100644 src/components/features/QuickPhrasesPopover.tsx diff --git a/src/components/features/QuickPhraseItem.tsx b/src/components/features/QuickPhraseItem.tsx new file mode 100644 index 0000000..385bf65 --- /dev/null +++ b/src/components/features/QuickPhraseItem.tsx @@ -0,0 +1,123 @@ +'use client'; + +import { useState } from 'react'; +import * as LucideIcons from 'lucide-react'; +import type { QuickPhrase } from '@/types'; +import { cn } from '@/lib/utils'; +import { Tooltip } from '@/components/ui/Tooltip'; + +interface QuickPhraseItemProps { + phrase: QuickPhrase; + onSelect: (phrase: QuickPhrase) => void; + onEdit?: (phrase: QuickPhrase) => void; + onDelete?: (id: string) => void; + showActions?: boolean; +} + +/** + * 快捷短语列表项组件 + */ +export function QuickPhraseItem({ + phrase, + onSelect, + onEdit, + onDelete, + showActions = true, +}: QuickPhraseItemProps) { + const [isHovered, setIsHovered] = useState(false); + + // 获取图标组件 + const IconComponent = phrase.icon + ? (LucideIcons[phrase.icon as keyof typeof LucideIcons] as React.ComponentType<{ size?: number; className?: string }>) + : LucideIcons.MessageSquare; + + // 截断内容预览(最多显示 50 个字符) + const contentPreview = phrase.content.length > 50 + ? phrase.content.substring(0, 50) + '...' + : phrase.content; + + const handleSelect = () => { + onSelect(phrase); + }; + + const handleEdit = (e: React.MouseEvent) => { + e.stopPropagation(); + onEdit?.(phrase); + }; + + const handleDelete = (e: React.MouseEvent) => { + e.stopPropagation(); + onDelete?.(phrase.id); + }; + + return ( +
暂无快捷短语
+点击上方按钮添加
+暂无快捷短语
+点击上方 + 添加
+