import { ComponentProps, ReactElement, ReactNode } from 'react';
import { ExperimentalStepperProps } from './Stepper';
import { ComponentCSSPropType } from './tailwind';
export interface ExperimentalModalProps<Steps extends number | readonly string[] = readonly string[], Step extends Steps extends readonly string[] ? Steps[number] : number = Steps extends readonly string[] ? Steps[number] : number> extends Omit<ComponentProps<'div'>, 'children'> {
    /** Defaults to `dialog` on desktop and `drawer` on mobile. */
    variant?: ComponentCSSPropType<'modal', 'variant', 'dialog'>;
    /** @default "medium" */
    size?: ComponentCSSPropType<'modal', 'size', 'medium'>;
    open?: boolean;
    /** Defaults to `false` if `trigger` is provided, or `true` otherwise. */
    defaultOpen?: boolean;
    onOpenChange?: (open: boolean) => void;
    /**
     * Element that opens the modal when clicked, or function that returns such an element (where you can customize the actual
     * trigger functionality; it doesn't necessarily have to be on click). The trigger element is rendered alongside the modal.
     * This provides an alternative to the controlled API (the `open` and `onOpenChange` props) that doesn't require any state
     * in the parent component.
     */
    trigger?: ReactElement | ((renderProps: {
        props: Record<string, unknown>;
        open: boolean;
        setOpen: (open: boolean) => void;
        openModal: () => void;
        currentStep: Step;
        setCurrentStep: (step: Step) => void;
    }) => ReactElement);
    /**
     * Whether the user should be able to close the modal on their own, either by clicking outside of it, by pressing Escape,
     * or by clicking the close button that gets rendered in `ExperimentalModal.Header` when `dismissible` is `true` (though
     * it can be replaced or removed altogether with the `buttonAfter` prop). Defaults to `true` if either `onOpenChange` or
     * `trigger` is provided, or `false` otherwise.
     */
    dismissible?: boolean;
    /** One of `dialog` or `alertdialog`. Defaults to `dialog` if `dismissible` is `true`, or `alertdialog` if it's `false`. */
    role?: 'dialog' | 'alertdialog';
    steps?: Steps;
    currentStep?: Step;
    onCurrentStepChange?: (step: Step) => void;
    children?: ReactNode | ((renderProps: {
        open: boolean;
        setOpen: (open: boolean) => void;
        closeModal: () => void;
        currentStep: Step;
        setCurrentStep: (step: Step) => void;
    }) => ReactNode);
}
export declare const ExperimentalModalRoot: <Steps extends number | readonly string[], Step extends Steps extends readonly string[] ? Steps[number] : number>(props: ExperimentalModalProps<Steps, Step> & import('react').RefAttributes<HTMLDivElement>) => ReactNode | null;
export interface ExperimentalModalHeaderProps extends Omit<ComponentProps<'div'>, 'title' | 'children'> {
    title: ReactNode;
    /** Defaults to a back button if there is a previous step, or `null` otherwise. */
    buttonBefore?: ReactNode;
    /** Defaults to a close button if the modal is `dismissible`, or `null` otherwise. */
    buttonAfter?: ReactNode;
    /**
     * Props to pass to the `ExperimentalStepper` component, or `null` to render a `ExperimentalDivider` instead.
     * Defaults to match the `steps` and `currentStep` props of the parent `ExperimentalModal` (except if there is only one step
     * or if the `currentStep` is not among the `steps`, in which case a divider is rendered instead of the stepper).
     */
    stepper?: {
        count: NonNullable<ExperimentalStepperProps['count']>;
        currentIndex: ExperimentalStepperProps['currentIndex'];
    } | null;
}
export declare const ExperimentalModalHeader: import('react').ForwardRefExoticComponent<Omit<ExperimentalModalHeaderProps, "ref"> & import('react').RefAttributes<HTMLDivElement>>;
export interface ExperimentalModalBodyProps extends ComponentProps<'div'> {
}
export declare const ExperimentalModalBody: import('react').ForwardRefExoticComponent<Omit<ExperimentalModalBodyProps, "ref"> & import('react').RefAttributes<HTMLDivElement>>;
export interface ExperimentalModalFooterProps extends ComponentProps<'div'> {
    primaryButton?: ReactNode;
    secondaryButton?: ReactNode;
}
export declare const ExperimentalModalFooter: import('react').ForwardRefExoticComponent<Omit<ExperimentalModalFooterProps, "ref"> & import('react').RefAttributes<HTMLDivElement>>;
export interface ExperimentalModalStepProps {
    children: ReactNode;
}
export declare const ExperimentalModalStep: {
    ({ children }: ExperimentalModalStepProps): import("react/jsx-runtime").JSX.Element | null;
    displayName: string;
};
//# sourceMappingURL=Modal.parts.d.ts.map