import { AfterViewInit, AfterViewChecked, ElementRef, EventEmitter, OnChanges, OnDestroy, OnInit, QueryList, SimpleChanges } from '@angular/core';
import { PoButtonComponent } from '../po-button/po-button.component';
import { PoTimerBaseComponent } from './po-timer-base.component';
/** Tipo dos eixos das colunas. */
type PoTimerColumnType = 'hour' | 'minute' | 'second' | 'period';
/**
 * @docsPrivate
 *
 * @docsExtends PoTimerBaseComponent
 *
 * @example
 *
 * <example name="po-timer-basic" title="PO Timer Basic">
 *  <file name="sample-po-timer-basic/sample-po-timer-basic.component.html"> </file>
 *  <file name="sample-po-timer-basic/sample-po-timer-basic.component.ts"> </file>
 * </example>
 *
 * <example name="po-timer-labs" title="PO Timer Labs">
 *  <file name="sample-po-timer-labs/sample-po-timer-labs.component.html"> </file>
 *  <file name="sample-po-timer-labs/sample-po-timer-labs.component.ts"> </file>
 * </example>
 *
 * <example name="po-timer-alarm" title="PO Timer - Alarm">
 *  <file name="sample-po-timer-alarm/sample-po-timer-alarm.component.html"> </file>
 *  <file name="sample-po-timer-alarm/sample-po-timer-alarm.component.ts"> </file>
 * </example>
 *
 * <example name="po-timer-shift" title="PO Timer - Shift">
 *  <file name="sample-po-timer-shift/sample-po-timer-shift.component.html"> </file>
 *  <file name="sample-po-timer-shift/sample-po-timer-shift.component.ts"> </file>
 * </example>
 */
