import type { RefObject, ReactNode } from 'react'; /** 单个锚点项 */ export interface ConversationAnchorItem { /** 稳定 id,用于定位 DOM 节点与 React key */ id: string; /** 在 Tooltip 中展示的摘要文案(纯文本)。为空时回落到 labels.scrollTo。 */ summary?: string; } /** i18n 文案 */ export interface ConversationAnchorLabels { /** nav 的 aria-label */ ariaLabel?: string; /** Tooltip 兜底文案(无摘要时) */ scrollTo?: string; } /** 样式变体 */ export type ConversationAnchorVariant = 'bar' | 'punch'; export interface ConversationAnchorNavProps { /** 滚动容器 ref,用于检测当前可视锚点;受控场景可传 { current: null } */ scrollContainerRef: RefObject; /** 锚点列表,顺序即视觉顺序 */ items: ConversationAnchorItem[]; /** 点击锚点时回调,参数为在 items 中的索引与对应 item */ onSelect: (index: number, item: ConversationAnchorItem) => void; /** * 当前高亮索引(受控)。 * 省略时组件内部会订阅 scrollContainerRef 的滚动并通过 IntersectionObserver 自动推导。 */ activeIndex?: number; /** * 锚点视觉样式: * - 'bar' (默认):短横杠,hover 时加长 * - 'punch':圆形"打孔"点,适合羊皮纸 / 拟物风主题 */ variant?: ConversationAnchorVariant; /** 少于该数量时隐藏整个 nav,默认 3 */ minItems?: number; /** 外部强制隐藏(例如 compact 布局),默认 false */ hidden?: boolean; /** 自定义 Tooltip / aria 文案 */ labels?: ConversationAnchorLabels; /** 额外 className(会与默认定位 className 合并) */ className?: string; /** * 自定义锚点元素解析。默认通过 * `scrollContainerRef.current.querySelector('[data-spark-anchor=""]')` * 查找;需要业务在消息容器上添加该属性。 */ getAnchorElement?: (item: ConversationAnchorItem, index: number, container: HTMLElement) => HTMLElement | null; /** 渲染 slot:自定义每个锚点的视觉表达,返回 null 时回落到内置样式 */ renderAnchor?: (ctx: { item: ConversationAnchorItem; index: number; isActive: boolean; variant: ConversationAnchorVariant; }) => ReactNode; } export declare const ConversationAnchorNav: import("react").NamedExoticComponent; export interface UseVisibleAnchorIndexOptions { scrollContainerRef: RefObject; items: ConversationAnchorItem[]; /** 与 ConversationAnchorNav 同名 prop,默认按 `[data-spark-anchor=""]` 查找 */ getAnchorElement?: ConversationAnchorNavProps['getAnchorElement']; /** 为 false 时不订阅滚动,返回 0;用于受控场景 */ enabled?: boolean; } /** * 订阅 scroll 容器内每个锚点元素的可见性,返回"最靠近顶部且仍可见"的锚点索引。 * - 容器必须可滚动(通常 overflow-y: auto),且锚点元素是其后代 * - 每个锚点需要能通过 `getAnchorElement` 解析到 HTMLElement */ export declare function useVisibleAnchorIndex({ scrollContainerRef, items, getAnchorElement, enabled, }: UseVisibleAnchorIndexOptions): number;