import { StyleProp, ViewStyle } from 'react-native'; /** 布局模式 */ export type LayoutMode = 'grid' | 'waterfall' | 'horizontal' | 'list'; /** 卡片尺寸预设 */ export type CardSize = 'small' | 'medium' | 'large' | 'auto'; /** DbItemCard 组件属性 */ export interface DbItemCardProps { /** 卡片内部子元素(自定义渲染内容) */ children: React.ReactNode; /** 布局模式:grid/waterfall/horizontal/list */ layoutMode?: LayoutMode; /** 列表列数,控制卡片宽度计算,默认2列 */ numColumns?: number; /** 列表项之间的水平间距,单位px,默认8px */ itemSpacing?: number; /** 列表项之间的垂直间距,单位px,默认等于 itemSpacing */ rowSpacing?: number; /** 列表容器两侧的间距(左右边距),单位px,默认12px */ sideSpacing?: number; /** 卡片在列表中的索引,用于计算间距和瀑布流高度 */ index?: number; /** 卡片自定义样式 */ style?: StyleProp; /** 卡片固定高度,单位px */ cardHeight?: number; /** 卡片最小高度(用于瀑布流) */ minHeight?: number; /** 卡片最大高度(用于瀑布流) */ maxHeight?: number; /** 卡片宽度(仅 horizontal 模式有效) */ cardWidth?: number; /** 卡片背景色,默认白色 */ backgroundColor?: string; /** 卡片圆角值,单位px,默认12px */ borderRadius?: number; /** 是否显示阴影 */ shadow?: boolean; /** 阴影强度:none/sm/md/lg */ shadowLevel?: 'none' | 'sm' | 'md' | 'lg'; /** 边框宽度 */ borderWidth?: number; /** 边框颜色 */ borderColor?: string; /** 内边距 */ padding?: number; /** 点击回调 */ onPress?: () => void; /** 长按回调 */ onLongPress?: () => void; /** 是否禁用点击效果 */ disabled?: boolean; /** 点击时的透明度 */ activeOpacity?: number; /** 自定义容器宽度(覆盖自动计算) */ width?: number | string; /** 宽高比(用于自动计算高度) */ aspectRatio?: number; /** 是否为第一个元素 */ isFirst?: boolean; /** 是否为最后一个元素 */ isLast?: boolean; /** 是否为一行的最后一个 */ isRowLast?: boolean; } /** DbItemCardList 组件属性(卡片列表容器) */ export interface DbItemCardListProps { /** 数据源 */ data: T[]; /** 渲染每个卡片的内容 */ renderItem: (item: T, index: number) => React.ReactNode; /** 获取每个项目的唯一 key */ keyExtractor: (item: T, index: number) => string; /** 布局模式 */ layoutMode?: LayoutMode; /** 列数(grid/waterfall 模式有效) */ numColumns?: number; /** 水平间距 */ itemSpacing?: number; /** 垂直间距 */ rowSpacing?: number; /** 两侧边距(组件自己添加的边距,不是父容器的边距) */ sideSpacing?: number; /** * 容器宽度(用于自动计算卡片宽度) * - 不传时自动测量实际容器宽度 * - 传入数值时使用指定宽度 */ containerWidth?: number; /** 卡片圆角 */ borderRadius?: number; /** 卡片背景色 */ cardBackgroundColor?: string; /** 是否显示阴影 */ showShadow?: boolean; /** 阴影强度 */ shadowLevel?: 'none' | 'sm' | 'md' | 'lg'; /** 卡片固定高度 */ cardHeight?: number; /** 卡片宽度(horizontal 模式) */ cardWidth?: number; /** 宽高比 */ aspectRatio?: number; /** 瀑布流模式下获取每个项目的高度 */ getItemHeight?: (item: T, index: number) => number; /** * 是否自动测量瀑布流项目高度 * - 当设置为 true 且未提供 getItemHeight 时,组件会自动测量每个项目的实际高度 * - 默认为 false,保持向后兼容(需要手动提供 getItemHeight) */ autoMeasureHeight?: boolean; /** * 瀑布流默认卡片高度(在未测量完成前使用) * 当启用 autoMeasureHeight 时,此值作为初始高度,测量完成后会被实际高度覆盖 */ defaultCardHeight?: number; /** 容器样式 */ style?: StyleProp; /** 内容容器样式 */ contentContainerStyle?: StyleProp; /** 卡片点击回调 */ onItemPress?: (item: T, index: number) => void; /** 列表头部 */ ListHeaderComponent?: React.ReactNode; /** 列表底部 */ ListFooterComponent?: React.ReactNode; /** 空状态组件 */ ListEmptyComponent?: React.ReactNode; /** 是否可滚动 */ scrollable?: boolean; /** 是否水平滚动(horizontal 模式) */ horizontal?: boolean; /** 是否显示滚动条 */ showsScrollIndicator?: boolean; /** 是否正在加载更多 */ isLoadingMore?: boolean; /** 加载更多回调(水平滚动模式或瀑布流模式) */ onLoadMore?: () => void; /** 距离底部/右边多少距离时触发加载更多(像素值) * 水平滚动模式:距离右边像素值,默认 500 * 瀑布流模式:距离底部像素值,默认 500 */ loadMoreThreshold?: number; /** 加载中组件 */ LoadingComponent?: React.ReactNode; /** 底部间距(用于避免被 TabBar 等元素挡住) */ bottomSpacing?: number; } /** 阴影样式配置 */ export interface ShadowConfig { shadowColor: string; shadowOffset: { width: number; height: number; }; shadowOpacity: number; shadowRadius: number; elevation: number; }