import { ChangeDetectorRef, EventEmitter, OnDestroy, OnInit } from '@angular/core';
import { AbstractControl, ControlValueAccessor, Validator } from '@angular/forms';
import { PoMask } from '../po-input/po-mask';
import { Observable } from 'rxjs';
import { PoLanguageService } from '../../../services/po-language/po-language.service';
import { PoDatepickerIsoFormat } from './enums/po-datepicker-iso-format.enum';
import { PoHelperOptions } from '../../po-helper';
/**
 * @description
 *
 * O `po-datepicker` é um componente específico para manipulação de datas permitindo a digitação e / ou seleção.
 *
 * O formato de exibição da data, ou seja, o formato que é apresentado ao usuário é o dd/mm/yyyy,
 * mas podem ser definidos outros padrões (veja mais na propriedade `p-format`).
 *
 * O idioma padrão do calendário será exibido de acordo com o navegador, caso tenha necessidade de alterar
 * use a propriedade `p-locale`.
 *
 * O datepicker aceita três formatos de data: o E8601DZw (yyyy-mm-ddThh:mm:ss+|-hh:mm), o E8601DAw (yyyy-mm-dd) e o
 * Date padrão do Javascript.
 *
 * > Por padrão, o formato de saída do *model* se ajustará conforme o formato de entrada. Se por acaso precisar controlar o valor de saída,
 * a propriedade `p-iso-format` provê esse controle independentemente do formato de entrada. Veja abaixo os formatos disponíveis:
 *
 * - Formato de entrada e saída (E8601DZw) - `'2017-11-28T00:00:00-02:00'`;
 *
 * - Formato de entrada e saída (E8601DAw) - `'2017-11-28'`;
 *
 * - Formato de entrada (Date) - `new Date(2017, 10, 28)` e saída (E8601DAw) - `'2017-11-28'`;
 *
 * **Importante:**
 *
 * - Para utilizar datas com ano inferior a 100, verificar o comportamento do [`new Date`](https://www.w3schools.com/js/js_dates.asp)
 * e utilizar o método [`setFullYear`](https://www.w3schools.com/jsref/jsref_setfullyear.asp).
 * - Caso a data esteja inválida, o `model` receberá **'Data inválida'**.
 * - Caso o `input` esteja passando um `[(ngModel)]`, mas não tenha um `name`, então irá ocorrer um erro
 * do próprio Angular (`[ngModelOptions]="{standalone: true}"`).
 *
 * Exemplo:
 *
 * ```
 * <po-datepicker
 *   [(ngModel)]="pessoa.nome"
 *   [ngModelOptions]="{standalone: true}"
 * </po-datepicker>
 * ```
 *
 * > Não esqueça de importar o `FormsModule` em seu módulo, tal como para utilizar o `input default`.
 *
 * #### Tokens customizáveis
 *
 * É possível alterar o estilo do componente usando os seguintes tokens (CSS): <br>
 * Obs: Só é possível realizar alterações ao adicionar a classe `.po-input`
 *
 * > Para maiores informações, acesse o guia [Personalizando o Tema Padrão com Tokens CSS](https://po-ui.io/guides/theme-customization).
 *
 * | Propriedade                            | Descrição                                             | Valor Padrão                                     |
 * |----------------------------------------|-------------------------------------------------------|--------------------------------------------------|
 * | **Default Values**                     |                                                       |                                                  |
 * | `--font-family`                        | Família tipográfica usada                             | `var(--font-family-theme)`                       |
 * | `--font-size`                          | Tamanho da fonte                                      | `var(--font-size-default)`                       |
 * | `--text-color-placeholder` &nbsp;      | Cor principal do texto do placeholder                 | `var(--color-neutral-light-30)`                  |
 * | `--color`                              | Cor principal do datepicker                           | `var(--color-neutral-dark-70)`                   |
 * | `--background`                         | Cor de background                                     | `var(--color-neutral-light-05)`                  |
 * | `--padding`                            | Preenchimento                                         | `0 0.5rem`                                       |
 * | `--text-color`                         | Cor do texto                                          | `var(--color-neutral-dark-90)`                   |
 * | `--field-container-title-justify`      | Alinhamento horizontal do título (`justify-content`)  | `space-between`                                   |
 * | `--field-container-title-flex`         | Flex do título (`flex`)                               | `1 auto`                                          |
 * | **Hover**                              |                                                       |                                                  |
 * | `--color-hover`                        | Cor principal no estado hover                         | `var(--color-brand-01-dark)`                     |
 * | `--background-hover`                   | Cor de background no estado hover                     | `var(--color-brand-01-lightest)`                 |
 * | **Focused**                            |                                                       |                                                  |
 * | `--color-focused`                      | Cor principal no estado de focus                      | `var(--color-action-default)`                    |
 * | `--outline-color-focused`              | Cor do outline do estado de focus                     | `var(--color-action-focus)`                      |
 * | **Disabled**                           |                                                       |                                                  |
 * | `--color-disabled`                     | Cor principal no estado disabled                      | `var(--color-neutral-light-30)`                  |
 * | `--background-disabled`                | Cor de background no estado disabled &nbsp;           | `var(--color-neutral-light-20)`                  |
 * | `--text-color-disabled`                | Cor do texto no estado disabled                       | `var(--color-neutral-dark-70)`                   |
 *
 */
