import * as _angular_core from '@angular/core';
import { ElementRef, InjectionToken } from '@angular/core';
import { BooleanInput } from '@angular/cdk/coercion';
import { HasElementRef } from '@fundamental-ngx/cdk/utils';
import { IconFont } from '@fundamental-ngx/core/icon';
import { ContentDensityObserver } from '@fundamental-ngx/core/content-density';

interface ButtonModel {
    setDisabled(value: boolean): void;
    isDisabled(): boolean;
    setFdType(value: ButtonType): void;
    getFdType(): ButtonType;
    markForCheck(): void;
}

type GlyphPosition = 'before' | 'after';
type ButtonType = '' | 'standard' | 'positive' | 'negative' | 'attention' | 'half' | 'ghost' | 'transparent' | 'emphasized' | 'menu';
declare const defaultButtonType: ButtonType;
declare class BaseButton implements HasElementRef, ButtonModel {
    /** Whether button is in toggled state. */
    readonly toggled: _angular_core.InputSignalWithTransform<boolean, BooleanInput>;
    /** Whether button is selected. */
    readonly selected: _angular_core.InputSignalWithTransform<boolean, BooleanInput>;
    /**
     * Native type of button element
     */
    readonly type: _angular_core.InputSignal<string | null | undefined>;
    /** Position of glyph related to text */
    readonly glyphPosition: _angular_core.InputSignal<GlyphPosition>;
    /** The icon to include in the button. See the icon page for the list of icons.
     * Setter is used to control when css class have to be rebuilded.
     * Default value is set to ''.
     */
    readonly glyph: _angular_core.InputSignal<string | null | undefined>;
    /** Glyph font family */
    readonly glyphFont: _angular_core.InputSignal<IconFont>;
    /** The type of the button. Types include:
     * 'standard' | 'positive' | 'negative' | 'attention' | 'half' | 'ghost' | 'transparent' | 'emphasized' | 'menu'.
     * Leave empty for default (Standard button).'
     * Default value is set to 'standard'
     */
    readonly fdType: _angular_core.InputSignal<ButtonType>;
    /**
     * Text rendered inside button component
     */
    readonly label: _angular_core.InputSignal<string | undefined>;
    /** Whether to apply menu mode to the button.
     * Default value is set to false
     */
    readonly fdMenu: _angular_core.InputSignalWithTransform<boolean, BooleanInput>;
    /**
     * Native disabled attribute of button element
     */
    readonly disabled: _angular_core.InputSignalWithTransform<boolean, BooleanInput>;
    /**
     * Native aria-disabled attribute of button element
     */
    readonly ariaDisabled: _angular_core.InputSignalWithTransform<boolean, BooleanInput>;
    /** adding native aria-label to the component */
    readonly ariaLabel: _angular_core.InputSignal<string | null | undefined>;
    /** adding native aria-description to the component */
    readonly ariaDescription: _angular_core.InputSignal<string | null | undefined>;
    /** @hidden */
    readonly elementRef: ElementRef<any>;
    /**
     * Internal toggled state that can be mutated programmatically.
     * Syncs with the toggled input but allows internal modification.
     * @hidden
     */
    protected readonly toggledState: _angular_core.WritableSignal<boolean>;
    /**
     * Internal selected state that can be mutated programmatically.
     * Syncs with the selected input but allows internal modification.
     * @hidden
     */
    protected readonly selectedState: _angular_core.WritableSignal<boolean>;
    /**
     * Internal button type state that can be mutated programmatically.
     * Syncs with the fdType input but allows internal modification.
     * @hidden
     */
    protected readonly fdTypeState: _angular_core.WritableSignal<ButtonType>;
    /**
     * Internal disabled state that can be mutated programmatically.
     * Syncs with the disabled input but allows internal modification.
     * @hidden
     */
    protected readonly _disabledState: _angular_core.WritableSignal<boolean>;
    /**
     * No-op for ButtonModel interface compatibility.
     * Signals automatically notify Angular when they change.
     * @deprecated Signals eliminate the need for manual change detection.
     */
    markForCheck(): void;
    /**
     * Programmatically set the disabled state.
     * This allows parent components to update the button's disabled state.
     */
    setDisabled(value: boolean): void;
    /**
     * Get the current disabled state.
     * Returns the internal disabled state which may have been modified programmatically.
     */
    isDisabled(): boolean;
    /**
     * Programmatically set the button type.
     * This allows directives to override the button type.
     */
    setFdType(value: ButtonType): void;
    /**
     * Get the current button type.
     * Returns the internal button type which may have been modified programmatically.
     */
    getFdType(): ButtonType;
    /**
     * Programmatically set the selected state.
     * This allows parent components to update the button's selected state.
     */
    setSelected(value: boolean): void;
    /**
     * Get the current selected state.
     * Returns the internal selected state which may have been modified programmatically.
     */
    isSelected(): boolean;
    /**
     * Programmatically set the toggled state.
     * This allows parent components to update the button's toggled state.
     */
    setToggled(value: boolean): void;
    /**
     * Get the current toggled state.
     * Returns the internal toggled state which may have been modified programmatically.
     */
    isToggled(): boolean;
    static ɵfac: _angular_core.ɵɵFactoryDeclaration<BaseButton, never>;
    static ɵdir: _angular_core.ɵɵDirectiveDeclaration<BaseButton, never, never, { "toggled": { "alias": "toggled"; "required": false; "isSignal": true; }; "selected": { "alias": "selected"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "glyphPosition": { "alias": "glyphPosition"; "required": false; "isSignal": true; }; "glyph": { "alias": "glyph"; "required": false; "isSignal": true; }; "glyphFont": { "alias": "glyphFont"; "required": false; "isSignal": true; }; "fdType": { "alias": "fdType"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "fdMenu": { "alias": "fdMenu"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "ariaDisabled": { "alias": "aria-disabled"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "ariaDescription": { "alias": "ariaDescription"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
}

declare const badgeEnabledButtonTypes: ButtonType[];
declare class ButtonBadgeDirective implements HasElementRef {
    /**
     * Content, which should be shown inside the Badge.
     * It should not be longer than 4 characters.
     */
    readonly content: _angular_core.InputSignal<string | number | undefined>;
    /** @hidden */
    readonly elementRef: ElementRef<HTMLElement>;
    /** @hidden */
    protected readonly buttonComponent: BaseButton;
    /** @hidden */
    constructor();
    static ɵfac: _angular_core.ɵɵFactoryDeclaration<ButtonBadgeDirective, never>;
    static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ButtonBadgeDirective, "fd-button-badge", never, { "content": { "alias": "content"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
}

/**
 * Button directive, used to enhance standard HTML buttons.
 *
 * ``` selector: button[fd-button], a[fd-button] ```
 *
 * ```html
 * <button fd-button label="Button Text"></button>
 * <a fd-button label="Button Text"></a>
 * ```
 */
declare class ButtonComponent extends BaseButton implements HasElementRef {
    /** Button ID - default value is provided if not set  */
    readonly id: _angular_core.InputSignal<string>;
    /** @hidden */
    readonly specialButtonType: Array<string>;
    /** @hidden */
    readonly elementRef: ElementRef<any>;
    /**
     * Calculate aria-label attribute
     * @hidden
     */
    protected readonly buttonArialabel: _angular_core.Signal<any>;
    /**
     * Calculate aria-description attribute
     * @hidden
     */
    protected readonly buttonAriaDescription: _angular_core.Signal<string | null | undefined>;
    /** @hidden */
    protected readonly contentDensityObserver: ContentDensityObserver;
    /** @hidden
     * CssClassBuilder interface implementation
     * function must return single string
     * function is responsible for order which css classes are applied
     */
    protected readonly cssClass: _angular_core.Signal<string>;
    /** @hidden */
    constructor();
    /** Forces the focus outline around the button, which is not default behavior in Safari. */
    protected clicked(event: Event): void;
    static ɵfac: _angular_core.ɵɵFactoryDeclaration<ButtonComponent, never>;
    static ɵcmp: _angular_core.ɵɵComponentDeclaration<ButtonComponent, "button[fd-button], a[fd-button], span[fd-button]", ["fd-button"], { "id": { "alias": "id"; "required": false; "isSignal": true; }; }, {}, never, ["*", "fd-button-badge"], true, never>;
}

/**
 * @deprecated
 * Use `ButtonComponent` import instead
 */
declare class ButtonModule {
    static ɵfac: _angular_core.ɵɵFactoryDeclaration<ButtonModule, never>;
    static ɵmod: _angular_core.ɵɵNgModuleDeclaration<ButtonModule, never, [typeof ButtonComponent], [typeof ButtonComponent]>;
    static ɵinj: _angular_core.ɵɵInjectorDeclaration<ButtonModule>;
}

declare const FD_BUTTON_COMPONENT: InjectionToken<BaseButton>;

export { BaseButton, ButtonBadgeDirective, ButtonComponent, ButtonModule, FD_BUTTON_COMPONENT, badgeEnabledButtonTypes, defaultButtonType };
export type { ButtonModel, ButtonType, GlyphPosition };
