import * as i0 from '@angular/core';
import { TemplateRef, OnInit, AfterViewInit, OnChanges, QueryList, ElementRef, SimpleChanges, InjectionToken } from '@angular/core';
import { Direction } from '@angular/cdk/bidi';
import { FocusableItem, Nullable, Size, HasElementRef, CssClassBuilder, FocusableListItemFocusedEvent, FocusableItemDirective, ColorAccent } from '@fundamental-ngx/cdk/utils';
import { Observable } from 'rxjs';
import * as i7 from '@angular/cdk/portal';

/**
 * Avatar group item directive, used to provide a template for the avatar group item.
 */
declare class AvatarGroupItemDirective {
    /**
     * Text, which will be displayed when in overflow popover and activated
     * */
    title: string;
    /**
     * If set to true, item will never be hidden in overflow popover
     * */
    forceVisibility: boolean;
    /** @hidden */
    _templateRef: TemplateRef<void>;
    /**
     * Template for the details of the avatar group item.
     * This template it used to render additional information in the overflow popover.
     * */
    set details(detailsTemplate: TemplateRef<void> | string);
    get details(): TemplateRef<void>;
    /** @hidden */
    private _details;
    static ɵfac: i0.ɵɵFactoryDeclaration<AvatarGroupItemDirective, never>;
    static ɵdir: i0.ɵɵDirectiveDeclaration<AvatarGroupItemDirective, "[fdAvatarGroupItem]", never, { "title": { "alias": "fdAvatarGroupItemTitle"; "required": false; }; "forceVisibility": { "alias": "fdAvatarGroupItemForceVisibility"; "required": false; }; "details": { "alias": "fdAvatarGroupItem"; "required": false; }; }, {}, never, never, true, never>;
}

declare class AvatarGroupItemRendererDirective implements OnInit, FocusableItem {
    /**
     * Avatar group item to be rendered.
     **/
    avatarGroupItem: AvatarGroupItemDirective;
    /**
     * Whether the item should be forced to be visible.
     **/
    forceVisibility: boolean;
    /**
     * HTML element of the item.
     **/
    element$: Observable<Nullable<HTMLElement>>;
    /** @hidden */
    keydown: Observable<KeyboardEvent>;
    /**
     * Whether the item is visible.
     **/
    get visible(): boolean;
    /**
     * Currently rendered element's HTMLElement.
     **/
    get element(): HTMLElement;
    /**
     * Rendered element's width or it's last saved width.
     **/
    get width(): number;
    /**
     * Rendered element's height or it's last saved height.
     **/
    get height(): number;
    /** @hidden */
    private _portalOutlet;
    /** @hidden */
    private _viewContainerRef;
    /**
     * @hidden
     **/
    private _element$;
    /** @hidden */
    private _templatePortal?;
    /** @hidden */
    private _isFocusable;
    /** @hidden */
    private _embeddedViewRef;
    /** @hidden */
    private _lastSavedWidth;
    /** @hidden */
    private _lastSavedHeight;
    /** @hidden */
    private _posInSet;
    /** @hidden */
    private _setSize;
    /** @hidden */
    private _hostConfig;
    /** @hidden */
    constructor();
    /** @hidden */
    ngOnInit(): void;
    /**
     * Hides the item.
     **/
    hide(): void;
    /**
     * Shows the item.
     **/
    show(): void;
    /**
     * Whether the item is focusable.
     **/
    isFocusable: () => boolean;
    /**
     * Sets the tabbable state of the item.
     **/
    setTabbable(tabbable: boolean): void;
    /**
     * Sets aria-posinset and aria-setsize on the rendered element.
     * Stored values are applied immediately if the item is visible,
     * and re-applied on the next show() call otherwise.
     **/
    set posInSet(value: number);
    get posInSet(): number;
    /** @hidden */
    set setSize(value: number);
    get setSize(): number;
    /** @hidden */
    focus(): void;
    /** @hidden */
    private _applyAriaPosition;
    static ɵfac: i0.ɵɵFactoryDeclaration<AvatarGroupItemRendererDirective, never>;
    static ɵdir: i0.ɵɵDirectiveDeclaration<AvatarGroupItemRendererDirective, "[fdAvatarGroupItemPortal]", ["fdAvatarGroupItemPortal"], { "avatarGroupItem": { "alias": "avatarGroupItem"; "required": false; }; "forceVisibility": { "alias": "forceVisibility"; "required": false; }; "posInSet": { "alias": "posInSet"; "required": false; }; "setSize": { "alias": "setSize"; "required": false; }; }, {}, never, never, true, never>;
}

