foundation-mui-icons
Foundation 项目 @mui/icons-material 图标库详尽用法指南。Icon 铁律:只用 *Rounded 系列,禁止 emoji/Unicode/第三方 icon 包。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Foundation 项目 @mui/icons-material 图标库详尽用法指南。Icon 铁律:只用 *Rounded 系列,禁止 emoji/Unicode/第三方 icon 包。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Foundation 脚手架的子窗口系统使用指南:ChildWindowService(Open/Close/List)、事件总线通信(定向 / 广播)、预设类型(confirm / message / blank)、新增子窗口类型标准操作,以及"子窗口 MVVM 与主窗口一致、通信只走事件总线"等铁律。
MUI 9 数据展示类组件在 Foundation 项目中的详尽用法。当使用 Typography/Avatar/Badge/Chip/Divider/List/Table/Tooltip 时参考。
MUI 9 反馈类组件在 Foundation 项目中的详尽用法。当使用 Alert/Dialog/Progress/Skeleton/Snackbar/Backdrop 时参考。
MUI 9 输入类组件在 Foundation 项目中的详尽用法。当使用 Button/TextField/Select/Checkbox/Switch/Slider/Radio/Rating/Autocomplete/ToggleButton/FAB 时参考。
MUI 9 布局类组件在 Foundation 项目中的详尽用法。当使用 Box/Container/Grid/Stack/ImageList 时参考。
MUI 9 导航类组件在 Foundation 项目中的详尽用法。当使用 Tabs/Menu/Drawer/Breadcrumbs/Pagination/Stepper/SpeedDial/BottomNav/Link 时参考。
| name | foundation-mui-icons |
| description | Foundation 项目 @mui/icons-material 图标库详尽用法指南。Icon 铁律:只用 *Rounded 系列,禁止 emoji/Unicode/第三方 icon 包。 |
*Rounded 系列——匹配方圆设计语言(按钮 borderRadius: 6,容器 borderRadius: 8)import XxxRoundedIcon from '@mui/icons-material/XxxRounded',保证 tree-shakingt('key') i18nsrc/components/icons/@mui/icons-material 提供 5000+ Material Design 图标的 React 组件封装,每个图标有 5 种风格变体:
| 风格 | 后缀 | 示例 | 说明 |
|---|---|---|---|
| Filled | 无后缀 | Delete | 实心填充(默认) |
| Outlined | Outlined | DeleteOutlined | 线框轮廓 |
| Rounded | Rounded | DeleteRounded | 圆角(Foundation 唯一允许) |
| Sharp | Sharp | DeleteSharp | 直角锐利 |
| Two Tone | TwoTone | DeleteTwoTone | 双色调 |
每个图标组件本质是一个 <SvgIcon> 包裹的 <svg> 元素,支持 MUI 的 sx / color / fontSize 等标准 props。
只允许使用
*Rounded系列图标,以匹配项目的方圆设计语言。
// ✅ 正确:使用 *Rounded 系列
import DeleteRoundedIcon from '@mui/icons-material/DeleteRounded';
import SettingsRoundedIcon from '@mui/icons-material/SettingsRounded';
import FolderOpenRoundedIcon from '@mui/icons-material/FolderOpenRounded';
// ❌ 禁止:非 Rounded 系列
import DeleteIcon from '@mui/icons-material/Delete';
import DeleteOutlinedIcon from '@mui/icons-material/DeleteOutlined';
import DeleteSharpIcon from '@mui/icons-material/DeleteSharp';
// ❌ 禁止:第三方 icon 包
import { FaTrash } from 'react-icons/fa';
import { Trash2 } from 'lucide-react';
// ❌ 禁止:emoji / Unicode 符号当图标
<span>🗑️</span>
<span>✓</span>
// ✅ 每个图标单独 import,Vite/webpack 只打包用到的图标
import SearchRoundedIcon from '@mui/icons-material/SearchRounded';
import HomeRoundedIcon from '@mui/icons-material/HomeRounded';
// ❌ 从顶层桶文件导入,开发模式慢、生产包体积大
import { SearchRounded, HomeRounded } from '@mui/icons-material';
导入后变量名统一加 Icon 后缀,便于在 JSX 中区分组件与图标:
import DeleteRoundedIcon from '@mui/icons-material/DeleteRounded';
import SettingsRoundedIcon from '@mui/icons-material/SettingsRounded';
fontSize 值 | 实际尺寸 | 适用场景 |
|---|---|---|
"small" | 20px | 行内文本、按钮内、表格行操作 |
"medium" | 24px | 默认尺寸,大多数场景 |
"large" | 35px | 状态卡片、空状态插图 |
"inherit" | 继承父元素 font-size | 需要跟随文字大小时 |
// 标准尺寸
<DeleteRoundedIcon fontSize="small" />
<DeleteRoundedIcon /> {/* 默认 medium */}
<DeleteRoundedIcon fontSize="large" />
// 自定义尺寸:用 sx,不用 style
<DeleteRoundedIcon sx={{ fontSize: 48 }} />
// ❌ 禁止:内联 style
<DeleteRoundedIcon style={{ fontSize: 48 }} />
color="inherit",图标颜色跟随父元素 colortheme.palette.foundation.* 取,禁止硬编码 hexcolor prop 值:"inherit" | "primary" | "secondary" | "action" | "disabled" | "error"// ✅ 跟随父元素颜色(默认行为)
<DeleteRoundedIcon color="inherit" />
// ✅ 使用 MUI 语义色
<ErrorRoundedIcon color="error" />
<CheckCircleRoundedIcon color="primary" />
// ✅ 使用 Foundation 主题色(通过 sx)
<WarningRoundedIcon sx={{ color: (theme) => theme.palette.foundation.status.warning }} />
<DeleteRoundedIcon sx={{ color: (theme) => theme.palette.foundation.status.danger }} />
// ❌ 禁止:硬编码颜色值
<DeleteRoundedIcon sx={{ color: '#ff0000' }} />
<DeleteRoundedIcon style={{ color: 'red' }} />
import SearchRoundedIcon from '@mui/icons-material/SearchRounded';
import SendRoundedIcon from '@mui/icons-material/SendRounded';
// 左侧图标
<Button startIcon={<SearchRoundedIcon />}>{t('actions.search')}</Button>
// 右侧图标
<Button endIcon={<SendRoundedIcon />}>{t('actions.send')}</Button>
纯图标按钮必须提供 aria-label,否则屏幕阅读器无法识别用途。
import DeleteRoundedIcon from '@mui/icons-material/DeleteRounded';
import CloseRoundedIcon from '@mui/icons-material/CloseRounded';
// ✅ 必须有 aria-label(走 i18n)
<IconButton aria-label={t('actions.delete')}>
<DeleteRoundedIcon />
</IconButton>
<IconButton aria-label={t('actions.close')} size="small">
<CloseRoundedIcon fontSize="small" />
</IconButton>
// ❌ 禁止:无 aria-label 的 IconButton
<IconButton><DeleteRoundedIcon /></IconButton>
import SettingsRoundedIcon from '@mui/icons-material/SettingsRounded';
import PersonRoundedIcon from '@mui/icons-material/PersonRounded';
<List>
<ListItem>
<ListItemIcon><PersonRoundedIcon /></ListItemIcon>
<ListItemText primary={t('nav.profile')} />
</ListItem>
<ListItem>
<ListItemIcon><SettingsRoundedIcon /></ListItemIcon>
<ListItemText primary={t('nav.settings')} />
</ListItem>
</List>
import SearchRoundedIcon from '@mui/icons-material/SearchRounded';
import VisibilityRoundedIcon from '@mui/icons-material/VisibilityRounded';
// 前置图标
<TextField
placeholder={t('search.placeholder')}
InputProps={{
startAdornment: (
<InputAdornment position="start">
<SearchRoundedIcon />
</InputAdornment>
),
}}
/>
// 后置图标(如密码可见性切换)
<TextField
type="password"
InputProps={{
endAdornment: (
<InputAdornment position="end">
<IconButton aria-label={t('actions.toggleVisibility')}>
<VisibilityRoundedIcon />
</IconButton>
</InputAdornment>
),
}}
/>
import FaceRoundedIcon from '@mui/icons-material/FaceRounded';
import CancelRoundedIcon from '@mui/icons-material/CancelRounded';
import DoneRoundedIcon from '@mui/icons-material/DoneRounded';
// 前置图标
<Chip icon={<FaceRoundedIcon />} label={t('tags.user')} />
// 删除图标(默认是 CancelRounded,可自定义)
<Chip
label={t('tags.selected')}
onDelete={handleDelete}
deleteIcon={<CancelRoundedIcon />}
/>
// 带自定义删除图标
<Chip
icon={<DoneRoundedIcon />}
label={t('tags.completed')}
color="primary"
variant="outlined"
/>
当需要找到合适的图标时,按以下流程操作:
delete、settings、folder、download)DeleteRounded)import DeleteRoundedIcon from '@mui/icons-material/DeleteRounded'| 用途 | 图标组件 |
|---|---|
| 搜索 | SearchRoundedIcon |
| 设置 | SettingsRoundedIcon |
| 关闭 | CloseRoundedIcon |
| 删除 | DeleteRoundedIcon |
| 编辑 | EditRoundedIcon |
| 添加 | AddRoundedIcon |
| 返回 | ArrowBackRoundedIcon |
| 菜单 | MenuRoundedIcon |
| 主页 | HomeRoundedIcon |
| 用户 | PersonRoundedIcon |
| 文件夹 | FolderRoundedIcon / FolderOpenRoundedIcon |
| 下载 | DownloadRoundedIcon |
| 上传 | UploadRoundedIcon |
| 刷新 | RefreshRoundedIcon |
| 展开 | ExpandMoreRoundedIcon / ExpandLessRoundedIcon |
| 更多 | MoreVertRoundedIcon / MoreHorizRoundedIcon |
| 复制 | ContentCopyRoundedIcon |
| 保存 | SaveRoundedIcon |
| 警告 | WarningRoundedIcon |
| 错误 | ErrorRoundedIcon |
| 成功 | CheckCircleRoundedIcon |
| 信息 | InfoRoundedIcon |
当 MUI 图标库中没有合适的图标时,可以用 SvgIcon 封装自定义 SVG。
自定义图标统一放在 frontend/src/components/icons/ 目录下,每个图标一个文件。
// frontend/src/components/icons/CustomLogoIcon.tsx
import SvgIcon, { SvgIconProps } from '@mui/material/SvgIcon';
export const CustomLogoIcon = (props: SvgIconProps) => (
<SvgIcon {...props} viewBox="0 0 24 24">
<path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2z" />
</SvgIcon>
);
import { CustomLogoIcon } from '@/components/icons/CustomLogoIcon';
// 与 MUI 图标完全一致的 API
<CustomLogoIcon fontSize="large" color="primary" />
<CustomLogoIcon sx={{ fontSize: 48, color: (theme) => theme.palette.foundation.accent }} />
viewBox 必须与原始 SVG 的 viewBox 一致(通常是 "0 0 24 24")fill 属性,让 MUI 通过 currentColor 控制颜色width / height 属性,由 fontSize prop 控制尺寸<path>,全部放在 <SvgIcon> 内即可SvgIcon 是所有 MUI 图标的底层组件,它:
<svg> 包装为 MUI 组件,支持 sx / color / fontSize 等 propsviewBox="0 0 24 24"、fill="currentColor"aria-hidden="true"(装饰性图标)import SvgIcon from '@mui/material/SvgIcon';
// 直接使用(不推荐,建议封装为独立组件)
<SvgIcon viewBox="0 0 24 24" fontSize="small">
<path d="M..." />
</SvgIcon>
不推荐在 Foundation 项目中使用。 仅作了解。
Icon 组件用于渲染 font icon(如 Material Icons Web Font),需要额外加载字体文件:
import Icon from '@mui/material/Icon';
// 需要在 index.html 中引入 Material Icons 字体
<Icon>delete</Icon>
<Icon fontSize="small">settings</Icon>
不推荐原因:
SvgIcon 方案更轻量、更可控放在 IconButton 中的图标必须通过按钮的 aria-label 提供文字描述:
// ✅ IconButton 提供 aria-label
<IconButton aria-label={t('actions.delete')}>
<DeleteRoundedIcon />
</IconButton>
// ✅ Button 有文字,图标自动作为装饰
<Button startIcon={<SaveRoundedIcon />}>{t('actions.save')}</Button>
纯装饰性图标(如列表项前的图标、状态指示器)不需要额外的无障碍标注,SvgIcon 默认已设置 aria-hidden="true":
// ✅ 装饰性图标,无需额外处理
<ListItemIcon><FolderRoundedIcon /></ListItemIcon>
// ✅ 状态指示器
<CheckCircleRoundedIcon color="primary" />
如果图标需要解释但不是按钮,用 Tooltip 包裹:
import Tooltip from '@mui/material/Tooltip';
import InfoRoundedIcon from '@mui/icons-material/InfoRounded';
<Tooltip title={t('help.storageInfo')}>
<InfoRoundedIcon fontSize="small" sx={{ cursor: 'help' }} />
</Tooltip>
| 反模式 | 正确做法 |
|---|---|
import { Delete } from '@mui/icons-material' | import DeleteRoundedIcon from '@mui/icons-material/DeleteRounded' |
| 使用非 Rounded 变体 | 始终选择 *Rounded 后缀 |
<span>🗑️</span> 当图标 | 使用对应的 MUI Icon 组件 |
import { FaXxx } from 'react-icons/fa' | 使用 @mui/icons-material |
style={{ fontSize: 32 }} | sx={{ fontSize: 32 }} |
sx={{ color: '#ff0000' }} | sx={{ color: (theme) => theme.palette.xxx }} |
<IconButton> 无 aria-label | 必须添加 aria-label={t('...')} |
| 自定义图标散落各处 | 统一放 src/components/icons/ |
| 图标文字硬编码 | 所有人类可见文字走 t() |
在 Foundation 的样式工厂模式中,图标颜色应从 theme 取值:
// MyComponent.styles.ts
import type { SxProps, Theme } from '@mui/material';
export const myStyles = (theme: Theme): Record<string, SxProps<Theme>> => {
const fp = theme.palette.foundation;
return {
iconDefault: {
color: fp.text.secondary,
},
iconDanger: {
color: fp.status.danger,
},
iconSuccess: {
color: fp.status.success,
},
iconAccent: {
color: fp.accent,
},
};
};
// MyComponent.tsx
import { useTheme } from '@mui/material/styles';
import DeleteRoundedIcon from '@mui/icons-material/DeleteRounded';
import CheckCircleRoundedIcon from '@mui/icons-material/CheckCircleRounded';
import { myStyles } from './MyComponent.styles';
const MyComponent = () => {
const theme = useTheme();
const styles = myStyles(theme);
return (
<>
<DeleteRoundedIcon sx={styles.iconDanger} />
<CheckCircleRoundedIcon sx={styles.iconSuccess} />
</>
);
};
| 约束 | 说明 |
|---|---|
只用 *Rounded | 匹配方圆设计语言 |
| Default import | import XxxRoundedIcon from '@mui/icons-material/XxxRounded' |
变量名加 Icon 后缀 | DeleteRoundedIcon、SettingsRoundedIcon |
| 颜色从 theme 取 | theme.palette.foundation.*,禁止硬编码 hex |
| IconButton 必须 aria-label | aria-label={t('key')},走 i18n |
| 装饰性图标无需 aria-label | SvgIcon 默认 aria-hidden="true" |
自定义图标放 src/components/icons/ | 用 SvgIcon 封装,named export |
| 禁止 emoji / Unicode / 第三方包 | 只用 @mui/icons-material |
禁止 style prop | 用 sx 或样式工厂 |