interface CreateNodeOptions {
    element?: Element;
}

interface CreateNodeBaseUIOptions {
    flags?: number;
    childIndex?: number;
}

interface CreateNodeUIOptions<T> extends CreateNodeBaseUIOptions, CreateNodeOptions {
    parent?: T;
    children?: T[];
    innerWrapped?: T;
}

interface CreateNodeGroupUIOptions extends CreateNodeBaseUIOptions, Partial<LayoutType> {
    wrapper?: boolean;
}

interface CreateNodeWrapperUIOptions<T> extends Partial<LayoutType>, ExcludeOptions {
    flags?: number;
    children?: T[];
}

interface StyleMapOptions {
    documentRoot: DocumentRoot;
    shadowRoot?: ShadowRoot | null;
}

interface StyleSheetOptions extends StyleMapOptions {
    namespace?: CssCascadeLayer;
    namespaceRule?: CSSNamespaceRule[];
    container?: CssConditionData;
    scope?: CssScopeData;
    selectorText?: string | null;
    context?: string;
    imported?: boolean;
    baseUrl?: string | null;
    errors?: string[];
}

interface PreloadAssetsOptions {
    images?: boolean;
    fonts?: boolean;
    localFonts?: boolean;
}

interface InsertStoredAssetOptions extends MetadataAction {
    shared?: boolean;
    within?: boolean;
}

interface FindStoredAssetOptions {
    remove?: boolean;
}

interface WriteDocumentOptions extends Pick<UserResourceSettingsUI, "showAttributes" | "showComments"> {}

interface LayoutOptions<T> extends Partial<LayoutType> {
    parent: T;
    node: T;
    children?: T[];
    itemCount?: number;
    rowCount?: number;
    columnCount?: number;
    renderType?: number;
}

interface ExtensionOptions {
    dependencies?: ExtensionDependency[];
}

interface ExtensionUIOptions extends ExtensionOptions {
    tagNames?: string[];
}

interface SaveDocumentOptions<T = unknown> {
    project?: T;
    projectId?: string;
    pathname?: string;
    systemDefined?: boolean;
    index?: number;
}

interface AudioOptions extends ResourceAction, MetadataAction {
    mimeType?: string;
}

interface VideoOptions extends AudioOptions {}

interface RawDataOptions extends ContentAction, Partial<Dimension>, FromAction, MetadataAction {
    buffer?: ArrayBuffer;
    filename?: string;
    decode?: boolean;
}

interface AddImageSrcOptions extends MetadataAction {
    prefix?: string;
    resolution?: ImageResolution[];
}

interface DescendOptions<T> {
    condition?: (item: T) => boolean;
    error?: (item: T) => boolean;
    including?: T;
    excluding?: T;
    every?: boolean;
    matches?: string;
}

interface AscendOptions<T, U = string> extends DescendOptions<T> {
    attr?: U;
    startSelf?: boolean;
    closest?: string;
}

interface SiblingsOptions<T> extends DescendOptions<T> {
    reverse?: boolean;
}

interface TraverseSiblingsOptions {
    floating?: boolean;
    pageFlow?: boolean;
    lineBreak?: boolean;
    excluded?: boolean;
}

interface BoxOptions {
    reset?: 0 | 1;
    adjustment?: number;
    max?: boolean;
    min?: boolean;
    accumulate?: boolean;
    negative?: boolean;
    applySelf?: boolean;
}

interface CssSortOptions extends CssInitialOptions {
    ascending?: boolean;
    duplicate?: boolean;
    byFloat?: true;
    byInt?: true;
}

interface CssInitialOptions {
    initial?: boolean;
    modified?: boolean;
    computed?: boolean;
    value?: string;
}

interface CssUnitOptions extends NodeParseUnitOptions, CssInitialOptions {}

interface CssAscendOptions extends CssInitialOptions {
    startSelf?: boolean;
    breakWhen?: string;
}

interface CssAnyOptions extends CssInitialOptions, CssAscendOptions {
    ascend?: boolean;
}

