import type * as RemixNode from "@remix-run/node";
import type * as RemixReact from "@remix-run/react";
import { ReactNode } from "react";
import type * as ReactRouter from "react-router";
import { Boolean, Flatten, HasUnknownKeys, Merge, Never, NonBoolean, Unflatten, Writeable } from "./utils.js";
export * from "./utils.js";
type HandleUnknownKeys<Conditions> = HasUnknownKeys<Conditions> extends true ? any : Conditions;
export interface ElementProps {
    children?: ReactNode;
    fallback?: ReactNode;
}
export type Condition<Value> = Flatten<Boolean<Value> | NonBoolean<Writeable<Value>>> | NonBoolean<Flatten<Value>>[] | Unflatten<NonBoolean<Writeable<Value>>>;
export type Conditions<Values> = Partial<{
    [P in keyof Values]: Readonly<Condition<Values[P]>>;
}> & Never<ElementProps>;
export type Values<Value = unknown> = {
    [key: string]: Value;
} & Never<ElementProps>;
export type Loader<Values> = (args: ExtendedDataFunctionArgs) => Values | Promise<Values>;
export type DataFunctionArgs = ReactRouter.ActionFunctionArgs | ReactRouter.LoaderFunctionArgs | ReactRouter.ClientActionFunctionArgs | ReactRouter.ClientLoaderFunctionArgs | RemixNode.ActionFunctionArgs | RemixNode.LoaderFunctionArgs | RemixReact.ClientActionFunctionArgs | RemixReact.ClientLoaderFunctionArgs;
export type ExtendedDataFunctionArgs = DataFunctionArgs & {
    serverAction: any;
    serverLoader: any;
    context: any;
};
export interface Options {
    method?: "every" | "some";
}
export interface LoaderOptions extends Options {
    routeId?: string;
    prop?: string;
}
export declare function __create<V extends Values, C extends Conditions<V>>(useValues: () => V, defaultConditions?: C, options?: Options): {
    Is: ({ children, fallback, ...conditions }: Partial<Merge<ElementProps, HandleUnknownKeys<C>>>) => string | number | boolean | import("react").ReactElement<any, string | import("react").JSXElementConstructor<any>> | Iterable<ReactNode> | null;
    useIs: (conditions?: C) => boolean;
    is: import("lodash").CurriedFunction2<V, C | undefined, boolean>;
};
export declare function create<V extends Values>(useValues: () => V, defaultConditions?: Conditions<V>, options?: Options): readonly [({ children, fallback, ...conditions }: Partial<Merge<ElementProps, HandleUnknownKeys<Conditions<V>>>>) => string | number | boolean | import("react").ReactElement<any, string | import("react").JSXElementConstructor<any>> | Iterable<ReactNode> | null, (conditions?: Conditions<V> | undefined) => boolean];
export declare function createFromLoader<V extends Values>(loadValues: Loader<V>, defaultConditions?: Conditions<V>, options?: LoaderOptions): readonly [({ children, fallback, ...conditions }: Partial<Merge<ElementProps, HandleUnknownKeys<Conditions<V>>>>) => string | number | boolean | import("react").ReactElement<any, string | import("react").JSXElementConstructor<any>> | Iterable<ReactNode> | null, (conditions?: Conditions<V> | undefined) => boolean, (args: DataFunctionArgs) => Promise<import("lodash").CurriedFunction1<Conditions<V> | undefined, boolean> & {
    [x: string]: V;
    __values: V;
}>];
