import '../../chipper/js/initialize-globals.js';
import '../../assert/js/assert.js';
import '../../tandem/js/PhetioIDUtils.js';
import '../../globals.js';
/**
 * A carousel UI component.
 *
 * A set of N items is divided into M 'pages', based on how many items are visible in the carousel.
 * Pressing the next and previous buttons moves through the pages.
 * Movement through the pages is animated, so that items appear to scroll by.
 *
 * Note that Carousel wraps each item (Node) in an alignBox to ensure all items have an equal "footprint" dimension.
 *
 * The Carousel handles dynamic layout as far as carousel items changing sizes - it will resize to fit all of the items.
 * If you want to align or stretch item content, that can be done with CarouselItem's alignBoxOptions
 * (align:stretch will cause the item to be expanded to its section in the Carousel).
 *
 * Carousel currently is not sizable on its own (you can't set a preferred width/height that causes it to expand).
 *
 * @author Chris Malley (PixelZoom, Inc.)
 * @author Sam Reid (PhET Interactive Simulations)
 */
import BooleanProperty from '../../axon/js/BooleanProperty.js';
import Property from '../../axon/js/Property.js';
import ReadOnlyProperty from '../../axon/js/ReadOnlyProperty.js';
import StrictOmit from '../../phet-core/js/types/StrictOmit.js';
import { AlignBox, AlignBoxOptions, LayoutOrientation, Node, NodeOptions, SeparatorOptions, TPaint } from '../../scenery/js/imports.js';
import { AnimationOptions } from '../../twixt/js/Animation.js';
import { CarouselButtonOptions } from './buttons/CarouselButton.js';
import GroupItemOptions from './GroupItemOptions.js';
export type CarouselItem = GroupItemOptions & {
    alignBoxOptions?: AlignBoxOptions;
};
type SelfOptions = {
    orientation?: LayoutOrientation;
    fill?: TPaint;
    stroke?: TPaint;
    lineWidth?: number;
    cornerRadius?: number;
    defaultPageNumber?: number;
    itemsPerPage?: number;
    spacing?: number;
    margin?: number;
    alignBoxOptions?: AlignBoxOptions;
    buttonOptions?: CarouselButtonOptions;
    separatorsVisible?: boolean;
    separatorOptions?: SeparatorOptions;
    animationEnabled?: boolean;
    animationOptions?: StrictOmit<AnimationOptions<number>, 'to' | 'setValue' | 'getValue'>;
};
export type CarouselOptions = SelfOptions & StrictOmit<NodeOptions, 'children'>;
export default class Carousel extends Node {
    private readonly items;
    private readonly alignBoxes;
    private readonly visibleAlignBoxesProperty;
    readonly carouselItemNodes: Node[];
    private readonly itemsPerPage;
    private readonly defaultPageNumber;
    readonly numberOfPagesProperty: ReadOnlyProperty<number>;
    readonly pageNumberProperty: Property<number>;
    animationEnabled: boolean;
    backgroundWidth: number;
    backgroundHeight: number;
    private readonly disposeCarousel;
    private readonly scrollingNode;
    private readonly carouselConstraint;
    readonly isAnimatingProperty: BooleanProperty;
    /**
     * NOTE: This will dispose the item Nodes when the carousel is disposed
     */
    constructor(items: CarouselItem[], providedOptions?: CarouselOptions);
    /**
     * NOTE: This will dispose the item Nodes
     */
    dispose(): void;
    /**
     * Resets the carousel to its initial state.
     * @param animationEnabled - whether to enable animation during reset
     */
    reset(animationEnabled?: boolean): void;
    /**
     * Given an item's visible index, scrolls the carousel to the page that contains that item.
     */
    private scrollToItemVisibleIndex;
    /**
     * Given an item, scrolls the carousel to the page that contains that item. This will only scroll if item is in the
     * Carousel and visible.
     */
    scrollToItem(item: CarouselItem): void;
    /**
     * Public for ScrollingFlowBox only
     */
    scrollToAlignBox(alignBox: AlignBox): void;
    /**
     * Set the visibility of an item in the Carousel. This toggles visibility and will reflow the layout, such that hidden
     * items do not leave a gap in the layout.
     */
    setItemVisible(item: CarouselItem, visible: boolean): void;
    /**
     * Gets the AlignBox that wraps an item's Node.
     */
    private getAlignBoxForItem;
    /**
     * Returns the Node that was created for a given item.
     */
    getNodeForItem(item: CarouselItem): Node;
    private itemVisibleIndexToPageNumber;
    getVisibleAlignBoxes(): AlignBox[];
}
export {};
//# sourceMappingURL=Carousel.d.ts.map