import * as i0 from '@angular/core';
import { ElementRef, OnDestroy, EventEmitter, QueryList, AfterContentInit, AfterViewInit, AfterViewChecked, OnChanges, Renderer2, ChangeDetectorRef, NgZone, SimpleChanges } from '@angular/core';
import { Nullable } from '@fundamental-ngx/cdk/utils';
import { Direction } from '@angular/cdk/bidi';

declare class CarouselItemDirective<T = unknown> {
    private readonly _elementRef;
    /** Value of the item , to keep some information inside */
    value: T;
    /** Initial height value, needed when carousel is inside popover */
    initialHeight: number;
    /** Initial height value, needed when carousel is inside popover */
    initialWidth: number;
    /** Carousel Id, it has some default value if not set,  */
    id: string;
    /** @hidden */
    constructor(_elementRef: ElementRef<HTMLElement>);
    /** Native element  */
    get element(): HTMLElement;
    /** Width of element */
    getWidth(): number;
    /** Height of element */
    getHeight(): number;
    static ɵfac: i0.ɵɵFactoryDeclaration<CarouselItemDirective<any>, never>;
    static ɵdir: i0.ɵɵDirectiveDeclaration<CarouselItemDirective<any>, "[fd-carousel-item], [fdCarouselItem]", ["fdCarouselItem"], { "value": { "alias": "value"; "required": false; }; "initialHeight": { "alias": "initialHeight"; "required": false; }; "initialWidth": { "alias": "initialWidth"; "required": false; }; "id": { "alias": "id"; "required": false; }; }, {}, never, never, true, never>;
}

declare const DEFAULT_TRANSITION_DURATION = "150ms";
interface CarouselItemInterface {
    element: HTMLElement;
    getHeight(): number;
    getWidth(): number;
}
interface CarouselConfig {
    /** Defines if carousel items are placed vertically */
    vertical?: boolean;
    /** Amount of visible elements in carousel */
    elementsAtOnce?: number;
    /** Defines if support for gestures, like touch swipe or mouse drag should be enabled */
    gestureSupport?: boolean;
    /** Defines if carousel should move elements to sides. It allows to slide infinitely in one direction */
    infinite?: boolean;
    /** Transition time of CSS translate, `150ms` by default */
    transition?: string;
}
interface PanEndOutput {
    item: CarouselItemInterface;
    after: boolean;
}
/** @dynamic */
declare class CarouselService implements OnDestroy {
    private readonly _document;
    /** Event thrown when element is dragged. Emits "true" when drag starts and "false" when drag ends. */
    readonly dragStateChange$: EventEmitter<boolean>;
    /** Event thrown, when active element is changed */
    readonly activeChange$: EventEmitter<PanEndOutput>;
    /** Configuration for carousel */
    config: CarouselConfig;
    /** Initial active item of carousel, position first + offset */
    active: Nullable<CarouselItemInterface>;
    /** Set to true for rtl mode */
    isRtl: boolean;
    /** carousel items query list */
    items: QueryList<CarouselItemInterface>;
    /** Current transition value in px */
    set currentTransitionPx(currentTransitionPx: number);
    get currentTransitionPx(): number;
    /** @hidden */
    private get elementsAtOnce();
    /** @hidden */
    private _lastDistance;
    /** @hidden */
    private _currentTransitionPx;
    /** @hidden */
    private _element;
    /** @hidden */
    private _initialDragPosition;
    /** @hidden */
    private _lastDragPosition;
    /** @hidden */
    private _listenToMouseMove;
    /** @hidden */
    private _dragStarted;
    /**
     * @hidden
     */
    private readonly _destroyRef;
    /** @hidden */
    constructor(_document: Document | null);
    /** @hidden */
    ngOnDestroy(): void;
    /** set initial values for the service */
    initialise(config: CarouselConfig, items: QueryList<CarouselItemInterface>, listElementReference: ElementRef): void;
    /** update config value for the service */
    updateConfig(config: CarouselConfig): void;
    /** set element ref */
    setElement(elementRef: ElementRef): void;
    /** set items and assign active item, if not already there */
    setItems(items: QueryList<CarouselItemInterface>): void;
    /** Change active element */
    goToItem(item: CarouselItemInterface, smooth?: boolean): void;
    /** pick next element and set it active */
    pickNext(): void;
    /** pick previous element and set it active */
    pickPrevious(): void;
    /** @hidden */
    private _centerActive;
    /** @hidden */
    private _transitionToIndex;
    /** @hidden Get closes element, based on current transition */
    private _getClosest;
    /** @hidden */
    private _getIndexOfItem;
    /** @hidden Getting size of carousel, width for horizontal, height for vertical */
    private _getSize;
    /** @hidden */
    private _handlePan;
    /** @hidden */
    private _handlePanEnd;
    /**
     * @hidden Animates the carousel to the currently selected slide.
     */
    private _transitionCarousel;
    /** @hidden Pam Start handler, removes transition duration, */
    private _handlePanStart;
    /** @hidden */
    private _setupGestures;
    /** @hidden */
    private _subscribeToEvents;
    /** @hidden */
    private _setupDragStart;
    /** @hidden */
    private _setupDrag;
    /** @hidden */
    private _setupDragEnd;
    /** @hidden */
    private _getTransition;
    /** @hidden */
    private _getDraggedDelta;
    /** @hidden */
    private _getDragCoordinate;
    /** @hidden */
    private _isTouchEvent;
    static ɵfac: i0.ɵɵFactoryDeclaration<CarouselService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<CarouselService>;
}

