# Pika 反馈组件开发计划与规范 > 参照 ant Design 反馈组件,结合 Pika 设计规范(DESIGN_SPEC.md)制定。 > 核心目标:**让 AI 第一次生成的代码就能跑、就能看、就能用。** > 设计原则:以 Apple Human Interface Guidelines 为准,融合 Ant Design 成熟实践。 --- ## 一、组件体系 ### 1.1 反馈组件分类 | 组件 | 英文名 | 用途 | 优先级 | |------|--------|------|--------| | Alert | 警告提示 | 显示需要关注的消息 | P0 | | Message | 全局提示 | 操作反馈的非阻塞轻量提示 | P0 | | Modal | 对话框 | 需要用户交互的浮层 | P0 | | Notification | 通知提醒 | 复杂内容的全局通知 | P1 | | Progress | 进度条 | 显示操作进度 | P1 | | Spin | 加载中 | 页面或区块的加载状态 | P1 | | Result | 结果 | 操作结果的反馈 | P1 | | Drawer | 抽屉 | 从边缘滑出的面板 | P2 | | Popconfirm | 气泡确认框 | 轻量级确认对话框 | P2 | ### 1.2 设计原则对照 | 规范项 | Pika 要求 | antd 参考 | |--------|----------|----------| | 尺寸体系 | `small \| middle \| large` | xs/sm/md/lg/xl (过多) | | 样式绑定 | `data-*` 属性选择器 | className 拼接 | | 事件命名 | `on + 动词 + 名词` | 部分不符合 | | 数据 prop | 统一 `data` | options/dataSource/treeData 混乱 | | 类型定义 | 联合类型字面量 | 部分使用 boolean | --- ## 二、Alert 组件 ### 2.1 组件概述 显示需要用户关注的信息提示。 ### 2.2 antd API 完整清单 | 属性 | 说明 | 类型 | 默认值 | |------|------|------|--------| | action | 操作区域 | ReactNode | - | | banner | 是否显示为顶部横幅 | boolean | false | | closable | 是否可关闭,支持 `ClosableType` 配置 | boolean \| ClosableType | false | | description | 描述内容 | ReactNode | - | | icon | 自定义图标 | ReactNode | - | | title | 标题 | ReactNode | - | | showIcon | 是否显示图标 | boolean | false, banner 模式为 true | | type | 类型 | `success \| info \| warning \| error` | `info`, banner 模式为 `warning` | **ClosableType:** | 属性 | 说明 | 类型 | |------|------|------| | afterClose | 关闭动画完成后的回调 | function | | closeIcon | 自定义关闭图标 | ReactNode | | onClose | 关闭时的回调 | (e: MouseEvent) => void | ### 2.3 Pika Props 定义 ```tsx export type AlertType = 'success' | 'info' | 'warning' | 'error' export type AlertSize = 'small' | 'middle' | 'large' export interface AlertProps { type?: AlertType size?: AlertSize title?: ReactNode description?: ReactNode showIcon?: boolean icon?: ReactNode closable?: boolean closeIcon?: ReactNode action?: ReactNode banner?: boolean onClose?: (e: React.MouseEvent) => void afterClose?: () => void className?: string style?: CSSProperties } ``` ### 2.4 Pika 样式规范 ```tsx // TSX — 使用 data-* 属性
{icon || defaultIcon}
{title} {description}
{closable && }
``` ```css /* CSS — 使用属性选择器 */ .root[data-type="success"] { background: var(--nv-color-success-bg); color: var(--nv-color-success); } .root[data-type="warning"] { background: var(--nv-color-warning-bg); color: var(--nv-color-warning); } .root[data-type="error"] { background: var(--nv-color-error-bg); color: var(--nv-color-error); } .root[data-type="info"] { background: var(--nv-color-info-bg); color: var(--nv-color-info); } .root[data-banner] { border-radius: 0; margin: 0; padding: var(--nv-spacing-small) var(--nv-spacing-middle); } ``` --- ## 三、Message 组件 ### 3.1 组件概述 全局反馈操作结果的轻量提示,从顶部居中显示,自动关闭。 ### 3.2 antd API 完整清单 **静态方法:** ```tsx message.success(content, [duration], onClose) message.error(content, [duration], onClose) message.info(content, [duration], onClose) message.warning(content, [duration], onClose) message.loading(content, [duration], onClose) ``` **Config 参数:** | 属性 | 说明 | 类型 | 默认值 | |------|------|------|--------| | content | 消息内容 | ReactNode \| config | - | | duration | 自动关闭延时(秒),0 为不自动关闭 | number | 1.5 / 3 | | onClose | 关闭时的回调 | function | - | **message.open(config) / message.useMessage():** | 属性 | 说明 | 类型 | 默认值 | |------|------|------|--------| | className | 自定义类名 | string | - | | classNames | 语义化 DOM 类名 | Record | - | | content | 消息内容 | ReactNode | - | | duration | 自动关闭延时 | number | 3 | | icon | 自定义图标 | ReactNode | - | | pauseOnHover | 鼠标悬停时暂停计时 | boolean | true | | key | 唯一标识 | string \| number | - | | style | 自定义样式 | CSSProperties | - | | styles | 语义化 DOM 样式 | Record | - | | onClick | 点击回调 | function | - | | onClose | 关闭回调 | function | - | **message.config(options):** | 属性 | 说明 | 类型 | 默认值 | |------|------|------|--------| | duration | 默认延时 | number | 3 | | getContainer | 挂载节点 | () => HTMLElement | () => document.body | | maxCount | 最大显示数 | number | - | | prefixCls | 前缀类名 | string | `ant-message` | | rtl | RTL 模式 | boolean | false | | top | 距离顶部距离 | string \| number | 8 | ### 3.3 Pika Props 定义 ```tsx export type MessageType = 'success' | 'error' | 'warning' | 'info' | 'loading' export type MessagePlacement = 'top' | 'topLeft' | 'topRight' | 'bottom' | 'bottomLeft' | 'bottomRight' export interface MessageConfig { duration?: number maxCount?: number placement?: MessagePlacement top?: number bottom?: number getContainer?: () => HTMLElement } export interface MessageOptions { content: ReactNode duration?: number icon?: ReactNode key?: string onClose?: () => void pauseOnHover?: boolean className?: string style?: CSSProperties } ``` ### 3.4 Pika API 设计 ```tsx // 静态方法 Message.show(options: MessageOptions): MessageInstance Message.success(options: MessageOptions): MessageInstance Message.error(options: MessageOptions): MessageInstance Message.warning(options: MessageOptions): MessageInstance Message.info(options: MessageOptions): MessageInstance Message.loading(options: MessageOptions): MessageInstance // 配置 Message.config(config: MessageConfig): void Message.destroy(key?: string): void Message.destroyAll(): void // Hooks const [MessageApi, contextHolder] = Message.useMessage() ``` --- ## 四、Modal 组件 ### 4.1 组件概述 需要用户交互的对话框,从页面中央弹出。 ### 4.2 antd API 完整清单 **Modal 组件属性:** | 属性 | 说明 | 类型 | 默认值 | |------|------|------|--------| | afterClose | 完全关闭后的回调 | function | - | | cancelButtonProps | 取消按钮 props | ButtonProps | - | | cancelText | 取消按钮文字 | ReactNode | `Cancel` | | centered | 是否居中显示 | boolean | false | | closable | 是否显示关闭按钮 | boolean \| ClosableType | true | | closeIcon | 自定义关闭图标 | ReactNode | | | confirmLoading | 确认按钮 loading | boolean | false | | destroyOnHidden | 关闭时是否销毁内容 | boolean | false | | footer | 底部内容,设为 null 隐藏 | ReactNode \| ((originNode, extra) => ReactNode) | (OK/Cancel) | | forceRender | 强制渲染 | boolean | false | | focusable | 焦点管理配置 | `{ trap?: boolean, focusTriggerAfterClose?: boolean }` | - | | getContainer | 挂载节点 | HTMLElement \| () => HTMLElement \| false | document.body | | keyboard | 是否支持 ESC 关闭 | boolean | true | | mask | 遮罩配置 | boolean \| `{ enabled?: boolean, blur?: boolean, closable?: boolean }` | true | | modalRender | 自定义模态框渲染 | (node: ReactNode) => ReactNode | - | | okButtonProps | 确认按钮 props | ButtonProps | - | | okText | 确认按钮文字 | ReactNode | `OK` | | okType | 确认按钮类型 | string | `primary` | | open | 是否显示 | boolean | false | | title | 标题 | ReactNode | - | | width | 宽度 | string \| number \| Breakpoint | 520 | | wrapClassName | 外层类名 | string | - | | zIndex | z-index 值 | number | 1000 | | onCancel | 取消回调 | function(e) | - | | onOk | 确认回调 | function(e) | - | | afterOpenChange | 打开/关闭动画结束回调 | (open: boolean) => void | - | **Modal.method() 属性:** | 属性 | 说明 | 类型 | 默认值 | |------|------|------|--------| | icon | 自定义图标 | ReactNode | | | maskClosable | 点击遮罩是否关闭 | boolean | false | | okButtonProps | 确认按钮 props | ButtonProps | - | | cancelButtonProps | 取消按钮 props | ButtonProps | - | | width | 宽度 | string \| number | 416 | ### 4.3 Pika Props 定义 ```tsx export type ModalSize = 'small' | 'middle' | 'large' export type ModalPlacement = 'top' | 'center' | 'bottom' export interface ModalProps { open?: boolean title?: ReactNode content?: ReactNode footer?: ReactNode | null width?: string | number size?: ModalSize placement?: ModalPlacement closable?: boolean closeIcon?: ReactNode centered?: boolean mask?: boolean maskClosable?: boolean keyboard?: boolean loading?: boolean confirmLoading?: boolean okText?: ReactNode cancelText?: ReactNode okButtonProps?: ButtonProps cancelButtonProps?: ButtonProps okType?: ButtonVariant getContainer?: HTMLElement | (() => HTMLElement) | false zIndex?: number onOk?: (e: React.MouseEvent) => void | Promise onCancel?: (e: React.MouseEvent) => void afterOpenChange?: (open: boolean) => void afterClose?: () => void className?: string style?: CSSProperties } ``` ### 4.4 Pika 样式规范 ```tsx // TSX
{title} {closable && }
{content}
{footer !== undefined && (
{footer}
)}
``` --- ## 五、Notification 组件 ### 5.1 组件概述 全局通知消息,显示在屏幕四角,可包含复杂内容。 ### 5.2 antd API 完整清单 **静态方法:** ```tsx notification.success(config) notification.error(config) notification.info(config) notification.warning(config) notification.open(config) notification.destroy(key?: string) ``` **Config 参数:** | 属性 | 说明 | 类型 | 默认值 | |------|------|------|--------| | actions | 操作按钮组 | ReactNode | - | | className | 自定义类名 | string | - | | closeIcon | 关闭图标 | ReactNode | true | | description | 通知内容 | ReactNode | - | | duration | 关闭延时,0/false 不自动关闭 | number \| false | 4.5 | | icon | 自定义图标 | ReactNode | - | | key | 唯一标识 | string | - | | title | 标题 | ReactNode | - | | placement | 位置 | `top \| topLeft \| topRight \| bottom \| bottomLeft \| bottomRight` | `topRight` | | role | 语义角色 | `alert \| status` | `alert` | | showProgress | 显示进度条 | boolean | - | | pauseOnHover | 悬停暂停计时 | boolean | true | | style | 自定义样式 | CSSProperties | - | | onClick | 点击回调 | function | - | | onClose | 关闭回调 | function | - | **notification.useNotification() 配置:** | 属性 | 说明 | 类型 | 默认值 | |------|------|------|--------| | bottom | 距离底部距离 | number | 24 | | closeIcon | 关闭图标 | ReactNode | - | | getContainer | 挂载节点 | () => HTMLNode | () => document.body | | maxCount | 最大显示数 | number | - | | placement | 默认位置 | string | `topRight` | | showProgress | 显示进度条 | boolean | - | | pauseOnHover | 悬停暂停 | boolean | true | | stack | 堆叠配置 | boolean \| `{ threshold: number }` | `{ threshold: 3 }` | | top | 距离顶部距离 | number | 24 | ### 5.3 Pika Props 定义 ```tsx export type NotificationType = 'success' | 'info' | 'warning' | 'error' export type NotificationPlacement = | 'top' | 'topLeft' | 'topRight' | 'bottom' | 'bottomLeft' | 'bottomRight' export interface NotificationOptions { title?: ReactNode description?: ReactNode icon?: ReactNode actions?: ReactNode duration?: number | false showProgress?: boolean pauseOnHover?: boolean closable?: boolean closeIcon?: ReactNode onClose?: () => void onClick?: () => void className?: string style?: CSSProperties } export interface NotificationConfig { placement?: NotificationPlacement top?: number bottom?: number maxCount?: number stack?: boolean | { threshold: number } getContainer?: () => HTMLElement } ``` ### 5.4 Pika API 设计 ```tsx // 静态方法 Notification.show(options: NotificationOptions): NotificationInstance Notification.success(options: NotificationOptions): NotificationInstance Notification.error(options: NotificationOptions): NotificationInstance Notification.warning(options: NotificationOptions): NotificationInstance Notification.info(options: NotificationOptions): NotificationInstance Notification.destroy(key?: string): void Notification.destroyAll(): void // 配置 Notification.config(config: NotificationConfig): void // Hooks const [NotificationApi, contextHolder] = Notification.useNotification() ``` --- ## 六、Progress 组件 ### 6.1 组件概述 显示操作进度,支持线条、圆形、仪表盘三种类型。 ### 6.2 antd API 完整清单 **通用属性:** | 属性 | 说明 | 类型 | 默认值 | |------|------|------|--------| | format | 格式化函数 | (percent, successPercent) => ReactNode | (percent) => percent + `%` | | percent | 进度值 | number | 0 | | railColor | 未填充部分颜色 | string | - | | showInfo | 是否显示信息 | boolean | true | | status | 状态 | `success \| exception \| normal \| active` | - | | strokeColor | 进度条颜色 | string \| string[] \| { from: string; to: string; direction: string } | - | | strokeLinecap | 线帽样式 | `round \| butt \| square` | `round` | | success | 成功部分配置 | `{ percent: number, strokeColor: string }` | - | | type | 类型 | `line \| circle \| dashboard` | `line` | | size | 尺寸 | number \| [number, number] \| { width: number, height: number } \| "small" \| "medium" | "medium" | **line 类型专属:** | 属性 | 说明 | 类型 | |------|------|------| | steps | 总步数 | number | | strokeColor | 进度条颜色,支持渐变 | string \| string[] | **circle/dashboard 类型专属:** | 属性 | 说明 | 类型 | 默认值 | |------|------|------|--------| | strokeWidth | 圆形宽度(百分比) | number | 6 | | strokeColor | 圆形颜色 | string \| { number%: string } | - | **dashboard 类型专属:** | 属性 | 说明 | 类型 | 默认值 | |------|------|------|--------| | gapDegree | 间隙角度(0-295) | number | 75 | | gapPlacement | 间隙位置 | `top \| bottom \| start \| end` | `bottom` | ### 6.3 Pika Props 定义 ```tsx export type ProgressType = 'line' | 'circle' | 'dashboard' export type ProgressStatus = 'success' | 'exception' | 'normal' | 'active' export type ProgressSize = 'small' | 'middle' | 'large' export type StrokeLinecap = 'round' | 'butt' | 'square' export interface ProgressProps { type?: ProgressType status?: ProgressStatus size?: ProgressSize percent?: number strokeColor?: string | string[] | { from: string; to: string; direction: 'left-right' | 'right-left' | 'top-bottom' | 'bottom-top' } railColor?: string strokeWidth?: number strokeLinecap?: StrokeLinecap gapDegree?: number gapPlacement?: 'top' | 'bottom' | 'start' | 'end' steps?: number showInfo?: boolean format?: (percent: number, successPercent?: number) => ReactNode success?: { percent?: number; strokeColor?: string } onChange?: (percent: number) => void className?: string style?: CSSProperties } ``` --- ## 七、Spin 组件 ### 7.1 组件概述 页面或区块的加载状态指示器。 ### 7.2 antd API 完整清单 | 属性 | 说明 | 类型 | 默认值 | |------|------|------|--------| | delay | 延迟显示加载状态(毫秒) | number | - | | description | 自定义描述文字 | ReactNode | - | | fullscreen | 全屏模式 | boolean | false | | indicator | 自定义加载指示器 | ReactNode | - | | percent | 进度百分比,设为 `auto` 显示不定进度 | number \| 'auto' | - | | size | 尺寸 | `small \| middle \| large` | `middle` | | spinning | 是否显示 | boolean | true | | tip | 自定义描述文字 (deprecated) | ReactNode | - | | wrapperClassName | 包裹层类名 (deprecated) | string | - | ### 7.3 Pika Props 定义 ```tsx export type SpinSize = 'small' | 'middle' | 'large' export interface SpinProps { size?: SpinSize spinning?: boolean delay?: number fullscreen?: boolean indicator?: ReactNode percent?: number | 'auto' description?: ReactNode tip?: ReactNode // deprecated, use description onChange?: (spinning: boolean) => void className?: string style?: CSSProperties } ``` ### 7.4 Pika 样式规范 ```tsx // TSX
{fullscreen &&
}
{indicator || } {percent !== undefined && ( {percent}% )} {description && {description}}
``` --- ## 八、Result 组件 ### 8.1 组件概述 展示操作结果,包含状态图标、标题、描述和操作按钮。 ### 8.2 antd API 完整清单 | 属性 | 说明 | 类型 | 默认值 | |------|------|------|--------| | extra | 操作区域 | ReactNode | - | | icon | 自定义图标 | ReactNode | - | | status | 状态 | `success \| error \| info \| warning \| 404 \| 403 \| 500` | `info` | | subTitle | 副标题 | ReactNode | - | | title | 标题 | ReactNode | - | ### 8.3 Pika Props 定义 ```tsx export type ResultStatus = 'success' | 'error' | 'info' | 'warning' | 404 | 403 | 500 export interface ResultProps { status?: ResultStatus title?: ReactNode subTitle?: ReactNode description?: ReactNode icon?: ReactNode extra?: ReactNode className?: string style?: CSSProperties } ``` --- ## 九、Drawer 组件 ### 9.1 组件概述 从屏幕边缘滑出的面板,包含标题、内容和操作区。 ### 9.2 antd API 完整清单 | 属性 | 说明 | 类型 | 默认值 | |------|------|------|--------| | afterOpenChange | 动画结束回调 | function(open) | - | | className | 面板类名 | string | - | | closable | 关闭按钮配置 | boolean \| { closeIcon?: ReactNode; placement?: 'start' \| 'end' } | true | | destroyOnHidden | 关闭时销毁内容 | boolean | false | | extra | 额外操作区 | ReactNode | - | | footer | 底部内容 | ReactNode | - | | forceRender | 强制渲染 | boolean | false | | focusable | 焦点管理 | `{ trap?: boolean, focusTriggerAfterClose?: boolean }` | - | | getContainer | 挂载节点 | HTMLElement \| () => HTMLElement \| Selectors \| false | body | | headerStyle | 头部样式 (deprecated) | CSSProperties | - | | height | 高度 (deprecated) | string \| number | 378 | | keyboard | ESC 关闭 | boolean | true | | loading | 显示骨架屏 | boolean | false | | mask | 遮罩配置 | boolean \| `{ enabled?: boolean, blur?: boolean }` | true | | maskClosable | 点击遮罩关闭 | boolean | true | | maxSize | 可调整的最大尺寸 | number | - | | open | 是否显示 | boolean | false | | placement | 位置 | `top \| right \| bottom \| left` | `right` | | push | 嵌套推动行为 | boolean \| { distance: string \| number } | { distance: 180 } | | resizable | 可调整尺寸 | boolean \| ResizableConfig | - | | rootClassName | 根元素类名 | string | - | | rootStyle | 根元素样式 | CSSProperties | - | | size | 预设尺寸 | 'default' \| 'large' \| number \| string | 'default' | | style | 面板样式 | CSSProperties | - | | styles | 语义化样式 | Record | - | | title | 标题 | ReactNode | - | | width | 宽度 (deprecated) | string \| number | 378 | | zIndex | z-index | number | 1000 | | onClose | 关闭回调 | function(e) | - | | drawerRender | 自定义渲染 | (node: ReactNode) => ReactNode | - | ### 9.3 Pika Props 定义 ```tsx export type DrawerPlacement = 'top' | 'right' | 'bottom' | 'left' export type DrawerSize = 'default' | 'large' | number export interface DrawerProps { open?: boolean title?: ReactNode content?: ReactNode footer?: ReactNode | null placement?: DrawerPlacement size?: DrawerSize closable?: boolean closeIcon?: ReactNode closePlacement?: 'start' | 'end' mask?: boolean maskClosable?: boolean keyboard?: boolean loading?: boolean extra?: ReactNode resizable?: boolean maxSize?: number getContainer?: HTMLElement | (() => HTMLElement) | false zIndex?: number onClose?: (e: React.MouseEvent) => void afterOpenChange?: (open: boolean) => void className?: string style?: CSSProperties } ``` --- ## 十、Popconfirm 组件 ### 10.1 组件概述 轻量级气泡确认框,用于需要用户确认的操作。 ### 10.2 antd API 完整清单 | 属性 | 说明 | 类型 | 默认值 | |------|------|------|--------| | cancelButtonProps | 取消按钮 props | ButtonProps | - | | cancelText | 取消按钮文字 | string | `Cancel` | | disabled | 是否禁用 | boolean | false | | icon | 自定义图标 | ReactNode | | | okButtonProps | 确认按钮 props | ButtonProps | - | | okText | 确认按钮文字 | string | `OK` | | okType | 确认按钮类型 | string | `primary` | | showCancel | 显示取消按钮 | boolean | true | | title | 标题 | ReactNode \| () => ReactNode | - | | description | 描述 | ReactNode \| () => ReactNode | - | | onCancel | 取消回调 | function(e) | - | | onConfirm | 确认回调 | function(e) | - | | onPopupClick | 弹出层点击回调 | function(e) | - | **弹出属性 (共享 Tooltip/Popover/Popconfirm):** | 属性 | 说明 | 类型 | 默认值 | |------|------|------|--------| | align | 对齐配置 | object | - | | arrow | 箭头配置 | boolean \| { pointAtCenter: boolean } | true | | autoAdjustOverflow | 自动调整位置 | boolean | true | | color | 背景色 | string | - | | defaultOpen | 默认打开 | boolean | false | | destroyOnHidden | 关闭时销毁 | boolean | false | | fresh | 每次打开刷新内容 | boolean | false | | getPopupContainer | 弹出层容器 | (triggerNode: HTMLElement) => HTMLElement | () => document.body | | mouseEnterDelay | 鼠标进入延迟(秒) | number | 0.1 | | mouseLeaveDelay | 鼠标离开延迟(秒) | number | 0.1 | | placement | 位置 | `top \| left \| right \| bottom \| topLeft \| topRight \| bottomLeft \| bottomRight \| leftTop \| leftBottom \| rightTop \| rightBottom` | `top` | | trigger | 触发方式 | `hover \| focus \| click \| contextMenu` \| Array | `hover` | | open | 是否打开 | boolean | false | | zIndex | z-index | number | - | | onOpenChange | 打开状态变化回调 | (open: boolean) => void | - | ### 10.3 Pika Props 定义 ```tsx export type PopconfirmPlacement = | 'top' | 'topLeft' | 'topRight' | 'bottom' | 'bottomLeft' | 'bottomRight' | 'left' | 'leftTop' | 'leftBottom' | 'right' | 'rightTop' | 'rightBottom' export interface PopconfirmProps { title?: ReactNode description?: ReactNode icon?: ReactNode okText?: ReactNode cancelText?: ReactNode okType?: ButtonVariant okButtonProps?: ButtonProps cancelButtonProps?: ButtonProps showCancel?: boolean disabled?: boolean placement?: PopconfirmPlacement trigger?: 'hover' | 'click' | 'focus' | 'contextMenu' arrow?: boolean autoAdjustOverflow?: boolean getPopupContainer?: (triggerNode: HTMLElement) => HTMLElement mouseEnterDelay?: number mouseLeaveDelay?: number open?: boolean defaultOpen?: boolean onConfirm?: (e: React.MouseEvent) => void onCancel?: (e: React.MouseEvent) => void onOpenChange?: (open: boolean) => void className?: string style?: CSSProperties } ``` --- ## 十一、通用 Token 设计 ### 11.1 反馈组件 Token ```ts export const feedbackTokens = { alert: { padding: { small: '8px 12px', middle: '12px 16px', large: '16px 24px' }, radius: 'var(--nv-radius-middle)', iconSize: { small: 16, middle: 20, large: 24 }, }, message: { width: 360, padding: '12px 16px', radius: 'var(--nv-radius-middle)', zIndex: 2010, }, notification: { width: 384, padding: '16px 24px', radius: 'var(--nv-radius-middle)', zIndex: 2050, }, modal: { width: { small: 400, middle: 520, large: 720 }, radius: 'var(--nv-radius-large)', padding: '24px', zIndex: 1000, }, drawer: { width: { default: 378, large: 736 }, height: 378, radius: 0, zIndex: 1000, }, progress: { lineHeight: 4, circleStrokeWidth: 6, dashboardGapDegree: 75, }, spin: { dotSize: { small: 14, middle: 20, large: 32 }, }, popconfirm: { padding: '12px 16px', radius: 'var(--nv-radius-middle)', zIndex: 1060, }, } as const ``` ### 11.2 状态颜色映射 ```ts export const STATUS_COLORS = { success: { bg: 'var(--nv-color-success-bg)', border: 'var(--nv-color-success-border)', color: 'var(--nv-color-success)', }, warning: { bg: 'var(--nv-color-warning-bg)', border: 'var(--nv-color-warning-border)', color: 'var(--nv-color-warning)', }, error: { bg: 'var(--nv-color-error-bg)', border: 'var(--nv-color-error-border)', color: 'var(--nv-color-error)', }, info: { bg: 'var(--nv-color-info-bg)', border: 'var(--nv-color-info-border)', color: 'var(--nv-color-info)', }, } as const ``` --- ## 十二、文件结构 ``` src/components/feedback/ ├── alert/ │ ├── Alert.tsx │ ├── Alert.module.css │ ├── Alert.test.tsx │ └── index.ts ├── message/ │ ├── Message.tsx │ ├── Message.module.css │ ├── Message.test.tsx │ └── index.ts ├── modal/ │ ├── Modal.tsx │ ├── Modal.module.css │ ├── Modal.test.tsx │ └── index.ts ├── notification/ │ ├── Notification.tsx │ ├── Notification.module.css │ ├── Notification.test.tsx │ └── index.ts ├── progress/ │ ├── Progress.tsx │ ├── Progress.module.css │ ├── Progress.test.tsx │ └── index.ts ├── spin/ │ ├── Spin.tsx │ ├── Spin.module.css │ ├── Spin.test.tsx │ └── index.ts ├── result/ │ ├── Result.tsx │ ├── Result.module.css │ ├── Result.test.tsx │ └── index.ts ├── drawer/ │ ├── Drawer.tsx │ ├── Drawer.module.css │ ├── Drawer.test.tsx │ └── index.ts ├── popconfirm/ │ ├── Popconfirm.tsx │ ├── Popconfirm.module.css │ ├── Popconfirm.test.tsx │ └── index.ts └── tokens/ └── index.ts ``` --- ## 十三、开发优先级 | 阶段 | 组件 | 原因 | |------|------|------| | Phase 1 | Alert, Spin, Progress | 基础反馈组件,使用频率高 | | Phase 2 | Modal, Message | 需要用户交互的核心组件 | | Phase 3 | Notification, Result | 复杂反馈场景 | | Phase 4 | Drawer, Popconfirm | 边缘场景组件 | --- ## 十四、功能检查清单 ### Alert - [ ] 四种类型: success/info/warning/error - [ ] 三种尺寸: small/middle/large - [ ] 标题和描述 - [ ] 自定义图标 - [ ] 可关闭 (closable) - [ ] 顶部横幅模式 (banner) - [ ] 自定义操作 (action) - [ ] 动画过渡 ### Message - [ ] 五种类型: success/error/warning/info/loading - [ ] 自动关闭 (duration) - [ ] 手动关闭 - [ ] 自定义图标 - [ ] 最大数量限制 (maxCount) - [ ] 位置配置 (placement) - [ ] 悬停暂停 (pauseOnHover) - [ ] 全局配置 (config) - [ ] Hooks API (useMessage) ### Modal - [ ] 打开/关闭状态 (open) - [ ] 标题和内容 - [ ] 自定义底部 (footer) - [ ] 居中显示 (centered) - [ ] 确认/取消按钮 - [ ] 按钮 loading 状态 - [ ] 遮罩配置 (mask) - [ ] 键盘 ESC 关闭 - [ ] 宽度配置 - [ ] 静态方法 (Modal.confirm 等) - [ ] Hooks API (useModal) ### Notification - [ ] 五种类型 - [ ] 标题和描述 - [ ] 自动关闭 - [ ] 手动关闭 - [ ] 六种位置 - [ ] 堆叠显示 (stack) - [ ] 最大数量 - [ ] 进度条显示 - [ ] 自定义操作按钮 - [ ] Hooks API ### Progress - [ ] 三种类型: line/circle/dashboard - [ ] 百分比显示 - [ ] 自定义颜色 - [ ] 渐变色 - [ ] 线帽样式 - [ ] 步骤显示 - [ ] 成功部分高亮 - [ ] 格式化函数 ### Spin - [ ] 三种尺寸 - [ ] 加载指示器 - [ ] 全屏模式 - [ ] 延迟显示 - [ ] 自定义描述 - [ ] 进度显示 ### Result - [ ] 七种状态 - [ ] 标题和描述 - [ ] 自定义图标 - [ ] 操作按钮区 ### Drawer - [ ] 四种位置 - [ ] 预设尺寸 - [ ] 可调整尺寸 - [ ] 遮罩配置 - [ ] 键盘关闭 - [ ] 嵌套推动 ### Popconfirm - [ ] 标题和描述 - [ ] 确认/取消按钮 - [ ] 自定义图标 - [ ] 多种触发方式 - [ ] 12 种弹出位置 - [ ] 自动调整位置 --- ## 十五、AI 提示工程 ``` 开发 Pika 反馈组件时,遵循以下提示词: 1. 导入: import { 组件名 } from '@Pika/ui/feedback/组件名' 2. 尺寸: size 始终为 'small' | 'middle' | 'large' 3. 状态: status 始终为 'default' | 'success' | 'warning' | 'error' | 'info' 4. 样式: 使用 data-* 属性绑定,className 只用于自定义类 5. 事件: on + 动词 + 名词,如 onClose, onConfirm 6. 布尔: 使用 show/open/disabled 等肯定形式 7. 类型: 使用联合类型字面量,不用 boolean 隐藏选项 ```