import React, { ReactNode, CSSProperties } from 'react'; /** * 滚动位置配置 */ export interface ScrollPosition { /** 竖向滚动位置(像素) */ scrollTop?: number; /** 横向滚动位置(像素) */ scrollLeft?: number; /** 滚动行为 */ behavior?: 'auto' | 'smooth'; } /** * 滚动到元素配置 */ export interface ScrollToElementConfig { /** 目标元素 ID */ targetId: string; /** 对齐方式 */ align?: 'start' | 'center' | 'end' | 'nearest'; /** 滚动行为 */ behavior?: 'auto' | 'smooth'; /** 偏移量 */ offset?: number; } /** * 滚动百分比配置 */ export interface ScrollPercentage { /** 竖向滚动百分比 (0-100) */ percentY?: number; /** 横向滚动百分比 (0-100) */ percentX?: number; /** 滚动行为 */ behavior?: 'auto' | 'smooth'; } /** * 滚动按钮配置 */ export interface ScrollActionsConfig { show?: boolean; /** 按钮类型 */ type: "backTop" | "rArrows" | "lrArrows" | "tbArrows" | "custom"; style?: CSSProperties; scrollDistance?: number; /** 按钮配置 根据type不同,配置不同 */ config?: any; } /** * 滚动事件数据 */ export interface ScrollEventData { /** 当前滚动位置 */ scrollTop: number; scrollLeft: number; /** 滚动百分比 */ percentY: number; percentX: number; /** 可滚动高度/宽度 */ scrollHeight: number; scrollWidth: number; /** 容器尺寸 */ clientHeight: number; clientWidth: number; /** 滚动方向 */ direction: 'up' | 'down' | 'left' | 'right' | null; /** 是否滚动到顶部 */ isScrollToTop: boolean; /** 是否滚动到底部 */ isScrollToBottom: boolean; /** 是否滚动到左边 */ isScrollToLeft: boolean; /** 是否滚动到右边 */ isScrollToRight: boolean; /** 是否已经产生滚动条 */ isOverflows: boolean; } /** * 视图监听配置 */ export interface IntersectionConfig { /** 是否启用视图监听 */ enabled?: boolean; /** 交叉阈值 (0-1) */ threshold?: number | number[]; /** 根边距 */ rootMargin?: string; /** 元素进入视图回调 */ onEnterViewport?: (entry: IntersectionObserverEntry, element: Element) => void; /** 元素离开视图回调 */ onLeaveViewport?: (entry: IntersectionObserverEntry, element: Element) => void; /** 可见度变化回调 */ onVisibilityChange?: (entry: IntersectionObserverEntry, element: Element) => void; /** 需要监听的元素选择器 */ targetSelector?: string; } /** * 吸附滚动配置 */ export interface SnapScrollConfig { /** 是否启用吸附滚动 */ enabled?: boolean; /** 吸附类型 */ type?: 'mandatory' | 'proximity'; /** 吸附对齐方式 */ align?: 'start' | 'center' | 'end'; /** 吸附开始回调 */ onSnapStart?: (targetIndex: number, targetPosition: number) => void; /** 吸附结束回调 */ onSnapEnd?: (currentIndex: number, currentPosition: number) => void; } /** * PisellScrollView 组件 Props */ export interface PisellScrollViewProps { /** 子元素 */ children?: ReactNode; /** 自定义类名 */ className?: string; /** 自定义样式 */ style?: CSSProperties; /** 滚动方向 */ overflow?: 'auto' | 'scroll' | 'hidden' | 'x' | 'y' | 'both'; /** 滚动条样式 */ scrollbarStyle?: 'default' | 'thin' | 'minimal' | 'rounded' | 'overlay' | 'custom' | 'none'; /** 自定义滚动条类名(当 scrollbarStyle 为 'custom' 时使用) */ scrollbarClassName?: string; /** 是否显示滚动按钮 */ showScrollButtons?: boolean; /** 箭头操作 */ scrollActionsConfig?: ScrollActionsConfig; /** 滚动时触发 */ onScroll?: (data: ScrollEventData) => void; /** 开始滚动时触发 */ onScrollStart?: (data: ScrollEventData) => void; /** 滚动结束时触发(防抖延迟,默认 150ms) */ onScrollEnd?: (data: ScrollEventData) => void; /** 滚动结束防抖延迟时间(ms) */ scrollEndDelay?: number; /** 到达顶部时触发 */ onReachTop?: (data: ScrollEventData) => void; /** 到达底部时触发 */ onReachBottom?: (data: ScrollEventData) => void; /** 到达左边时触发 */ onReachLeft?: (data: ScrollEventData) => void; /** 到达右边时触发 */ onReachRight?: (data: ScrollEventData) => void; /** 边界阈值(到达边界的像素阈值) */ reachThreshold?: number; /** IntersectionObserver 配置 */ intersection?: IntersectionConfig; /** 吸附滚动配置 */ snapScroll?: SnapScrollConfig; /** 容器宽度 */ width?: number | string; /** 容器高度 */ height?: number | string; /** 最大宽度 */ maxWidth?: number | string; /** 最大高度 */ maxHeight?: number | string; /** 最小宽度 */ minWidth?: number | string; /** 最小高度 */ minHeight?: number | string; /** Ref 引用 */ ref?: React.Ref; /** 设计模式 */ __designMode?: boolean; } /** * 组件暴露的方法 */ export interface PisellScrollViewRef { /** 滚动到指定位置 */ scrollTo: (position: ScrollPosition) => void; /** 滚动到指定元素 */ scrollToElement: (config: ScrollToElementConfig) => void; /** 滚动到百分比位置 */ scrollToPercentage: (percentage: ScrollPercentage) => void; /** 滚动到顶部 */ scrollToTop: (behavior?: 'auto' | 'smooth') => void; /** 滚动到底部 */ scrollToBottom: (behavior?: 'auto' | 'smooth') => void; /** 滚动到最左侧 */ scrollToLeft: (behavior?: 'auto' | 'smooth') => void; /** 滚动到最右侧 */ scrollToRight: (behavior?: 'auto' | 'smooth') => void; /** 获取当前滚动信息 */ getScrollData: () => ScrollEventData; /** 获取滚动容器 DOM 元素 */ getScrollContainer: () => HTMLElement | null; /** 滚动到指定吸附点(索引) */ scrollToSnapPoint: (index: number, behavior?: 'auto' | 'smooth') => void; /** 获取所有吸附点位置 */ getSnapPoints: () => number[]; /** 获取当前吸附点索引 */ getCurrentSnapIndex: () => number; /** 滚动到下一个吸附点 */ scrollToNextSnap: (behavior?: 'auto' | 'smooth') => void; /** 滚动到上一个吸附点 */ scrollToPrevSnap: (behavior?: 'auto' | 'smooth') => void; }