/** * Renderer-independent semantic text coordinates used by pane selection. * * Anchors point at stable domain block ids and UTF-16 source offsets rather * than viewport cells, so wrapping, resizing, and virtualized rows cannot * change what an existing selection means. */ export declare const SEMANTIC_BLOCK_SEPARATOR = "\n\n"; export interface SemanticBlock { readonly id: string; readonly text: string; } export interface SemanticDocument { readonly blocks: readonly SemanticBlock[]; } export interface SemanticAnchor { readonly blockId: string; readonly offset: number; } export interface SemanticRange { readonly anchor: SemanticAnchor; readonly focus: SemanticAnchor; } export type SemanticMovement = "left" | "right" | "word-left" | "word-right" | "line-start" | "line-end" | "up" | "down"; export declare function normalizeSemanticDocument(document: SemanticDocument): SemanticDocument; export declare function documentStart(document: SemanticDocument): SemanticAnchor | undefined; export declare function documentEnd(document: SemanticDocument): SemanticAnchor | undefined; export declare function clampSemanticAnchor(document: SemanticDocument, anchor: SemanticAnchor, missing?: "start" | "end"): SemanticAnchor | undefined; export declare function compareSemanticAnchors(document: SemanticDocument, left: SemanticAnchor, right: SemanticAnchor): number; export declare function semanticRangeText(document: SemanticDocument, range: SemanticRange): string; export declare function moveSemanticAnchor(document: SemanticDocument, requested: SemanticAnchor, movement: SemanticMovement): SemanticAnchor | undefined; /** SEL-005: double-click selects a whole URL/path as one unit, else a word. */ export declare function semanticWordRange(document: SemanticDocument, requested: SemanticAnchor): SemanticRange | undefined; export declare function semanticLineRange(document: SemanticDocument, requested: SemanticAnchor): SemanticRange | undefined;