// Generated by dts-bundle-generator v9.5.1

declare const logLevels: readonly [
	"silent",
	"error",
	"warn",
	"info",
	"perf",
	"debug"
];
type LogLevel = typeof logLevels[number];
type ConsoleMethodName = "log" | "error" | "warn" | "info" | "debug" | "group" | "groupCollapsed" | "groupEnd";
type ConsoleMethod = (...args: unknown[]) => void;
type ConsoleLike = {
	[K in ConsoleMethodName]: ConsoleMethod;
};
type LoogerMethod = ConsoleMethod & {
	group(message: string, content: (() => unknown[] | void) | unknown[]): void;
	groupCollapsed(message: string, content: (() => unknown[] | void) | unknown[]): void;
};
declare class Logger {
	#private;
	error: LoogerMethod;
	warn: LoogerMethod;
	info: LoogerMethod;
	perf: LoogerMethod;
	debug: LoogerMethod;
	log: LoogerMethod;
	constructor(prefix?: string, logLevel?: LogLevel, consoleLikeApi?: ConsoleLike);
	shouldLogLevel(logLevel: LogLevel): boolean;
	get logLevel(): LogLevel;
	set logLevel(logLevel: LogLevel);
}
type EventMap = Record<string, unknown[]>;
type Callback<P extends unknown[]> = (...args: P) => void;
type Listener<P extends unknown[]> = {
	callback: Callback<P> | null;
	next: Listener<P> | null;
};
declare class Emitter<Events extends EventMap> {
	listeners: {
		[EventName in keyof Events]: Listener<Events[EventName]> | null;
	};
	constructor();
	on<E extends keyof Events>(event: E, callback: Callback<Events[E]>): this;
	once<E extends keyof Events>(event: E, callback: Callback<Events[E]>): this;
	off<E extends keyof Events>(event: E, callback: Callback<Events[E]>): this;
	emit<E extends keyof Events>(event: E, ...args: Events[E]): boolean;
}
type OnChangeCallback<T> = (value: T, unsubscribe: () => void) => void | Promise<void>;
type Subscriber<T> = {
	callback: OnChangeCallback<T> | null;
	subscriber: Subscriber<T> | null;
};
declare class Observer<T> {
	#private;
	subscriber: Subscriber<T> | null;
	value: T;
	constructor(initValue: T, shouldUpdate?: (a: T, b: T) => boolean);
	get readonly(): {
		subscribe: (callback: OnChangeCallback<T>) => () => void;
		subscribeSync: (callback: OnChangeCallback<T>) => () => void;
		unsubscribe: (callback: OnChangeCallback<T>) => void;
		readonly value: T;
	};
	subscribe(callback: OnChangeCallback<T>): () => void;
	subscribeSync(callback: OnChangeCallback<T>): () => void;
	unsubscribe(callback: OnChangeCallback<T>): void;
	shouldUpdate(newValue: T, oldValue: T): boolean;
	set(value: T): boolean;
	asyncSet(value: T): Promise<boolean>;
}
type LoadDataState = {
	stage: "inited" | "request" | "receiving" | "decoding" | "received";
	progress?: LoadDataStateProgress;
	step?: string;
} | {
	stage: "error";
	error: Error;
};
type LoadDataStateProgress = {
	done: boolean;
	elapsed: number;
	units?: "bytes";
	completed: number;
	total?: number;
};
type LoadDataResourceSource = Response | File | Blob | ArrayBufferView | string;
type LoadDataResourceMetadata = {
	type?: string;
	name?: string;
	size?: number | null;
	encodedSize?: number;
	createdAt?: string | number;
	[k: string]: unknown;
};
type ExtractResourceOptions = {
	isResponseOk?: (response: Response) => boolean;
	getContentSize?: (response: Response) => string | undefined;
	getContentEncodedSize?: (response: Response) => string | undefined;
	getContentCreatedAt?: (response: Response) => string | undefined;
};
type ProgressbarStage = keyof typeof loadStages;
type ProgressbarState = {
	stage: ProgressbarStage;
	progress: LoadDataStateProgress | null;
	error: Error | null;
};
export declare const loadStages: {
	inited: {
		value: number;
		duration: number;
		title: string;
	};
	request: {
		value: number;
		duration: number;
		title: string;
	};
	receiving: {
		value: number;
		duration: number;
		title: string;
	};
	decoding: {
		value: number;
		duration: number;
		title: string;
	};
	received: {
		value: number;
		duration: number;
		title: string;
	};
	prepare: {
		value: number;
		duration: number;
		title: string;
	};
	initui: {
		value: number;
		duration: number;
		title: string;
	};
	done: {
		value: number;
		duration: number;
		title: string;
	};
	error: {
		value: number;
		duration: number;
		title: string;
	};
};
export declare function decodeStageProgress(stage: ProgressbarStage, progress: ProgressbarState["progress"], step?: string): {
	stageTitle: string;
	progressValue: number;
	progressText: string | null;
	stepText: string;
	title: string;
};
declare function extractResourceMetadata(source: LoadDataResourceSource, options?: ExtractResourceOptions): LoadDataResourceMetadata | undefined;
type PageId = string;
type PageRef = string | number | null;
type PageParams = Record<string, unknown> | [
	string,
	unknown
][] | string;
type PageAnchor = string | null;
type PageHashStateWithAnchor = PageHashState & {
	anchor: PageAnchor;
};
type PageHashState = {
	id: PageId;
	ref: PageRef;
	params: PageParams;
};
type SerializedColorSchemeValue = typeof colorSchemeSerializedValues[number];
type ColorSchemeState = typeof colorSchemeStateValues[number];
declare const colorSchemeSerializedValues: readonly [
	"auto",
	"light",
	"dark"
];
declare const colorSchemeStateValues: readonly [
	"auto",
	"light",
	"dark",
	"light-only",
	"dark-only"
];
type PopupTriggerEl = HTMLElement | null | undefined;
type PopupRender = (el: HTMLElement, triggerEl: PopupTriggerEl, hide: () => void) => void;
type PopupOptions = {
	position: "trigger" | "pointer";
	positionMode: "safe" | "natural";
	pointerOffsetX: number;
	pointerOffsetY: number;
	showDelay: boolean | number | ((triggerEl: PopupTriggerEl) => boolean | number);
	hoverTriggers: string | null;
	hoverPin: false | "popup-hover" | "trigger-click";
	hideIfEventOutside: boolean;
	hideOnResize: boolean;
	render: PopupRender;
	className: string;
};
type RenderFunction = (el: HTMLElement | DocumentFragment, props: RenderProps, data?: any, context?: any) => Promise<any> | void;
type RawViewConfig = SingleViewConfig | RenderFunction | string | RawViewConfig[];
type ClassNameFn = (data: any, context: any) => string | false | null | undefined;
type queryFn = (data: any, context: any) => any;
type query = string | queryFn | boolean;
interface SingleViewConfig {
	view: string | RenderFunction;
	when?: query;
	context?: query;
	data?: query;
	whenData?: query;
	className?: string | ClassNameFn | (string | ClassNameFn)[];
	tooltip?: TooltipConfig | RawViewConfig;
	[key: string]: any;
}
type RenderPropsForbiddenKeys = "view" | "when" | "context" | "data" | "whenData" | "postRender" | "className" | "tooltip";
type RenderProps = {
	[K in string]: K extends RenderPropsForbiddenKeys ? never : any;
};
type TooltipConfig = Partial<{
	showDelay: boolean | number;
	className: string;
	position: PopupOptions["position"];
	positionMode: PopupOptions["positionMode"];
	pointerOffsetX: number;
	pointerOffsetY: number;
	content: RawViewConfig;
}>;
type NavItemConfig = Omit<SingleViewConfig, "view"> & {
	view?: string;
};
type CreateMessageType<T extends Record<string, any>> = {
	[K in keyof T]: {
		from: "discoveryjs-app";
		id: string;
		type: K;
		payload: T[K];
	};
}[keyof T];
type NavSection = "primary" | "secondary" | "menu";
type NavInsertPosition = "before" | "after" | number;
type EmbedHostToPreinitMessage = CreateMessageType<{
	defineAction: string;
	setPageHash: {
		hash: string;
		replace?: boolean;
	};
	setRouterPreventLocationUpdate: boolean;
}>;
type EmbedPreinitToHostMessage = CreateMessageType<{
	preinit: {
		page: {
			hash: string;
		};
	};
	loadingState: LoadDataState;
	destroy: null;
}>;
type EmbedHostToClientMessage = CreateMessageType<{
	defineAction: string;
	notification: {
		name: string;
		details: any;
	};
	setPageHash: {
		hash: string;
		replace?: boolean;
	};
	setPageHashState: Partial<PageHashState> & {
		replace?: boolean;
	};
	setPageHashStateWithAnchor: Partial<PageHashStateWithAnchor> & {
		replace?: boolean;
	};
	setPage: PageHashState & {
		replace?: boolean;
	};
	setPageRef: {
		ref: PageRef;
		replace?: boolean;
	};
	setPageParams: {
		params: PageParams;
		replace: boolean;
	};
	setPageAnchor: {
		anchor: PageAnchor;
		replace: boolean;
	};
	setColorSchemeState: ColorSchemeState;
	setRouterPreventLocationUpdate: boolean;
	unloadData: null;
	actionResult: {
		callId: string;
		value: unknown;
	} | {
		callId: string;
		error: string;
	};
	changeNavButtons: {
		section: NavSection;
		action: "insert";
		name: string;
		position: NavInsertPosition;
		config: NavItemConfig;
		commands: string[];
	} | {
		section: NavSection;
		action: "prepend";
		config: NavItemConfig;
		commands: string[];
	} | {
		section: NavSection;
		action: "append";
		config: NavItemConfig;
		commands: string[];
	} | {
		section: NavSection;
		action: "before";
		name: string;
		config: NavItemConfig;
		commands: string[];
	} | {
		section: NavSection;
		action: "after";
		name: string;
		config: NavItemConfig;
		commands: string[];
	} | {
		section: NavSection;
		action: "replace";
		name: string;
		config: NavItemConfig;
		commands: string[];
	} | {
		section: NavSection;
		action: "remove";
		name: string;
	};
	dataStream: {
		stream: ReadableStream;
		resource: LoadDataResourceMetadata;
	};
	startChunkedDataUpload: {
		acceptToken: string;
		resource: LoadDataResourceMetadata;
	};
	dataChunk: {
		acceptToken: string;
		value: Uint8Array | undefined;
		done: boolean;
	};
	cancelChunkedDataUpload: {
		acceptToken: string;
		error: string;
	};
}>;
type EmbedClientToHostMessage = CreateMessageType<{
	ready: {
		page: PageHashStateWithAnchor & {
			hash: string;
		};
		colorScheme: {
			value: SerializedColorSchemeValue;
			state: ColorSchemeState;
		};
	};
	pageHashChanged: PageHashStateWithAnchor & {
		hash: string;
		replace: boolean;
	};
	colorSchemeChanged: {
		value: SerializedColorSchemeValue;
		state: ColorSchemeState;
	};
	action: {
		callId: string;
		name: string;
		args: unknown[];
	};
	navMethod: string;
	loadingState: ProgressbarState;
	data: null;
	unloadData: null;
	destroy: null;
}>;
type LocationSync = ReturnType<typeof createLocationSync>;
declare function createLocationSync(onChange: (newHash: string, oldHash: string) => void, logger?: Logger): {
	set(hash: string, replace: boolean): void;
	dispose(): void;
};
export type BaseAppEvents = {
	destroy: [
	];
};
export interface EmbedPreinitAppEvents extends BaseAppEvents {
	loadingStateChanged: [
		state: LoadDataState
	];
}
export interface EmbedAppEvents extends BaseAppEvents {
	colorSchemeChanged: [
		value: {
			state: ColorSchemeState;
			value: SerializedColorSchemeValue;
		}
	];
	loadingStateChanged: [
		state: ProgressbarState
	];
	pageHashChanged: [
		hash: string,
		replace: boolean
	];
	unloadData: [
	];
	data: [
	];
}
export type onDisconnectCallback = () => void;
export type onPreinitCallback = (api: typeof EmbedPreinitApp.prototype.publicApi) => onDisconnectCallback | void;
export type onConnectCallback = (api: typeof EmbedApp.prototype.publicApi) => onDisconnectCallback | void;
export type ActionsMap = Map<string, (...args: unknown[]) => unknown>;
declare class BaseApp<Message extends EmbedHostToPreinitMessage | EmbedHostToClientMessage, Events extends BaseAppEvents = BaseAppEvents> extends Emitter<Events> {
	window: Window;
	id: string;
	actions: ActionsMap;
	dataLoadToken: string | null;
	constructor(window: Window, id: string, actions: ActionsMap);
	sendMessage<T extends Message["type"]>(type: T, payload: Extract<Message, {
		type: T;
	}>["payload"], transfer?: Transferable[]): void;
	destroy(): void;
}
declare class EmbedPreinitApp extends BaseApp<EmbedHostToPreinitMessage, EmbedPreinitAppEvents> {
	publicApi: ReturnType<typeof EmbedPreinitApp.createPublicApi>;
	static createPublicApi(app: EmbedPreinitApp): Readonly<{
		on: <E extends keyof EmbedPreinitAppEvents>(event: E, callback: Callback<EmbedPreinitAppEvents[E]>) => EmbedPreinitApp;
		once: <E_1 extends keyof EmbedPreinitAppEvents>(event: E_1, callback: Callback<EmbedPreinitAppEvents[E_1]>) => EmbedPreinitApp;
		off: <E_2 extends keyof EmbedPreinitAppEvents>(event: E_2, callback: Callback<EmbedPreinitAppEvents[E_2]>) => EmbedPreinitApp;
		defineAction(name: string, fn: (...args: unknown[]) => unknown): void;
		setPageHash(hash: string, replace?: boolean): void;
		setRouterPreventLocationUpdate(allow?: boolean): void;
	}>;
	constructor(window: Window, id: string, actions: ActionsMap);
	processMessage(message: EmbedPreinitToHostMessage): void;
}
declare class EmbedApp extends BaseApp<EmbedHostToClientMessage, EmbedAppEvents> {
	commandMap: Map<string, (...args: unknown[]) => unknown>;
	dataLoadToken: string | null;
	pageHash: Observer<string>;
	pageId: Observer<string>;
	pageRef: Observer<PageRef>;
	pageParams: Observer<PageParams>;
	pageAnchor: Observer<PageAnchor>;
	locationSync: LocationSync | null;
	colorScheme: Observer<{
		state: ColorSchemeState | "unknown";
		value: SerializedColorSchemeValue | "unknown";
	}>;
	publicApi: ReturnType<typeof EmbedApp.createPublicApi>;
	static createPublicApi(app: EmbedApp): Readonly<{
		pageHash: {
			subscribe: (callback: (value: string, unsubscribe: () => void) => void | Promise<void>) => () => void;
			subscribeSync: (callback: (value: string, unsubscribe: () => void) => void | Promise<void>) => () => void;
			unsubscribe: (callback: (value: string, unsubscribe: () => void) => void | Promise<void>) => void;
			readonly value: string;
		};
		pageId: {
			subscribe: (callback: (value: string, unsubscribe: () => void) => void | Promise<void>) => () => void;
			subscribeSync: (callback: (value: string, unsubscribe: () => void) => void | Promise<void>) => () => void;
			unsubscribe: (callback: (value: string, unsubscribe: () => void) => void | Promise<void>) => void;
			readonly value: string;
		};
		pageRef: {
			subscribe: (callback: (value: PageRef, unsubscribe: () => void) => void | Promise<void>) => () => void;
			subscribeSync: (callback: (value: PageRef, unsubscribe: () => void) => void | Promise<void>) => () => void;
			unsubscribe: (callback: (value: PageRef, unsubscribe: () => void) => void | Promise<void>) => void;
			readonly value: PageRef;
		};
		pageAnchor: {
			subscribe: (callback: (value: PageAnchor, unsubscribe: () => void) => void | Promise<void>) => () => void;
			subscribeSync: (callback: (value: PageAnchor, unsubscribe: () => void) => void | Promise<void>) => () => void;
			unsubscribe: (callback: (value: PageAnchor, unsubscribe: () => void) => void | Promise<void>) => void;
			readonly value: PageAnchor;
		};
		pageParams: {
			subscribe: (callback: (value: PageParams, unsubscribe: () => void) => void | Promise<void>) => () => void;
			subscribeSync: (callback: (value: PageParams, unsubscribe: () => void) => void | Promise<void>) => () => void;
			unsubscribe: (callback: (value: PageParams, unsubscribe: () => void) => void | Promise<void>) => void;
			readonly value: PageParams;
		};
		colorScheme: {
			subscribe: (callback: (value: {
				state: "auto" | "unknown" | "light" | "dark" | "light-only" | "dark-only";
				value: "auto" | "unknown" | "light" | "dark";
			}, unsubscribe: () => void) => void | Promise<void>) => () => void;
			subscribeSync: (callback: (value: {
				state: "auto" | "unknown" | "light" | "dark" | "light-only" | "dark-only";
				value: "auto" | "unknown" | "light" | "dark";
			}, unsubscribe: () => void) => void | Promise<void>) => () => void;
			unsubscribe: (callback: (value: {
				state: "auto" | "unknown" | "light" | "dark" | "light-only" | "dark-only";
				value: "auto" | "unknown" | "light" | "dark";
			}, unsubscribe: () => void) => void | Promise<void>) => void;
			readonly value: {
				state: "auto" | "unknown" | "light" | "dark" | "light-only" | "dark-only";
				value: "auto" | "unknown" | "light" | "dark";
			};
		};
		on: <E extends keyof EmbedAppEvents>(event: E, callback: Callback<EmbedAppEvents[E]>) => EmbedApp;
		once: <E_1 extends keyof EmbedAppEvents>(event: E_1, callback: Callback<EmbedAppEvents[E_1]>) => EmbedApp;
		off: <E_2 extends keyof EmbedAppEvents>(event: E_2, callback: Callback<EmbedAppEvents[E_2]>) => EmbedApp;
		nav: {
			insert(config: NavItemConfig, position: NavInsertPosition, name: string): void;
			prepend(config: NavItemConfig): void;
			append(config: NavItemConfig): void;
			before(name: string, config: NavItemConfig): void;
			after(name: string, config: NavItemConfig): void;
			replace(name: string, config: NavItemConfig): void;
			remove(name: string): void;
		} & {
			primary: {
				insert(config: NavItemConfig, position: NavInsertPosition, name: string): void;
				prepend(config: NavItemConfig): void;
				append(config: NavItemConfig): void;
				before(name: string, config: NavItemConfig): void;
				after(name: string, config: NavItemConfig): void;
				replace(name: string, config: NavItemConfig): void;
				remove(name: string): void;
			};
			secondary: {
				insert(config: NavItemConfig, position: NavInsertPosition, name: string): void;
				prepend(config: NavItemConfig): void;
				append(config: NavItemConfig): void;
				before(name: string, config: NavItemConfig): void;
				after(name: string, config: NavItemConfig): void;
				replace(name: string, config: NavItemConfig): void;
				remove(name: string): void;
			};
			menu: {
				insert(config: NavItemConfig, position: NavInsertPosition, name: string): void;
				prepend(config: NavItemConfig): void;
				append(config: NavItemConfig): void;
				before(name: string, config: NavItemConfig): void;
				after(name: string, config: NavItemConfig): void;
				replace(name: string, config: NavItemConfig): void;
				remove(name: string): void;
			};
		};
		notify(name: string, details: any): void;
		defineAction(name: string, fn: (...args: unknown[]) => unknown): void;
		setPageHash(hash: string, replace?: boolean): void;
		setPageHashState(pageState: Partial<PageHashState>, replace?: boolean): void;
		setPageHashStateWithAnchor(pageStateWithAnchor: Partial<PageHashStateWithAnchor>, replace?: boolean): void;
		setPage(id: string, ref: PageRef, params: PageParams, replace?: boolean): void;
		setPageRef(ref: PageRef, replace?: boolean): void;
		setPageParams(params: PageParams, replace?: boolean): void;
		setPageAnchor(anchor: PageAnchor, replace?: boolean): void;
		setColorSchemeState(value: ColorSchemeState): void;
		setRouterPreventLocationUpdate(allow?: boolean): void;
		setLocationSync(enabled?: boolean): void;
		unloadData(): void;
		uploadData(source: unknown, getResourceMetadataFromSource: typeof extractResourceMetadata): Promise<void>;
	}>;
	constructor(window: Window, id: string, actions: ActionsMap);
	processMessage(message: EmbedClientToHostMessage): Promise<void>;
	destroy(): void;
}
export declare function connectToEmbedApp(iframe: HTMLIFrameElement, onConnect: onConnectCallback): onDisconnectCallback;
export declare function connectToEmbedApp(iframe: HTMLIFrameElement, onPreinit: onPreinitCallback | void, onConnect: onConnectCallback): onDisconnectCallback;

export {};