type Visibility = 'visible' | 'hidden';
declare class CarouselItemComponent<T = any> implements CarouselItemInterface {
    private readonly _elementRef;
    /** Id of the Carousel items. */
    id: string;
    /** Sets aria-label attribute for carousel item */
    ariaLabel: Nullable<string>;
    /** Sets aria-labelledby attribute for carousel item */
    ariaLabelledBy: Nullable<string>;
    /** Sets aria-describedby attribute for carousel item */
    ariaDescribedBy: Nullable<string>;
    /**
     * Loading indicator when item is not yet loaded
     */
    loading: boolean;
    /** Sets tooltip for carousel item */
    title: null;
    /** Initial height value, needed when carousel is inside popover */
    initialHeight: number;
    /** Initial height value, needed when carousel is inside popover */
    initialWidth: number;
    /** Value of carousel item */
    value: T;
    /** @hidden Hide/show slide, useful for managing tab order */
    _visibility: Visibility;
    /** @hidden value for aria-setsize attribute */
    ariaSetsize: i0.WritableSignal<number>;
    /** @hidden value for aria-posinset attribute */
    ariaPosinset: i0.WritableSignal<number>;
    /** @hidden value for aria-selected attribute */
    ariaSelected: i0.WritableSignal<boolean>;
    /** @hidden value for aria-hidden attribute */
    ariaHidden: i0.WritableSignal<boolean>;
    /** @hidden */
    set visibility(visibility: Visibility);
    get visibility(): Visibility;
    /** @hidden */
    constructor(_elementRef: ElementRef<HTMLElement>);
    /** Native element  */
    get element(): HTMLElement;
    /** Width of element */
    getWidth(): number;
    /** Height of element */
    getHeight(): number;
    static ɵfac: i0.ɵɵFactoryDeclaration<CarouselItemComponent<any>, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<CarouselItemComponent<any>, "fd-carousel-item", never, { "id": { "alias": "id"; "required": false; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; }; "ariaLabelledBy": { "alias": "ariaLabelledBy"; "required": false; }; "ariaDescribedBy": { "alias": "ariaDescribedBy"; "required": false; }; "loading": { "alias": "loading"; "required": false; }; "title": { "alias": "title"; "required": false; }; "initialHeight": { "alias": "initialHeight"; "required": false; }; "initialWidth": { "alias": "initialWidth"; "required": false; }; "value": { "alias": "value"; "required": false; }; }, {}, never, ["*"], true, never>;
}

