/** * 统一 SVG 图标库 — 替代所有 Emoji,保持视觉一致性 * 基于 Lucide/Feather 风格,使用 currentColor 继承颜色 */ const PATHS = { // 状态图标 'check-circle': '', 'x-circle': '', 'alert-triangle': '', 'info': '', 'circle': '', // 简单指示符 'check': '', 'x': '', // 操作图标 'search': '', 'gift': '', 'zap': '', 'target': '', 'bar-chart': '', 'home': '', 'paperclip': '', 'copy': '', 'clipboard': '', 'file': '', 'file-text': '', 'file-plain': '', 'package': '', 'box': '', 'trash': '', 'terminal': '', 'edit': '', 'folder': '', 'monitor': '', 'plug': '', 'wrench': '', 'bug': '', 'fire': '', 'key': '', 'lock': '', 'clock': '', 'send': '', 'download': '', 'upload': '', 'inbox': '', 'radio': '', 'lightbulb': '', 'globe': '', 'shield': '', 'hash': '', 'phone': '', 'users': '', 'list': '', // 军事主题图标 'swords': '', 'castle': '', 'tent': '', 'scroll': '', 'play': '', 'pause': '', 'alert-circle': '', 'message-circle': '', 'message-square': '', 'stop': '', 'refresh-cw': '', 'rocket': '', 'eye': '', 'pen-tool': '', 'gear': '', 'plus-circle': '', 'crown': '', 'hammer': '', 'send': '', } /** * 生成内联 SVG 图标 * @param {string} name 图标名称 * @param {number} [size=16] 图标尺寸(px) * @param {string} [className] 可选 CSS 类名 * @returns {string} SVG HTML 字符串 */ export function icon(name, size = 16, className) { const paths = PATHS[name] if (!paths) return '' const cls = className ? ` class="${className}"` : '' return `${paths}` } /** * 状态图标(带颜色) * @param {'ok'|'err'|'warn'|'info'} type 状态类型 * @param {number} [size=16] 图标尺寸 * @returns {string} 带颜色的 SVG 字符串 */ export function statusIcon(type, size = 16) { const map = { ok: { name: 'check-circle', color: 'var(--success)' }, err: { name: 'x-circle', color: 'var(--danger, var(--error))' }, warn: { name: 'alert-triangle', color: 'var(--warning)' }, info: { name: 'info', color: 'var(--info, var(--primary))' }, } const cfg = map[type] if (!cfg) return '' const paths = PATHS[cfg.name] return `${paths}` } /** * 用于日志前缀的图标(纯文本环境也能回退) * @param {string} name 图标名称 * @returns {string} 小尺寸 SVG 字符串 */ export function logIcon(name, size = 14) { return icon(name, size) }