import { Component, Slots, Slot, VNode, VNodeTypes, Ref, MaybeRef, ComponentPublicInstance, VNodeNormalizedChildren } from 'vue';
export declare const enum ShapeFlags {
    ELEMENT = 1,// 普通HTML元素
    FUNCTIONAL_COMPONENT = 2,// 函数式组件
    STATEFUL_COMPONENT = 4,// 有状态组件
    TEXT_CHILDREN = 8,// 文本节点
    ARRAY_CHILDREN = 16,// 数组子节点
    SLOTS_CHILDREN = 32,// 插槽子节点
    TELEPORT = 64,// teleport组件
    SUSPENSE = 128,// suspense组件
    COMPONENT_SHOULD_KEEP_ALIVE = 256,// 需要被keep-live的有状态组件
    COMPONENT_KEPT_ALIVE = 512,// 已经被keep-alive的有状态组件
    COMPONENT = 6
}
/**
 * 判断vnode是不是element
 */
export declare const isElement: (vnode: VNode) => boolean;
/**
 * 判断vnode是不是文本节点
 * 包含注释节点
 */
export declare const isTextElement: (vnode: VNode) => boolean;
/**
 * 判断vnode是不是vue组件
 * @param vnode vnode节点
 * @param type 组件信息
 */
export declare function isComponent(vnode: VNode, _type?: VNodeTypes): _type is Component & {
    __name?: string;
    name?: string;
};
/**
 * 判断vnode是不是vue组件
 */
export declare const isSlotsChildren: (vnode: VNode, _children?: VNode["children"]) => _children is Slots;
/**
 * 判断vnode是不是slot的子元素
 */
export declare const isArrayChildren: (vn: VNode, _children?: VNode["children"]) => _children is VNode[];
/**
 * 判断val是不是vue组件实例
 */
export declare function isComponentPublicInstance(val: unknown): val is ComponentPublicInstance;
export declare function useSlotElement(componentName?: string): {
    setSlotChildren(nodes: VNode[] | undefined): void;
};
export declare function getFirstComponent(vn: VNode | VNode[]): VNode | null;
export declare const getFirstElement: (vn: VNode | VNode[]) => HTMLElement | null;
export declare function useSlotFirstElement(): {
    setSlot: (nodes: VNode[] | undefined) => void;
    firstElement: Ref<HTMLElement | null>;
};
type ElementQuery = string | HTMLElement | ComponentPublicInstance | null | undefined;
/**
 * 将 MaybeRef 类型的元素查询值解析为 HTMLElement
 * @param elRef - 元素查询值，可以是字符串选择器、HTMLElement、组件实例，或 Ref 包装的上述类型
 * @returns 解析后的 HTMLElement，若无法解析则返回 null
 * @todo elQuery.$el 的类型可能为 SVGElement Text Comment 等，此处没有处理
 */
export declare const getHtmlElement: (elRef: MaybeRef<ElementQuery>) => HTMLElement | null;
/**
 * 异步解析 MaybeRef 类型的元素查询值为 HTMLElement，当值为 Ref 且当前为 falsy 时会等待其变为 truthy 后再解析
 * @param elRef - 元素查询值，可以是字符串选择器、HTMLElement、组件实例，或 Ref 包装的上述类型
 * @returns Promise，解析为 HTMLElement；若值变为 falsy 会打印警告，Promise 可能不会 resolve
 */
export declare const resolveHtmlElement: (elRef: MaybeRef<ElementQuery>) => Promise<HTMLElement | null>;
/**
 * 检测插槽是否为空（无实际渲染内容）。
 *
 * 通过试渲染 slot({}) 来判断，可以正确处理以下情况：
 * - 注释节点（v-if="false" 渲染出的注释节点视为空）
 * - 空文本节点
 * - 空片段节点
 *
 * 传入 {} 而非不传参，是为了避免 scoped slot 在使用解构语法时崩溃：
 *   <template #foo="{ setValue }">  ← 若 slot() 传 undefined，解构会抛 TypeError
 * 传入空对象是安全的折中方案，对普通插槽无影响。
 *
 * 注意：若 slot 内容通过 slot props 做条件渲染（如 v-if="setValue"），
 * 试渲染时 props 为空对象，条件为 falsy，可能导致误判为空。
 * 这属于极少数场景，实际使用中应避免在 slot 内依赖 slot props 做 v-if 判断。
 *
 * 另：直接用 $slots.foo 存在性判断不能检测注释节点（只要父组件写了 <template #foo> 就为 truthy），
 * 因此不能替代本函数。
 */
export declare const isEmptySlot: (slot?: Slot) => boolean;
/**
 * 过滤插槽
 * @description 根据 slotNames 中的插槽名，筛选出 slots 中实际存在的插槽名
 * @param slots - Vue 插槽对象
 * @param slotNames - 插槽名称映射表
 * @returns slots 中存在的插槽名称数组，类型为 slotNames 值的联合类型
 */
export declare function filterSlots<T extends Record<string, string>>(slots: Slots, slotNames: T): Array<T[keyof T]>;
/**
 * 合并class
 */
export declare function mergeClass(...classList: Array<string | {
    [k: string]: boolean;
} | Array<{
    [k: string]: boolean;
} | string> | undefined>): (string | {
    [k: string]: boolean;
})[];
/**
 * 根据传入的参数获取能被component渲染的内容
 */
export declare function getRenderableComponent(content: unknown): (() => VNode | string) | null;
/**
 * 判断该 VNode 是否由该 type 创建的
 * @param vn 虚拟节点
 * @param type 组件或组件名称，元素名称，
 * @returns 是否是该组件/元素创建的虚拟节点
 */
export declare const isVNodeOfType: (vn: VNode, type: Component | string) => boolean | "";
/** 从虚拟节点树中获取指定组件生成的虚拟节点 */
export declare const flatComponentVNode: (vn: VNodeNormalizedChildren | VNode[] | VNode, type: Component | string) => VNode<import('vue').RendererNode, import('vue').RendererElement, {
    [key: string]: any;
}>[];
export {};