interface FdCarouselResourceStrings {
    fd_carousel_of?: string;
    fd_carousel_reader?: string;
}

type PageIndicatorsOrientation = 'bottom' | 'top';
type CarouselBackgroundOptions = 'translucent' | 'transparent' | 'solid';
declare enum SlideDirection {
    None = 0,
    NEXT = 1,
    PREVIOUS = 2
}
interface FittingSlidesAndWidth {
    width: number;
    slides: number;
}
declare class CarouselActiveSlides {
    readonly activeItems: CarouselItemComponent[];
    readonly slideDirection: string;
    constructor(activeItems: CarouselItemComponent[], slideDirection: string);
}
declare class CarouselComponent implements AfterContentInit, AfterViewInit, AfterViewChecked, OnChanges {
    private readonly _elementRef;
    private readonly _renderer;
    private readonly _changeDetectorRef;
    private readonly _carouselService;
    private readonly _zone;
    /** ID for the Carousel. */
    id: string;
    /** Sets aria-label attribute for carousel */
    ariaLabel: null;
    /** Sets aria-labelledby attribute for carousel */
    ariaLabelledBy: string;
    /** Sets aria-describedby attribute for carousel */
    ariaDescribedBy: string;
    /** Sets position of page indicator container. Default position is bottom. */
    pageIndicatorsOrientation: PageIndicatorsOrientation;
    /** Height for carousel container */
    height: string;
    /** Width for carousel container */
    width: string;
    /** If carousel is in circular loop */
    loop: boolean;
    /** Shows/hides optional navigation button */
    navigation: boolean;
    /** Show navigation button in page indicator container or inside content. Default is page indicator container on true value */
    navigatorInPageIndicator: boolean;
    /** Convert to Numeric page indicator */
    numericIndicator: boolean;
    /** Shows/hides optional page indicator container  */
    pageIndicatorContainer: boolean;
    /** Shows/hides optional page indicator */
    pageIndicator: boolean;
    /**
     * An accessor that sets the resource strings.
     * By default it uses EN resources.
     */
    set resourceStrings(value: FdCarouselResourceStrings);
    /**
     * An accessor that returns the resource strings.
     */
    get resourceStrings(): FdCarouselResourceStrings;
    /** Sets sliding duration in millie seconds. Default is 150 */
    slideTransitionDuration: number;
    /** Is swipe enabled */
    swipeEnabled: boolean;
    /** Is carousel is vertical. Default value is false. */
    vertical: boolean;
    /** Whether to hide top border of the Pagination Container. */
    noPaginationContainerBorder: boolean;
    /** Background configuration for the Content container. */
    contentBackground: CarouselBackgroundOptions;
    /** Background configuration for the Pagination container */
    pageIndicatorBackground: CarouselBackgroundOptions;
    /** Number of items to be visible at a time */
    set visibleSlidesCount(value: number | 'auto');
    get visibleSlidesCount(): number | 'auto';
    /** An event that is emitted after a slide transition has happened */
    readonly slideChange: EventEmitter<CarouselActiveSlides>;
    /** @hidden */
    slides: QueryList<CarouselItemComponent>;
    /** @hidden */
    slideContainer: ElementRef;
    /** Carousel container element. */
    carouselContainer: ElementRef;
    /** @hidden Start index of currently active items */
    currentActiveSlidesStartIndex: number;
    /** @hidden End index of currently active items */
    currentActiveSlidesEndIndex: number;
    /** @hidden an array of id(s) of currently active item(s) */
    currentActiveSlidesIds: string[];
    /** @hidden the total number of slides in the carousel */
    totalSlides: number;
    /** @hidden Make left navigation button disabled */
    leftButtonDisabled: boolean;
    /** @hidden Make right navigation button disabled */
    rightButtonDisabled: boolean;
    /** @hidden Fake array for counting number of page indicator */
    pageIndicatorsCountArray: number[];
    /** @hidden */
    _slidesWrapperSize: number;
    /** @hidden A string containing the id(s) of the active item(s) */
    ariaActivedescendant: string;
    /** @hidden */
    get _contentSizePx(): string;
    /** @hidden handles rtl service */
    protected readonly dir: i0.Signal<Direction>;
    /** @hidden */
    private _visibleSlidesCount;
    /** @hidden */
    private _visibleSlidesNumericCount;
    /** @hidden */
    private _resourceStrings;
    /** @hidden */
    private _config;
    /** @hidden */
    private _slidesCopy;
    /** @hidden */
    private _previousVisibleSlidesCount;
    /** @hidden */
    private _slideSwiped;
    /** @hidden */
    private readonly _destroyRef;
    /** @hidden */
    private readonly _rtlService;
    /** @hidden */
    private readonly _isRtl;
    /** @hidden */
    constructor(_elementRef: ElementRef<HTMLElement>, _renderer: Renderer2, _changeDetectorRef: ChangeDetectorRef, _carouselService: CarouselService, _zone: NgZone);
    /** @hidden */
    handleKeyboardEvent(event: KeyboardEvent): void;
    /** @hidden */
    ngOnChanges(changes: SimpleChanges): void;
    /** @hidden */
    ngAfterContentInit(): void;
    /** @hidden */
    ngAfterViewInit(): void;
    /** @hidden */
    ngAfterViewChecked(): void;
    /** @hidden */
    get _showNavigationButtonInPageIndicatorContainer(): boolean;
    /** @hidden */
    get _showNavigationButtonInContent(): boolean;
    /** @hidden */
    get _showPageIndicatorContainer(): boolean;
    /** @hidden */
    get getPageIndicatorLabel(): string;
    /** @hidden */
    get screenReaderLabel(): string;
    /** @hidden */
    _focus(): void;
    /** Transitions to the previous slide in the carousel. */
    previous(): void;
    /** Transitions to the next slide in the carousel. */
    next(): void;
    /** @hidden Subscribe to carousel service events */
    private _subscribeServiceEvents;
    /**
     * @hidden Prevent native focus flow related to button, if button will be disable on focus state.
     * It works only if carousel is not in circular loop.
     */
    private _preventDefaultBtnFocus;
    /** @hidden Adjust position of active item, based on slide direction */
    private _adjustActiveItemPosition;
    /** @hidden Handles navigation button visibility */
    private _buttonVisibility;
    /** @hidden Handle when slide is added or removed */
    private _onSlideUpdates;
    /** @hidden Initialize carousel with visible items */
    private _initializeCarousel;
    /** @hidden */
    private _goToFirstItem;
    /** @hidden Initialize config for Carousel service */
    private _initializeServiceConfig;
    /**
     * @hidden Returns the slide swapping steps
     */
    private _getStepTaken;
    /** @hidden Handles notification on visible slide change */
    private _notifySlideChange;
    /** @hidden Manages visibility for slides. Useful in managing tab order */
    private _manageSlideVisibility;
    /** @hidden On Swiping of slide, manage page indicator */
    private _onSlideSwipe;
    /**
     * @hidden Making slides visible when slides are dragged. Otherwise, it looses the effect.
     */
    private _onSlideDrag;
    /**
     * @hidden
     * Resizes inner carousel container to fit all items in the viewport and hide those which are not fully in it.
     */
    private _resizeContentContainer;
    /**
     * @hidden
     * Calculates how many slides can be shown within current carousel viewport.
     * @returns Object containing fitting slides count and total width of those slides.
     */
    private _getFittingSlidesAndWidth;
    /** @hidden */
    private _getVisibleSlidesCount;
    static ɵfac: i0.ɵɵFactoryDeclaration<CarouselComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<CarouselComponent, "fd-carousel", never, { "id": { "alias": "id"; "required": false; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; }; "ariaLabelledBy": { "alias": "ariaLabelledBy"; "required": false; }; "ariaDescribedBy": { "alias": "ariaDescribedBy"; "required": false; }; "pageIndicatorsOrientation": { "alias": "pageIndicatorsOrientation"; "required": false; }; "height": { "alias": "height"; "required": false; }; "width": { "alias": "width"; "required": false; }; "loop": { "alias": "loop"; "required": false; }; "navigation": { "alias": "navigation"; "required": false; }; "navigatorInPageIndicator": { "alias": "navigatorInPageIndicator"; "required": false; }; "numericIndicator": { "alias": "numericIndicator"; "required": false; }; "pageIndicatorContainer": { "alias": "pageIndicatorContainer"; "required": false; }; "pageIndicator": { "alias": "pageIndicator"; "required": false; }; "resourceStrings": { "alias": "resourceStrings"; "required": false; }; "slideTransitionDuration": { "alias": "slideTransitionDuration"; "required": false; }; "swipeEnabled": { "alias": "swipeEnabled"; "required": false; }; "vertical": { "alias": "vertical"; "required": false; }; "noPaginationContainerBorder": { "alias": "noPaginationContainerBorder"; "required": false; }; "contentBackground": { "alias": "contentBackground"; "required": false; }; "pageIndicatorBackground": { "alias": "pageIndicatorBackground"; "required": false; }; "visibleSlidesCount": { "alias": "visibleSlidesCount"; "required": false; }; }, { "slideChange": "slideChange"; }, ["slides"], ["*"], true, never>;
}

