import Prism from 'prismjs';

interface InitCodeHighlightOptions {
    languagesUrl?: string;
    rtl?: boolean;
    tabSize?: number;
    enableAutocorrect?: boolean;
    lineNumbers?: boolean;
    defaultTheme?: boolean;
    areaId?: string | null;
    ariaLabelledby?: string | null;
    readonly?: boolean;
    copyButton?: boolean;
    maxLines?: number;
    minLines?: number;
    language?: string;
    styleParent?: HTMLElement;
    handleTabs?: boolean;
    handleSelfClosingCharacters?: boolean;
    handleNewLineIndentation?: boolean;
}
type InitHighlightEventMap = {
    _input: (ev: Event) => void;
    _keydown: (ev: KeyboardEvent) => void;
    _scroll: (ev: Event) => void;
};

declare class InitCodeHighlight {
    editorRoot: HTMLElement;
    opts: InitCodeHighlightOptions;
    events: InitHighlightEventMap;
    code: string;
    elWrapper: HTMLElement;
    elTextarea: HTMLTextAreaElement;
    elPre: HTMLElement;
    elCode: HTMLElement;
    elLineNumbers: HTMLElement;
    elCopyButton: HTMLElement;
    elCopyButtonMessage: HTMLElement;
    lineNumber: number;
    constructor(selectorOrElement: string | HTMLElement, opts: InitCodeHighlightOptions);
    protected startEditor(): void;
    protected createWrapper(): void;
    protected createTextarea(): void;
    protected createPre(): void;
    protected createCode(): void;
    protected createLineNumbers(): void;
    protected createCopyButton(): void;
    protected destroyLineNumbers(): void;
    protected createElement(elementTag: string, whereToAppend: HTMLElement): HTMLElement;
    protected runOptions(): void;
    protected updateLineNumbersCount(): void;
    protected updateEditorHeight(): void;
    protected listenTextarea(): void;
    protected handleTabs(e: KeyboardEvent): void;
    protected handleSelfClosingCharacters(e: KeyboardEvent): void;
    protected setLineNumber(): void;
    protected handleNewLineIndentation(e: KeyboardEvent): void;
    protected closeCharacter(char: string): void;
    protected skipCloseChar(char: string): boolean;
    updateCode(newCode: string): void;
    updateLanguage(newLanguage: string): void;
    getPrism(): typeof Prism;
    protected populateDefault(): void;
    highlight(): void;
    protected updateCallBack: ((code: string) => void) | null;
    onUpdate(callback: (code: string) => void): void;
    getCode(): string;
    runUpdate(): void;
    enableReadonlyMode(): void;
    disableReadonlyMode(): void;
    toggleReadonlyMode(): void;
    enableLineNumbers(): void;
    disableLineNumbers(): void;
    toggleLineNumbers(): void;
    dispose(): void;
}

export { type InitCodeHighlightOptions, InitCodeHighlight as default };
