{"version":3,"file":"seniorsistemas-angular-components-select.mjs","sources":["../../projects/angular-components/select/src/lib/select/components/select-option/select-option.component.ts","../../projects/angular-components/select/src/lib/select/components/select-option/select-option.component.html","../../projects/angular-components/select/src/lib/select/select.component.ts","../../projects/angular-components/select/src/lib/select/select.component.html","../../projects/angular-components/select/src/seniorsistemas-angular-components-select.ts"],"sourcesContent":["import { Component, input, model, output } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CheckboxComponent } from '@seniorsistemas/angular-components/checkbox';\n\n@Component({\n    selector: 's-select-option',\n    templateUrl: './select-option.component.html',\n    standalone: true,\n    imports: [CommonModule, CheckboxComponent],\n})\nexport class SelectOptionComponent {\n    public id = input.required<string>();\n    public label = input.required<string>();\n    public multiple = input.required<boolean>();\n    public checkmark = input.required<boolean>();\n    public isGrouper = input.required<boolean>();\n    public isFocused = input.required<boolean>();\n\n    public isSelected = model.required<boolean>();\n\n    public selected = output();\n\n    public onClick(): void {\n        if (this.isGrouper()) {\n            return;\n        }\n\n        this.selected.emit();\n    }\n}\n","<div\n    [attr.id]=\"id()\"\n    [attr.role]=\"isGrouper() ? 'presentation' : 'option'\"\n    [attr.aria-selected]=\"isGrouper() ? null : isSelected()\"\n    class=\"flex select-none items-center gap-3 px-3 py-2\"\n    [class.hover:bg-grayscale-10]=\"!isGrouper()\"\n    [class.bg-grayscale-10]=\"!isGrouper() && isFocused()\"\n    (click)=\"onClick()\"\n    (keydown.enter)=\"onClick()\"\n    (keydown.space)=\"onClick(); $event.preventDefault()\"\n>\n    @if (!isGrouper() && checkmark() && !multiple() && isSelected()) {\n        <i\n            class=\"far fa-check text-grayscale-60\"\n            aria-hidden=\"true\"\n        ></i>\n    }\n\n    @if (!isGrouper() && multiple()) {\n        <s-checkbox [checked]=\"isSelected()\"></s-checkbox>\n    }\n    <span\n        [class]=\"isSelected() ? 'text-[#428BCA]' : 'text-grayscale-90'\"\n        [class.font-bold]=\"isGrouper()\"\n    >\n        {{ label() }}\n    </span>\n</div>\n\n","import { OverlayModule } from '@angular/cdk/overlay';\nimport { ScrollingModule } from '@angular/cdk/scrolling';\nimport { CommonModule } from '@angular/common';\nimport {\n    Component,\n    computed,\n    ElementRef,\n    forwardRef,\n    inject,\n    input,\n    model,\n    OnInit,\n    signal,\n    viewChild,\n    effect,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { ControlValueAccessor, FormControl, FormGroup, NG_VALUE_ACCESSOR, ReactiveFormsModule } from '@angular/forms';\n\nimport { TranslateModule, TranslateService } from '@ngx-translate/core';\nimport { CheckboxComponent } from '@seniorsistemas/angular-components/checkbox';\nimport { debounceTime, distinctUntilChanged } from 'rxjs/operators';\n\nimport { SelectOptionComponent } from './components/select-option/select-option.component';\nimport { animate, state, style, transition, trigger } from '@angular/animations';\n\ninterface InternalDropdownOption<T> {\n    data: T;\n    id: string;\n    grouper?: boolean;\n}\n/**\n * @description Componente de seleção dropdown genérico com suporte a seleção simples e múltipla,\n * filtro, agrupamento, virtual scroll e acessibilidade (ARIA combobox). Implementa\n * {@link ControlValueAccessor} para integração com Reactive Forms e Template-driven Forms.\n *\n * @example\n * ```html\n * <s-select\n *   formControlName=\"categoria\"\n *   placeholder=\"Selecione uma categoria\"\n *   [options]=\"categorias\"\n *   optionLabel=\"nome\"\n *   optionValue=\"id\"\n *   [filter]=\"true\"\n *   [showClear]=\"true\" />\n * ```\n *\n * @category Inputs\n */\n@Component({\n    selector: 's-select',\n    templateUrl: './select.component.html',\n    standalone: true,\n    imports: [\n        CommonModule,\n        ReactiveFormsModule,\n        ScrollingModule,\n        SelectOptionComponent,\n        CheckboxComponent,\n        TranslateModule,\n        OverlayModule,\n    ],\n    host: {\n        '(window:resize)': 'onWindowResize($event)',\n    },\n    styles: [\n        `\n            :host.ng-dirty.ng-invalid {\n                .dropdown-container,\n                .select-container {\n                    border-color: #c13018;\n                    outline: none;\n                }\n            }\n        `,\n    ],\n\n    providers: [\n        {\n            provide: NG_VALUE_ACCESSOR,\n            useExisting: forwardRef(() => SelectComponent),\n            multi: true,\n        },\n    ],\n    animations: [\n        trigger('visibilityChanged', [\n            state('void', style({ opacity: 0, transform: 'scale(0.95)' })),\n            transition(':enter', [\n                animate('500ms cubic-bezier(0, 0, 0.2, 1)', style({ opacity: 1, transform: 'scale(1)' })),\n            ]),\n            transition(':leave', [\n                animate('500ms cubic-bezier(0.4, 0, 0.2, 1)', style({ opacity: 0, transform: 'scale(0.95)' })),\n            ]),\n        ]),\n    ],\n})\nexport class SelectComponent<T> implements ControlValueAccessor, OnInit {\n    private static nextId = 0;\n\n    /** @description Texto exibido quando nenhuma opção está selecionada. @default '' */\n    public placeholder = input('');\n\n    /** @description Habilita a seleção de múltiplas opções simultâneas. @default false */\n    public multiple = input(false);\n\n    /** @description Lista de opções disponíveis para seleção. Campo obrigatório. */\n    public options = input.required<T[]>();\n\n    /** @description Chave do objeto de opção usada como label de exibição. */\n    public optionLabel = input<keyof T>();\n\n    /** @description Chave do objeto de opção usada como valor a ser emitido ao formulário. */\n    public optionValue = input<keyof T>();\n\n    /** @description Exibe um botão para limpar a seleção atual. @default false */\n    public showClear = input(false);\n\n    /** @description Habilita um campo de filtro textual para pesquisa nas opções. @default false */\n    public filter = input(false);\n\n    /** @description Exibe um ícone de checkmark ao lado da opção selecionada. @default false */\n    public checkmark = input(false);\n\n    /** @description Chave(s) do objeto usada(s) para filtragem textual. Quando não informado, usa `optionLabel`. */\n    public filterBy = input<keyof T | (keyof T)[]>();\n\n    /** @description Habilita agrupamento de opções. As opções devem conter itens filhos conforme a estrutura de grupo suportada. @default false */\n    public group = input(false);\n\n    /** @description Habilita virtualização da lista para melhor performance com grandes volumes de opções. @default false */\n    public virtualScroll = input(false);\n\n    /** @description Altura fixa de cada item da lista em pixels, necessária para o cálculo do virtual scroll. @default 37 */\n    public virtualScrollItemSize = input(37);\n\n    /** @description Mensagem exibida quando nenhuma opção corresponde ao filtro aplicado. @default null */\n    public emptyMessage = input<string | null>(null);\n\n    /** @description Controla o estado desabilitado do componente via two-way binding. @default false */\n    public disabled = model(false);\n\n    /** @description Controla a visibilidade do painel de opções via two-way binding. @default false */\n    public showOptions = model(false);\n\n    /** @description Label de acessibilidade do componente. @default '' */\n    public ariaLabel = input('');\n\n    /** @description ID do elemento externo que descreve o componente (aria-labelledby). @default '' */\n    public ariaLabelledBy = input('');\n\n    public value = signal<InternalDropdownOption<T> | null>(null);\n    public values = signal<InternalDropdownOption<T>[]>([]);\n    public filterValue = signal('');\n    public focusedIndex = signal(-1);\n    private _pendingValue: T | T[] | null = null;\n    public isOpen = false;\n\n    public componentId = `select${SelectComponent.nextId++}`;\n\n    /**\n     * Computed que indica se todas as opções filtradas estão selecionadas.\n     * Retorna `true` se todas as opções disponíveis (excluindo agrupadores) estiverem presentes\n     * na lista de valores selecionados, e `false` caso contrário.\n     * @returns {boolean} `true` se todas as opções filtradas estão selecionadas, `false` caso contrário.\n     */\n    public allSelected = computed(() => {\n        const options = this.filteredOptions().filter((option) => !option.grouper);\n        const selectedIds = this.values().map((option) => option.id);\n\n        const ret = options.length > 0 && options.every((option) => selectedIds.includes(option.id));\n        return ret;\n    });\n\n    /**\n     * Retorna o item atualmente focado na lista de opções filtradas.\n     * @returns O dado do item focado ou `null` caso nenhum item esteja focado.\n     */\n    public focusedItem = computed(() => {\n        const index = this.focusedIndex();\n        if (index < 0) return null;\n        return this.filteredOptions()[index]?.data ?? null;\n    });\n\n    /**\n     * Retorna o item atualmente focado na lista de opções filtradas.\n     * @returns O dado do item focado ou `null` caso nenhum item esteja focado.\n     */\n    public focusedOptionId = computed(() => {\n        const index = this.focusedIndex();\n        if (index < 0) return null;\n        return this.filteredOptions()[index]?.id ?? null;\n    });\n\n    /**\n     * Computa e retorna a lista interna de opções do dropdown.\n     * - Se as opções estiverem agrupadas (`group()` retorna verdadeiro),\n     *   utiliza `_grouperToFlat` para transformar as opções agrupadas em uma lista plana.\n     * - Caso contrário, retorna as opções com IDs adicionados.\n     * @returns Um array de `InternalDropdownOption<T>` representando as opções disponíveis para o componente select.\n     */\n    public internalOptions = computed<InternalDropdownOption<T>[]>(() => {\n        const opts = this.options();\n        const optionsWithId = this._addIdToOptions(opts);\n        return this.group() ? this._grouperToFlat(optionsWithId) : optionsWithId;\n    });\n\n    /**\n     * Retorna uma string representando a seleção atual do componente.\n     * - Se o modo múltiplo estiver ativado e mais de um item estiver selecionado,\n     *   retorna uma mensagem traduzida indicando o número total de registros selecionados.\n     * - Se apenas um item estiver selecionado, retorna o rótulo desse item.\n     * - Se o modo múltiplo não estiver ativado, retorna o rótulo do item selecionado ou uma string vazia caso nenhum item esteja selecionado.\n     * @returns {string} Texto representando a seleção atual.\n     */\n    public print = computed(() => {\n        if (this.multiple()) {\n            const selected = this.values();\n            if (selected.length > 1) {\n                return this._translateService.instant(`platform.angular_components.total_records_selected`, {\n                    count: selected.length,\n                });\n            } else if (selected.length === 1) {\n                return this._getLabelFromOption(selected[0].data);\n            }\n        } else {\n            const selected = this.value();\n            return selected ? this._getLabelFromOption(selected.data) : '';\n        }\n\n        return '';\n    });\n\n    /**\n     * Indica se o seletor está \"limpo\", ou seja, sem nenhum valor selecionado.\n     * - No modo múltiplo (`multiple`), retorna `true` se não houver nenhum valor selecionado (`values` está vazio).\n     * - No modo simples, retorna `true` se não houver valor selecionado (`value` é falsy).\n     * @returns `true` se não houver seleção, `false` caso contrário.\n     */\n    public isClean = computed(() => {\n        return this.multiple() ? !this.values().length : !this.value();\n    });\n\n    /**\n     * Computed que indica se o estado de seleção \"Selecionar Todos\" está indeterminado.\n     * Retorna `true` quando nem todos os itens filtrados estão selecionados e nem todos estão desmarcados,\n     * ou seja, quando há uma seleção parcial dos itens disponíveis.\n     * @returns {boolean} `true` se a seleção for parcial, `false` caso contrário.\n     */\n    public selectAllIsIndeterminate = computed(() => {\n        const selected = this.internalOptions().filter((option) => {\n            return this.values().some((o) => o.id === option.id);\n        });\n        const options = this.filteredOptions().filter((option) => !option.grouper);\n        const all = options.length > 0 && options.every((option) => selected.includes(option));\n        const none = options.every((option) => !selected.includes(option));\n\n        return !all && !none;\n    });\n\n    /**\n     * Retorna uma lista de opções filtradas com base no valor de busca (`filterValue`) e nos critérios definidos.\n     * - Se o filtro estiver desabilitado ou o valor de busca estiver vazio, retorna todas as opções.\n     * - Caso contrário, filtra as opções utilizando o(s) campo(s) especificado(s) em `filterBy`.\n     * - Ignora opções que possuem a propriedade `grouper` definida.\n     * @returns As opções filtradas conforme o valor de busca e critérios de filtro.\n     */\n    public filteredOptions = computed(() => {\n        const allOptions = this.internalOptions();\n        const search = this.filterValue().toLowerCase().trim();\n\n        if (!this.filter() || !search) {\n            return allOptions;\n        }\n\n        const filterBy = this.filterBy();\n        return allOptions.filter((option) => {\n            if (option.grouper) {\n                return false;\n            }\n\n            let label = '';\n\n            const optionLabel = this.optionLabel();\n\n            if (!filterBy) {\n                label = optionLabel ? String(option.data[optionLabel]) : String(option.data);\n            } else if (Array.isArray(filterBy)) {\n                label = filterBy.map((by) => String(option.data[by] ?? '')).join(' ');\n            } else {\n                label = String(option.data[filterBy] ?? '');\n            }\n\n            return label.toLowerCase().includes(search);\n        });\n    });\n\n    public readonly filterForm = new FormGroup<{ filter: FormControl<string> }>({\n        filter: new FormControl<string>('', { nonNullable: true }),\n    });\n\n    private readonly _containerDiv = viewChild<ElementRef<HTMLDivElement>>('containerDiv');\n    private readonly _filterInput = viewChild<ElementRef<HTMLInputElement>>('filterInput');\n    private readonly _selectAllCheckbox = viewChild<ElementRef<HTMLElement>>('selectAllCheckbox');\n    private _onChange: (value: any | any[] | null) => void = () => {};\n    private _onTouched: () => void = () => {};\n\n    private readonly _translateService = inject(TranslateService);\n\n    constructor() {\n        this.filterForm\n            .get('filter')!\n            .valueChanges.pipe(debounceTime(300), distinctUntilChanged(), takeUntilDestroyed())\n            .subscribe((value) => {\n                this.filterValue.set(value);\n            });\n\n        // Efeito para tentar aplicar valor pendente quando options mudar\n        effect(() => {\n            const opts = this.options();\n            if (opts && opts.length && this._pendingValue !== null) {\n                this._applyPendingValue();\n            }\n        });\n    }\n\n    public ngOnInit(): void {\n        this._validateInputs();\n    }\n\n    /**\n     * Define o valor selecionado do componente select.\n     * @param value O valor a ser definido. Pode ser um objeto do tipo `T`, um array de `T` (quando múltipla seleção está habilitada), ou `null`.\n     * @throws Se o modo múltiplo estiver ativado e o valor não for um array, lança um erro.\n     * @throws Se o modo múltiplo estiver desativado e o valor for um array, lança um erro.\n     * Este método mapeia o(s) valor(es) fornecido(s) para as opções internas do componente,\n     * garantindo que apenas opções válidas sejam selecionadas conforme o modo de seleção (único ou múltiplo).\n     */\n    public writeValue(value: T | T[] | null): void {\n        // Armazena valor pendente e tenta aplicar\n        this._pendingValue = value;\n        this._applyPendingValue();\n    }\n\n    /**\n     * Tenta aplicar o valor pendente (_pendingValue) ao estado do componente,\n     * mapeando para InternalDropdownOption<T> conforme options disponíveis.\n     */\n    private _applyPendingValue(): void {\n        const value = this._pendingValue;\n        const opts = this.internalOptions();\n        const optionValue = this.optionValue();\n\n        if (value && this.multiple()) {\n            if (Array.isArray(value)) {\n                const mapped = value\n                    .map((v) => {\n                        if (optionValue) {\n                            return opts.find((opt) => opt.data[optionValue] === v) || null;\n                        } else {\n                            return opts.find((opt) => JSON.stringify(opt.data) === JSON.stringify(v)) || null;\n                        }\n                    })\n                    .filter((opt): opt is InternalDropdownOption<T> => !!opt);\n                this.values.set(mapped);\n            } else {\n                this.values.set([]);\n            }\n        } else {\n            let mapped: InternalDropdownOption<T> | null = null;\n            if (Array.isArray(value)) {\n                mapped = null;\n            } else if (optionValue && value != null) {\n                const compareValue =\n                    typeof value === 'object' && value !== null && optionValue in value ? value[optionValue] : value;\n                mapped = opts.find((opt) => opt.data[optionValue] === compareValue) || null;\n            } else if (value != null) {\n                mapped = opts.find((opt) => JSON.stringify(opt.data) === JSON.stringify(value)) || null;\n            }\n            this.value.set(mapped ?? null);\n        }\n        this._pendingValue = null;\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 de callback que recebe o novo valor selecionado ou null.\n     */\n    public registerOnChange(onChange: (value: T | T[] | null) => 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 executada quando o componente for marcado como \"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     * Alterna a exibição das opções do componente select.\n     * Se o componente estiver desabilitado, não realiza nenhuma ação.\n     * Caso contrário, inverte o estado de exibição das opções.\n     * Ao abrir, move o foco para o item atualmente selecionado.\n     */\n    public toggle(): void {\n        if (this.disabled()) {\n            return;\n        }\n\n        const shouldOpen = !this.showOptions();\n        this.isOpen = shouldOpen;\n        this.showOptions.set(shouldOpen);\n\n        if (shouldOpen) {\n            if (this.filter()) {\n                // Quando há filtro com múltipla seleção, foco vai para o checkbox primeiro;\n                // caso contrário, vai direto para o input de filtro.\n                // O foco é movido após a renderização do overlay.\n                setTimeout(() => {\n                    if (this.multiple()) {\n                        const checkboxHost = this._selectAllCheckbox()?.nativeElement;\n                        const focusable = checkboxHost?.querySelector<HTMLElement>('[tabindex]');\n                        focusable?.focus();\n                    } else {\n                        this._filterInput()?.nativeElement.focus();\n                    }\n                });\n            } else {\n                this._focusSelectedOption();\n            }\n        }\n    }\n\n    /**\n     * Seleciona um item no componente de seleção.\n     * @param item O item a ser selecionado ou desmarcado.\n     * Se o componente estiver desabilitado, a função retorna imediatamente.\n     * No modo múltiplo, adiciona ou remove o item da lista de valores selecionados.\n     * No modo simples, define o item como valor selecionado e fecha o dropdown.\n     * Sempre notifica as mudanças e marca o componente como tocado.\n     */\n    public selectItem(item: InternalDropdownOption<T>): void {\n        if (this.disabled()) {\n            return;\n        }\n\n        const optionValue = this.optionValue();\n\n        if (this.multiple()) {\n            const store = [...this.values()];\n            const index = store.findIndex((selectedItem) => {\n                return selectedItem === item;\n            });\n\n            if (index !== -1) {\n                store.splice(index, 1);\n            } else {\n                store.push(item);\n            }\n\n            this.values.set(store);\n            const result = optionValue ? store.map((item) => item.data[optionValue]) : store;\n            this._onChange(result);\n        } else {\n            this.value.set(item);\n            const result = optionValue ? item.data[optionValue] : item.data;\n            this._onChange(result);\n            this._closeDropdown();\n            this._containerDiv()?.nativeElement.focus();\n        }\n\n        this._onTouched();\n    }\n\n    /**\n     * Limpa o valor selecionado no componente select.\n     * Se o componente estiver desabilitado, não executa nenhuma ação.\n     * Para seleção múltipla, remove todos os valores selecionados e notifica a alteração.\n     * Para seleção única, define o valor como nulo e notifica a alteração.\n     * Fecha o dropdown e marca o componente como \"tocado\".\n     * Impede a propagação do evento do mouse.\n     * @param event Evento do mouse que acionou a limpeza da seleção.\n     */\n    public clear(event: MouseEvent): void {\n        if (this.disabled()) {\n            return;\n        }\n\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._closeDropdown();\n\n        this._onTouched();\n        event.stopPropagation();\n    }\n\n    /**\n     * Limpa o filtro do formulário, resetando o campo 'filter' do formulário de filtro.\n     * Este método redefine o valor do campo 'filter' para seu estado inicial,\n     * removendo qualquer texto ou valor previamente inserido pelo usuário.\n     */\n    public clearFilter(): void {\n        this.filterForm.get('filter')?.reset();\n    }\n\n    /**\n     * Manipula o evento de redimensionamento da janela.\n     * Fecha o dropdown de opções caso ele esteja visível ao redimensionar a janela.\n     * @param _ Evento de redimensionamento da janela (não utilizado).\n     */\n    public onWindowResize(_: Event): void {\n        if (this.showOptions()) {\n            this._closeDropdown();\n        }\n    }\n\n    /**\n     * Manipula o evento de clique no elemento container da seleção.\n     * Este método alterna o estado de exibição do componente select e,\n     * em seguida, define o foco no elemento container correspondente.\n     */\n    public onContainerDivClick(): void {\n        this.toggle();\n        this._containerDiv()?.nativeElement.focus();\n    }\n\n    /**\n     * Manipula eventos de teclado no input de filtro do overlay.\n     * - 'ArrowDown': Move o foco para a primeira opção da lista.\n     * - 'ArrowUp': Move o foco para a última opção da lista.\n     * - 'Escape': Fecha o dropdown e retorna o foco ao combobox.\n     * - 'Enter': Seleciona a opção focada, se houver.\n     * @param event O evento de teclado disparado no input de filtro.\n     */\n    public onFilterKeyDown(event: KeyboardEvent): void {\n        const options = this.filteredOptions();\n\n        switch (event.key) {\n            case 'ArrowDown':\n                event.preventDefault();\n                this._focusNextOption(options);\n                break;\n            case 'ArrowUp':\n                event.preventDefault();\n                if (options.length > 0) {\n                    if (this.focusedIndex() < 0) {\n                        // Nenhum item focado: foca o último disponível\n                        let lastIndex = options.length - 1;\n                        while (lastIndex >= 0 && options[lastIndex].grouper) {\n                            lastIndex--;\n                        }\n                        if (lastIndex >= 0) {\n                            this.focusedIndex.set(lastIndex);\n                            this._scrollToFocusedOption();\n                        }\n                    } else {\n                        this._focusPreviousOption(options);\n                    }\n                }\n                break;\n            case 'Escape':\n                event.preventDefault();\n                event.stopPropagation();\n                this._closeDropdown();\n                this._containerDiv()?.nativeElement.focus();\n                break;\n            case 'Enter':\n                if (this.focusedIndex() >= 0 && this.focusedIndex() < options.length) {\n                    event.preventDefault();\n                    this.selectItem(options[this.focusedIndex()]);\n                }\n                break;\n        }\n    }\n\n    /**\n     * Manipula eventos de teclado para navegação e seleção de opções no componente select.\n     * - 'ArrowDown': Move o foco para a próxima opção disponível.\n     * - 'ArrowUp': Move o foco para a opção anterior.\n     * - 'Tab': Seleciona a opção atualmente focada e fecha o dropdown.\n     * - 'Enter': Seleciona a opção focada se o dropdown estiver aberto, ou alterna a abertura do dropdown.\n     * - 'Escape': Fecha o dropdown.\n     * - ' ': (barra de espaço) Seleciona a opção focada se o dropdown estiver aberto, ou alterna a abertura do dropdown.\n     * Previne o comportamento padrão do navegador quando necessário para garantir a navegação adequada pelo teclado.\n     * @param event O evento de teclado disparado pelo usuário.\n     */\n    public onKeyDown(event: KeyboardEvent): void {\n        const options = this.filteredOptions();\n\n        if (!options.length && event.key !== 'Escape' && event.key !== 'Enter' && event.key !== ' ') {\n            return;\n        }\n\n        const _selectOption = () => {\n            if (this.focusedIndex() >= 0 && this.focusedIndex() < options.length) {\n                event.preventDefault();\n                this.selectItem(options[this.focusedIndex()]);\n            }\n        };\n\n        switch (event.key) {\n            case 'ArrowDown':\n                event.preventDefault();\n                if (!this.showOptions()) {\n                    this.toggle();\n                } else {\n                    this._focusNextOption(options);\n                }\n                break;\n            case 'ArrowUp':\n                event.preventDefault();\n                if (this.showOptions()) {\n                    this._focusPreviousOption(options);\n                }\n                break;\n            case 'Tab':\n                // Quando há filtro aberto, Tab deve navegar para dentro do overlay (não fechar)\n                if (this.showOptions() && this.filter()) {\n                    return;\n                }\n                _selectOption();\n                this._closeDropdown();\n                break;\n            case 'Enter':\n                if (this.showOptions()) {\n                    _selectOption();\n                } else {\n                    this.toggle();\n                }\n                break;\n            case 'Escape':\n                if (this.showOptions()) {\n                    event.preventDefault();\n                    event.stopPropagation();\n                }\n                this._closeDropdown();\n                break;\n            case ' ':\n                event.preventDefault();\n                if (this.showOptions()) {\n                    _selectOption();\n                } else {\n                    this.toggle();\n                }\n                break;\n        }\n    }\n\n    /**\n     * Retorna o rótulo (label) associado a uma opção fornecida.\n     * @param option - A opção do tipo T para a qual o rótulo deve ser obtido.\n     * @returns O rótulo da opção como uma string.\n     */\n    public getOptionLabel(option: T): string {\n        return this._getLabelFromOption(option);\n    }\n\n    /**\n     * Função de trackBy utilizada em diretivas *ngFor para otimizar a renderização de listas.\n     * Retorna o identificador único (`id`) de cada item do tipo `InternalDropdownOption<T>`.\n     * @param _ - Índice do item na lista (não utilizado).\n     * @param item - O item atual da lista do tipo `InternalDropdownOption<T>`.\n     * @returns O identificador único do item como uma string.\n     */\n    public trackById(_: number, item: InternalDropdownOption<T>): string {\n        return item.id;\n    }\n\n    /**\n     * Verifica se a opção fornecida está selecionada.\n     * @param option - A opção interna do dropdown a ser verificada.\n     * @returns `true` se a opção estiver selecionada, caso contrário `false`.\n     */\n    public isOptionSelected(option: InternalDropdownOption<T>): boolean {\n        return (\n            this.values().find((o) => {\n                return o === option;\n            }) !== undefined\n        );\n    }\n\n    /**\n     * Alterna a seleção de todos os itens disponíveis.\n     * Se o modo múltiplo estiver ativado, seleciona todos os itens filtrados que não são agrupadores\n     * caso nem todos estejam selecionados, ou limpa a seleção caso todos já estejam selecionados.\n     * Após a alteração, notifica a mudança de valor.\n     */\n    public toggleSelectAll(): void {\n        if (!this.multiple()) {\n            return;\n        }\n\n        const options = this.filteredOptions().filter((option) => !option.grouper);\n\n        if (this.allSelected()) {\n            this.values.set([]);\n        } else {\n            this.values.set(options);\n        }\n\n        this._onChange(this.values());\n    }\n\n    /**\n     * Retorna o rótulo (label) de uma opção fornecida.\n     * Este método utiliza a propriedade definida por `optionLabel` para extrair o valor do rótulo da opção.\n     * Caso `optionLabel` não esteja definido, retorna a representação em string da própria opção.\n     * @private\n     * @param option A opção da qual o rótulo será extraído.\n     * @returns O rótulo da opção como uma string.\n     */\n    private _getLabelFromOption(option: T): string {\n        const optionLabel = this.optionLabel();\n        return optionLabel ? String(option[optionLabel]) : String(option);\n    }\n\n    /**\n     * Valida as entradas do componente de seleção.\n     * Este método verifica se as opções fornecidas são válidas. Caso as opções sejam objetos,\n     * garante que a propriedade `optionLabel` esteja definida, lançando um erro caso contrário.\n     * Se não houver opções, a validação é ignorada.\n     * @private\n     * @throws {Error} Se as opções forem objetos e `optionLabel` não estiver definido.\n     */\n    private _validateInputs(): void {\n        const options = this.options();\n\n        if (!options.length) {\n            return;\n        }\n\n        const hasObjectOptions = options.some((option) => typeof option === 'object' && option !== null);\n\n        if (hasObjectOptions) {\n            if (!this.optionLabel()) {\n                throw new Error('The \"optionLabel\" input is required when options are objects.');\n            }\n        }\n    }\n\n    /**\n     * Fecha o dropdown de opções do componente select.\n     * Este método oculta as opções disponíveis e redefine o índice do item focado para -1,\n     * indicando que nenhum item está atualmente focado.\n     * @private\n     */\n    private _closeDropdown(): void {\n        this.showOptions.set(false);\n        this.focusedIndex.set(-1);\n    }\n\n    /**\n     * Adiciona um identificador único a cada opção fornecida.\n     * Para cada item no array de opções, gera um objeto `InternalDropdownOption` contendo o dado original\n     * e um campo `id` único baseado no timestamp atual e no índice do item. Caso a opção seja um grupo\n     * (detectado pela presença de um array `items`), adiciona também a propriedade `grouper: true`.\n     * @private\n     * @param options Array de opções do tipo `T` a serem processadas.\n     * @returns Um array de objetos `InternalDropdownOption<T>` com identificadores únicos.\n     */\n    private _addIdToOptions(options: T[]): InternalDropdownOption<T>[] {\n        const timestamp = Date.now();\n\n        return options.map((option, index) => {\n            if (this.group() && Array.isArray((option as any).items)) {\n                return {\n                    data: option,\n                    id: `id_${timestamp}_${index++}`,\n                    grouper: true,\n                };\n            }\n\n            return {\n                data: option,\n                id: `id_${timestamp}_${index++}`,\n            };\n        });\n    }\n\n    /**\n     * Converte uma lista de opções possivelmente agrupadas em uma lista plana de opções.\n     * Para cada opção que possui um agrupador (`grouper`) e um array de itens em `data.items`,\n     * adiciona a opção do agrupador e, em seguida, adiciona cada item do grupo como uma nova opção\n     * individual, atribuindo um `id` único para cada item do grupo.\n     * Caso a opção não seja um agrupador, ela é adicionada diretamente ao resultado.\n     * @private\n     * @param options Lista de opções internas do dropdown, podendo conter agrupadores.\n     * @returns Lista plana de opções, incluindo agrupadores e seus itens expandidos.\n     */\n    private _grouperToFlat(options: InternalDropdownOption<T>[]): InternalDropdownOption<T>[] {\n        const result: InternalDropdownOption<T>[] = [];\n\n        options.forEach((option) => {\n            if (option.grouper && Array.isArray((option.data as any).items)) {\n                result.push(option);\n                const groupItems = (option.data as any).items.map((item: T, index: number) => ({\n                    data: item,\n                    id: `${option.id}_item_${index}`,\n                }));\n                result.push(...groupItems);\n            } else {\n                result.push(option);\n            }\n        });\n\n        return result;\n    }\n\n    /**\n     * Move o foco para a próxima opção disponível na lista, ignorando opções que sejam agrupadores.\n     * @private\n     * @param options Lista de opções internas do dropdown.\n     */\n    private _focusNextOption(options: InternalDropdownOption<T>[]) {\n        let nextIndex = this.focusedIndex() + 1;\n\n        while (nextIndex < options.length && options[nextIndex].grouper) {\n            nextIndex++;\n        }\n\n        if (nextIndex < options.length) {\n            this.focusedIndex.set(nextIndex);\n            this._scrollToFocusedOption();\n        }\n    }\n\n    /**\n     * Move o foco para a opção anterior na lista, ignorando opções do tipo \"grouper\".\n     * @private\n     * @param options Lista de opções internas do dropdown.\n     */\n    private _focusPreviousOption(options: InternalDropdownOption<T>[]) {\n        let prevIndex = this.focusedIndex() - 1;\n\n        while (prevIndex >= 0 && options[prevIndex].grouper) {\n            prevIndex--;\n        }\n\n        if (prevIndex >= 0) {\n            this.focusedIndex.set(prevIndex);\n            this._scrollToFocusedOption();\n        }\n    }\n\n    /**\n     * Rola a lista de opções para garantir que a opção atualmente focada esteja visível.\n     * Este método obtém o ID da opção atualmente focada a partir da lista de opções filtradas.\n     * Se um ID válido for encontrado, busca o elemento correspondente no DOM e utiliza\n     * `scrollIntoView` para rolar até a opção, alinhando-a ao bloco mais próximo.\n     * @private\n     */\n    private _scrollToFocusedOption(): void {\n        const id = this.filteredOptions()[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     * Define o foco no item atualmente selecionado ao abrir o dropdown.\n     * No modo simples, foca o item selecionado. No modo múltiplo, foca o primeiro item selecionado.\n     * Após renderização do overlay, rola a lista até o item focado.\n     * @private\n     */\n    private _focusSelectedOption(): void {\n        const options = this.filteredOptions();\n        let selectedIndex = -1;\n\n        if (this.multiple()) {\n            const firstSelected = this.values()[0];\n            if (firstSelected) {\n                selectedIndex = options.findIndex((o) => o.id === firstSelected.id);\n            }\n        } else {\n            const selected = this.value();\n            if (selected) {\n                selectedIndex = options.findIndex((o) => o.id === selected.id);\n            }\n        }\n\n        this.focusedIndex.set(selectedIndex);\n\n        if (selectedIndex >= 0) {\n            setTimeout(() => this._scrollToFocusedOption());\n        }\n    }\n}\n\n","<div\n    #containerDiv\n    cdkOverlayOrigin\n    #trigger=\"cdkOverlayOrigin\"\n    class=\"select-container group flex h-[35px] w-full overflow-hidden rounded-[3px] border outline-1 outline-primary focus:outline\"\n    [class.pointer-events-none]=\"disabled()\"\n    [class.border-grayscale-20]=\"disabled()\"\n    [class.bg-grayscale-5]=\"disabled()\"\n    [class.pointer-events-auto]=\"!disabled()\"\n    [class.border-grayscale-30]=\"!disabled()\"\n    [class.bg-grayscale-0]=\"!disabled()\"\n    [attr.aria-disabled]=\"disabled()\"\n    [attr.aria-expanded]=\"showOptions()\"\n    [attr.aria-haspopup]=\"'listbox'\"\n    [attr.aria-controls]=\"componentId + '-listbox'\"\n    [attr.aria-owns]=\"showOptions() ? componentId + '-listbox' : null\"\n    [attr.aria-activedescendant]=\"showOptions() ? focusedOptionId() : null\"\n    role=\"combobox\"\n    (click)=\"onContainerDivClick()\"\n    (keydown)=\"onKeyDown($event)\"\n    tabindex=\"0\"\n    [attr.aria-label]=\"ariaLabel() || null\"\n    [attr.aria-labelledby]=\"ariaLabelledBy() || null\"\n>\n    <span\n        class=\"flex flex-grow select-none px-3 py-[7px]\"\n        [class.text-grayscale-90]=\"!disabled() && !isClean()\"\n        [class.text-grayscale-60]=\"!disabled() && isClean()\"\n        [class.text-grayscale-30]=\"disabled()\"\n    >\n        {{ print() || placeholder() }}\n    </span>\n\n    @if (!disabled() && showClear() && !isClean()) {\n        <button\n            class=\"mx-3\"\n            (click)=\"clear($event)\"\n            [attr.aria-label]=\"'platform.angular_components.aria_clear_selection' | translate\"\n        >\n            <i\n                class=\"fas fa-times flex items-center\"\n                aria-hidden=\"true\"\n            ></i>\n        </button>\n    }\n\n    <div\n        class=\"dropdown-container flex items-center border-l px-3 group-hover:bg-grayscale-10 group-focus:border-primary\"\n        [class.border-grayscale-20]=\"disabled()\"\n        [class.border-grayscale-30]=\"!disabled()\"\n    >\n        <i\n            class=\"fas\"\n            aria-hidden=\"true\"\n            [class.text-grayscale-30]=\"disabled()\"\n            [class.text-grayscale-90]=\"!disabled()\"\n            [class.fa-caret-down]=\"!showOptions()\"\n            [class.fa-caret-up]=\"showOptions()\"\n        ></i>\n    </div>\n</div>\n\n<ng-template\n    #dropdownTemplate\n    cdkConnectedOverlay\n    [cdkConnectedOverlayOrigin]=\"trigger\"\n    [cdkConnectedOverlayOpen]=\"showOptions()\"\n    [cdkConnectedOverlayHasBackdrop]=\"true\"\n    (backdropClick)=\"showOptions.set(false)\"\n    cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n    (detach)=\"showOptions.set(false)\"\n>\n    <div\n        [id]=\"componentId + '-listbox'\"\n        class=\"dropdown-body-class z-[1000] rounded-[3px] bg-grayscale-0 py-1 shadow-md\"\n        (click)=\"$event.stopPropagation()\"\n        [style.width.px]=\"containerDiv.offsetWidth\"\n        [attr.aria-multiselectable]=\"multiple() ? true : null\"\n        [@visibilityChanged]\n        role=\"listbox\"\n    >\n        @if (filter()) {\n            <div class=\"flex w-full items-center gap-3 px-3 py-1.5\">\n                @if (multiple()) {\n                    <s-checkbox\n                        #selectAllCheckbox\n                        [checked]=\"allSelected()\"\n                        [indeterminate]=\"selectAllIsIndeterminate()\"\n                        (checkedChange)=\"toggleSelectAll()\"\n                    ></s-checkbox>\n                }\n\n                <div class=\"relative flex h-[35px] grow\">\n                    <form\n                        class=\"flex w-full grow\"\n                        [formGroup]=\"filterForm\"\n                    >\n                        <input\n                            #filterInput\n                            class=\"w-full grow rounded-[3px] border border-grayscale-30 pl-2.5 pr-7 outline-1 outline-primary\"\n                            type=\"text\"\n                            formControlName=\"filter\"\n                            (click)=\"$event.stopPropagation()\"\n                            (keydown)=\"onFilterKeyDown($event)\"\n                            [attr.aria-label]=\"'platform.angular_components.filter_options' | translate\"\n                            [attr.aria-controls]=\"componentId + '-listbox'\"\n                            [attr.aria-activedescendant]=\"focusedOptionId()\"\n                            autocomplete=\"off\"\n                        />\n                    </form>\n                    <i\n                        class=\"fas fa-search absolute right-2.5 top-2.5 text-grayscale-90\"\n                        aria-hidden=\"true\"\n                    ></i>\n                </div>\n                <button\n                    (click)=\"clearFilter()\"\n                    [attr.aria-label]=\"'platform.angular_components.clear_filter' | translate\"\n                >\n                    <i\n                        class=\"fas fa-times flex items-center\"\n                        aria-hidden=\"true\"\n                    ></i>\n                </button>\n            </div>\n        }\n\n        <!-- Virtual scroll -->\n        @if (virtualScroll() && filteredOptions().length > 10) {\n            <cdk-virtual-scroll-viewport\n                [itemSize]=\"virtualScrollItemSize()\"\n                class=\"h-52 overflow-auto\"\n            >\n                <ng-container *cdkVirtualFor=\"let option of filteredOptions(); trackBy: trackById\">\n                    <s-select-option\n                        [id]=\"option.id\"\n                        [label]=\"getOptionLabel(option.data)\"\n                        [multiple]=\"multiple()\"\n                        [checkmark]=\"checkmark()\"\n                        [isSelected]=\"isOptionSelected(option)\"\n                        (selected)=\"selectItem(option)\"\n                        [isGrouper]=\"option.grouper ?? false\"\n                        [isFocused]=\"option.data === focusedItem()\"\n                    ></s-select-option>\n                </ng-container>\n            </cdk-virtual-scroll-viewport>\n        }\n\n        <!-- Normal list -->\n        @if (!virtualScroll() || filteredOptions().length <= 10) {\n            <ul class=\"max-h-52 overflow-auto\">\n                @for (option of filteredOptions(); track option.id) {\n                    <s-select-option\n                        [id]=\"option.id\"\n                        [label]=\"getOptionLabel(option.data)\"\n                        [multiple]=\"multiple()\"\n                        [checkmark]=\"checkmark()\"\n                        [isSelected]=\"isOptionSelected(option)\"\n                        (selected)=\"selectItem(option)\"\n                        [isGrouper]=\"option.grouper ?? false\"\n                        [isFocused]=\"option.data === focusedItem()\"\n                    ></s-select-option>\n                }\n            </ul>\n        }\n\n        @if (filteredOptions().length === 0) {\n            <span class=\"m-3 text-grayscale-60\">{{\n                emptyMessage() ?? 'platform.angular_components.no_records_found' | translate\n            }}</span>\n        }\n    </div>\n</ng-template>\n\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}