type AvatarGroupType = 'individual' | 'group';
type AvatarGroupOrientation = 'horizontal' | 'vertical';
type AvatarGroupSize = Size;
interface AvatarGroupHostConfig {
    type: AvatarGroupType;
    orientation: AvatarGroupOrientation;
    size: AvatarGroupSize;
}

declare class AvatarGroupHostComponent implements OnInit, AfterViewInit, OnChanges, HasElementRef, AvatarGroupHostConfig, CssClassBuilder {
    /**
     * The class to apply to the host element.
     **/
    class: Nullable<string>;
    /**
     * The type of the avatar group.
     * Options include 'individual' and 'group'.
     **/
    type: AvatarGroupHostConfig['type'];
    /**
     * The orientation of the avatar group.
     * Options include 'horizontal' and 'vertical'.
     **/
    orientation: AvatarGroupHostConfig['orientation'];
    /**
     * The size of the avatar group.
     * Options include 'xs', 's', 'm', 'l', and 'xl'.
     **/
    size: AvatarGroupHostConfig['size'];
    /**
     * The items to be rendered in the avatar group.
     **/
    items: QueryList<AvatarGroupItemDirective>;
    /**
     * @hidden
     * The portals to be rendered in the avatar group.
     **/
    _portals: QueryList<AvatarGroupItemRendererDirective>;
    /** @hidden */
    _resizeEmitter: Observable<ResizeObserverEntry[]>;
    /** The reference to the host element */
    readonly elementRef: ElementRef<any>;
    /** @hidden */
    _hiddenItems: i0.WritableSignal<AvatarGroupItemRendererDirective[]>;
    /** @hidden */
    private readonly _destroyRef;
    /** @hidden */
    private _cdr;
    /** @hidden */
    private _onChanges$;
    /** @hidden */
    buildComponentCssClass(): string[];
    /** @hidden */
    ngOnInit(): void;
    /** @hidden */
    ngOnChanges(changes: SimpleChanges): void;
    /** @hidden */
    ngAfterViewInit(): void;
    /** @hidden */
    private _calculateVisibility;
    static ɵfac: i0.ɵɵFactoryDeclaration<AvatarGroupHostComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<AvatarGroupHostComponent, "fd-avatar-group-host", never, { "class": { "alias": "class"; "required": false; }; "type": { "alias": "type"; "required": false; }; "orientation": { "alias": "orientation"; "required": false; }; "size": { "alias": "size"; "required": false; }; "items": { "alias": "items"; "required": false; }; }, {}, ["_portals"], ["*"], true, never>;
}

/**
 * Avatar group overflow body directive, used to provide a template for the avatar group overflow body.
 * If nothing is provided, default overflow body will be used.
 */
declare class AvatarGroupOverflowBodyDirective {
    /** @hidden */
    readonly _templateRef: TemplateRef<{
        hiddenItems: AvatarGroupItemRendererDirective[];
    }>;
    static ɵfac: i0.ɵɵFactoryDeclaration<AvatarGroupOverflowBodyDirective, never>;
    static ɵdir: i0.ɵɵDirectiveDeclaration<AvatarGroupOverflowBodyDirective, "[fdAvatarGroupOverflowBody]", never, {}, {}, never, never, true, never>;
}

/**
 * Avatar group overflow button directive, used to provide a template for the avatar group overflow button.
 * If nothing is provided, default overflow button will be used.
 */
