import { type SetOptionalAndNullable } from '@augment-vir/common';
import { type PropertyInitMapBase } from 'element-vir';
import { type EmptyObject } from 'type-fest';
import { type GlobalValues } from '../../../ui/elements/element-book-app/global-values.js';
import { type InfiniteRecursionLimiter } from '../../../util/type.js';
import { type BookPageControlsInitBase } from './book-page-controls.js';
import { type BookElementExampleInit, type BookPage } from './book-page.js';
/**
 * The callback type for a book page definition's `defineExample` callback.
 *
 * @category Internal
 */
export type DefineExampleCallback<GlobalValuesType extends GlobalValues = {}, ControlsInit extends BookPageControlsInitBase = BookPageControlsInitBase> = <State extends PropertyInitMapBase>(exampleInit: BookElementExampleInit<GlobalValuesType, ControlsInit, State>) => void;
/**
 * Used for `defineExamples` in a book page's init.
 *
 * @category Internal
 */
export type ElementExamplesDefiner<GlobalValuesType extends GlobalValues = {}, ControlsInit extends BookPageControlsInitBase = BookPageControlsInitBase> = (params: {
    defineExample: DefineExampleCallback<GlobalValuesType, ControlsInit>;
}) => void;
/**
 * Collapses all element-book control inits into a single flag object.
 *
 * @category Internal
 */
export type CollapseControlsInit<ParentPage extends BookPage | undefined, CurrentControlsInit extends BookPageControlsInitBase, 
/** Prevent infinite recursion TypeScript errors. */
RecursionDepth = InfiniteRecursionLimiter> = CurrentControlsInit & (RecursionDepth extends [
    any,
    ...infer RemainingDepth
] ? ParentPage extends BookPage<infer GlobalValuesType, infer GrandParentPage, infer ParentControls> ? CollapseControlsInit<GrandParentPage, ParentControls, RemainingDepth> : EmptyObject : EmptyObject);
/**
 * Collapses all element-book global values into a single flag object.
 *
 * @category Internal
 */
export type CollapseGlobalValuesType<ParentPage extends BookPage | undefined, GlobalValuesType extends GlobalValues, 
/** Prevent infinite recursion TypeScript errors. */
RecursionDepth = InfiniteRecursionLimiter> = GlobalValuesType & (RecursionDepth extends [
    any,
    ...infer RemainingDepth
] ? ParentPage extends BookPage<infer GlobalValuesType, infer GrandParentPage, infer ParentControls> ? CollapseGlobalValuesType<GrandParentPage, GlobalValuesType, RemainingDepth> : EmptyObject : EmptyObject);
/**
 * The parameters for initializing a new element-book page.
 *
 * @category Type
 */
export type BookPageInit<GlobalValuesType extends GlobalValues, ParentPage extends BookPage | undefined, CurrentControlsInit extends BookPageControlsInitBase> = SetOptionalAndNullable<Omit<BookPage<any, ParentPage, CurrentControlsInit>, 'entryType' | 'elementExamples' | 'errors'>, 'controls' | 'descriptionParagraphs' | 'useVerticalExamples'> & {
    defineExamples?: ElementExamplesDefiner<CollapseGlobalValuesType<ParentPage, GlobalValuesType>, CollapseControlsInit<ParentPage, CurrentControlsInit>> | undefined;
};
/**
 * A variant of {@link defineBookPage} that allows you specify what the expected global element-book
 * values are for the page that you are defining.
 *
 * @category Main
 */
export declare function defineBookPageWithGlobals<const GlobalValuesType extends GlobalValues = {}>(): <const ParentPage extends BookPage | undefined = undefined, const ControlsInit extends BookPageControlsInitBase = {}>(pageInit: BookPageInit<GlobalValuesType, ParentPage, ControlsInit>) => BookPage<GlobalValuesType, ParentPage, ControlsInit>;
/**
 * Define an element-book page. This is how you create new entries for your element-book instance.
 *
 * @category Main
 */
export declare function defineBookPage<const GlobalValuesType extends GlobalValues = {}, const ParentPage extends BookPage | undefined = undefined, const ControlsInit extends BookPageControlsInitBase = {}>(pageInit: BookPageInit<GlobalValuesType, ParentPage, ControlsInit>): BookPage<GlobalValuesType, ParentPage, ControlsInit>;
