feat: 系统优化Phase2 - 面包屑导航/侧边栏间距/制度公示阅读签收/模板变量中文化/通知类型补全

- 面包屑导航组件,集成至TopNav header
- 侧边栏菜单分组间距增大,分组间分隔线
- 制度公示员工阅读签收:PolicyReadRecord模型、portal路由、管理端阅读统计
- 修复Policies.tsx民主程序推进bug(字段名/API路径/参数)
- 用工文本模板变量名英文转中文显示
- 通知类型TYPE_LABELS补全(RISK_ALERT/SOCIAL_INS/OVERTIME_ALERT/PAYSLIP_READY)
- 通知示例数据补充
- h2标题统一为text-sm font-medium
- 新增run.md
This commit is contained in:
selfrelease
2026-07-26 20:32:38 +08:00
parent 9cb0d1f63b
commit d79e3baa34
71 changed files with 18561 additions and 3230 deletions
@@ -0,0 +1,29 @@
/**
* 错误提示横幅组件
* 统一各页面的错误信息展示样式
*/
interface ErrorBannerProps {
/** 错误信息 */
message: string
/** 变体:错误(红) / 警告(黄) */
variant?: 'error' | 'warning'
/** 自定义 className */
className?: string
}
const variantStyles: Record<string, string> = {
error: 'bg-red-50 text-red-700',
warning: 'bg-amber-50 text-amber-700',
}
/**
* 错误/警告提示横幅
*/
export default function ErrorBanner({ message, variant = 'error', className = '' }: ErrorBannerProps) {
return (
<div className={`px-3 py-2 rounded-md text-xs ${variantStyles[variant]} ${className}`}>
{message}
</div>
)
}
@@ -0,0 +1,22 @@
/**
* 加载中组件
* 统一各页面的"加载中..."显示
*/
interface LoadingSpinnerProps {
/** 自定义文本 */
text?: string
/** 容器 padding */
className?: string
}
/**
* 加载中占位
*/
export default function LoadingSpinner({ text = '加载中...', className = 'py-16' }: LoadingSpinnerProps) {
return (
<div className={`text-center text-sm text-gray-400 ${className}`}>
{text}
</div>
)
}
@@ -0,0 +1,33 @@
/**
* 状态徽章组件
* 统一各页面的状态标签样式,替代重复的 `px-2 py-0.5 rounded text-xs` 模式
*/
interface StatusBadgeProps {
/** 状态文本 */
label: string
/** 颜色变体 */
variant?: 'success' | 'warning' | 'danger' | 'info' | 'neutral' | 'purple'
/** 自定义 className */
className?: string
}
const variantStyles: Record<string, string> = {
success: 'bg-green-50 text-safe',
warning: 'bg-yellow-50 text-yellow-700',
danger: 'bg-red-50 text-danger',
info: 'bg-blue-50 text-blue-600',
neutral: 'bg-gray-100 text-gray-500',
purple: 'bg-purple-50 text-purple-700',
}
/**
* 状态徽章
*/
export default function StatusBadge({ label, variant = 'neutral', className = '' }: StatusBadgeProps) {
return (
<span className={`px-2 py-0.5 rounded text-xs ${variantStyles[variant]} ${className}`}>
{label}
</span>
)
}
+13
View File
@@ -0,0 +1,13 @@
/** UI 组件统一导出 */
export { default as Button } from './Button'
export { default as Card } from './Card'
export { default as Modal } from './Modal'
export { default as Pagination } from './Pagination'
export { default as EmptyState } from './EmptyState'
export { default as ConfirmDialog } from './ConfirmDialog'
export { Skeleton, SkeletonText, SkeletonCard, SkeletonPage } from './Skeleton'
export { default as Signal } from './Signal'
export { default as StatusBadge } from './StatusBadge'
export { default as LoadingSpinner } from './LoadingSpinner'
export { default as ErrorBanner } from './ErrorBanner'
export { Input, Label, Select } from './Input'