import { AfterViewInit, AfterViewChecked, ElementRef, EventEmitter, OnChanges, OnDestroy, OnInit, QueryList, SimpleChanges } from '@angular/core'; import { PoTimerBaseComponent } from './po-timer-base.component'; /** Tipo dos eixos das colunas. */ type PoTimerColumnType = 'hour' | 'minute' | 'second' | 'period'; /** * @docsPrivate * * @docsExtends PoTimerBaseComponent * * @example * * * * * * * * * * * * * * * * * * * * */ export declare class PoTimerComponent extends PoTimerBaseComponent implements OnInit, OnChanges, AfterViewInit, AfterViewChecked, OnDestroy { hourCells: QueryList; minuteCells: QueryList; secondCells: QueryList; periodCells: QueryList; hourItemsRefs: QueryList>; minuteItemsRefs: QueryList>; secondItemsRefs: QueryList>; displayHours: Array; displayMinutes: Array; displaySeconds: Array; 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; disabledMinuteCache: Set; disabledSecondCache: Set; 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 (