export declare class PoTimerComponent extends PoTimerBaseComponent implements OnInit, OnChanges, AfterViewInit, AfterViewChecked, OnDestroy {
    hourCells: QueryList<PoButtonComponent>;
    minuteCells: QueryList<PoButtonComponent>;
    secondCells: QueryList<PoButtonComponent>;
    periodCells: QueryList<PoButtonComponent>;
    hourItemsRefs: QueryList<ElementRef<HTMLElement>>;
    minuteItemsRefs: QueryList<ElementRef<HTMLElement>>;
    secondItemsRefs: QueryList<ElementRef<HTMLElement>>;
    displayHours: Array<number>;
    displayMinutes: Array<number>;
    displaySeconds: Array<number>;
    boundaryTab: EventEmitter<{
        direction: "forward" | "backward";
        event: KeyboardEvent;
        column: PoTimerColumnType;
    }>;
    private readonly changeDetector;
    private readonly ngZone;
    private readonly domDocument;
    private hasViewInitialized;
    private currentRenderedSize;
    /** ID do requestAnimationFrame pendente para throttle do wheel. */
    private wheelRafId;
    /**
     * Offset atual (em px) de cada coluna, mantido em JS.
     * O container de itens e posicionado via translateY(-offset).
     * O offset e mantido sempre no intervalo [sectionHeight, 2*sectionHeight)
     * para que o salto de reposicionamento seja sempre invisivel (as secoes
     * sao identicas por serem copias do mesmo array fonte).
     */
    private columnOffsets;
    /**
     * Indice no displayArray do item focado em cada coluna.
     * Usado para redirecionar o foco ao botao correto ao entrar na coluna via Tab.
     */
    private focusedDisplayIndex;
    activeDescendantIds: Record<PoTimerColumnType, string>;
    disabledMinuteCache: Set<number>;
    disabledSecondCache: Set<number>;
    private ariaSyncNeeded;
    private cachedCellPairs;
    constructor();
    ngOnInit(): void;
    ngOnChanges(changes: SimpleChanges): void;
    ngAfterViewInit(): void;
    ngAfterViewChecked(): void;
    ngOnDestroy(): void;
    onSelectHour(hour: number): void;
    onSelectMinute(minute: number): void;
    onSelectSecond(second: number): void;
    onSelectPeriod(newPeriod: string): void;
    onCellFocus(type: PoTimerColumnType, displayIndex: number): void;
    getCellTabIndex(type: PoTimerColumnType, displayIndex: number): number;
    onCellKeydown(event: KeyboardEvent, type: PoTimerColumnType): void;
    onPeriodKeydown(event: KeyboardEvent): void;
    onColumnWheel(event: WheelEvent, type: PoTimerColumnType): void;
    writeValue(time: string): void;
    trackByIndex(index: number, _item: number): number;
    focusFirstVisibleCell(): void;
    focusLastVisibleCell(): void;
    initAllColumnOffsets(): void;
    /**
     * Posiciona o container de itens na secao do meio do array repetido,
     * alinhando o item selecionado ao topo da janela visivel.
     *
     * Estrutura do array repetido (exemplo sourceLength = 24, repeats = 3):
     *   [secao 0: itens 0-23] [secao 1: itens 0-23] [secao 2: itens 0-23]
     *                         ^--- usuario fica aqui (offset em [sH, 2*sH))
     *
     * Usar a secao do meio garante que qualquer deslize para cima ou para baixo
     * tem espaco antes de precisar fazer o wrap.
     */
    private initColumnOffset;
    private getFirstAvailableIndexByType;
    private getReferenceHourForConstraints;
    private getReferenceMinuteForConstraints;
    private isValueDisabledByType;
    /**
     * Desloca a coluna pelo numero de passos indicado e aplica o wrap modular.
     *
     * O wrap mantem o offset em [sectionHeight, 2*sectionHeight), aproveitando
     * o fato de que as secoes sao identicas — o salto e impercetivel visualmente.
     */
    private scrollColumnByStep;
    private wrapOffset;
    private getCellStep;
    /**
     * Foca o botao nativo (<button> interno ao po-button) no indice indicado
     * do displayArray da coluna. O po-button tem tabindex=-1 para nao aparecer
     * no fluxo natural do Tab, mas pode receber foco programatico.
     */
    private focusButtonAt;
    private focusActiveButton;
    private computeTopDisplayIndex;
    /**
     * Foca a proxima coluna visivel do componente.
     * Se a coluna atual for a ultima, nao cancela o evento e deixa o browser
     * mover o foco para o proximo elemento focavel apos o componente.
     */
    private focusNextColumn;
    /**
     * Foca a coluna anterior visivel do componente.
     * Se a coluna atual for a primeira, nao cancela o evento e deixa o browser
     * mover o foco para o elemento focavel antes do componente.
     */
    private focusPreviousColumn;
    /**
     * Retorna, em ordem DOM, os elementos focaveis de todas as colunas visiveis.
     * Inclui o div da coluna AM/PM (se visivel), cujos botoes internos recebem
     * o foco diretamente pois nao usam o padrao de roving focus.
     */
    private getVisibleColumnTypes;
    private updateAllCachedCellPairs;
    private subscribeToCellChanges;
    private updateCachedCellPairs;
    private markAriaSyncNeeded;
    /** Atualiza aria-activedescendant para o indice focado no displayArray. */
    private updateActiveDescendant;
    /**
     * Move o foco para o proximo item habilitado na direcao indicada.
     * So aplica translate quando o item focado fica parcial ou totalmente fora da viewport.
     */
    private moveFocusByStep;
    private movePeriodFocusByStep;
    private selectFocusedPeriod;
    private getFocusableDisplayIndex;
    /** Seleciona o item atualmente focado na coluna. */
    private selectFocusedItem;
    private shouldTranslateToRevealFocusedItem;
    private getStepsToRevealFocusedItem;
    private getColumnViewportHeight;
    private getNextEnabledDisplayIndex;
    private getForwardDistance;
    private getNormalizedDisplayIndex;
    private getDisplayIndexForSourceNearViewport;
    private getItemsElement;
    private normalizeFocusedIndex;
    private getNormalizedFocusedIndex;
    private getCurrentFocusedDisplayIndex;
    private getDomFocusedDisplayIndex;
    private isDisplayIndexDisabled;
    private getSelectedValue;
    private buildDisplayArrays;
    /** Reconstroi os caches de minutos e segundos desabilitados. */
    private rebuildDisabledCaches;
    private getFirstAvailableMinuteForCurrentHour;
    private getFirstAvailableSecondForCurrentHourAndMinute;
    private realignColumnsToSelection;
    private refreshRovingTabIndex;
    private repeatArray;
    private getSourceArray;
    private getDisplayArray;
    /**
     * Propaga atributos ARIA (role, aria-selected, aria-setsize, aria-posinset)
     * dos elementos host <po-button> para os elementos nativos <button> internos,
     * garantindo que leitores de tela como NVDA recebam a semantica correta.
     *
     * Usa a secao fixa do meio [sourceLength, 2*sourceLength) como canonica.
     * Quando o item focado esta fora dessa secao (na fronteira do infinity scroll),
     * ele substitui o item equivalente na secao fixa para manter exatamente
     * sourceLength itens com role="option".
     *
     * Todos os botoes nativos recebem os atributos ARIA corretos
     * (role, aria-selected, aria-setsize, aria-posinset) propagados
     * dos data-attributes do host <po-button>.
     *
     * Nao usa `inert` — o infinity scroll repete o array 3x e marcar
     * secoes como inert causava botoes desabilitados durante transicoes
     * de scroll. Em vez disso, duplicatas recebem role="none" e
     * aria-hidden="true" no <button> nativo para que NVDA nao as conte,
     * mas permanecem clicaveis visualmente.
     *
     * A secao canonica e determinada pela secao do item focado,
     * garantindo que exatamente sourceLength itens tenham role="option".
     */
    private syncAriaToNativeButtons;
    /**
     * Determina se um item do displayArray e canonico para fins de ARIA.
     *
     * - Sem infinity scroll: todos sao canonicos.
     * - Com infinity scroll: apenas itens na secao canonica (determinada
     *   pelo offset visivel) recebem role="option".
     */
    private isCanonicalDisplayItem;
    /**
     * Sincroniza os atributos ARIA de um unico par host/nativeButton.
     * Chamado tanto por syncAriaToNativeButtons (batch) quanto por
     * focusButtonAt (antes do .focus()) para evitar leitura duplicada.
     */
    private syncSingleButtonAria;
}
export {};
