import '../../../../assert/js/assert.js';
import '../../../../globals.js';
import StrictOmit from '../../../../phet-core/js/types/StrictOmit.js';
import Bounds2 from '../../../../dot/js/Bounds2.js';
import { AlignGroup, Node, NodeOptions, SizableOptions } from '../../imports.js';
import TReadOnlyProperty from '../../../../axon/js/TReadOnlyProperty.js';
export declare const AlignBoxXAlignValues: readonly ["left", "center", "right", "stretch"];
export type AlignBoxXAlign = (typeof AlignBoxXAlignValues)[number];
export declare const AlignBoxYAlignValues: readonly ["top", "center", "bottom", "stretch"];
export type AlignBoxYAlign = (typeof AlignBoxYAlignValues)[number];
type SelfOptions = {
    alignBounds?: Bounds2 | null;
    alignBoundsProperty?: TReadOnlyProperty<Bounds2>;
    align?: AlignBoxXAlign & AlignBoxYAlign;
    xAlign?: AlignBoxXAlign;
    yAlign?: AlignBoxYAlign;
    margin?: number;
    xMargin?: number;
    yMargin?: number;
    leftMargin?: number;
    rightMargin?: number;
    topMargin?: number;
    bottomMargin?: number;
    group?: AlignGroup | null;
};
type ParentOptions = NodeOptions & SizableOptions;
export type AlignBoxOptions = SelfOptions & StrictOmit<ParentOptions, 'children'>;
declare const SuperType: typeof Node & import("../../../../phet-core/js/types/Constructor.js").default<import("../WidthSizable.js").TWidthSizable & import("../HeightSizable.js").THeightSizable & {
    validateLocalPreferredSize(): void;
}>;
export default class AlignBox extends SuperType {
    private _content;
    private _alignBounds;
    private _xSet;
    private _ySet;
    private _xAlign;
    private _yAlign;
    private _leftMargin;
    private _rightMargin;
    private _topMargin;
    private _bottomMargin;
    private _group;
    private readonly constraint;
    _contentBoundsListener: (...args: any[]) => void;
    private readonly _alignBoundsProperty;
    private readonly _alignBoundsPropertyListener;
    /**
     * An individual container for an alignment group. Will maintain its size to match that of the group by overriding
     * its localBounds, and will position its content inside its localBounds by respecting its alignment and margins.
     *
     * @param content - Content to align inside the alignBox
     * @param [providedOptions] - AlignBox-specific options are documented in ALIGNMENT_CONTAINER_OPTION_KEYS
     *                    above, and can be provided along-side options for Node
     */
    constructor(content: Node, providedOptions?: AlignBoxOptions);
    /**
     * Triggers recomputation of the alignment. Should be called if it needs to be refreshed.
     *
     * NOTE: alignBox.getBounds() will not trigger a bounds validation for our content, and thus WILL NOT trigger
     * layout. content.getBounds() should trigger it, but invalidateAligment() is the preferred method for forcing a
     * re-check.
     */
    invalidateAlignment(): void;
    /**
     * Sets the alignment bounds (the bounds in which our content will be aligned). If null, AlignBox will act
     * as if the alignment bounds have a left-top corner of (0,0) and with a width/height that fits the content and
     * bounds.
     *
     * NOTE: If the group is a valid AlignGroup, it will be responsible for setting the alignBounds.
     */
    setAlignBounds(alignBounds: Bounds2 | null): this;
    set alignBounds(value: Bounds2 | null);
    get alignBounds(): Bounds2 | null;
    /**
     * Returns the current alignment bounds (if available, see setAlignBounds for details).
     */
    getAlignBounds(): Bounds2 | null;
    /**
     * Sets the attachment to an AlignGroup. When attached, our alignBounds will be controlled by the group.
     */
    setGroup(group: AlignGroup | null): this;
    set group(value: AlignGroup | null);
    get group(): AlignGroup | null;
    /**
     * Returns the attached alignment group (if one exists), or null otherwise.
     */
    getGroup(): AlignGroup | null;
    /**
     * Sets the horizontal alignment of this box.
     */
    setXAlign(xAlign: AlignBoxXAlign): this;
    set xAlign(value: AlignBoxXAlign);
    get xAlign(): AlignBoxXAlign;
    /**
     * Returns the current horizontal alignment of this box.
     */
    getXAlign(): AlignBoxXAlign;
    /**
     * Sets the vertical alignment of this box.
     */
    setYAlign(yAlign: AlignBoxYAlign): this;
    set yAlign(value: AlignBoxYAlign);
    get yAlign(): AlignBoxYAlign;
    /**
     * Returns the current vertical alignment of this box.
     */
    getYAlign(): AlignBoxYAlign;
    getAlign(): AlignBoxXAlign & AlignBoxYAlign;
    setAlign(value: AlignBoxXAlign & AlignBoxYAlign): this;
    get align(): AlignBoxXAlign & AlignBoxYAlign;
    set align(value: AlignBoxXAlign & AlignBoxYAlign);
    /**
     * Sets the margin of this box (setting margin values for all sides at once).
     *
     * This margin is the minimum amount of horizontal space that will exist between the content the sides of this
     * box.
     */
    setMargin(margin: number): this;
    set margin(value: number);
    get margin(): number;
    /**
     * Returns the current margin of this box (assuming all margin values are the same).
     */
    getMargin(): number;
    /**
     * Sets the horizontal margin of this box (setting both left and right margins at once).
     *
     * This margin is the minimum amount of horizontal space that will exist between the content and the left and
     * right sides of this box.
     */
    setXMargin(xMargin: number): this;
    set xMargin(value: number);
    get xMargin(): number;
    /**
     * Returns the current horizontal margin of this box (assuming the left and right margins are the same).
     */
    getXMargin(): number;
    /**
     * Sets the vertical margin of this box (setting both top and bottom margins at once).
     *
     * This margin is the minimum amount of vertical space that will exist between the content and the top and
     * bottom sides of this box.
     */
    setYMargin(yMargin: number): this;
    set yMargin(value: number);
    get yMargin(): number;
    /**
     * Returns the current vertical margin of this box (assuming the top and bottom margins are the same).
     */
    getYMargin(): number;
    /**
     * Sets the left margin of this box.
     *
     * This margin is the minimum amount of horizontal space that will exist between the content and the left side of
     * the box.
     */
    setLeftMargin(leftMargin: number): this;
    set leftMargin(value: number);
    get leftMargin(): number;
    /**
     * Returns the current left margin of this box.
     */
    getLeftMargin(): number;
    /**
     * Sets the right margin of this box.
     *
     * This margin is the minimum amount of horizontal space that will exist between the content and the right side of
     * the container.
     */
    setRightMargin(rightMargin: number): this;
    set rightMargin(value: number);
    get rightMargin(): number;
    /**
     * Returns the current right margin of this box.
     */
    getRightMargin(): number;
    /**
     * Sets the top margin of this box.
     *
     * This margin is the minimum amount of vertical space that will exist between the content and the top side of the
     * container.
     */
    setTopMargin(topMargin: number): this;
    set topMargin(value: number);
    get topMargin(): number;
    /**
     * Returns the current top margin of this box.
     */
    getTopMargin(): number;
    /**
     * Sets the bottom margin of this box.
     *
     * This margin is the minimum amount of vertical space that will exist between the content and the bottom side of the
     * container.
     */
    setBottomMargin(bottomMargin: number): this;
    set bottomMargin(value: number);
    get bottomMargin(): number;
    /**
     * Returns the current bottom margin of this box.
     */
    getBottomMargin(): number;
    getContent(): Node;
    get content(): Node;
    /**
     * Returns the bounding box of this box's content. This will include any margins.
     */
    getContentBounds(): Bounds2;
    getMinimumWidth(): number;
    getMinimumHeight(): number;
    setAdjustedLocalBounds(bounds: Bounds2): void;
    /**
     * Disposes this box, releasing listeners and any references to an AlignGroup
     */
    dispose(): void;
    mutate(options?: AlignBoxOptions): this;
}
export {};
//# sourceMappingURL=AlignBox.d.ts.map