import * as i0 from '@angular/core';
import { ElementRef, OnInit, EventEmitter, QueryList, AfterViewInit, PipeTransform } from '@angular/core';
import { ControlValueAccessor, NgControl, FormControl, AbstractControl, FormGroup, ValidatorFn, ValidationErrors } from '@angular/forms';
import { MatChip, MatChipListbox } from '@angular/material/chips';
import * as _angular_material_form_field from '@angular/material/form-field';
import { DateTime } from 'luxon';
import { MatSelect } from '@angular/material/select';
import { MatOption } from '@angular/material/core';

declare abstract class InputDirective<T> implements ControlValueAccessor {
    constructor();
    elementRef: ElementRef<any>;
    ngControl: NgControl;
    get formControl(): FormControl<T>;
    hideHint: boolean;
    hint: string | number | null;
    id: string;
    placeholder: string | null;
    label: string;
    get isRequired(): boolean;
    onChange: (value: T) => void;
    onTouched: () => void;
    writeValue: (value: T) => void;
    registerOnChange(fn: (value: T) => void): void;
    registerOnTouched(fn: () => void): void;
    scrollIntoView(options: ScrollIntoViewOptions | undefined): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<InputDirective<any>, never>;
    static ɵdir: i0.ɵɵDirectiveDeclaration<InputDirective<any>, never, never, { "hideHint": { "alias": "hideHint"; "required": false; }; "hint": { "alias": "hint"; "required": false; }; "id": { "alias": "id"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "label": { "alias": "label"; "required": true; }; }, {}, never, never, true, never>;
    static ngAcceptInputType_hideHint: unknown;
}

declare class InputCheckboxComponent extends InputDirective<boolean | null> implements OnInit {
    labelPosition: 'before' | 'after';
    readonly change: EventEmitter<boolean>;
    ngOnInit(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<InputCheckboxComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<InputCheckboxComponent, "pro-input-checkbox[label]", never, { "labelPosition": { "alias": "labelPosition"; "required": false; }; }, { "change": "change"; }, never, never, true, never>;
}

declare class InputChipComponent extends MatChip {
    private readonly elementRef;
    get element(): HTMLElement;
    static ɵfac: i0.ɵɵFactoryDeclaration<InputChipComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<InputChipComponent, "pro-input-chip", never, {}, {}, never, ["*"], true, never>;
}

declare class InputChipsComponent extends InputDirective<string> {
    readonly chips: QueryList<InputChipComponent>;
    readonly matChipListbox: MatChipListbox | undefined;
    max: number | string | undefined;
    multiple: boolean;
    compareWith: MatChipListbox['compareWith'];
    static ɵfac: i0.ɵɵFactoryDeclaration<InputChipsComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<InputChipsComponent, "pro-input-chips[label]", never, { "max": { "alias": "max"; "required": false; }; "multiple": { "alias": "multiple"; "required": false; }; "compareWith": { "alias": "compareWith"; "required": false; }; }, {}, ["chips"], never, true, never>;
    static ngAcceptInputType_max: unknown;
    static ngAcceptInputType_multiple: unknown;
}

type DateTimeFormat = 'ccc, LLLL dd, yyyy hh:mm a' | 'MM/dd/yyyy, hh:mm a' | 'MM/dd/yyyy, hh:mm a (ZZZZ)' | 'MM/dd/yyyy' | 'h:mm a (ZZZZ)' | 'relative-date' | 'relative-datetime';

type InputAppearance = _angular_material_form_field.MatFormFieldAppearance;
type InputAutocomplete = 'additional-name' | 'address-level1' | 'address-level2' | 'address-level3' | 'address-level4' | 'address-line1' | 'address-line2' | 'address-line3' | 'bday' | 'bday-day' | 'bday-month' | 'bday-year' | 'cc-additional-name' | 'cc-csc' | 'cc-exp' | 'cc-exp-month' | 'cc-exp-year' | 'cc-family-name' | 'cc-given-name' | 'cc-name' | 'cc-number' | 'cc-type' | 'country' | 'country-name' | 'current-password' | 'email' | 'family-name' | 'given-name' | 'honorific-prefix' | 'honorific-suffix' | 'impp' | 'language' | 'name' | 'new-password' | 'nickname' | 'off' | 'on' | 'one-time-code' | 'organization' | 'organization-title' | 'photo' | 'postal-code' | 'sex' | 'street-address' | 'tel' | 'tel-area-code' | 'tel-country-code' | 'tel-extension' | 'tel-local' | 'tel-local-prefix' | 'tel-local-suffix' | 'tel-national' | 'transaction-amount' | 'transaction-currency' | 'url' | 'username';
type InputType = 'color' | 'datetime-local' | 'date' | 'email' | 'month' | 'number' | 'password' | 'search' | 'tel' | 'text' | 'time' | 'url' | 'week';

interface Option {
    label: string;
    value: number | string;
}

declare class InputComponent extends InputDirective<string> {
    appearance: InputAppearance;
    autocomplete: InputAutocomplete;
    max: number | string | undefined;
    min: number | string | undefined;
    maxLength: number | string | undefined;
    minLength: number | string | undefined;
    name: string | undefined;
    step: number | string | undefined;
    type: InputType;
    static ɵfac: i0.ɵɵFactoryDeclaration<InputComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<InputComponent, "pro-input[label]", never, { "appearance": { "alias": "appearance"; "required": false; }; "autocomplete": { "alias": "autocomplete"; "required": false; }; "max": { "alias": "max"; "required": false; }; "min": { "alias": "min"; "required": false; }; "maxLength": { "alias": "maxLength"; "required": false; }; "minLength": { "alias": "minLength"; "required": false; }; "name": { "alias": "name"; "required": false; }; "step": { "alias": "step"; "required": false; }; "type": { "alias": "type"; "required": false; }; }, {}, never, never, true, never>;
    static ngAcceptInputType_max: unknown;
    static ngAcceptInputType_min: unknown;
    static ngAcceptInputType_maxLength: unknown;
    static ngAcceptInputType_minLength: unknown;
    static ngAcceptInputType_step: unknown;
}

declare class InputDatepickerComponent extends InputDirective<DateTime> {
    appearance: InputAppearance;
    max: DateTime | undefined;
    min: DateTime | undefined;
    static ɵfac: i0.ɵɵFactoryDeclaration<InputDatepickerComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<InputDatepickerComponent, "pro-input-datepicker[label]", never, { "appearance": { "alias": "appearance"; "required": false; }; "max": { "alias": "max"; "required": false; }; "min": { "alias": "min"; "required": false; }; }, {}, never, never, true, never>;
}

declare class InputDropdownOptionComponent extends MatOption {
    private readonly elementRef;
    get element(): HTMLElement;
    static ɵfac: i0.ɵɵFactoryDeclaration<InputDropdownOptionComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<InputDropdownOptionComponent, "pro-input-dropdown-option", never, {}, {}, never, ["*"], true, never>;
}

declare class InputDropdownOptionGroupComponent {
    label: string;
    readonly options: QueryList<InputDropdownOptionComponent>;
    static ɵfac: i0.ɵɵFactoryDeclaration<InputDropdownOptionGroupComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<InputDropdownOptionGroupComponent, "pro-input-dropdown-option-group[label]", never, { "label": { "alias": "label"; "required": true; }; }, {}, ["options"], ["*"], true, never>;
}

declare class InputDropdownComponent<T> extends InputDirective<T> {
    appearance: InputAppearance;
    max: number | string | undefined;
    multiple: boolean;
    readonly options: QueryList<InputDropdownOptionComponent>;
    readonly optionGroups: QueryList<InputDropdownOptionGroupComponent>;
    readonly matSelect?: MatSelect;
    protected get selectedOptions(): readonly InputDropdownOptionComponent[];
    compareWith: MatSelect['compareWith'];
    static ɵfac: i0.ɵɵFactoryDeclaration<InputDropdownComponent<any>, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<InputDropdownComponent<any>, "pro-input-dropdown[label]", never, { "appearance": { "alias": "appearance"; "required": false; }; "max": { "alias": "max"; "required": false; }; "multiple": { "alias": "multiple"; "required": false; }; "compareWith": { "alias": "compareWith"; "required": false; }; }, {}, ["options", "optionGroups"], never, true, never>;
    static ngAcceptInputType_max: unknown;
    static ngAcceptInputType_multiple: unknown;
}

declare class InputLoadingComponent implements OnInit {
    appearance: InputAppearance;
    hideHint: boolean;
    hint: string | undefined;
    label: string | undefined;
    protected readonly formControl: FormControl<string>;
    protected loadingText: string;
    ngOnInit(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<InputLoadingComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<InputLoadingComponent, "pro-input-loading", never, { "appearance": { "alias": "appearance"; "required": false; }; "hideHint": { "alias": "hideHint"; "required": false; }; "hint": { "alias": "hint"; "required": false; }; "label": { "alias": "label"; "required": false; }; }, {}, never, never, true, never>;
    static ngAcceptInputType_hideHint: unknown;
}

declare class InputRadioOptionComponent<T> {
    private readonly elementRef;
    value: T;
    get element(): HTMLElement;
    static ɵfac: i0.ɵɵFactoryDeclaration<InputRadioOptionComponent<any>, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<InputRadioOptionComponent<any>, "pro-input-radio-option[value]", never, { "value": { "alias": "value"; "required": true; }; }, {}, never, ["*"], true, never>;
}

declare class InputRadioComponent<T> extends InputDirective<T> {
    protected readonly options: QueryList<InputRadioOptionComponent<T>>;
    static ɵfac: i0.ɵɵFactoryDeclaration<InputRadioComponent<any>, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<InputRadioComponent<any>, "pro-input-radio[label]", never, {}, {}, ["options"], never, true, never>;
}

declare class InputTextareaComponent extends InputDirective<string> {
    appearance: InputAppearance;
    autocomplete: InputAutocomplete;
    name: string | undefined;
    maxLength: number | string | undefined;
    minLength: number | string | undefined;
    static ɵfac: i0.ɵɵFactoryDeclaration<InputTextareaComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<InputTextareaComponent, "pro-input-textarea[label]", never, { "appearance": { "alias": "appearance"; "required": false; }; "autocomplete": { "alias": "autocomplete"; "required": false; }; "name": { "alias": "name"; "required": false; }; "maxLength": { "alias": "maxLength"; "required": false; }; "minLength": { "alias": "minLength"; "required": false; }; }, {}, never, never, true, never>;
    static ngAcceptInputType_maxLength: unknown;
    static ngAcceptInputType_minLength: unknown;
}

declare class InputTimepickerComponent extends InputDirective<DateTime> {
    appearance: InputAppearance;
    interval: string | number | null;
    max: DateTime | undefined;
    min: DateTime | undefined;
    static ɵfac: i0.ɵɵFactoryDeclaration<InputTimepickerComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<InputTimepickerComponent, "pro-input-timepicker[label]", never, { "appearance": { "alias": "appearance"; "required": false; }; "interval": { "alias": "interval"; "required": false; }; "max": { "alias": "max"; "required": false; }; "min": { "alias": "min"; "required": false; }; }, {}, never, never, true, never>;
}

declare class InputToggleComponent extends InputDirective<boolean | null> implements OnInit {
    readonly change: EventEmitter<boolean>;
    ngOnInit(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<InputToggleComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<InputToggleComponent, "pro-input-toggle[label]", never, {}, { "change": "change"; }, never, never, true, never>;
}

declare class FormDirective<T extends {
    [K in keyof T]: AbstractControl;
}> implements AfterViewInit {
    protected readonly formGroup: FormGroup<T>;
    private readonly inputs;
    private readonly inputCheckboxes;
    private readonly inputChips;
    private readonly inputDatepickers;
    private readonly inputDropdowns;
    private readonly inputRadios;
    private readonly inputTextareas;
    private readonly inputTimepickers;
    private readonly inputToggles;
    private get formInputs();
    ngAfterViewInit(): void;
    /** Trigger validation checks & highlight all invalid controls. */
    highlightInvalidControls(): void;
    /** Reset the form to its original state. */
    protected reset(): void;
    /**
     * Scroll to the first invalid control in the form.
     *
     * @returns The label of the first invalid control.
     */
    scrollToFirstInvalidControl(): string | null;
    static ɵfac: i0.ɵɵFactoryDeclaration<FormDirective<any>, never>;
    static ɵdir: i0.ɵɵDirectiveDeclaration<FormDirective<any>, never, never, {}, {}, never, never, true, never>;
}

declare class DateTimePipe implements PipeTransform {
    private readonly defaultFormat;
    /** Transform DateTime object into a readable string. */
    transform(value: DateTime | null | undefined | unknown, format?: DateTimeFormat): string;
    private getRelativeDate;
    private getRelativeDateTime;
    static ɵfac: i0.ɵɵFactoryDeclaration<DateTimePipe, never>;
    static ɵpipe: i0.ɵɵPipeDeclaration<DateTimePipe, "dateTime", true>;
}

/**
 * Validate that the value is an empty value.
 *
 * @param value The value to check.
 * @returns True if the value is an empty value, false otherwise.
 */
declare function isEmptyValue(value: unknown): value is null | undefined;
/**
 * Validate that the value is a non-empty value.
 *
 * @param value The value to check.
 * @returns True if the value is a non-empty value, false otherwise.
 */
declare function isNonEmptyValue<T>(value: T): value is NonNullable<T>;
/**
 * Validate that the value is a number.
 *
 * @param value The value to check.
 * @returns True if the value is a number, false otherwise.
 */
declare function isNumber(value: unknown): value is number;
/**
 * Validate that the value is a string. This includes both primitive strings
 * and string objects.
 *
 * @param value The value to check.
 * @returns True if the value is a string, false otherwise.
 */
declare function isString(value: unknown): value is string;
/**
 * Validate that the value is an empty string. An empty string is a string that
 * contains no characters.
 *
 * @param value The value to check.
 * @returns True if the value is an empty string, false otherwise.
 */
declare function isEmptyString(value: unknown): value is '';
/**
 * Validate that the value is a blank string. A blank string is a string that
 * contains only whitespace characters.
 *
 * @param value
 * @returns
 */
declare function isWhitespaceString(value: unknown): boolean;
/**
 * Validate that the value is a string that is non-empty.
 *
 * @param value The value to check.
 * @returns True if the value is a string that is non-empty, false otherwise.
 */
declare function isNonEmptyString(value: unknown): value is string;

declare class CustomValidators {
    /**
     * Validates that a given DateTime value does not exceed a maximum allowed DateTime.
     *
     * @param max The maximum allowed DateTime.
     * @returns A validator function that checks if the value exceeds the max DateTime.
     */
    static maxDateTime(max: DateTime): ValidatorFn;
    /**
     * Validates that a given DateTime value is not earlier than a minimum allowed DateTime.
     *
     * @param min The minimum allowed DateTime.
     * @returns A validator function that checks if the value is below the min DateTime.
     */
    static minDateTime(min: DateTime): ValidatorFn;
    /**
     * Validates that a given value is **not** a string.
     *
     * @param control The form control being validated.
     * @returns A validation error if the value is a string, otherwise null.
     */
    static nonString(control: AbstractControl): ValidationErrors | null;
    /**
     * Validates that a given value is a number.
     *
     * @returns A validator function that checks if the value is a number.
     */
    static isNumber(): ValidatorFn;
    /**
     * Validates that a given value is a whole number (integer).
     *
     * @returns A validator function that checks if the value is a whole number.
     */
    static wholeNumber(): ValidatorFn;
}

export { CustomValidators, DateTimePipe, FormDirective, InputCheckboxComponent, InputChipComponent, InputChipsComponent, InputComponent, InputDatepickerComponent, InputDirective, InputDropdownComponent, InputDropdownOptionComponent, InputDropdownOptionGroupComponent, InputLoadingComponent, InputRadioComponent, InputRadioOptionComponent, InputTextareaComponent, InputTimepickerComponent, InputToggleComponent, isEmptyString, isEmptyValue, isNonEmptyString, isNonEmptyValue, isNumber, isString, isWhitespaceString };
export type { DateTimeFormat, InputAppearance, InputAutocomplete, InputType, Option };
