import type { PositionAnchor } from "./types.js";
/** @internal */
export interface XCoordConfig {
    xMargin: number;
    elWidth: number;
    initialX?: number;
    containerRect: DOMRect;
}
/** @internal */
export interface YCoordConfig {
    yMargin: number;
    elHeight: number;
    initialY?: number;
    containerRect: DOMRect;
}
type Left = number;
type Top = number;
/**
 * Creates the `left` style value for an element that should be fixed to the
 * (outer) left of the container element. So the right bounds of the fixed
 * element will be equal to the left bounds of the container element (before the
 * xMargin is applied).
 *
 * @internal
 */
export declare function getLeftCoord({ xMargin, elWidth, initialX, containerRect, }: XCoordConfig): Left;
/**
 * Creates the `left` style value for an element that should be fixed to the
 * inner-left of the container element. So the left bounds of both the container
 * and fixed elements will overlap (before the xMargin is applied)
 *
 * @internal
 */
export declare function getInnerLeftCoord({ xMargin, initialX, containerRect, }: XCoordConfig): Left;
/**
 * Creates the `left` style value for an element that should be fixed to the
 * center of the container element. So the center point of the fixed element
 * should be the center point of the container element.
 *
 * Note: Unlike all the other horizontal positioning logic, the center position
 * does not use the xMargin.
 *
 * @internal
 */
export declare function getCenterXCoord({ elWidth, initialX, containerRect, }: XCoordConfig): Left;
/**
 * Creates the `left` style value for an element that should be fixed to the
 * inner-right of the container element. So the right bounds for both the
 * container and fixed elements will overlap (before the xMargin is applied).
 *
 * @internal
 */
export declare function getInnerRightCoord({ xMargin, elWidth, initialX, containerRect, }: XCoordConfig): Left;
/**
 * Creates the `left` style value for an element that should be fixed to the
 * (outer) right of the container element. So the left bounds of the fixed
 * element will overlap with the right bounds of the container element (before
 * the xMargin is applied).
 *
 * @internal
 */
export declare function getRightCoord({ xMargin, initialX, containerRect, }: XCoordConfig): Left;
/**
 * Creates the `top` style value for an element that should be fixed above the
 * container element. So the bottom bounds of the fixed element will overlap
 * with the top bounds of the container element (before the yMargin is applied).
 *
 * @internal
 */
export declare function getAboveCoord({ yMargin, initialY, elHeight, containerRect, }: YCoordConfig): Top;
/**
 * Creates the `top` style value for an element that should be fixed to the top
 * of the container element. So the top bounds for both the container and fixed
 * elements will overlap (before the yMargin is applied).
 *
 * @internal
 */
export declare function getTopCoord({ yMargin, initialY, containerRect, }: YCoordConfig): Top;
/**
 * Creates the `top` style value for an element that should be fixed vertically
 * centered relative to the container element. So the vertical center point for
 * the fixed element should overlap the vertical center point of the container
 * element.
 *
 * Note: Unlike all the other vertical positioning logic, the center position
 * does not use the yMargin.
 *
 * @internal
 */
export declare function getCenterYCoord({ yMargin, elHeight, initialY, containerRect, }: YCoordConfig): Top;
/**
 * Creates the `top` style value for an element that should be fixed to the
 * bottom of the container element. So the top bounds of the fixed element
 * should overlap the bottom bounds of the container element (before the yMargin
 * is applied).
 *
 * @internal
 */
export declare function getBottomCoord({ yMargin, initialY, elHeight, containerRect, }: YCoordConfig): Top;
/**
 * Creates the `top` style value for an element that should be fixed to the
 * bottom of the container element. So the bottom bounds of both the container
 * and fixed elements should overlap (before the yMargin is applied).
 *
 * @internal
 */
export declare function getBelowCoord({ yMargin, initialY, containerRect, }: YCoordConfig): Top;
/**
 * @remarks \@since 6.0.0
 * @internal
 */
export interface TransformOriginOptions extends PositionAnchor {
    transformOriginY?: number;
}
/**
 * This is a simple util that'll generate a css `transform-origin` string so
 * that the fixed element can animate from the correct point based on the
 * provided anchor.
 *
 * @param options - The anchor that should be used to create the transform origin
 * for.
 * @returns the transform origin string
 * @internal
 */
export declare function getTransformOrigin(options: TransformOriginOptions): string;
/**
 * Attempts to find a sizing container based on the provided HTMLElement. By
 * default, the sizing element will just be the provided element unless:
 * - the item has a known role within react-md that can target known classes
 * - the item has a `data-sizing-selector` attribute that is a valid query
 *   selector for the nested item.
 *
 * NOTE: The `data-sizing-selector` will be run from the current element instead
 * of the `document`.
 *
 * @param el - The element to find a sizing container for.
 * @returns the sizing container relative to the provided element, or `null` if
 * none could be found.
 * @throws This error will be thrown if using the `data-query-selector` and the
 * query selector does not return an element on the page.
 * @internal
 */
export declare function findSizingContainer(el: HTMLElement | null): HTMLElement | null;
/**
 * This util is used to get the "true" `element.getBoundingClientRect()` that
 * ensures that transitions using transforms don't mess up the sizing so that
 * position calculations are easier to do.
 *
 * @param element - The element to get a rect for.
 * @returns either a DOMRect for the element
 * @internal
 */
export declare function getElementRect(element: HTMLElement): DOMRect;
/**
 * @remarks \@since 4.0.0
 * @internal
 */
interface IsWithinViewportOptions {
    fixedElement: HTMLElement;
    fixedToElement: HTMLElement;
}
/**
 * @remarks \@since 4.0.0
 * @internal
 */
export declare function isWithinViewport(options: IsWithinViewportOptions): boolean;
export {};
