/**
 * A vertical/horizontal flow-based layout container.
 *
 * See https://scenerystack.org/learn/scenery-layout/#FlowBox for details
 *
 * FlowBox-only options:
 *   - resize (see https://scenerystack.org/learn/scenery-layout/#FlowBox-resize)
 *   - orientation (see https://scenerystack.org/learn/scenery-layout/#FlowBox-orientation)
 *   - spacing (see https://scenerystack.org/learn/scenery-layout/#FlowBox-spacing)
 *   - lineSpacing (see https://scenerystack.org/learn/scenery-layout/#FlowBox-lineSpacing)
 *   - justify (see https://scenerystack.org/learn/scenery-layout/#FlowBox-justify)
 *   - justifyLines (see https://scenerystack.org/learn/scenery-layout/#FlowBox-justifyLines)
 *   - wrap (see https://scenerystack.org/learn/scenery-layout/#FlowBox-wrap)
 *   - layoutOrigin (see https://scenerystack.org/learn/scenery-layout/#layoutOrigin)
 *   - forward (see https://scenerystack.org/learn/scenery-layout/#FlowBox-forward)
 *
 * FlowBox and layoutOptions options (can be set either in the FlowBox itself, or within its child nodes' layoutOptions):
 *   - align (see https://scenerystack.org/learn/scenery-layout/#FlowBox-align)
 *   - stretch (see https://scenerystack.org/learn/scenery-layout/#FlowBox-stretch)
 *   - grow (see https://scenerystack.org/learn/scenery-layout/#FlowBox-grow)
 *   - cellAlign (see https://scenerystack.org/learn/scenery-layout/#FlowBox-cellAlign)
 *   - margin (see https://scenerystack.org/learn/scenery-layout/#FlowBox-margins)
 *   - xMargin (see https://scenerystack.org/learn/scenery-layout/#FlowBox-margins)
 *   - yMargin (see https://scenerystack.org/learn/scenery-layout/#FlowBox-margins)
 *   - leftMargin (see https://scenerystack.org/learn/scenery-layout/#FlowBox-margins)
 *   - rightMargin (see https://scenerystack.org/learn/scenery-layout/#FlowBox-margins)
 *   - topMargin (see https://scenerystack.org/learn/scenery-layout/#FlowBox-margins)
 *   - bottomMargin (see https://scenerystack.org/learn/scenery-layout/#FlowBox-margins)
 *   - minContentWidth (see https://scenerystack.org/learn/scenery-layout/#FlowBox-minContent)
 *   - minContentHeight (see https://scenerystack.org/learn/scenery-layout/#FlowBox-minContent)
 *   - maxContentWidth (see https://scenerystack.org/learn/scenery-layout/#FlowBox-maxContent)
 *   - maxContentHeight (see https://scenerystack.org/learn/scenery-layout/#FlowBox-maxContent)
 *
 * @author Jonathan Olson <jonathan.olson@colorado.edu>
 */