declare class AvatarGroupOverflowButtonDirective {
    /** @hidden */
    readonly _templateRef: TemplateRef<{
        hiddenItems: AvatarGroupItemRendererDirective[];
    }>;
    static ɵfac: i0.ɵɵFactoryDeclaration<AvatarGroupOverflowButtonDirective, never>;
    static ɵdir: i0.ɵɵDirectiveDeclaration<AvatarGroupOverflowButtonDirective, "[fdAvatarGroupOverflowButton]", never, {}, {}, never, never, true, never>;
}

declare class AvatarGroupComponent implements AvatarGroupHostConfig {
    /**
     * The AvatarGroup control has two group types:
     *
     * `group`: The avatars are displayed as partially overlapped on top of each other and the entire group has one click/tap area.
     * `individual`: The avatars are displayed side-by-side and each avatar has its own click/tap area.
     * */
    type: AvatarGroupHostConfig['type'];
    /**
     * Orientation of the AvatarGroup control.
     *
     * `horizontal`: The avatars are displayed horizontally.
     * `vertical`: The avatars are displayed vertically.
     */
    orientation: AvatarGroupHostConfig['orientation'];
    /**
     * The spacing between the items depends on the size of the avatars in the group.
     * The size is also used for the default overflow button.
     * `xs`, `s`, `m`, `l`, `xl`
     */
    size: AvatarGroupHostConfig['size'];
    /**
     * The title which is displayed when user opens the overflow popover.
     * This takes effect only when default overflow popover body is used,
     * otherwise the title should be set on the custom overflow popover body component.
     */
    overflowPopoverTitle: string;
    /**
     * Aria label for the avatar group container.
     * When not provided, a default label is generated from the i18n `coreAvatarGroup.ariaLabelGroup` key
     * for group type, or `coreAvatarGroup.ariaLabelIndividual` for individual type,
     * using the current displayed and hidden avatar counts as context.
     */
    ariaLabel: string;
    /** @hidden */
    _avatarRenderers: QueryList<AvatarGroupItemRendererDirective>;
    /** @hidden */
    _avatars: QueryList<AvatarGroupItemDirective>;
    /** @hidden */
    _overflowButton: AvatarGroupOverflowButtonDirective;
    /** @hidden */
    _avatarGroupPopoverBody: AvatarGroupOverflowBodyDirective;
    /**
     * Heading level for the overflow popover title.
     * @default 5
     */
    readonly overflowHeadingLevel: i0.InputSignal<1 | 3 | 2 | 4 | 5 | 6>;
    /** @hidden */
    readonly _avatarGroupHost: i0.Signal<AvatarGroupHostComponent | undefined>;
    /** @hidden */
    protected readonly contentDirection: i0.Signal<Direction>;
    /** @hidden */
    protected readonly _defaultAriaLabelGroup: i0.Signal<string>;
    /** @hidden */
    protected readonly _defaultAriaLabelIndividual: i0.Signal<string>;
    /** @hidden */
    private readonly _translate;
    /** @hidden */
    private readonly _ariaLabelContext;
    /** @hidden */
    private readonly _cdr;
    /** @hidden */
    private readonly _rtlService;
    /** @hidden */
    private readonly _liveAnnouncer;
    /** @hidden */
    _detectChanges(): void;
    /** @hidden */
    protected _onItemFocused(event: FocusableListItemFocusedEvent): void;
    /** @hidden */
    protected _popupBodyAriaLabel(count: number): string;
    static ɵfac: i0.ɵɵFactoryDeclaration<AvatarGroupComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<AvatarGroupComponent, "fd-avatar-group", never, { "type": { "alias": "type"; "required": false; }; "orientation": { "alias": "orientation"; "required": false; }; "size": { "alias": "size"; "required": false; }; "overflowPopoverTitle": { "alias": "overflowPopoverTitle"; "required": false; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; }; "overflowHeadingLevel": { "alias": "overflowHeadingLevel"; "required": false; "isSignal": true; }; }, {}, ["_overflowButton", "_avatarGroupPopoverBody", "_avatars"], ["*"], true, never>;
}

