import type { ReactNode } from 'react' // ===== 基础类型 ===== export type ReasoningStepDetail = | { type: 'action'; action: string; desc?: string; details?: ReasoningStepDetail[] } | { type: 'file' filename: string lines?: string path?: string fileType?: string details?: ReasoningStepDetail[] } export type ReasoningStepStatus = 'completed' | 'in-progress' // ===== 组件 Props ===== export interface ReasoningStepRootProps { /** 主文本 */ text: ReactNode /** 描述文本 */ description?: string /** 状态 */ status?: ReasoningStepStatus /** 自定义图标 */ icon?: ReactNode /** 是否显示图标 */ showIcon?: boolean /** 详情数据 */ details?: ReasoningStepDetail[] /** 子组件 */ children?: ReactNode /** 动画持续时间 */ duration?: number /** 动画扩散度 */ spread?: number /** 禁用展开动画 */ disableExpandAnimation?: boolean /** 默认展开 */ defaultExpanded?: boolean /** 受控展开状态 */ expanded?: boolean /** 展开状态变化回调 */ onExpandedChange?: (expanded: boolean) => void /** 自定义眼睛图标 */ eyeIcon?: ReactNode /** 自定义箭头图标 */ arrowRightIcon?: ReactNode } export type ReasoningStepProps = ReasoningStepRootProps export interface ReasoningStepHeaderProps { className?: string } export interface ReasoningStepDetailsProps { className?: string children?: ReactNode } export interface ReasoningStepDetailRowProps { detail: ReasoningStepDetail depth?: number pathKey?: string className?: string } // ===== Context 类型 ===== export interface ReasoningStepContextValue { // 状态 status: ReasoningStepStatus isExpanded: boolean isHovered: boolean setIsHovered: (hovered: boolean) => void toggleExpanded: () => void effectiveExpanded: boolean effectiveShowIcon: boolean hasExpandableContent: boolean // 数据 text: ReactNode description?: string details?: ReasoningStepDetail[] detailsChildren?: ReactNode // 配置 duration: number spread: number disableExpandAnimation: boolean detailIndent: string // 嵌套状态 expandedNestedKeys: Set toggleNested: (pathKey: string) => void // 图标 icon?: ReactNode eyeIcon: ReactNode arrowRightIcon: ReactNode } // ===== 复合组件类型 ===== export interface ReasoningStepCompound { Root: React.FC Header: React.FC Details: React.FC DetailRow: React.FC }