declare class CarouselDirective implements AfterContentInit {
    private readonly _elementRef;
    private readonly _carouselService;
    /** Configuration for carousel */
    config: CarouselConfig;
    /** Initial active item of carousel, position first + offset */
    active: CarouselItemDirective;
    /** @hidden */
    get carouselService(): CarouselService;
    /** Event thrown, when active element is changed */
    readonly activeChange: EventEmitter<PanEndOutput>;
    /** Event thrown when element is dragged. Emits "true" when drag starts and "false" when drag ends. */
    readonly dragStateChange: EventEmitter<boolean>;
    /** @hidden */
    items: QueryList<CarouselItemDirective>;
    /** @hidden */
    constructor(_elementRef: ElementRef, _carouselService: CarouselService);
    /** @hidden */
    ngAfterContentInit(): void;
    /** Change active element */
    goToItem(item: CarouselItemDirective, smooth?: boolean): void;
    /** Pick previous carousel item */
    pickPrevious(): void;
    /** Pick next carousel item */
    pickNext(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<CarouselDirective, never>;
    static ɵdir: i0.ɵɵDirectiveDeclaration<CarouselDirective, "[fdCarousel]", never, { "config": { "alias": "config"; "required": false; }; "active": { "alias": "active"; "required": false; }; }, { "activeChange": "activeChange"; "dragStateChange": "dragStateChange"; }, ["items"], never, true, never>;
}

/**
 * @deprecated
 * Use direct imports of components and directives.
 */
declare class CarouselModule {
    static ɵfac: i0.ɵɵFactoryDeclaration<CarouselModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<CarouselModule, never, [typeof CarouselItemDirective, typeof CarouselDirective, typeof CarouselComponent, typeof CarouselItemComponent], [typeof CarouselItemDirective, typeof CarouselDirective, typeof CarouselComponent, typeof CarouselItemComponent]>;
    static ɵinj: i0.ɵɵInjectorDeclaration<CarouselModule>;
}

export { CarouselComponent, CarouselDirective, CarouselItemComponent, CarouselItemDirective, CarouselModule, CarouselService, DEFAULT_TRANSITION_DURATION, SlideDirection };
export type { CarouselBackgroundOptions, CarouselConfig, CarouselItemInterface, FittingSlidesAndWidth, PageIndicatorsOrientation, PanEndOutput, Visibility };
