import type { ModelEvents, ModelOptions, PageAnchor, PageParams, PageRef, PageHashState, PageHashStateWithAnchor, SetDataOptions } from './model.js';
import type { Dataset } from '../core/utils/load-data.js';
import type { InjectStyle } from '../core/utils/inject-styles.js';
import type { SingleViewConfig } from '../core/view.js';
import type { Progressbar } from '../core/utils/progressbar.js';
import { Model } from './model.js';
import { Observer } from '../core/observer.js';
import { ColorScheme, ColorSchemeState } from '../core/color-scheme.js';
import { ViewModelNavigation } from '../nav/index.js';
import { PageRenderer } from '../core/page.js';
import { ViewRenderer } from '../core/view.js';
import { PresetRenderer } from '../core/preset.js';
export type RenderSubject = typeof renderSubjects[number];
export type SetDataProgressOptions = Partial<{
    dataset: Dataset;
    progressbar: Progressbar;
}>;
declare const renderSubjects: readonly ["nav", "sidebar", "page"];
export interface ViewModelEvents extends ModelEvents {
    startSetData: [subscribe: Progressbar['subscribeSync']];
    pageStateChange: [prev: PageHashState];
    pageAnchorChange: [prev: string | null];
    pageHashChange: [replace: boolean];
}
export interface ViewModelOptions<T = ViewModel> extends ModelOptions<T> {
    container: HTMLElement;
    styles: InjectStyle[];
    compact: boolean;
    colorScheme: ColorSchemeState;
    colorSchemePersistent: boolean;
    defaultPage: string;
    defaultPageId: string;
    discoveryPageId: string;
    reportToDiscoveryRedirect: boolean;
    inspector: boolean;
    /** @deprecated Legacy option, use colorScheme instead */
    darkmode: ColorSchemeState;
    /** @deprecated Legacy option, use colorSchemePersistent instead */
    darkmodePersistent: boolean;
}
type ViewModelOptionsBind = ViewModelOptions;
export declare class ViewModel<Options extends ViewModelOptions = ViewModelOptionsBind, Events extends ViewModelEvents = ViewModelEvents> extends Model<Options, Events> {
    #private;
    compact: boolean;
    colorScheme: ColorScheme;
    inspectMode: Observer<boolean>;
    view: ViewRenderer;
    nav: ViewModelNavigation;
    preset: PresetRenderer;
    page: PageRenderer;
    defaultPageId: string;
    discoveryPageId: string;
    reportToDiscoveryRedirect: boolean;
    pageId: string;
    pageRef: PageRef;
    pageParams: Record<string, any>;
    pageAnchor: PageAnchor;
    pageHash: string;
    dom: {
        ready: Promise<void>;
        wrapper: HTMLElement;
        root: HTMLElement | ShadowRoot;
        container: HTMLElement;
        nav: HTMLElement;
        sidebar: HTMLElement;
        content: HTMLElement;
        pageContent: HTMLElement;
        detachColorScheme: null | (() => void);
    };
    queryExtensions: Record<string, (...args: unknown[]) => any>;
    constructor(options: Partial<Options>);
    initRenderTriggers(): void;
    setData(data: unknown, options?: SetDataOptions & {
        render?: boolean;
    }): Promise<void>;
    setDataProgress(data: unknown, context: unknown, options?: SetDataProgressOptions): Promise<void>;
    queryToConfig(view: string, query: string): SingleViewConfig;
    initDom(styles?: InjectStyle[]): void;
    setContainer(container?: HTMLElement): void;
    disposeDom(): void;
    addGlobalEventListener<E extends keyof DocumentEventMap>(type: E, listener: (e: DocumentEventMap[E]) => void, options?: boolean | AddEventListenerOptions): () => void;
    addHostElEventListener<E extends keyof HTMLElementEventMap>(type: E, listener: (e: HTMLElementEventMap[E]) => void, options?: boolean | AddEventListenerOptions): () => void;
    scheduleRender(subject?: RenderSubject): void;
    enforceScheduledRenders(): Promise<void>;
    cancelScheduledRender(subject?: RenderSubject): void;
    getRenderContext(): any;
    protected renderNav(): void;
    protected renderSidebar(): Promise<void> | undefined;
    encodePageHash(pageId: string, pageRef?: PageRef, pageParams?: PageParams, pageAnchor?: string | null): string;
    decodePageHash(hash: string): {
        pageId: string;
        pageRef: string | null;
        pageParams: Record<string, unknown>;
        pageAnchor: string | null;
    };
    setPageHashState(pageState?: Partial<PageHashState>, replace?: boolean): boolean;
    overridePageHashState(pageState: Partial<PageHashState>, replace?: boolean): boolean;
    getPageHashState(): PageHashState;
    setPageHashStateWithAnchor(pageStateWithAnchor: Partial<PageHashStateWithAnchor>, replace?: boolean): boolean;
    overridePageHashStateWithAnchor(pageState: Partial<PageHashStateWithAnchor>, replace?: boolean): boolean;
    getPageHashStateWithAnchor(): PageHashStateWithAnchor;
    setPage(pageId: string, pageRef?: PageRef, pageParams?: PageParams, replace?: boolean): boolean;
    setPageRef(pageRef?: PageRef, replace?: boolean): boolean;
    setPageParams(pageParams: PageParams, replace?: boolean): boolean;
    setPageAnchor(pageAnchor: string | null, replace?: boolean): boolean;
    setPageHash(hash: string, replace?: boolean): boolean;
    applyPageAnchor(onlyIfPageAnchorPresent?: boolean): void;
    protected renderPage(): Promise<void>;
}
export {};