import '../../../../globals.js';
import StrictOmit from '../../../../phet-core/js/types/StrictOmit.js';
import FlowCell from '../../layout/constraints/FlowCell.js';
import FlowConstraint from '../../layout/constraints/FlowConstraint.js';
import type { FlowConstraintOptions } from '../../layout/constraints/FlowConstraint.js';
import { HorizontalLayoutAlign, VerticalLayoutAlign } from '../../layout/LayoutAlign.js';
import { HorizontalLayoutJustification, VerticalLayoutJustification } from '../../layout/LayoutJustification.js';
import LayoutNode from '../../layout/nodes/LayoutNode.js';
import type { LayoutNodeOptions } from '../../layout/nodes/LayoutNode.js';
import { LayoutOrientation } from '../../layout/LayoutOrientation.js';
import Node from '../../nodes/Node.js';
import TReadOnlyProperty from '../../../../axon/js/TReadOnlyProperty.js';
import TProperty from '../../../../axon/js/TProperty.js';
type ExcludeFlowConstraintOptions = 'excludeInvisible' | 'preferredWidthProperty' | 'preferredHeightProperty' | 'minimumWidthProperty' | 'minimumHeightProperty' | 'layoutOriginProperty';
type SelfOptions = {
    resize?: boolean;
    forward?: boolean;
    forwardProperty?: TReadOnlyProperty<boolean> | null;
} & StrictOmit<FlowConstraintOptions, ExcludeFlowConstraintOptions>;
export type FlowBoxOptions = SelfOptions & LayoutNodeOptions;
export default class FlowBox extends LayoutNode<FlowConstraint> {
    private readonly _cellMap;
    private readonly onChildInserted;
    private readonly onChildRemoved;
    private readonly onChildrenReordered;
    private readonly onChildrenChanged;
    private readonly _forwardProperty;
    constructor(providedOptions?: FlowBoxOptions);
    /**
     * Called when a child is inserted.
     */
    protected onFlowBoxChildInserted(node: Node, index: number): void;
    /**
     * Called when a child is removed.
     */
    private onFlowBoxChildRemoved;
    /**
     * Called when children are rearranged
     */
    private onFlowBoxChildrenReordered;
    /**
     * Called on change of children (child added, removed, order changed, etc.)
     */
    private onFlowBoxChildrenChanged;
    /**
     * Called when our `forward` value changes.
     */
    private onFlowBoxForwardReverseChanged;
    getCell(node: Node): FlowCell;
    get orientation(): LayoutOrientation;
    set orientation(value: LayoutOrientation);
    get spacing(): number;
    set spacing(value: number);
    get lineSpacing(): number;
    set lineSpacing(value: number);
    get justify(): HorizontalLayoutJustification | VerticalLayoutJustification;
    set justify(value: HorizontalLayoutJustification | VerticalLayoutJustification);
    get justifyLines(): HorizontalLayoutJustification | VerticalLayoutJustification | null;
    set justifyLines(value: HorizontalLayoutJustification | VerticalLayoutJustification | null);
    get wrap(): boolean;
    set wrap(value: boolean);
    get align(): HorizontalLayoutAlign | VerticalLayoutAlign;
    set align(value: HorizontalLayoutAlign | VerticalLayoutAlign);
    get stretch(): boolean;
    set stretch(value: boolean);
    get grow(): number;
    set grow(value: number);
    get margin(): number;
    set margin(value: number);
    get xMargin(): number;
    set xMargin(value: number);
    get yMargin(): number;
    set yMargin(value: number);
    get leftMargin(): number;
    set leftMargin(value: number);
    get rightMargin(): number;
    set rightMargin(value: number);
    get topMargin(): number;
    set topMargin(value: number);
    get bottomMargin(): number;
    set bottomMargin(value: number);
    get minContentWidth(): number | null;
    set minContentWidth(value: number | null);
    get minContentHeight(): number | null;
    set minContentHeight(value: number | null);
    get maxContentWidth(): number | null;
    set maxContentWidth(value: number | null);
    get maxContentHeight(): number | null;
    set maxContentHeight(value: number | null);
    /**
     * Sets what Property our forwardProperty is backed by
     */
    setForwardProperty(newTarget: TReadOnlyProperty<boolean> | null): this;
    /**
     * See setForwardProperty() for more information
     */
    set forwardProperty(property: TReadOnlyProperty<boolean> | null);
    /**
     * See getForwardProperty() for more information
     */
    get forwardProperty(): TProperty<boolean>;
    /**
     * Get this Node's forwardProperty. Note! This is not the reciprocal of setForwardProperty. Node.prototype._forwardProperty
     * is a TinyForwardingProperty, and is set up to listen to changes from the forwardProperty provided by
     * setForwardProperty(), but the underlying reference does not change. This means the following:
     *     * const myNode = new Node();
     * const forwardProperty = new Property( false );
     * myNode.setForwardProperty( forwardProperty )
     * => myNode.getForwardProperty() !== forwardProperty (!!!!!!)
     *
     * Please use this with caution. See setForwardProperty() for more information.
     */
    getForwardProperty(): TProperty<boolean>;
    /**
     * Sets whether the nodes in this FlowBox are ordered in a forward order.
     * If false, the nodes will appear reversed in the layout.
     */
    setForward(forward: boolean): this;
    /**
     * See setForward() for more information
     */
    set forward(value: boolean);
    /**
     * See isForward() for more information
     */
    get forward(): boolean;
    /**
     * Returns whether this Node is forward.
     */
    isForward(): boolean;
    /**
     * Releases references
     */
    dispose(): void;
    setOrientation(orientation: LayoutOrientation): this;
    getOrientation(): LayoutOrientation;
    setSpacing(spacing: number): this;
    getSpacing(): number;
    setAlign(align: HorizontalLayoutAlign | VerticalLayoutAlign): this;
    getAlign(): HorizontalLayoutAlign | VerticalLayoutAlign;
    setResize(resize: boolean): this;
    isResize(): boolean;
    getHelperNode(): Node;
    mutate(options?: FlowBoxOptions): this;
    static readonly DEFAULT_FLOW_BOX_OPTIONS: {
        readonly orientation: "horizontal";
        readonly spacing: 0;
        readonly align: "center";
        readonly stretch: false;
        readonly forward: true;
    };
}
export {};