interface HasOptions extends CssInitialOptions {
    not?: string | string[];
    type?: number;
    inherit?: boolean;
    ignoreDefault?: boolean;
    validate?: boolean;
}

interface HasUnitOptions extends CssInitialOptions {
    not?: string | string[];
    percent?: boolean;
    inherit?: boolean;
    ignoreZero?: boolean;
}

interface MinMaxOptions extends CssInitialOptions {
    self?: boolean;
    last?: boolean;
    all?: boolean;
    wrapperOf?: boolean;
    subAttr?: string;
    initialValue?: number;
}

interface BaselineOptions {
    text?: boolean;
    image?: boolean;
    input?: boolean;
    middle?: boolean;
}

interface SiblingOptions<T, U, V> {
    attr?: U;
    parentAttr?: V;
    filter?: IteratorPredicate<T, unknown>;
}

interface NodeUnitOptions {
    dimension?: DimensionAttr;
    parent?: boolean;
    fromBox?: boolean;
}

interface NodeParseColorOptions {
    opacity?: number;
    ignoreWhite?: boolean;
    ignoreBlack?: boolean;
    ignoreTransparent?: boolean;
}

interface NodeParseUnitOptions extends ParseUnitOptions, NodeUnitOptions {
    fromFont?: boolean;
}

interface NodeConvertUnitOptions extends NodeParseUnitOptions, ConvertUnitOptions {}

interface TextHeightOptions {
    tagName?: string;
    width?: string;
    textContent?: string;
    textWrap?: boolean;
}

interface ExcludeOptions {
    resource?: number;
    procedure?: number;
    section?: number;
    optimization?: number;
}

interface AlignedVerticallyOptions<T> {
    siblings?: T[] | null;
    cleared?: Map<T, string> | null;
    horizontal?: boolean;
    partition?: boolean;
}

interface ReplaceTryOptions<T> {
    child: T;
    replaceWith: T;
    notFoundAppend?: boolean;
}

interface RemoveTryOptions<T, U = any> {
    replaceWith?: T;
    alignSiblings?: boolean;
    beforeReplace?: FunctionBind<U>;
}

interface HideOptions<T, U = any> extends RemoveTryOptions<T, U> {
    hidden?: boolean;
    collapse?: boolean;
    remove?: boolean;
}

interface TranslateOptions {
    accumulate?: boolean;
    contain?: boolean;
    oppose?: boolean;
    relative?: boolean;
}

interface CoordsXYOptions {
    dimension?: BoxType;
}

interface OffsetXYOptions extends CoordsXYOptions {
    offset?: number;
    flags?: number;
}

interface BackgroundPositionOptions extends UnitOptions {
    imageDimension?: Dimension | null;
    imageSize?: string;
}

interface ParseBorderRadiusOptions extends UnitOptions {
    dimension?: Dimension;
}

interface ParseGlobOptions {
    fromEnd?: boolean;
    fromBase?: boolean;
    ignoreWildcard?: boolean;
    ignoreQuery?: boolean;
    ignoreCase?: boolean;
}

interface LoadDataOptions extends DocumentAction<string> {
    type?: XMLHttpRequestResponseType;
    mimeType?: string;
    accept?: string;
    dataSource?: DataSource | DataSource[];
    merge?: number;
    mergeDepth?: number;
    cache?: boolean;
}

interface NodeListAddOptions {
    cascade?: boolean;
    remove?: boolean;
}

interface ImageOptions extends Partial<Dimension> {
    inline?: boolean;
    from?: string | string[];
}

interface FontsOptions {
    fontStyle?: string;
    fontWeight?: string;
    withBuffer?: boolean;
}

type AscendParameterOptions<T, U = string> = ((item: T) => boolean) | AscendOptions<T, U>;
type DescendParameterOptions<T> = ((item: T) => boolean) | DescendOptions<T>;
type SiblingsParameterOptions<T> = ((item: T) => boolean) | SiblingsOptions<T>;