/** * Wheel over the composer: scroll a multi-line / overflowing draft in-place, * or signal that the chat transcript may scroll (short single-line drafts). */ export declare function composerDraftOverflows(contentLines: number, visibleRows: number): boolean; /** Multi-line draft (newlines or soft-wrap) owns the wheel — never the chat. */ export declare function composerOwnsWheel(contentLines: number): boolean; /** Next viewport Y for an overflowing draft; undefined if nothing to scroll. */ export declare function nextComposerScrollOffset(opts: { readonly offsetY: number; readonly viewportHeight: number; readonly totalLines: number; readonly direction: "up" | "down" | string; readonly delta?: number | undefined; readonly lineStep?: number | undefined; }): number | undefined; /** Minimal editor surface used for draft-internal wheel scroll. */ export interface ComposerWheelEditor { readonly lineCount?: number; readonly virtualLineCount?: number; readonly plainText?: string; readonly editorView: { getViewport(): { offsetY: number; offsetX: number; height: number; width: number; }; getTotalVirtualLineCount?: () => number; setViewport(x: number, y: number, width: number, height: number, moveCursor?: boolean): void; }; moveCursorUp(): unknown; moveCursorDown(): unknown; } /** Best-effort visual line count from the live editor (React state can lag). */ export declare function measureComposerLines(editor: ComposerWheelEditor | null | undefined, contentLinesFallback: number): number; /** * Scroll the draft when the composer owns the wheel. * Returns true when chat must NOT scroll (multi-line / overflow draft). */ export declare function tryScrollComposerDraft(editor: ComposerWheelEditor, opts: { readonly contentLines: number; readonly visibleRows: number; readonly direction: "up" | "down" | string; readonly delta?: number | undefined; }): boolean; /** Wheel delta → transcript scroll steps (shared by composer + app). */ export declare function wheelChatDelta(direction: "up" | "down" | string, delta?: number): number; /** * Resolve composer wheel: "draft" | "chat" | "none". * Unfocused composer never scrolls the draft (avoids dual scroll with chat). */ export declare function resolveComposerWheelTarget(opts: { readonly composerFocused: boolean; readonly editor: ComposerWheelEditor | null | undefined; readonly contentLines: number; readonly visibleRows: number; }): "draft" | "chat";