export declare abstract class PoDatepickerBaseComponent implements ControlValueAccessor, OnInit, OnDestroy, Validator {
    protected languageService: PoLanguageService;
    protected cd: ChangeDetectorRef;
    additionalHelpEventTrigger: string | undefined;
    /** Rótulo do campo. */
    label?: string;
    /** Texto de apoio do campo. */
    help?: string;
    /**
     * Define o modo de operação do datepicker.
     *
     * Permite configurar o componente para seleção de:
     * - Mês e ano (`month-year`);
     * - Apenas ano (`year`).
     */
    mode?: 'month-year' | 'year';
    /**
     * Define o limite de anos exibidos nas variações `month-year` e `year`,
     * considerando a data atual como referência.
     *
     * O valor informado determina o intervalo de anos anterior e posterior
     * à data corrente que será disponibilizado para seleção.
     *
     * @default 150
     */
    yearRangeLimit?: number;
    /**
     *
     * @deprecated v23.x.x use `p-helper`
     *
     * @optional
     *
     * @description
     * Exibe um ícone de ajuda adicional, com o texto desta propriedade sendo passado para o popover do componente `po-helper`.
     * **Como boa prática, indica-se utilizar um texto com até 140 caracteres.**
     * > Requer um recuo mínimo de 8px se o componente estiver próximo à lateral da tela.
     *
     * > Essa propriedade está **depreciada** e será removida na versão `23.x.x`. Recomendamos utilizar a propriedade `p-helper` que oferece mais recursos e flexibilidade.
     *
     */
    additionalHelpTooltip?: string;
    /**
     * @optional
     *
     * @description
     *
     * Aplica foco no elemento ao ser iniciado.
     *
     * > Caso mais de um elemento seja configurado com essa propriedade, apenas o último elemento declarado com ela terá o foco.
     *
     * @default `false`
     */
    autoFocus: boolean;
    /**
     * @optional
     *
     * @description
     * Define se o título do campo será exibido de forma compacta.
     *
     * Quando habilitado (`true`), o modo compacto afeta o conjunto composto por:
     * - `po-label`
     * - `p-requirement (showRequired)`
     * - `po-helper`
     *
     * Ou seja, todos os elementos relacionados ao título do campo
     * (rótulo, indicador de obrigatoriedade e componente auxiliar) passam
     * a seguir o comportamento de layout compacto.
     *
     * Também é possível definir esse comportamento de forma global,
     * uma única vez, na folha de estilo geral da aplicação, por meio
     * da customização dos tokens CSS:
     *
     * - `--field-container-title-justify`
     * - `--field-container-title-flex`
     *
     * Exemplo:
     *
     * ```
     * :root {
     *   --field-container-title-justify: flex-start;
     *   --field-container-title-flex: 0 1 auto;
     * }
     * ```
     *
     * Dessa forma, o layout compacto passa a ser o padrão da aplicação,
     * sem a necessidade de definir a propriedade individualmente em cada campo.
     *
     * @default `false`
     */
    compactLabel: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
    /**
     * @optional
     *
     * @description
     *
     * Função executada para realizar a validação assíncrona personalizada.
     * Executada ao disparar o output `change`.
     *
     * @param value Valor atual preenchido no campo.
     *
     * @returns Retorna Observable com o valor `true` para sinalizar o erro `false` para indicar que não há erro.
     */
    errorAsync: (value: any) => Observable<boolean>;
    name: string;
    /**
     * @optional
     *
     * @description
     *
     * Define se a indicação de campo opcional será exibida.
     *
     * > Não será exibida a indicação se:
     * - O campo conter `p-required`;
     * - Não possuir `p-help` e/ou `p-label`.
     *
     * @default `false`
     */
    optional: boolean;
    /**
     * Mensagem apresentada quando a data for inválida ou fora do período.
     *
     * > Por padrão, esta mensagem não é apresentada quando o campo estiver vazio, mesmo que ele seja requerido.
     * Para exibir a mensagem com o campo vazio, utilize a propriedade `p-required-field-error-message` em conjunto.
     */
    errorPattern?: string;
    /**
     * @optional
     *
     * @description
     *
     * Limita a exibição da mensagem de erro a duas linhas e exibe um tooltip com o texto completo.
     *
     * > Caso essa propriedade seja definida como `true`, a mensagem de erro será limitada a duas linhas
     * e um tooltip será exibido ao passar o mouse sobre a mensagem para mostrar o conteúdo completo.
     *
     * @default `false`
     */
    errorLimit: boolean;
    /**
     * @optional
     *
     * @description
     *
     * Exibe a mensagem setada na propriedade `p-error-pattern` se o campo estiver vazio e for requerido.
     *
     * > Necessário que a propriedade `p-required` esteja habilitada.
     *
     * @default `false`
     */
    showErrorMessageRequired: boolean;
    /**
     * @deprecated v23.x.x use `p-helper`
     *
     * @optional
     *
     * @description
     * Evento disparado ao clicar no ícone de ajuda adicional.
     *
     * > Essa propriedade está **depreciada** e será removida na versão `23.x.x`. Recomendamos utilizar a propriedade `p-helper` que oferece mais recursos e flexibilidade.
     */
    additionalHelp: EventEmitter<any>;
    /**
     * @optional
     *
     * @description
     *
     * Evento disparado ao sair do campo.
     */
    onblur: EventEmitter<any>;
    /**
     * @optional
     *
     * @description
     *
     * Evento disparado ao alterar valor do campo.
     */
    onchange: EventEmitter<any>;
    /**
     * @optional
     *
     * @description
     * Evento disparado quando uma tecla é pressionada enquanto o foco está no componente.
     * Retorna um objeto `KeyboardEvent` com informações sobre a tecla.
     */
    keydown: EventEmitter<KeyboardEvent>;
    /**
     * @optional
     *
     * @description
     *
     * Define as opções do componente de ajuda (po-helper) que será exibido ao lado do label quando a propriedade `p-label` for definida, ou, ao lado do componente na ausência da propriedade `p-label`.
     * > Para mais informações acesse: https://po-ui.io/documentation/po-helper.
     *
     * > Ao configurar esta propriedade, o antigo ícone de ajuda adicional (`p-additional-help-tooltip` e `p-additional-help`) será ignorado.
     */
    poHelperComponent: import("@angular/core").InputSignal<string | PoHelperOptions>;
    /**
     * @optional
     *
     * @description
     *
     * Habilita a quebra automática do texto da propriedade `p-label`. Quando `p-label-text-wrap` for verdadeiro, o texto que excede
     * o espaço disponível é transferido para a próxima linha em pontos apropriados para uma
     * leitura clara.
     *
     * @default `false`
     */
    labelTextWrap: import("@angular/core").InputSignal<boolean>;
    offset: number;
    protected firstStart: boolean;
    protected hour: string;
    protected isExtendedISO: boolean;
    protected objMask: any;
    protected onChangeModel: any;
    protected validatorChange: any;
    protected onTouchedModel: any;
    protected shortLanguage: string;
    protected isInvalid: boolean;
    protected hasValidatorRequired: boolean;
    private _format?;
    private _isoFormat;
    private _maxDate;
    private _minDate;
    private _noAutocomplete?;
    private _placeholder?;
    private _loading?;
    private previousValue;
    private _size?;
    private _initialSize?;
    private subscription;
    private _date;
    /**
     * @optional
     *
     * @description
     *
     * Define a propriedade nativa `autocomplete` do campo como `off`.
     *
     * @default `false`
     */
    set noAutocomplete(value: boolean);
    get noAutocomplete(): boolean;
    /**
     * @optional
     *
     * @description
     *
     * Mensagem que aparecerá enquanto o campo não estiver preenchido.
     */
    set placeholder(placeholder: string);
    get placeholder(): string;
    /** Desabilita o campo. */
    disabled?: boolean;
    set setDisabled(disabled: string);
    /** Torna o elemento somente leitura. */
    readonly?: boolean;
    set setReadonly(readonly: string);
    /**
     * @optional
     *
     * @description
     *
     * Define que o campo será obrigatório.
     *
     * @default `false`
     */
    required?: boolean;
    set setRequired(required: string);
    /**
     * Define se a indicação de campo obrigatório será exibida.
     *
     * > Não será exibida a indicação se:
     * - Não possuir `p-help` e/ou `p-label`.
     */
    showRequired: boolean;
    /**
     * @optional
     *
     * @description
     *
     * Define o tamanho do componente:
     * - `small`: altura do input como 32px (disponível apenas para acessibilidade AA).
     * - `medium`: altura do input como 44px.
     *
     * > Caso a acessibilidade AA não esteja configurada, o tamanho `medium` será mantido.
     * Para mais detalhes, consulte a documentação do [po-theme](https://po-ui.io/documentation/po-theme).
     *
     * @default `medium`
     */
    set size(value: string);
    get size(): string;
    /** Habilita ação para limpar o campo. */
    clean?: boolean;
    set setClean(clean: string);
    /**
     * @optional
     *
     * @description
     *
     * Define uma data mínima para o `po-datepicker`.
     */
    set minDate(value: string | Date);
    get minDate(): string | Date;
    /**
     * @optional
     *
     * @description
     *
     * Define uma data máxima para o `po-datepicker`.
     */
    set maxDate(value: string | Date);
    get maxDate(): string | Date;
    /**
     * @optional
     *
     * @description
     *
     * Formato de exibição da data.
     *
     * Valores válidos:
     *  - `dd/mm/yyyy`
     *  - `mm/dd/yyyy`
     *  - `yyyy/mm/dd`
     *
     * Propriedade incompatível com as variações month-year e year.
     *
     * @default `dd/mm/yyyy`
     */
    set format(value: string);
    get format(): string;
    /**
     * @optional
     *
     * @description
     *
     * Padrão de formatação para saída do *model*, independentemente do formato de entrada.
     *
     * > Veja os valores válidos no *enum* `PoDatepickerIsoFormat`.
     *
     * Propriedade incompatível com as variações month-year e year.
     */
    set isoFormat(value: PoDatepickerIsoFormat);
    get isoFormat(): PoDatepickerIsoFormat;
    /**
     * @optional
     *
     * @description
     *
     * Idioma do Datepicker.
     *
     * > O locale padrão sera recuperado com base no [`PoI18nService`](/documentation/po-i18n) ou *browser*.
     */
    _locale?: string;
    set locale(value: string);
    get locale(): string;
    /**
     * @optional
     *
     * @description
     * Exibe um ícone de carregamento no lado direito do campo para sinalizar que uma operação está em andamento.
     *
     * @default `false`
     */
    set loading(value: boolean);
    get loading(): boolean;
    get isDisabled(): boolean;
    /**
     * @optional
     *
     * @description
     *
     * Define que o `calendar` e/ou tooltip (`p-additional-help-tooltip` e/ou `p-error-limit`) serão incluídos no body da
     * página e não dentro do componente. Essa opção pode ser necessária em cenários com containers que possuem scroll ou
     * overflow escondido, garantindo o posicionamento correto de ambos próximo ao elemento.
     *
     * > Quando utilizado com `p-helper`, leitores de tela como o NVDA podem não ler o conteúdo do popover.
     *
     * @default `false`
     */
    appendBox: boolean;
    constructor(languageService: PoLanguageService, cd: ChangeDetectorRef);
    set date(value: any);
    get date(): any;
    ngOnInit(): void;
    ngOnDestroy(): void;
    protected onThemeChange(): void;
    getDateFromString(dateString: string): Date;
    formatToDate(value: Date): string;
    controlModel(date: Date): void;
    callOnChange(value: any, retry?: boolean): void;
    mapSizeToIcon(size: string): string;
    setDisabledState(isDisabled: boolean): void;
    registerOnChange(func: any): void;
    registerOnTouched(func: any): void;
    registerOnValidatorChange(fn: () => void): void;
    validate(c: AbstractControl): {
        [key: string]: any;
    };
    private isMonthYearOrYearInvalid;
    private isDateRangeValidForMode;
    private validateMonthYearRange;
    private validateYearRange;
    protected validateModel(model: any): void;
    protected buildMask(format?: string): PoMask;
    formatTimezoneAndHour(offset: number): void;
    private applySizeBasedOnA11y;
    abstract writeValue(value: any): void;
    abstract refreshValue(value: Date): void;
}
