Files
RustUI/_plans/feedback-components-plan.md
T
2026-05-31 09:36:23 +08:00

30 KiB
Raw Blame History

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 定义

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 — 使用 data-* 属性
<div
  className={styles.root}
  data-type={type}
  data-size={size}
  data-banner={banner || undefined}
  data-closable={closable || undefined}
  data-show-icon={showIcon || undefined}
>
  <span className={styles.icon}>{icon || defaultIcon}</span>
  <div className={styles.content}>
    <span className={styles.title}>{title}</span>
    <span className={styles.description}>{description}</span>
  </div>
  {closable && <button className={styles.close} data-close>×</button>}
</div>
/* 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 完整清单

静态方法:

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<SemanticDOM, string> -
content 消息内容 ReactNode -
duration 自动关闭延时 number 3
icon 自定义图标 ReactNode -
pauseOnHover 鼠标悬停时暂停计时 boolean true
key 唯一标识 string | number -
style 自定义样式 CSSProperties -
styles 语义化 DOM 样式 Record<SemanticDOM, CSSProperties> -
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 定义

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 设计

// 静态方法
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 定义

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<void>
  onCancel?: (e: React.MouseEvent) => void
  afterOpenChange?: (open: boolean) => void
  afterClose?: () => void
  className?: string
  style?: CSSProperties
}

4.4 Pika 样式规范

// TSX
<div
  className={styles.root}
  data-open={open || undefined}
  data-size={size}
  data-placement={placement}
  data-centered={centered || undefined}
>
  <div className={styles.mask} data-mask />
  <div className={styles.container}>
    <div className={styles.header} data-header>
      <span className={styles.title}>{title}</span>
      {closable && <button data-close>×</button>}
    </div>
    <div className={styles.body}>{content}</div>
    {footer !== undefined && (
      <div className={styles.footer} data-footer>{footer}</div>
    )}
  </div>
</div>

五、Notification 组件

5.1 组件概述

全局通知消息,显示在屏幕四角,可包含复杂内容。

5.2 antd API 完整清单

静态方法:

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 定义

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 设计

// 静态方法
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 定义

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 定义

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
<div
  className={styles.root}
  data-size={size}
  data-fullscreen={fullscreen || undefined}
  data-spinning={spinning || undefined}
>
  {fullscreen && <div className={styles.mask} data-mask />}
  <div className={styles.container}>
    <span className={styles.indicator}>{indicator || <DefaultIndicator />}</span>
    {percent !== undefined && (
      <span className={styles.progress}>{percent}%</span>
    )}
    {description && <span className={styles.description}>{description}</span>}
  </div>
</div>

八、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 定义

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<SemanticDOM, CSSProperties> -
title 标题 ReactNode -
width 宽度 (deprecated) string | number 378
zIndex z-index number 1000
onClose 关闭回调 function(e) -
drawerRender 自定义渲染 (node: ReactNode) => ReactNode -

9.3 Pika Props 定义

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 定义

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

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 状态颜色映射

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 隐藏选项