import { Range } from '../rga/Range';
import { ChunkSlice } from '../util/ChunkSlice';
import { Cursor } from '../editor/Cursor';
import type { Point } from '../rga/Point';
import type { OverlayPoint } from '../overlay/OverlayPoint';
import type { Printable } from 'tree-dump/lib/types';
import type { Peritext } from '../Peritext';
import type { Slice } from '../slice/types';
import type { PeritextMlNode } from './types';
export declare abstract class AbstractInlineAttr<T = string> {
    slice: Slice<T>;
    constructor(slice: Slice<T>);
    /** @returns Whether the attribute starts at the start of the inline. */
    isStart(): boolean;
    /** @returns Whether the attribute ends at the end of the inline. */
    isEnd(): boolean;
    /** @returns Whether the attribute is collapsed to a point. */
    isCollapsed(): boolean;
}
/** The attribute started before this inline and ends after this inline. */
export declare class InlineAttrPassing<T = string> extends AbstractInlineAttr<T> {
}
/** The attribute starts at the beginning of this inline. */
export declare class InlineAttrStart<T = string> extends AbstractInlineAttr<T> {
    isStart(): boolean;
}
/** The attribute ends at the end of this inline. */
export declare class InlineAttrEnd<T = string> extends AbstractInlineAttr<T> {
    isEnd(): boolean;
}
/** The attribute starts and ends in this inline, exactly contains it. */
export declare class InlineAttrContained<T = string> extends AbstractInlineAttr<T> {
    isStart(): boolean;
    isEnd(): boolean;
}
/** The attribute is collapsed at start of this inline. */
export declare class InlineAttrStartPoint<T = string> extends AbstractInlineAttr<T> {
    isStart(): boolean;
    isCollapsed(): boolean;
}
/** The attribute is collapsed at end of this inline. */
export declare class InlineAttrEndPoint<T = string> extends AbstractInlineAttr<T> {
    isEnd(): boolean;
    isCollapsed(): boolean;
}
export type InlineAttr<T = string> = InlineAttrPassing<T> | InlineAttrStart<T> | InlineAttrEnd<T> | InlineAttrContained<T> | InlineAttrStartPoint<T> | InlineAttrEndPoint<T>;
export type InlineAttrStack<T = string> = InlineAttr<T>[];
export type InlineAttrs<T = string> = Record<string | number, InlineAttrStack<T>>;
/**
 * The `Inline` class represents a range of inline text within a block, which
 * has the same annotations and formatting for all of its text contents, i.e.
 * its text contents can be rendered as a single (`<span>`) element. However,
 * the text contents might still be composed of multiple {@link ChunkSlice}s,
 * which are the smallest units of text and need to be concatenated to get the
 * full text content of the inline.
 */
export declare class Inline<T = string> extends Range<T> implements Printable {
    readonly txt: Peritext<T>;
    readonly p1: OverlayPoint<T>;
    readonly p2: OverlayPoint<T>;
    constructor(txt: Peritext<T>, p1: OverlayPoint<T>, p2: OverlayPoint<T>, start: Point<T>, end: Point<T>);
    /**
     * @returns A stable unique identifier of this *inline* within a list of other
     *     inlines of the parent block. Can be used for UI libraries to track the
     *     identity of the inline across renders.
     */
    key(): number;
    /**
     * @returns The position of the inline within the text.
     */
    pos(): number;
    protected createAttr(slice: Slice<T>): InlineAttr<T>;
    private _attr;
    /**
     * @returns Returns the attributes of the inline, which are the slice
     *     annotations and formatting applied to the inline.
     *
     * @todo Rename to `.stat()`.
     * @todo Create a more efficient way to compute inline stats, separate: (1)
     *     boolean flags, (2) cursor, (3) other attributes.
     */
    attr(): InlineAttrs<T>;
    hasCursor(): boolean;
    /** @todo Make this return a list of cursors. */
    cursorStart(): Cursor | undefined;
    cursorEnd(): Cursor | undefined;
    /**
     * Returns a 2-tuple if this inline is part of a selection. The 2-tuple sides
     * specify how selection ends on each side. Empty string means the selection
     * continues past that edge, `focus` and `anchor` specify that the edge
     * is either a focus caret or an anchor, respectively.
     *
     * @returns Selection state of this inline.
     */
    selection(): undefined | [left: 'anchor' | 'focus' | '', right: 'anchor' | 'focus' | ''];
    texts(limit?: number): ChunkSlice<T>[];
    toJson(): PeritextMlNode;
    toStringName(): string;
    toString(tab?: string): string;
}
