diff --git a/frontend/src/components/LucideIconSelect/README.md b/frontend/src/components/LucideIconSelect/README.md index 284b1493..e651d6bc 100644 --- a/frontend/src/components/LucideIconSelect/README.md +++ b/frontend/src/components/LucideIconSelect/README.md @@ -98,30 +98,44 @@ function FormExample() { ## 图标分类 -组件内置了以下分类: +组件内置了以下分类,每个分类都有代表性图标: -- **常用** - 常用业务图标 -- **文件与文档** - 文件相关图标 -- **用户与团队** - 用户管理图标 -- **开发与代码** - 开发工具图标 -- **数据与存储** - 数据库、存储图标 -- **网络与服务** - 网络、服务器图标 -- **时间与日历** - 时间、日期图标 -- **操作与控制** - 操作按钮图标 -- **通知与提醒** - 通知相关图标 -- **编辑与格式** - 编辑工具图标 -- **导航与箭头** - 导航、箭头图标 -- **状态与标记** - 状态指示图标 +| 分类 | 图标 | 说明 | +|------|------|------| +| 全部 | 📐 | 显示所有可用图标 | +| 常用 | ✨ | 常用业务图标 | +| 文件与文档 | 📄 | 文件相关图标 | +| 用户与团队 | 👥 | 用户管理图标 | +| 开发与代码 | 💻 | 开发工具图标 | +| 数据与存储 | 💾 | 数据库、存储图标 | +| 网络与服务 | 🖥️ | 网络、服务器图标 | +| 时间与日历 | 📅 | 时间、日期图标 | +| 操作与控制 | 🎛️ | 操作按钮图标 | +| 通知与提醒 | 🔔 | 通知相关图标 | +| 编辑与格式 | ✏️ | 编辑工具图标 | +| 导航与箭头 | 🧭 | 导航、箭头图标 | +| 状态与标记 | ✅ | 状态指示图标 | + +### 分类标签特性 + +- 🎨 每个分类都有代表性图标,视觉更直观 +- 📱 响应式设计:移动端仅显示图标,桌面端显示图标+文字 +- 🔄 自动布局:标签自动换行,左对齐排列 +- ✨ 高亮显示:当前选中的分类会高亮显示 ## 自定义配置 如需添加或修改分类,可编辑 `src/config/lucideIcons.ts` 文件: ```ts -export const ICON_CATEGORIES = { - '自定义分类': [ - 'Icon1', 'Icon2', 'Icon3' - ], +export const ICON_CATEGORIES: Record = { + 'custom': { + name: '自定义分类', + icon: 'Star', // 分类的代表性图标 + icons: [ + 'Icon1', 'Icon2', 'Icon3' + ] + }, // ... 其他分类 }; ``` diff --git a/frontend/src/components/LucideIconSelect/index.tsx b/frontend/src/components/LucideIconSelect/index.tsx index 3e5cc9b4..d8f7dbbf 100644 --- a/frontend/src/components/LucideIconSelect/index.tsx +++ b/frontend/src/components/LucideIconSelect/index.tsx @@ -8,7 +8,7 @@ import { import { Input } from "@/components/ui/input"; import { Button } from "@/components/ui/button"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; -import { Search } from "lucide-react"; +import { Search, LayoutGrid } from "lucide-react"; import { searchLucideIcons, ICON_CATEGORIES } from '@/config/lucideIcons'; import DynamicIcon from '@/components/DynamicIcon'; @@ -55,14 +55,14 @@ const LucideIconSelect: React.FC = ({ return ( - - + + 选择图标 -
+
{/* 搜索框 */} -
+
= ({
{/* 分类标签 */} - - - 全部 ({iconList.length}) - {Object.keys(ICON_CATEGORIES).map((cat) => ( - - {cat} + + + + + 全部 + ({iconList.length}) + + {Object.entries(ICON_CATEGORIES).map(([key, cat]) => ( + + + {cat.name} ))} - - {/* 图标网格 */} -
- {iconList.length > 0 ? ( - iconList.map(({ name, component: Icon }) => ( - - )) - ) : ( -
- 未找到匹配的图标 -
- )} + + {/* 图标网格 - 固定高度 */} +
+
+ {iconList.length > 0 ? ( + iconList.map(({ name, component: Icon }) => ( + + )) + ) : ( +
+
+ +

未找到匹配的图标

+

+ 尝试其他关键词或浏览分类 +

+
+
+ )} +
{/* 当前选中 */} {value && ( -
+
当前选中:
diff --git a/frontend/src/config/lucideIcons.ts b/frontend/src/config/lucideIcons.ts index ddf261b8..0ac98832 100644 --- a/frontend/src/config/lucideIcons.ts +++ b/frontend/src/config/lucideIcons.ts @@ -20,58 +20,116 @@ export const getLucideIcon = (iconName: string): LucideIcon | null => { return (icons[iconName as keyof typeof icons] as LucideIcon) || null; }; +/** + * 图标分类配置 + * 每个分类包含名称、代表性图标和图标列表 + */ +export interface IconCategory { + name: string; + icon: string; + icons: string[]; +} + /** * 常用图标分类 */ -export const ICON_CATEGORIES = { - '常用': [ - 'FolderKanban', 'Workflow', 'Settings', 'Users', 'Calendar', - 'Clock', 'Database', 'Server', 'Cloud', 'Package' - ], - '文件与文档': [ - 'File', 'FileText', 'Folder', 'FolderOpen', 'Files', - 'FileJson', 'FileCode', 'FilePlus', 'FileEdit' - ], - '用户与团队': [ - 'User', 'Users', 'UserPlus', 'UserCheck', 'UserCog', - 'Shield', 'ShieldCheck', 'Contact' - ], - '开发与代码': [ - 'Code', 'Terminal', 'GitBranch', 'Github', 'GitFork', - 'GitCommit', 'GitPullRequest', 'Bug', 'Braces' - ], - '数据与存储': [ - 'Database', 'HardDrive', 'Save', 'Download', 'Upload', - 'Archive', 'Package', 'Inbox', 'FolderSync' - ], - '网络与服务': [ - 'Server', 'Cloud', 'CloudDownload', 'CloudUpload', 'Globe', - 'Wifi', 'Zap', 'Activity', 'TrendingUp' - ], - '时间与日历': [ - 'Calendar', 'CalendarDays', 'Clock', 'Timer', 'AlarmClock', - 'History', 'CalendarCheck', 'CalendarPlus' - ], - '操作与控制': [ - 'Play', 'Pause', 'Stop', 'RotateCw', 'RefreshCw', - 'Power', 'Settings', 'Sliders', 'ToggleLeft' - ], - '通知与提醒': [ - 'Bell', 'BellRing', 'MessageSquare', 'Mail', 'Inbox', - 'AlertCircle', 'AlertTriangle', 'Info', 'CheckCircle' - ], - '编辑与格式': [ - 'Edit', 'Edit2', 'Edit3', 'Pencil', 'Trash2', - 'Copy', 'Clipboard', 'Scissors', 'FileEdit' - ], - '导航与箭头': [ - 'ArrowRight', 'ArrowLeft', 'ArrowUp', 'ArrowDown', 'ChevronRight', - 'ChevronLeft', 'ChevronUp', 'ChevronDown', 'Home', 'Menu' - ], - '状态与标记': [ - 'Check', 'CheckCircle', 'CheckCircle2', 'X', 'XCircle', - 'AlertCircle', 'AlertTriangle', 'HelpCircle', 'Plus', 'Minus' - ] +export const ICON_CATEGORIES: Record = { + 'common': { + name: '常用', + icon: 'Sparkles', + icons: [ + 'FolderKanban', 'Workflow', 'Settings', 'Users', 'Calendar', + 'Clock', 'Database', 'Server', 'Cloud', 'Package' + ] + }, + 'file': { + name: '文件与文档', + icon: 'FileText', + icons: [ + 'File', 'FileText', 'Folder', 'FolderOpen', 'Files', + 'FileJson', 'FileCode', 'FilePlus', 'FileEdit' + ] + }, + 'user': { + name: '用户与团队', + icon: 'Users', + icons: [ + 'User', 'Users', 'UserPlus', 'UserCheck', 'UserCog', + 'Shield', 'ShieldCheck', 'Contact' + ] + }, + 'code': { + name: '开发与代码', + icon: 'Code', + icons: [ + 'Code', 'Terminal', 'GitBranch', 'Github', 'GitFork', + 'GitCommit', 'GitPullRequest', 'Bug', 'Braces' + ] + }, + 'data': { + name: '数据与存储', + icon: 'Database', + icons: [ + 'Database', 'HardDrive', 'Save', 'Download', 'Upload', + 'Archive', 'Package', 'Inbox', 'FolderSync' + ] + }, + 'network': { + name: '网络与服务', + icon: 'Server', + icons: [ + 'Server', 'Cloud', 'CloudDownload', 'CloudUpload', 'Globe', + 'Wifi', 'Zap', 'Activity', 'TrendingUp' + ] + }, + 'time': { + name: '时间与日历', + icon: 'Calendar', + icons: [ + 'Calendar', 'CalendarDays', 'Clock', 'Timer', 'AlarmClock', + 'History', 'CalendarCheck', 'CalendarPlus' + ] + }, + 'control': { + name: '操作与控制', + icon: 'Sliders', + icons: [ + 'Play', 'Pause', 'Stop', 'RotateCw', 'RefreshCw', + 'Power', 'Settings', 'Sliders', 'ToggleLeft' + ] + }, + 'notification': { + name: '通知与提醒', + icon: 'Bell', + icons: [ + 'Bell', 'BellRing', 'MessageSquare', 'Mail', 'Inbox', + 'AlertCircle', 'AlertTriangle', 'Info', 'CheckCircle' + ] + }, + 'edit': { + name: '编辑与格式', + icon: 'Edit', + icons: [ + 'Edit', 'Edit2', 'Edit3', 'Pencil', 'Trash2', + 'Copy', 'Clipboard', 'Scissors', 'FileEdit' + ] + }, + 'navigation': { + name: '导航与箭头', + icon: 'Navigation', + icons: [ + 'ArrowRight', 'ArrowLeft', 'ArrowUp', 'ArrowDown', 'ChevronRight', + 'ChevronLeft', 'ChevronUp', 'ChevronDown', 'Home', 'Menu' + ] + }, + 'status': { + name: '状态与标记', + icon: 'CheckCircle2', + icons: [ + 'Check', 'CheckCircle', 'CheckCircle2', 'X', 'XCircle', + 'AlertCircle', 'AlertTriangle', 'HelpCircle', 'Plus', 'Minus' + ] + } }; /** @@ -87,8 +145,10 @@ export const searchLucideIcons = (searchTerm: string, category?: string) => { // 按分类过滤 if (category && category !== 'all') { - const categoryIcons = ICON_CATEGORIES[category as keyof typeof ICON_CATEGORIES] || []; - filtered = allIcons.filter(icon => categoryIcons.includes(icon.name)); + const categoryData = ICON_CATEGORIES[category]; + if (categoryData) { + filtered = allIcons.filter(icon => categoryData.icons.includes(icon.name)); + } } // 按搜索词过滤