{"version":3,"file":"seniorsistemas-angular-components-autocomplete.mjs","sources":["../../projects/angular-components/autocomplete/src/lib/autocomplete/components/autocomplete-chip/autocomplete-chip.component.ts","../../projects/angular-components/autocomplete/src/lib/autocomplete/components/autocomplete-chip/autocomplete-chip.component.html","../../projects/angular-components/autocomplete/src/lib/autocomplete/autocomplete.component.ts","../../projects/angular-components/autocomplete/src/lib/autocomplete/autocomplete.component.html","../../projects/angular-components/autocomplete/src/lib/autocomplete/p-autocomplete-multiple-keyboard-fix.directive.ts","../../projects/angular-components/autocomplete/src/seniorsistemas-angular-components-autocomplete.ts"],"sourcesContent":["import { Component, input, output } from '@angular/core';\n\n@Component({\n    selector: 's-autocomplete-chip',\n    templateUrl: './autocomplete-chip.component.html',\n    standalone: true,\n})\nexport class AutocompleteChipComponent<T> {\n    public suggestion = input.required<T>();\n    public suggestionLabel = input<keyof T>();\n\n    public suggestionRemoved = output<T>();\n\n    public removeSuggestion() {\n        this.suggestionRemoved.emit(this.suggestion());\n    }\n}\n","<div class=\"flex items-center gap-2 rounded-[4px] border border-grayscale-50 bg-grayscale-10 px-2\">\n    <span class=\"text-nowrap\">{{ suggestionLabel() ? suggestion()[suggestionLabel()!] : suggestion() }}</span>\n    <button (click)=\"removeSuggestion()\">\n        <i class=\"far fa-times\"></i>\n    </button>\n</div>\n","import { OverlayModule } from '@angular/cdk/overlay';\nimport { ScrollingModule } from '@angular/cdk/scrolling';\nimport { CommonModule } from '@angular/common';\nimport {\n    Component,\n    computed,\n    DestroyRef,\n    ElementRef,\n    forwardRef,\n    inject,\n    input,\n    model,\n    output,\n    signal,\n    viewChild,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { ControlValueAccessor, FormsModule, NG_VALUE_ACCESSOR, ReactiveFormsModule } from '@angular/forms';\n\nimport { TranslateModule } from '@ngx-translate/core';\nimport { Observable, Subject } from 'rxjs';\nimport { debounceTime, distinctUntilChanged, filter, switchMap } from 'rxjs/operators';\n\nimport { AutocompleteChipComponent } from './components/autocomplete-chip/autocomplete-chip.component';\n\n/**\n * Representa um item de sugestão encapsulado, utilizado em componentes de autocomplete.\n * @template T Tipo dos dados associados à sugestão.\n * @property data Os dados da sugestão.\n * @property id Identificador único da sugestão.\n * @property [isSelected] Indica se a sugestão está selecionada.\n */\ninterface SuggestionWrapper<T> {\n    data: T;\n    id: string;\n    isSelected?: boolean;\n}\n\n/**\n * @description Componente de autocompletar com sugestões dinâmicas, suportando seleção simples\n * e múltipla. Implementa {@link ControlValueAccessor} para integração com formulários Angular.\n * Oferece carregamento lazy de sugestões via output `lazyLoad`, virtualização de lista,\n * seleção com chips no modo múltiplo e acessibilidade ARIA completa (combobox role).\n *\n * @example\n * ```html\n * <s-autocomplete\n *   formControlName=\"cidade\"\n *   placeholder=\"Buscar cidade...\"\n *   [suggestions]=\"cidades\"\n *   suggestionLabel=\"nome\"\n *   [delay]=\"400\"\n *   (completeMethod)=\"buscar($event)\" />\n * ```\n *\n * @category Inputs\n */\n@Component({\n    selector: 's-autocomplete',\n    standalone: true,\n    templateUrl: './autocomplete.component.html',\n    imports: [\n        CommonModule,\n        FormsModule,\n        ReactiveFormsModule,\n        OverlayModule,\n        ScrollingModule,\n        TranslateModule,\n        AutocompleteChipComponent,\n    ],\n    providers: [\n        {\n            provide: NG_VALUE_ACCESSOR,\n            useExisting: forwardRef(() => AutocompleteComponent),\n            multi: true,\n        },\n    ],\n    host: {\n        role: 'combobox',\n        '[attr.aria-expanded]': 'isOpen()',\n        '[attr.aria-haspopup]': '\"listbox\"',\n        '[attr.aria-owns]': 'isOpen() ? \"dropdown-container-\" + componentId : null',\n        '(window:resize)': 'onWindowResize()',\n    },\n})\nexport class AutocompleteComponent<T> implements ControlValueAccessor {\n    private static nextId = 0;\n\n    /** @description Lista estática de sugestões exibidas no dropdown. No modo lazy, prefira usar o output `lazyLoad`. @default [] */\n    public suggestions = input<T[]>([]);\n\n    /** @description Texto exibido no input quando nenhum valor está selecionado. */\n    public placeholder = input<string>();\n\n    /** @description Chave do objeto de sugestão cujo valor será emitido ao formulário. */\n    public suggestionValue = input<keyof T>();\n\n    /** @description Chave do objeto de sugestão usada como texto de exibição no dropdown. */\n    public suggestionLabel = input<keyof T>();\n\n    /** @description Torna o campo somente leitura, impedindo digitação e seleção. @default false */\n    public readonly = input(false);\n\n    /** @description Mensagem exibida no dropdown quando nenhuma sugestão é encontrada. */\n    public emptyMessage = input<string>();\n\n    /** @description Tempo de espera em ms após a última tecla antes de acionar a busca por sugestões. @default 300 */\n    public delay = input(300);\n\n    /** @description Exibe estado de erro visual no campo de input. @default false */\n    public invalid = input(false);\n\n    /** @description Habilita virtualização da lista de sugestões para melhor performance com grandes volumes de dados. @default false */\n    public virtualScroll = input(false);\n\n    /** @description Altura fixa em pixels de cada item no virtual scroll. @default 37 */\n    public virtualScrollItemSize = input(37);\n\n    /** @description Ativa o carregamento assíncrono de sugestões via o output `lazyLoad`. @default false */\n    public lazy = input(false);\n\n    /** @description Exibe um botão de dropdown para abrir a lista sem necessidade de digitação. @default false */\n    public dropdown = input(false);\n\n    /** @description Quando `true`, o valor do campo deve ser obrigatoriamente uma das opções sugeridas. @default false */\n    public forceSelection = input(false);\n\n    /** @description Exibe ícone de checkmark ao lado da opção selecionada no dropdown. @default false */\n    public checkmark = input(false);\n\n    /** @description Habilita seleção de múltiplos itens exibidos como chips no campo. @default false */\n    public multiple = input(false);\n\n    /** @description Quantidade mínima de caracteres necessária para acionar a busca por sugestões. @default 1 */\n    public minLengthToSearch = input(1);\n\n    /** @description Classe CSS adicional aplicada ao elemento `<input>` interno. @default '' */\n    public inputClass = input<string>('');\n\n    /** @description Chave do objeto usada para comparação de identidade entre opções, evitando duplicatas na seleção múltipla. */\n    public dataKey = input<keyof T>();\n\n    /** @description Valor atualmente selecionado no modo simples, via two-way binding. */\n    public value = model<T | null>();\n\n    /** @description Lista de valores selecionados no modo múltiplo, via two-way binding. @default [] */\n    public values = model<T[]>([]);\n\n    /** @description Controla o estado desabilitado do componente via two-way binding. @default false */\n    public disabled = model(false);\n\n    /**\n     * @description Emitido no modo lazy quando o usuário digita e o componente está pronto para receber novas sugestões.\n     * O evento contém `query` (texto digitado) e `response` (função callback para fornecer os dados).\n     */\n    public lazyLoad = output<{ query: string; response: (data: T[]) => void }>();\n\n    /** @description Emitido quando o usuário seleciona uma sugestão do dropdown. */\n    public selected = output<T>();\n\n    /** @description Emitido quando o usuário remove uma sugestão selecionada (modo múltiplo). */\n    public unselected = output<T>();\n\n    /** @description Emitido quando o campo perde o foco. */\n    public blurred = output<Event>();\n\n    /** @description Emitido quando o campo é limpo pelo usuário. */\n    public cleared = output();\n\n    /** @description Emitido a cada pressionamento de tecla no campo de input. */\n    public keyUp = output<Event>();\n\n    /** @description Emitido quando o campo recebe foco. */\n    public focused = output<any>();\n\n    /** @description Emitido quando o usuário digita no campo, fornecendo o texto atual para filtragem de sugestões. */\n    public completeMethod = output<{ query: string }>();\n\n    public focusedIndex = signal(-1);\n    public isOpen = signal(false);\n    public filteredSuggestions = signal<SuggestionWrapper<T>[]>([]);\n    public showEmptyMessage = signal(false);\n    public filterText = signal('');\n    public inputValue = signal('');\n    public loading = signal(false);\n\n    public componentId = `autocomplete_${AutocompleteComponent.nextId++}`;\n    public inputEl = viewChild<ElementRef>('inputEl');\n\n    private _inputSubject$ = new Subject<string>();\n    private _lazyLoadSubject$ = new Subject<string>();\n    private _destroyRef = inject(DestroyRef);\n    private _onChange?: (value: any | any[]) => void;\n    private _onTouched?: () => void;\n\n    /**\n     * Computed que retorna uma lista de sugestões do tipo `SuggestionWrapper<T>`,\n     * adicionando um identificador único a cada sugestão.\n     * @returns Uma lista de sugestões processadas com identificadores únicos.\n     */\n    public internalSuggestion = computed<SuggestionWrapper<T>[]>(() => {\n        const opts = this.suggestions();\n        return this._addIdToSuggestions(opts);\n    });\n\n    /**\n     * Retorna um conjunto (`Set`) com os IDs das sugestões selecionadas.\n     */\n    public selectedSuggestionIds = computed(() => {\n        if (!this.multiple()) {\n            return new Set<string>();\n        }\n\n        const currentValues = this.values();\n\n        return new Set(\n            currentValues.map((value) => {\n                return this.internalSuggestion().find((s) => JSON.stringify(s.data) === JSON.stringify(value))?.id;\n            }),\n        );\n    });\n\n    /**\n     * Retorna uma lista de sugestões filtradas, enriquecidas com a propriedade `isSelected`.\n     * Cada sugestão recebe um campo booleano `isSelected` indicando se ela está selecionada,\n     * com base nos IDs das sugestões selecionadas e no valor da sugestão.\n     * @returns Uma lista de sugestões filtradas, cada uma com a propriedade adicional `isSelected`.\n     */\n    public enrichedFilteredSuggestions = computed(() => {\n        const filtered = this.filteredSuggestions();\n        const selectedIds = this.selectedSuggestionIds();\n\n        return filtered.map((suggestion) => ({\n            ...suggestion,\n            isSelected: selectedIds.has(suggestion.id),\n        }));\n    });\n\n    constructor() {\n        this._validateInputs();\n        this._setupInputDebounce();\n        this._setupLazyLoadDebounce();\n    }\n\n    /**\n     * Define o valor do autocomplete.\n     * @param value Valor a ser definido, único ou array, conforme seleção múltipla.\n     * @throws Se múltiplo for falso e value for array.\n     */\n    public writeValue(value: T | T[]): void {\n        const suggestionLabel = this.suggestionLabel();\n\n        if (value && this.multiple()) {\n            if (Array.isArray(value)) {\n                this.values.set(value);\n            } else {\n                this.values.set([value]);\n            }\n        } else {\n            if (Array.isArray(value)) {\n                throw new Error('The value must not be an array when multiple is false.');\n            } else {\n                this.value.set(value);\n            }\n\n            this.inputValue.set(!value ? '' : suggestionLabel ? String(value[suggestionLabel]) : String(value));\n        }\n    }\n\n    /**\n     * Registra uma função de callback que será chamada sempre que o valor do componente mudar.\n     * @param onChange Função a ser chamada quando o valor mudar. Recebe o novo valor como argumento, que pode ser um único valor ou um array de valores.\n     */\n    public registerOnChange(onChange: (value: any | any[]) => void): void {\n        this._onChange = onChange;\n    }\n\n    /**\n     * Registra uma função de callback que será chamada quando o componente for tocado (perder o foco).\n     * @param onTouched Função de callback a ser chamada quando o componente for tocado.\n     */\n    public registerOnTouched(onTouched: () => void): void {\n        this._onTouched = onTouched;\n    }\n\n    /**\n     * Define o estado de desabilitado do componente.\n     * @param disabled Indica se o componente deve ser desabilitado (`true`) ou habilitado (`false`).\n     */\n    public setDisabledState?(disabled: boolean): void {\n        this.disabled.set(disabled);\n    }\n\n    /**\n     * Manipula o evento de entrada do usuário no campo de texto do autocomplete.\n     * Este método é chamado sempre que o usuário digita algo no campo de entrada.\n     * Ele executa as seguintes ações:\n     * - Dispara o callback de \"touched\" para controle de formulários.\n     * - Obtém o valor atual do campo de entrada.\n     * - Se o modo lazy estiver ativado, emite o evento de lazyLoad com a consulta e abre o painel de sugestões.\n     * - Caso contrário, atualiza o texto de filtro, notifica os observadores e abre o painel de sugestões se houver sugestões disponíveis.\n     * @param event Evento de entrada do tipo `Event` proveniente do campo de texto.\n     */\n    public onInput(event: Event): void {\n        this._onTouched?.();\n\n        const value = (event.target as HTMLInputElement).value;\n\n        if (this.lazy()) {\n            this._lazyLoadSubject$.next(value);\n            this.isOpen.set(true);\n            return;\n        }\n\n        this.filterText.set(value);\n\n        this.completeMethod.emit({ query: value });\n\n        this._inputSubject$.next(value);\n\n        if (this.suggestions()) {\n            this.isOpen.set(true);\n        }\n    }\n\n    /**\n     * Manipula o evento de perda de foco (blur) do campo de entrada do autocomplete.\n     * Este método verifica se o valor digitado pelo usuário corresponde exatamente a algum dos itens sugeridos.\n     * - Se houver correspondência:\n     *   - No modo múltiplo (`multiple`), adiciona o item selecionado à lista de valores, caso ainda não esteja presente.\n     *   - No modo simples, seleciona o item correspondente se ainda não estiver selecionado.\n     * - Se não houver correspondência, limpa o campo de entrada.\n     */\n    public onInputBlur(event: Event): void {\n        const inputValue = String(this.inputValue()).toLowerCase();\n        const suggestions = this.internalSuggestion();\n\n        const match = suggestions.find(({ data }) => {\n            const label = this.suggestionLabel() ? data[this.suggestionLabel()!] : data;\n            return String(label).toLowerCase() === inputValue;\n        });\n\n        if (match) {\n            if (this.multiple()) {\n                const currentValues = this.values();\n                const exists = currentValues.some(\n                    (value) =>\n                        (this.suggestionValue() ? value[this.suggestionValue()!] : value) ===\n                        (this.suggestionValue() ? match.data[this.suggestionValue()!] : match.data),\n                );\n                if (!exists) {\n                    this.values.set([...currentValues, match.data]);\n                    this._onChange?.(this.values());\n                }\n                this.inputValue.set('');\n            } else {\n                if (this.value() !== match.data) {\n                    this.selectSuggestion(match.data);\n                }\n            }\n        } else {\n            this.inputValue.set('');\n        }\n    }\n\n    /**\n     * Dispara o evento de foco quando o campo de entrada recebe foco.\n     * @param event O evento de foco disparado pelo elemento de entrada.\n     */\n    public onInputFocus(event: Event): void {\n        this.focused.emit(event);\n    }\n\n    /**\n     * Manipula eventos de teclado no componente de autocomplete.\n     * Este método gerencia a navegação e seleção de sugestões usando as teclas do teclado.\n     * - 'ArrowDown': Move o foco para a próxima sugestão.\n     * - 'ArrowUp': Move o foco para a sugestão anterior.\n     * - 'Enter' ou 'Tab': Seleciona a sugestão atualmente focada e fecha a lista de sugestões.\n     * - 'Escape': Fecha a lista de sugestões sem selecionar nenhum item.\n     * @param event O evento de teclado disparado pelo usuário.\n     */\n    public onKeyDown(event: KeyboardEvent): void {\n        const suggestions = this.filteredSuggestions();\n\n        this._onTouched?.();\n\n        const _selectSuggestion = () => {\n            if (this.focusedIndex() >= 0 && this.focusedIndex() < suggestions.length) {\n                event.preventDefault();\n                this.selectSuggestion(suggestions[this.focusedIndex()].data);\n            }\n        };\n\n        switch (event.key) {\n            case 'ArrowDown':\n                event.preventDefault();\n                this._focusNextSuggestion(suggestions);\n                break;\n            case 'ArrowUp':\n                event.preventDefault();\n                this._focusPreviousSuggestion();\n                break;\n            case 'Enter':\n            case 'Tab':\n                _selectSuggestion();\n                this.isOpen.set(false);\n                break;\n            case 'Escape':\n                this.isOpen.set(false);\n                break;\n        }\n    }\n\n    /**\n     * Emite um evento quando uma tecla é liberada no componente.     *\n     * @param event O evento de teclado associado à tecla liberada.\n     */\n    public onKeyUp(event: Event): void {\n        this.keyUp.emit(event);\n    }\n\n    /**\n     * Fecha o dropdown em eventos de redimensionamento de janela.\n     */\n    public onWindowResize(): void {\n        if (this.isOpen()) {\n            this.isOpen.set(false);\n        }\n    }\n\n    /**\n     * Seleciona uma sugestão da lista de sugestões.\n     * Se o modo múltiplo estiver ativado (`multiple()` retorna true), adiciona a sugestão à lista de suggestões selecionadas,\n     * caso ela ainda não esteja presente. Em seguida, limpa o valor do campo de entrada.\n     * Se o modo múltiplo não estiver ativado, define a sugestão como valor selecionado e atualiza o campo de entrada\n     * com o rótulo correspondente.\n     * Em ambos os casos, dispara o callback `_onChange` com o novo valor e fecha o painel de sugestões.\n     * @param suggestion - A sugestão a ser selecionada.\n     */\n    public selectSuggestion(suggestion: T): void {\n        if (this.multiple()) {\n            const currentValues = this.values();\n            const exists = currentValues.some(\n                (value) =>\n                    (this.suggestionValue() ? value[this.suggestionValue()!] : value) ===\n                    (this.suggestionValue() ? suggestion[this.suggestionValue()!] : suggestion),\n            );\n\n            if (!exists) {\n                this.values.set([...currentValues, suggestion]);\n                this._onChange?.(this.values());\n            }\n\n            this.inputValue.set('');\n        } else {\n            this.value.set(suggestion);\n            const _value = this.suggestionValue() ? suggestion[this.suggestionValue()!] : suggestion;\n            const _inputValue = String(this.suggestionLabel() ? suggestion[this.suggestionLabel()!] : suggestion);\n\n            this.inputValue.set(_inputValue);\n            this._onChange?.(_value);\n        }\n\n        this.selected.emit(suggestion);\n        this.isOpen.set(false);\n    }\n\n    /**\n     * Limpa o valor selecionado no componente de autocomplete.\n     * Se o modo múltiplo estiver ativado, remove todos os valores selecionados.\n     * Caso contrário, define o valor como nulo.\n     * Também limpa as sugestões filtradas, fecha o painel de sugestões\n     * e limpa o valor do campo de entrada.\n     */\n    public clear(): void {\n        if (this.multiple()) {\n            this.values.set([]);\n            this._onChange?.(this.values());\n        } else {\n            this.value.set(null);\n            this._onChange?.(this.value());\n        }\n\n        this.filteredSuggestions.set([]);\n        this.isOpen.set(false);\n        this.inputValue.set('');\n        this.cleared.emit();\n    }\n\n    /**\n     * Alterna a exibição do dropdown de sugestões do autocomplete.\n     * Este método configura o debounce do input, verifica se há sugestões filtradas\n     * e, caso não haja sugestões e o texto do filtro esteja vazio, redefine as sugestões filtradas.\n     * Por fim, alterna o estado de abertura do dropdown.\n     */\n    public toggleDropdown(): void {\n        this._setupInputDebounce();\n\n        if (this.filterText() === '') {\n            if (this.lazy()) {\n                this._lazyLoadSubject$.next('');\n            } else {\n                this.resetFilteredSuggestions();\n            }\n        }\n\n        this.isOpen.set(!this.isOpen());\n    }\n\n    /**\n     * Função utilizada para otimizar a renderização de listas no Angular, permitindo que o framework\n     * identifique cada item de forma única pelo seu `id`. Deve ser utilizada como função de `trackBy`\n     * em diretivas como `*ngFor`.\n     * @param _ - Índice do item na lista (não utilizado).\n     * @param item - Objeto do tipo `SuggestionWrapper<T>` que representa o item atual.\n     * @returns O identificador único (`id`) do item.\n     */\n    public trackById(_: number, item: SuggestionWrapper<T>): string {\n        return item.id;\n    }\n\n    /**\n     * Remove uma sugestão da lista de valores selecionados.\n     * @param suggestion O item a ser removido da lista de sugestões.\n     */\n    public removeSuggestion(suggestion: T): void {\n        const suggestionValue = this.suggestionValue();\n\n        this.values.set(\n            this.values().filter((value) => {\n                if (suggestionValue) {\n                    return value[suggestionValue] !== suggestion[suggestionValue];\n                }\n                return value !== suggestion;\n            }),\n        );\n        this._onChange?.(this.values());\n        this.unselected.emit(suggestion);\n    }\n\n    /**\n     * Reinicia a lista de sugestões filtradas.\n     * Se o modo lazy estiver ativado, emite um evento para carregar sugestões com uma consulta vazia.\n     * Em seguida, redefine as sugestões filtradas para o valor retornado por `internalSuggestion()`.\n     * @private\n     */\n    private resetFilteredSuggestions(): void {\n        if (this.lazy()) {\n            this._lazyLoadSubject$.next('');\n        } else {\n            this.filteredSuggestions.set(this.internalSuggestion());\n        }\n    }\n\n    /**\n     * Move o foco para a próxima sugestão na lista de sugestões, se houver.\n     * @private\n     * @param suggestions Lista de sugestões disponíveis.\n     */\n    private _focusNextSuggestion(suggestions: SuggestionWrapper<T>[]): void {\n        let nextIndex = this.focusedIndex() + 1;\n\n        if (nextIndex < suggestions.length) {\n            this.focusedIndex.set(nextIndex);\n            this._scrollToFocusedSuggestion();\n        }\n    }\n\n    /**\n     * Move o foco para a sugestão anterior na lista de sugestões, se houver.\n     * @private\n     */\n    private _focusPreviousSuggestion(): void {\n        let prevIndex = this.focusedIndex() - 1;\n\n        if (prevIndex >= 0) {\n            this.focusedIndex.set(prevIndex);\n            this._scrollToFocusedSuggestion();\n        }\n    }\n\n    /**\n     * Rola a lista de sugestões para garantir que a sugestão atualmente focada esteja visível.\n     * @private\n     */\n    private _scrollToFocusedSuggestion(): void {\n        const id = this.filteredSuggestions()[this.focusedIndex()]?.id;\n\n        if (!id) {\n            return;\n        }\n\n        const el = document.getElementById(id);\n        el?.scrollIntoView({ block: 'nearest' });\n    }\n\n    /**\n     * Adiciona um identificador único a cada sugestão fornecida.\n     * @private\n     * @param suggestions - Um array de sugestões do tipo T.\n     * @returns Um array de objetos `SuggestionWrapper<T>`, cada um contendo a sugestão original e um identificador único.\n     */\n    private _addIdToSuggestions(suggestions: T[]): SuggestionWrapper<T>[] {\n        return (\n            suggestions?.map((suggestion) => {\n                return {\n                    data: suggestion,\n                    id: this.dataKey()\n                        ? String(suggestion[this.dataKey()!])\n                        : ((typeof suggestion !== 'object'\n                              ? suggestion?.toString()\n                              : Object.values(suggestion as Object).join('_')) ?? ''),\n                };\n            }) ?? []\n        );\n    }\n\n    /**\n     * Configura o debounce e switchMap para lazy loading, resolvendo race conditions.\n     * Este método utiliza switchMap para cancelar requisições anteriores automaticamente\n     * quando uma nova busca é iniciada, evitando que resultados antigos sobrescrevam\n     * resultados mais recentes.\n     * @private\n     */\n    private _setupLazyLoadDebounce(): void {\n        this._lazyLoadSubject$\n            .pipe(\n                debounceTime(this.delay()),\n                distinctUntilChanged(),\n                switchMap((query) => {\n                    this.loading.set(true);\n                    // TODO: Manter fechado o dropdownd até a busca estiver concluída\n                    return new Observable<T[]>((subscriber) => {\n                        const timeoutId = setTimeout(() => {\n                            if (!subscriber.closed) {\n                                subscriber.error(new Error('Lazy load timeout'));\n                            }\n                        }, 30000);\n\n                        const responseCallback = (data: T[]) => {\n                            clearTimeout(timeoutId);\n                            if (!subscriber.closed) {\n                                subscriber.next(data);\n                                subscriber.complete();\n                            }\n                        };\n\n                        this.lazyLoad.emit({ query, response: responseCallback });\n                    });\n                }),\n                takeUntilDestroyed(this._destroyRef),\n            )\n            .subscribe({\n                next: (data: T[]) => {\n                    this.loading.set(false);\n                    // TODO: Abrir o dropdown somente aqui\n                    const wrappedSuggestions = this._addIdToSuggestions(data);\n                    this.filteredSuggestions.set(wrappedSuggestions);\n                    this.showEmptyMessage.set(wrappedSuggestions.length === 0);\n                },\n                error: (error) => {\n                    this.loading.set(false);\n                    // TODO: Abrir o dropdown somente aqui\n                    console.error('Lazy load error:', error);\n                    this.filteredSuggestions.set([]);\n                    this.showEmptyMessage.set(true);\n                },\n            });\n    }\n\n    /**\n     * Configura o debounce para o input do autocomplete.\n     * Este método utiliza um Subject para escutar as mudanças no valor do input,\n     * aplicando um debounce com o tempo definido por `this.delay()`. Quando um novo valor é emitido:\n     * - Se houver valor, filtra as sugestões com base no texto digitado e atualiza a lista de sugestões filtradas.\n     * - Se não houver valor e o dropdown estiver ativo, reseta as sugestões filtradas.\n     * - Caso contrário, limpa a lista de sugestões filtradas.\n     * Também atualiza o estado da mensagem de lista vazia e, se a seleção for livre (`forceSelection` for falso),\n     * propaga a mudança de valor para o formulário.\n     * @private\n     */\n    private _setupInputDebounce(): void {\n        this._inputSubject$\n            .pipe(\n                debounceTime(this.delay()),\n                distinctUntilChanged(),\n                filter((value) => value.length >= this.minLengthToSearch() || value.length === 0),\n                takeUntilDestroyed(this._destroyRef),\n            )\n            .subscribe((value) => {\n                if (value) {\n                    this.filteredSuggestions.set(\n                        this.internalSuggestion().filter(({ data }) => {\n                            const label = String(this.suggestionLabel() ? data[this.suggestionLabel()!] : data);\n                            return label.toLowerCase().includes(value.toLowerCase());\n                        }),\n                    );\n                    this.showEmptyMessage.set(this.filteredSuggestions().length === 0);\n                } else if (this.dropdown()) {\n                    this.resetFilteredSuggestions();\n                } else {\n                    this.filteredSuggestions.set([]);\n                }\n\n                if (!this.forceSelection()) {\n                    this._onChange?.(value);\n                }\n            });\n    }\n\n    /**\n     * Valida as entradas do componente de autocomplete.\n     * @private\n     * @throws {Error} Se as sugestões forem objetos e `suggestionLabel` não for fornecido.\n     */\n    private _validateInputs(): void {\n        const suggestions = this.suggestions();\n\n        if (!suggestions.length) {\n            return;\n        }\n\n        const hasObjectSuggestions = suggestions.some(\n            (suggestion) => typeof suggestion === 'object' && suggestion !== null,\n        );\n\n        if (hasObjectSuggestions) {\n            if (!this.suggestionLabel()) {\n                throw new Error('The suggestionLabel input must be provided when suggestions are objects.');\n            }\n        }\n    }\n}\n\n","<div\n    #containerDiv\n    cdkOverlayOrigin\n    #trigger=\"cdkOverlayOrigin\"\n    class=\"flex h-[35px] w-full items-center overflow-hidden rounded-[4px] border focus-within:border-2 focus-within:border-primary hover:bg-grayscale-10\"\n    [class]=\"inputClass()\"\n    [ngClass]=\"{\n        'pointer-events-none border-grayscale-20 bg-grayscale-5 text-grayscale-30': disabled(),\n        'pointer-events-auto border-grayscale-30 bg-grayscale-0 text-grayscale-90': !disabled(),\n        'border-criticality-red': invalid(),\n    }\"\n>\n    <div\n        class=\"flex flex-grow gap-2 px-2\"\n        [ngClass]=\"{\n            'border-r': dropdown(),\n            'border-grayscale-20': dropdown() && disabled(),\n            'border-grayscale-30 focus-within:border-r-2 focus-within:border-r-primary': dropdown() && !disabled(),\n            'bg-grayscale-5': disabled(),\n            'bg-grayscale-0': !disabled(),\n        }\"\n    >\n        @if (multiple() && values().length > 0) {\n            <div class=\"flex flex-wrap items-center gap-2\">\n                @for (suggestion of values(); track suggestion) {\n                    <s-autocomplete-chip\n                        [suggestion]=\"suggestion\"\n                        [suggestionLabel]=\"suggestionLabel()\"\n                        (suggestionRemoved)=\"removeSuggestion($event)\"\n                    ></s-autocomplete-chip>\n                }\n            </div>\n        }\n        <input\n            #inputEl\n            class=\"min-h-[35px] grow outline-none\"\n            type=\"text\"\n            [placeholder]=\"placeholder() ?? 'platform.angular_components.type_to_search' | translate\"\n            [readOnly]=\"readonly()\"\n            [(ngModel)]=\"inputValue\"\n            [attr.aria-disabled]=\"disabled()\"\n            [attr.aria-autocomplete]=\"multiple() ? 'list' : 'both'\"\n            [attr.aria-activedescendant]=\"focusedIndex() >= 0 ? filteredSuggestions()[focusedIndex()].id : null\"\n            role=\"searchbox\"\n            (input)=\"onInput($event)\"\n            (keydown)=\"onKeyDown($event)\"\n            (keyUp)=\"onKeyUp($event)\"\n            (blur)=\"onInputBlur($event)\"\n            (focus)=\"onInputFocus($event)\"\n        />\n\n        @if (loading()) {\n            <div class=\"flex items-center justify-center\">\n                <svg\n                    width=\"20\"\n                    height=\"20\"\n                    viewBox=\"0 0 20 20\"\n                    xmlns=\"http://www.w3.org/2000/svg\"\n                    class=\"animate-spin\"\n                >\n                    <circle\n                        cx=\"10\"\n                        cy=\"10\"\n                        r=\"9\"\n                        stroke=\"#428bca\"\n                        stroke-width=\"2\"\n                        fill=\"none\"\n                        stroke-dasharray=\"56.5\"\n                        stroke-dashoffset=\"10\"\n                        stroke-linecap=\"round\"\n                    />\n                </svg>\n            </div>\n        } @else {\n            @if (value() && !this.disabled()) {\n                <button\n                    class=\"px-2\"\n                    (click)=\"clear()\"\n                    tabindex=\"-1\"\n                >\n                    <i class=\"far fa-times text-grayscale-60\"></i>\n                </button>\n            }\n        }\n    </div>\n\n    @if (dropdown()) {\n        <button\n            class=\"flex h-full w-[35px] flex-shrink-0 flex-grow-0 items-center justify-center hover:bg-grayscale-10\"\n            (click)=\"toggleDropdown()\"\n        >\n            <i\n                class=\"fas text-grayscale-90\"\n                [class.fa-caret-down]=\"!isOpen()\"\n                [class.fa-caret-up]=\"isOpen()\"\n            ></i>\n        </button>\n    }\n</div>\n\n@if (showEmptyMessage() || (filteredSuggestions().length > 0 && !readonly())) {\n    <ng-template\n        #dropdownTemplate\n        cdkConnectedOverlay\n        [cdkConnectedOverlayOrigin]=\"trigger\"\n        [cdkConnectedOverlayOpen]=\"isOpen()\"\n        [cdkConnectedOverlayHasBackdrop]=\"true\"\n        (backdropClick)=\"isOpen.set(false)\"\n        cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n        (detach)=\"isOpen.set(false)\"\n    >\n        <div\n            [id]=\"'dropdown-container-' + componentId\"\n            class=\"mt-0.5 rounded-[4px] bg-grayscale-0 py-1 shadow\"\n            [style.width.px]=\"containerDiv.offsetWidth\"\n        >\n            <ul\n                class=\"max-h-52 overflow-auto\"\n                role=\"listbox\"\n            >\n                <!-- Virtual scroll -->\n                @if (virtualScroll() && filteredSuggestions().length > 10) {\n                    <cdk-virtual-scroll-viewport\n                        [itemSize]=\"virtualScrollItemSize()\"\n                        class=\"h-52 overflow-auto\"\n                    >\n                        <ng-container\n                            *cdkVirtualFor=\"\n                                let suggestion of enrichedFilteredSuggestions();\n                                let i = $index;\n                                trackBy: trackById\n                            \"\n                        >\n                            <ng-container\n                                [ngTemplateOutlet]=\"suggestionItemTemplate\"\n                                [ngTemplateOutletContext]=\"{ suggestion, i }\"\n                            ></ng-container>\n                        </ng-container>\n                    </cdk-virtual-scroll-viewport>\n                }\n\n                <!-- Normal list -->\n                @if (!virtualScroll() || filteredSuggestions().length <= 10) {\n                    @for (suggestion of enrichedFilteredSuggestions(); track suggestion.id; let i = $index) {\n                        <ng-container\n                            [ngTemplateOutlet]=\"suggestionItemTemplate\"\n                            [ngTemplateOutletContext]=\"{ suggestion, i }\"\n                        ></ng-container>\n                    }\n                }\n\n                @if (showEmptyMessage()) {\n                    <span class=\"p-3 text-grayscale-60\">{{\n                        emptyMessage() ?? 'platform.angular_components.no_records_found' | translate\n                    }}</span>\n                }\n            </ul>\n        </div>\n    </ng-template>\n}\n\n<ng-template\n    #suggestionItemTemplate\n    let-suggestion=\"suggestion\"\n    let-i=\"i\"\n>\n    <li\n        [id]=\"suggestion.id\"\n        class=\"rounded-sm flex cursor-pointer items-center gap-2 px-3 py-2 text-grayscale-70\"\n        [class.bg-grayscale-10]=\"i === focusedIndex()\"\n        [class.bg-grayscale-20]=\"suggestion.isSelected\"\n        [attr.aria-selected]=\"suggestion.isSelected\"\n        role=\"option\"\n        (click)=\"selectSuggestion(suggestion.data)\"\n    >\n        @if (checkmark() && multiple() && suggestion.isSelected) {\n            <i class=\"far fa-check\"></i>\n        }\n        {{ suggestionLabel() ? suggestion.data[suggestionLabel()!] : suggestion.data }}\n    </li>\n</ng-template>\n\n","import { computed, Directive, effect, ElementRef, inject, OnDestroy } from '@angular/core';\nimport { AutoComplete } from 'primeng/autocomplete';\n\n/**\n * @description Workaround para bug do PrimeNG v18 no `p-autoComplete` em modo múltiplo:\n * ao remover um chip via navegação por teclado (Enter/Space no ícone de remoção do `p-chip`),\n * o componente `p-chip` esconde o elemento visualmente mas não notifica o `p-autoComplete`,\n * fazendo com que o model não seja atualizado.\n *\n * A diretiva intercepta o keydown nos ícones de remoção (`.p-chip-remove-icon`) e\n * delega o clique para `span.p-autocomplete-chip-icon`, que chama `removeOption` do\n * `p-autoComplete` e sincroniza o model.\n *\n * Só atua quando `[multiple]=\"true\"`. Os listeners são re-registrados via `effect`\n * toda vez que a quantidade de chips (`chipCount`) muda.\n *\n * @example\n * ```html\n * <p-autoComplete sAutoCompleteMultipleFix [multiple]=\"true\" ... />\n * ```\n *\n * @category Directives\n */\n@Directive({\n    selector:\n        'p-autoComplete[sAutoCompleteMultipleFix], p-autocomplete[sAutoCompleteMultipleFix], p-auto-complete[sAutoCompleteMultipleFix]',\n    standalone: true,\n})\nexport class AutoCompleteMultipleKeyboardFixDirective implements OnDestroy {\n    private readonly autocompleteInstance = inject(AutoComplete);\n    private readonly elementRef = inject(ElementRef<HTMLElement>);\n\n    private listenerController: AbortController | null = null;\n\n    private readonly chipCount = computed(() => {\n        if (!this.isMultiple) return 0;\n        return this.autocompleteInstance.modelValue()?.length ?? 0;\n    });\n\n    private get isMultiple(): boolean {\n        return !!this.autocompleteInstance.multiple;\n    }\n\n    private readonly chipCountEffect = effect(() => {\n        const count = this.chipCount();\n        setTimeout(() => this.refreshListeners(count));\n    });\n\n    private refreshListeners(count: number): void {\n        this.listenerController?.abort();\n\n        if (count === 0) {\n            return;\n        }\n\n        this.listenerController = new AbortController();\n        const { signal } = this.listenerController;\n\n        const removeIcons = this.elementRef.nativeElement.querySelectorAll(\n            '.p-chip-remove-icon',\n        ) as NodeListOf<HTMLElement>;\n\n        removeIcons.forEach((icon: HTMLElement) => {\n            icon.addEventListener('keydown', this.handleRemoveIconKeydown, { signal });\n        });\n    }\n\n    /**\n     * Intercepta Enter/Backspace no ícone de remoção do chip e delega para o\n     * `span.p-autocomplete-chip-icon` que chama `removeOption` no `p-autoComplete`.\n     */\n    private readonly handleRemoveIconKeydown = (event: KeyboardEvent): void => {\n        if (event.key !== 'Enter' && event.key !== 'Backspace') return;\n\n        event.preventDefault();\n        event.stopImmediatePropagation();\n\n        const li = (event.target as HTMLElement).closest<HTMLElement>('li.p-autocomplete-chip-item');\n        const chipIcon = li?.querySelector<HTMLElement>('span.p-autocomplete-chip-icon');\n\n        chipIcon?.click();\n    };\n\n    public ngOnDestroy(): void {\n        this.listenerController?.abort();\n        this.listenerController = null;\n        this.chipCountEffect.destroy();\n    }\n}\n\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}