import { MaybeGetter } from './utilities/callOrGet.js';
import { AttributeSpec } from './Attribute.js';
/**
 * Configuration for Mark extensions.
 *
 * @typeParam Options - Type for mark options.
 * @typeParam Storage - Type for mark storage.
 * @typeParam Attrs - Type for mark attributes (optional, enables typed addAttributes).
 */
export interface MarkConfig<Options extends Record<string, unknown> = Record<string, never>, Storage extends Record<string, unknown> = Record<string, never>, Attrs extends Record<string, unknown> = Record<string, unknown>> {
    /** The unique name of the mark */
    name: string;
    /** Whether this mark is from an external package */
    isExternal?: boolean;
    /** Function to define mark options */
    addOptions?: MaybeGetter<Options>;
    /** Function to define mark storage */
    addStorage?: MaybeGetter<Storage>;
    /**
     * Function or object to add attributes to the mark.
     * When Attrs generic is provided, attribute keys are validated against it.
     */
    addAttributes?: MaybeGetter<{
        [K in keyof Attrs]?: Partial<AttributeSpec>;
    }>;
    /** Additional config fields - use with caution */
    [key: string]: unknown;
}
/**
 * Mark class is used to create Mark extensions.
 *
 * @typeParam Options - Type for mark options.
 * @typeParam Storage - Type for mark storage.
 * @typeParam Attrs - Type for mark attributes (enables typed attribute access).
 */
export declare class Mark<Options extends Record<string, unknown> = Record<string, never>, Storage extends Record<string, unknown> = Record<string, never>, Attrs extends Record<string, unknown> = Record<string, unknown>> {
    type: "mark";
    name: string;
    options: Options;
    storage: Storage;
    isExternal: boolean;
    config: MarkConfig<Options, Storage, Attrs>;
    /**
     * Type hint for the attributes this mark uses.
     * Not used at runtime, but enables type inference.
     */
    readonly __attrsType: Attrs;
    constructor(config: MarkConfig<Options, Storage, Attrs>);
    /**
     * Static method for creating Mark extension.
     * @param config Configuration for the mark.
     */
    static create<O extends Record<string, unknown> = Record<string, never>, S extends Record<string, unknown> = Record<string, never>, A extends Record<string, unknown> = Record<string, unknown>>(config: MarkConfig<O, S, A>): Mark<O, S, A>;
}
//# sourceMappingURL=Mark.d.ts.map