/**
 * Avatar group overflow button component.
 * This is used for the overflow button template.
 * Although any content can be projected as the overflow button, this component provides some styling and accessibility features.
 */
declare class AvatarGroupOverflowButtonComponent extends FocusableItemDirective implements OnChanges, OnInit, CssClassBuilder {
    /**
     * Size of the overflow button.
     */
    size: Size;
    /**
     * Whether the overflow button should be displayed as a circle.
     */
    circle: boolean;
    /**
     * A number from 1 to 10 representing the background color of the Avatar.
     */
    colorAccent: Nullable<ColorAccent>;
    /**
     * The class to apply to the host element.
     **/
    class: Nullable<string>;
    /** @hidden */
    constructor();
    /** @hidden */
    buildComponentCssClass(): string[];
    /** @hidden */
    ngOnInit(): void;
    /** @hidden */
    ngOnChanges(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<AvatarGroupOverflowButtonComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<AvatarGroupOverflowButtonComponent, "fd-avatar-group-overflow-button", never, { "size": { "alias": "size"; "required": false; }; "circle": { "alias": "circle"; "required": false; }; "colorAccent": { "alias": "colorAccent"; "required": false; }; "class": { "alias": "class"; "required": false; }; }, {}, never, ["*"], true, never>;
}

/**
 * Avatar group overflow body component, used to provide a template for the avatar group overflow body.
 */
declare class AvatarGroupOverflowBodyComponent {
    /** Remove the padding from the overflow body. */
    noPadding: boolean;
    /** Hide horizontal scrollbar from the overflow body. */
    noHorizontalScroll: boolean;
    /** Hide vertical scrollbar from the overflow body. */
    noVerticalScroll: boolean;
    /** Additional popover body class */
    additionalPopoverBodyClass: string;
    static ɵfac: i0.ɵɵFactoryDeclaration<AvatarGroupOverflowBodyComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<AvatarGroupOverflowBodyComponent, "fd-avatar-group-overflow-body", never, { "noPadding": { "alias": "noPadding"; "required": false; }; "noHorizontalScroll": { "alias": "noHorizontalScroll"; "required": false; }; "noVerticalScroll": { "alias": "noVerticalScroll"; "required": false; }; "additionalPopoverBodyClass": { "alias": "additionalPopoverBodyClass"; "required": false; }; }, {}, never, ["[fd-popover-body-header]", "[fd-avatar-group-overflow-body-content]"], true, never>;
}

/**
 * @deprecated
 * Use direct imports of components and directives.
 */
declare class AvatarGroupModule {
    static ɵfac: i0.ɵɵFactoryDeclaration<AvatarGroupModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<AvatarGroupModule, never, [typeof AvatarGroupComponent, typeof AvatarGroupItemDirective, typeof AvatarGroupOverflowButtonComponent, typeof AvatarGroupOverflowButtonDirective, typeof AvatarGroupOverflowBodyComponent, typeof AvatarGroupOverflowBodyDirective, typeof i7.PortalModule], [typeof AvatarGroupComponent, typeof AvatarGroupItemDirective, typeof AvatarGroupOverflowButtonComponent, typeof AvatarGroupOverflowButtonDirective, typeof AvatarGroupOverflowBodyComponent, typeof AvatarGroupOverflowBodyDirective]>;
    static ɵinj: i0.ɵɵInjectorDeclaration<AvatarGroupModule>;
}

declare const AVATAR_GROUP_HOST_CONFIG: InjectionToken<AvatarGroupHostConfig>;

export { AVATAR_GROUP_HOST_CONFIG, AvatarGroupComponent, AvatarGroupItemDirective, AvatarGroupModule, AvatarGroupOverflowBodyComponent, AvatarGroupOverflowBodyDirective, AvatarGroupOverflowButtonComponent, AvatarGroupOverflowButtonDirective };
export type { AvatarGroupHostConfig, AvatarGroupOrientation, AvatarGroupSize, AvatarGroupType };
