cfc-ds
Version:
Design System do Conselho Federal de Contabilidade baseado no govbr-ds
530 lines • 83.7 kB
JavaScript
import { Component, EventEmitter, forwardRef, HostListener, Input, Output } from '@angular/core';
import { NG_VALUE_ACCESSOR, NG_VALIDATORS } from '@angular/forms';
import { SelectType } from '../../enums/select-type.enum';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "@angular/flex-layout/extended";
export class SelectComponent {
renderer;
el;
cdr;
// Inputs
options = [];
id;
label;
placeholder = '';
labelInline = false;
multiSelect = false;
feedbackMessage;
feedbackState;
showSearchIcon = true;
showSelectAll = false;
required = false;
ariaLabel;
ariaDescribedBy;
disabled = false;
type = SelectType.default;
// Outputs
onChange = new EventEmitter();
onOpen = new EventEmitter();
onClose = new EventEmitter();
// Internal properties
inputId;
searchTerm = '';
selectedValues = [];
filteredOptions = [];
selectAllChecked = false;
isOptionsListVisible = false;
highlightedIndex = -1;
displayValue = '';
isTooltipVisible = false;
tooltipPosition = { top: 0, left: 0 };
// ControlValueAccessor properties
onModelChange = (_) => { };
onModelTouched = () => { };
constructor(renderer, el, cdr) {
this.renderer = renderer;
this.el = el;
this.cdr = cdr;
this.inputId = this.id || `select-${Math.random().toString(36).substring(2, 9)}`;
}
ngOnInit() {
if (this.required && this.ariaDescribedBy) {
this.ariaDescribedBy = `${this.ariaDescribedBy} feedback-${this.inputId}`;
}
else if (this.required) {
this.ariaDescribedBy = `feedback-${this.inputId}`;
}
}
ngAfterViewInit() {
// Garante que filteredOptions sempre começa com todas as opções disponíveis
this.filteredOptions = [...this.options];
this.updateDisplayValue();
this.cdr.detectChanges();
}
// Handle keyboard navigation
handleKeyDown(event) {
if (this.disabled)
return;
switch (event.key) {
case 'ArrowDown':
event.preventDefault();
if (!this.isOptionsListVisible) {
this.openOptionsList();
}
else {
this.highlightNextItem();
}
break;
case 'ArrowUp':
event.preventDefault();
if (!this.isOptionsListVisible) {
this.openOptionsList();
}
else {
this.highlightPreviousItem();
}
break;
case 'Enter':
if (this.isOptionsListVisible && this.highlightedIndex >= 0) {
event.preventDefault();
if (this.highlightedIndex === 0 && this.showSelectAll && this.multiSelect) {
this.toggleSelectAll();
}
else {
const adjustedIndex = this.showSelectAll && this.multiSelect ? this.highlightedIndex - 1 : this.highlightedIndex;
if (adjustedIndex >= 0 && adjustedIndex < this.filteredOptions.length) {
this.toggleSelection(this.filteredOptions[adjustedIndex]);
}
}
}
else if (!this.isOptionsListVisible) {
this.openOptionsList();
}
break;
case ' ': // Space key
if (this.isOptionsListVisible && this.highlightedIndex >= 0) {
event.preventDefault();
if (this.highlightedIndex === 0 && this.showSelectAll && this.multiSelect) {
this.toggleSelectAll();
}
else {
const adjustedIndex = this.showSelectAll && this.multiSelect ? this.highlightedIndex - 1 : this.highlightedIndex;
if (adjustedIndex >= 0 && adjustedIndex < this.filteredOptions.length) {
this.toggleSelection(this.filteredOptions[adjustedIndex]);
}
}
}
break;
case 'Escape':
if (this.isOptionsListVisible) {
event.preventDefault();
this.closeOptionsList();
}
break;
case 'Tab':
if (this.isOptionsListVisible) {
this.closeOptionsList();
}
break;
default:
// Para filtro por primeira letra quando as teclas são letras ou números
if (event.key.length === 1 && /[a-zA-Z0-9]/.test(event.key)) {
// Implementação para filtrar por primeira letra
this.filterByFirstLetter(event.key);
}
break;
}
}
handleItemKeyDown(event, option) {
if (this.disabled)
return;
if (event.key === 'Enter' || event.key === ' ') {
event.preventDefault();
if (option === null && this.showSelectAll && this.multiSelect) {
this.toggleSelectAll();
}
else {
this.toggleSelection(option);
}
}
}
// Filter options by first letter
filterByFirstLetter(letter) {
if (this.disabled)
return;
letter = letter.toLowerCase();
// Find the first option that starts with the letter
const index = this.filteredOptions.findIndex(option => option.label.toLowerCase().startsWith(letter));
if (index >= 0) {
this.highlightedIndex = this.showSelectAll && this.multiSelect ? index + 1 : index;
// Scroll to the item
setTimeout(() => {
const listElement = this.el.nativeElement.querySelector('.br-list');
const optionElement = listElement?.querySelector(`.br-item:nth-child(${this.highlightedIndex + 1})`);
if (listElement && optionElement) {
listElement.scrollTop = optionElement.offsetTop - listElement.offsetTop;
}
});
}
}
// Highlight navigation
highlightNextItem() {
if (this.disabled)
return;
const maxIndex = this.getOptionsLength() - 1;
if (this.highlightedIndex < maxIndex) {
this.highlightedIndex++;
this.scrollToHighlightedItem();
}
}
highlightPreviousItem() {
if (this.disabled)
return;
if (this.highlightedIndex > 0) {
this.highlightedIndex--;
this.scrollToHighlightedItem();
}
}
scrollToHighlightedItem() {
if (this.disabled)
return;
setTimeout(() => {
const listElement = this.el.nativeElement.querySelector('.br-list');
const optionElement = listElement?.querySelector(`.br-item:nth-child(${this.highlightedIndex + 1})`);
if (listElement && optionElement) {
const optionTop = optionElement.offsetTop;
const optionBottom = optionTop + optionElement.offsetHeight;
const listTop = listElement.scrollTop;
const listBottom = listTop + listElement.offsetHeight;
if (optionTop < listTop) {
listElement.scrollTop = optionTop;
}
else if (optionBottom > listBottom) {
listElement.scrollTop = optionBottom - listElement.offsetHeight;
}
}
});
}
getOptionsLength() {
return this.filteredOptions.length + (this.showSelectAll && this.multiSelect ? 1 : 0);
}
// Open/close the options list
openOptionsList() {
if (this.disabled)
return;
// Resetar os filtros quando abrir a lista
if (this.searchTerm === '') {
this.filteredOptions = [...this.options];
}
this.isOptionsListVisible = true;
this.highlightedIndex = 0;
this.onOpen.emit();
this.cdr.detectChanges();
}
closeOptionsList() {
if (this.disabled)
return;
this.isOptionsListVisible = false;
this.highlightedIndex = -1;
this.onClose.emit();
}
toggleOptionsList() {
if (this.disabled)
return;
if (this.isOptionsListVisible) {
this.closeOptionsList();
}
else {
this.openOptionsList();
}
}
onInputFocus() {
if (this.disabled)
return;
this.openOptionsList();
this.onModelTouched();
}
// Selection logic
toggleSelection(option, event) {
if (this.disabled)
return;
// Se recebemos um evento, impedir a propagação padrão
if (event) {
event.preventDefault();
event.stopPropagation();
}
// Garantir que estamos trabalhando com o objeto correto
const targetOption = this.options.find(opt => opt.value === option.value);
if (!targetOption) {
console.warn('Option not found:', option);
return;
}
if (this.multiSelect) {
const index = this.selectedValues.findIndex(item => item.value === targetOption.value);
if (index > -1) {
// Remove do array de selecionados
this.selectedValues.splice(index, 1);
}
else {
// Adiciona ao array de selecionados
this.selectedValues.push(targetOption);
}
// Importante: force a detecção de mudanças após a alteração
this.updateSelectAllState();
this.cdr.detectChanges();
}
else {
this.selectedValues = [targetOption];
this.closeOptionsList();
}
this.updateDisplayValue();
// Notifica o FormControl
const valueToEmit = this.multiSelect ? this.selectedValues : (this.selectedValues.length > 0 ? this.selectedValues[0].value : null);
this.onModelChange(valueToEmit);
this.onModelTouched();
// Emite evento para componente pai
this.onChange.emit(this.selectedValues);
}
isOptionSelected(option) {
return this.selectedValues.some(item => item.value === option.value);
}
toggleSelectAll(event) {
if (this.disabled)
return;
if (event) {
event.preventDefault();
event.stopPropagation();
}
if (this.selectAllChecked) {
this.selectedValues = [];
this.selectAllChecked = false;
}
else {
this.selectedValues = [...this.filteredOptions];
this.selectAllChecked = true;
}
this.cdr.detectChanges(); // Force a detecção de mudanças
this.updateDisplayValue();
// Notifica o FormControl
this.onModelChange(this.selectedValues);
this.onModelTouched();
// Emite evento para componente pai
this.onChange.emit(this.selectedValues);
if (!this.multiSelect) {
this.closeOptionsList();
}
}
updateSelectAllState() {
if (this.disabled)
return;
if (this.filteredOptions.length === 0) {
this.selectAllChecked = false;
return;
}
if (this.selectedValues.length === 0) {
this.selectAllChecked = false;
}
else if (this.filteredOptions.every(option => this.selectedValues.some(selected => selected.value === option.value))) {
this.selectAllChecked = true;
}
else {
// Estado intermediário - alguns selecionados, mas não todos
this.selectAllChecked = false;
}
}
// Search functionality
onSearchChange(event) {
if (this.disabled)
return;
const target = event.target;
this.searchTerm = target.value.toLowerCase();
this.filteredOptions = this.options.filter(option => option.label.toLowerCase().includes(this.searchTerm));
// Reset highlight position
this.highlightedIndex = 0;
// Se não tiver a lista aberta, abre
if (!this.isOptionsListVisible) {
this.openOptionsList();
}
// Update select all state based on filtered options
this.updateSelectAllState();
}
// Display value formatting
updateDisplayValue() {
if (this.selectedValues.length === 0) {
this.displayValue = '';
return;
}
if (this.multiSelect) {
if (this.selectedValues.length === 1) {
// Quando há apenas um item selecionado
this.displayValue = this.selectedValues[0].label;
}
else {
// Quando há múltiplos itens: primeiro item + (número dos demais)
this.displayValue = `${this.selectedValues[0].label} + (${this.selectedValues.length - 1})`;
}
}
else {
// Para seleção única
this.displayValue = this.selectedValues[0].label;
}
}
// Click outside to close
onClick(event) {
const clickedInside = this.el.nativeElement.contains(event.target);
if (!clickedInside && this.isOptionsListVisible) {
this.closeOptionsList();
}
}
getFullSelectedText() {
if (this.selectedValues.length === 0) {
return '';
}
return this.selectedValues.map(v => v.label).join(', ');
}
showTooltip(event) {
if (this.disabled)
return;
if ((this.isTextTruncated() || this.selectedValues.length > 1) && this.selectedValues.length > 0) {
const containerElement = this.el.nativeElement.querySelector('.select-container');
const rect = containerElement.getBoundingClientRect();
// Calcula posição melhor
this.tooltipPosition = {
top: rect.height, // Logo abaixo do container
left: rect.width / 2 // Centralizado
};
this.isTooltipVisible = true;
this.cdr.detectChanges();
}
}
hideTooltip() {
this.isTooltipVisible = false;
}
isTextTruncated() {
const inputElement = this.el.nativeElement.querySelector('.select-input');
if (inputElement) {
// Certifique-se de que há um pequeno buffer para considerarmos truncado
return (inputElement.scrollWidth > inputElement.clientWidth + 2);
}
return false;
}
// Implementação ControlValueAccessor
writeValue(value) {
if (value === null || value === undefined) {
this.selectedValues = [];
}
else if (Array.isArray(value)) {
this.selectedValues = this.options.filter(option => value.some((val) => {
if (typeof val === 'object' && val !== null) {
return val.value === option.value;
}
else {
return val === option.value;
}
}));
}
else {
const selectedOption = this.options.find(option => option.value === value ||
(typeof value === 'object' && value !== null && JSON.stringify(option.value) === JSON.stringify(value)));
this.selectedValues = selectedOption ? [selectedOption] : [];
}
this.updateDisplayValue();
this.updateSelectAllState();
this.cdr.detectChanges();
}
registerOnChange(fn) {
this.onModelChange = fn;
}
registerOnTouched(fn) {
this.onModelTouched = fn;
}
setDisabledState(isDisabled) {
this.disabled = isDisabled;
if (isDisabled) {
// Ensure the dropdown is closed when disabled
this.isOptionsListVisible = false;
}
this.cdr.detectChanges();
}
// Implementação do Validator
validate(control) {
if (this.required) {
const value = control.value;
if (value === null || value === undefined ||
(Array.isArray(value) && value.length === 0) ||
value === '') {
return { required: true };
}
}
return null;
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SelectComponent, deps: [{ token: i0.Renderer2 }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: SelectComponent, selector: "cfc-select", inputs: { options: "options", id: "id", label: "label", placeholder: "placeholder", labelInline: "labelInline", multiSelect: "multiSelect", feedbackMessage: "feedbackMessage", feedbackState: "feedbackState", showSearchIcon: "showSearchIcon", showSelectAll: "showSelectAll", required: "required", ariaLabel: "ariaLabel", ariaDescribedBy: "ariaDescribedBy", disabled: "disabled", type: "type" }, outputs: { onChange: "onChange", onOpen: "onOpen", onClose: "onClose" }, host: { listeners: { "document:click": "onClick($event)" } }, providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => SelectComponent),
multi: true
},
{
provide: NG_VALIDATORS,
useExisting: forwardRef(() => SelectComponent),
multi: true
}
], ngImport: i0, template: "<!-- select.component.html -->\r\n<!-- Layout segue o padr\u00E3o \"br-select\" do GovBR-DS (core.min.css carregado globalmente). -->\r\n<div class=\"br-select\"\r\n [class.disabled]=\"disabled\"\r\n [class.pagination-select]=\"type === 'pagination'\"\r\n [attr.multiple]=\"multiSelect ? 'multiple' : null\"\r\n role=\"combobox\"\r\n [attr.aria-expanded]=\"isOptionsListVisible && !disabled\"\r\n [attr.aria-haspopup]=\"!disabled\"\r\n [attr.aria-owns]=\"'list-' + inputId\"\r\n [attr.aria-required]=\"required\"\r\n [attr.aria-disabled]=\"disabled\">\r\n\r\n <div class=\"br-input\">\r\n <label *ngIf=\"label\" [for]=\"inputId\" [class.required]=\"required\">{{ label }}</label>\r\n <input\r\n [id]=\"inputId\"\r\n type=\"text\"\r\n [placeholder]=\"placeholder\"\r\n [attr.aria-label]=\"ariaLabel || label || 'Select'\"\r\n [attr.aria-describedby]=\"ariaDescribedBy\"\r\n [attr.aria-autocomplete]=\"'list'\"\r\n [attr.aria-controls]=\"'list-' + inputId\"\r\n [value]=\"displayValue\"\r\n [disabled]=\"disabled\"\r\n (input)=\"onSearchChange($event)\"\r\n (focus)=\"onInputFocus()\"\r\n (keydown)=\"handleKeyDown($event)\" />\r\n <button\r\n class=\"br-button\"\r\n type=\"button\"\r\n aria-label=\"Exibir lista\"\r\n tabindex=\"-1\"\r\n data-trigger=\"data-trigger\"\r\n [disabled]=\"disabled\"\r\n (click)=\"toggleOptionsList()\">\r\n <i class=\"fas\" [ngClass]=\"isOptionsListVisible ? 'fa-angle-up' : 'fa-angle-down'\" aria-hidden=\"true\"></i>\r\n </button>\r\n </div>\r\n\r\n <div class=\"br-list\"\r\n [id]=\"'list-' + inputId\"\r\n role=\"listbox\"\r\n [attr.aria-multiselectable]=\"multiSelect\"\r\n [attr.aria-labelledby]=\"inputId\"\r\n [attr.expanded]=\"isOptionsListVisible && !disabled ? 'expanded' : null\"\r\n tabindex=\"0\">\r\n\r\n <!-- Selecionar todos (apenas m\u00FAltipla sele\u00E7\u00E3o) -->\r\n <div *ngIf=\"showSelectAll && multiSelect\"\r\n class=\"br-item highlighted\"\r\n data-all=\"data-all\"\r\n role=\"option\"\r\n tabindex=\"-1\"\r\n [class.selected]=\"selectAllChecked\"\r\n [class.is-focused]=\"highlightedIndex === 0\"\r\n (click)=\"toggleSelectAll($event)\"\r\n (keydown)=\"handleItemKeyDown($event, null)\">\r\n <div class=\"br-checkbox\">\r\n <input\r\n type=\"checkbox\"\r\n [id]=\"'select-all-' + inputId\"\r\n [checked]=\"selectAllChecked\"\r\n tabindex=\"-1\"\r\n (click)=\"$event.preventDefault()\" />\r\n <label [for]=\"'select-all-' + inputId\">\r\n {{ selectAllChecked ? 'Desselecionar todos' : 'Selecionar todos' }}\r\n </label>\r\n </div>\r\n </div>\r\n\r\n <!-- Itens -->\r\n <div *ngFor=\"let option of filteredOptions; let i = index\"\r\n class=\"br-item\"\r\n role=\"option\"\r\n tabindex=\"-1\"\r\n [id]=\"'option-' + inputId + '-' + i\"\r\n [attr.aria-selected]=\"isOptionSelected(option)\"\r\n [class.selected]=\"isOptionSelected(option)\"\r\n [class.is-focused]=\"highlightedIndex === (showSelectAll && multiSelect ? i + 1 : i)\"\r\n (click)=\"toggleSelection(option, $event)\"\r\n (keydown)=\"handleItemKeyDown($event, option)\">\r\n\r\n <!-- M\u00FAltipla sele\u00E7\u00E3o: checkbox -->\r\n <div class=\"br-checkbox\" *ngIf=\"multiSelect\">\r\n <input\r\n type=\"checkbox\"\r\n [id]=\"'option-checkbox-' + inputId + '-' + i\"\r\n [checked]=\"isOptionSelected(option)\"\r\n tabindex=\"-1\"\r\n (click)=\"$event.preventDefault()\" />\r\n <label [for]=\"'option-checkbox-' + inputId + '-' + i\">{{ option.label }}</label>\r\n </div>\r\n\r\n <!-- Sele\u00E7\u00E3o \u00FAnica: radio -->\r\n <div class=\"br-radio\" *ngIf=\"!multiSelect\">\r\n <input\r\n type=\"radio\"\r\n [id]=\"'option-radio-' + inputId + '-' + i\"\r\n [name]=\"'radio-' + inputId\"\r\n [value]=\"option.value\"\r\n [checked]=\"isOptionSelected(option)\"\r\n tabindex=\"-1\"\r\n (click)=\"$event.preventDefault()\" />\r\n <label [for]=\"'option-radio-' + inputId + '-' + i\">{{ option.label }}</label>\r\n </div>\r\n </div>\r\n\r\n <!-- Estado vazio -->\r\n <div *ngIf=\"filteredOptions.length === 0\"\r\n class=\"br-item empty-state\"\r\n role=\"option\"\r\n aria-disabled=\"true\">\r\n Nenhum item encontrado.\r\n </div>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"feedbackMessage\"\r\n class=\"select-feedback\"\r\n [ngClass]=\"feedbackState\"\r\n [id]=\"'feedback-' + inputId\"\r\n aria-live=\"polite\">\r\n {{ feedbackMessage }}\r\n </div>\r\n</div>\r\n", styles: ["@charset \"UTF-8\";:host{display:block;width:100%}.br-select{width:100%;max-width:none}.br-select .br-input{cursor:pointer}.br-select .br-input label.required:after{content:\"*\";color:var(--danger, #e52207);margin-left:4px}.br-select .br-item.is-focused:not(.selected){background-color:var(--gray-2, #f8f8f8);outline:2px solid var(--focus-color, #c5d4eb);outline-offset:-2px}.br-select .br-item.selected{background-color:#1351b4}.br-select .br-item.selected,.br-select .br-item.selected label,.br-select .br-item.selected .br-radio label,.br-select .br-item.selected .br-checkbox label{color:#fff}.br-select .br-item.selected.is-focused{background-color:#1351b4}.br-select .br-item.empty-state{color:var(--gray-60, #888);font-style:italic;padding:var(--spacing-scale-2x, 16px);cursor:default}.select-feedback{font-size:14px;margin-top:4px}.select-feedback.danger{color:#e52207}.select-feedback.success{color:#168821}.select-feedback.warning{color:#c98a00}.select-feedback.info{color:#155bcb}.br-select.pagination-select{min-width:0}.br-select.pagination-select .br-input input{text-align:center;font-weight:500}.br-select.pagination-select .br-list{text-align:center}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }] });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SelectComponent, decorators: [{
type: Component,
args: [{ selector: 'cfc-select', providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => SelectComponent),
multi: true
},
{
provide: NG_VALIDATORS,
useExisting: forwardRef(() => SelectComponent),
multi: true
}
], template: "<!-- select.component.html -->\r\n<!-- Layout segue o padr\u00E3o \"br-select\" do GovBR-DS (core.min.css carregado globalmente). -->\r\n<div class=\"br-select\"\r\n [class.disabled]=\"disabled\"\r\n [class.pagination-select]=\"type === 'pagination'\"\r\n [attr.multiple]=\"multiSelect ? 'multiple' : null\"\r\n role=\"combobox\"\r\n [attr.aria-expanded]=\"isOptionsListVisible && !disabled\"\r\n [attr.aria-haspopup]=\"!disabled\"\r\n [attr.aria-owns]=\"'list-' + inputId\"\r\n [attr.aria-required]=\"required\"\r\n [attr.aria-disabled]=\"disabled\">\r\n\r\n <div class=\"br-input\">\r\n <label *ngIf=\"label\" [for]=\"inputId\" [class.required]=\"required\">{{ label }}</label>\r\n <input\r\n [id]=\"inputId\"\r\n type=\"text\"\r\n [placeholder]=\"placeholder\"\r\n [attr.aria-label]=\"ariaLabel || label || 'Select'\"\r\n [attr.aria-describedby]=\"ariaDescribedBy\"\r\n [attr.aria-autocomplete]=\"'list'\"\r\n [attr.aria-controls]=\"'list-' + inputId\"\r\n [value]=\"displayValue\"\r\n [disabled]=\"disabled\"\r\n (input)=\"onSearchChange($event)\"\r\n (focus)=\"onInputFocus()\"\r\n (keydown)=\"handleKeyDown($event)\" />\r\n <button\r\n class=\"br-button\"\r\n type=\"button\"\r\n aria-label=\"Exibir lista\"\r\n tabindex=\"-1\"\r\n data-trigger=\"data-trigger\"\r\n [disabled]=\"disabled\"\r\n (click)=\"toggleOptionsList()\">\r\n <i class=\"fas\" [ngClass]=\"isOptionsListVisible ? 'fa-angle-up' : 'fa-angle-down'\" aria-hidden=\"true\"></i>\r\n </button>\r\n </div>\r\n\r\n <div class=\"br-list\"\r\n [id]=\"'list-' + inputId\"\r\n role=\"listbox\"\r\n [attr.aria-multiselectable]=\"multiSelect\"\r\n [attr.aria-labelledby]=\"inputId\"\r\n [attr.expanded]=\"isOptionsListVisible && !disabled ? 'expanded' : null\"\r\n tabindex=\"0\">\r\n\r\n <!-- Selecionar todos (apenas m\u00FAltipla sele\u00E7\u00E3o) -->\r\n <div *ngIf=\"showSelectAll && multiSelect\"\r\n class=\"br-item highlighted\"\r\n data-all=\"data-all\"\r\n role=\"option\"\r\n tabindex=\"-1\"\r\n [class.selected]=\"selectAllChecked\"\r\n [class.is-focused]=\"highlightedIndex === 0\"\r\n (click)=\"toggleSelectAll($event)\"\r\n (keydown)=\"handleItemKeyDown($event, null)\">\r\n <div class=\"br-checkbox\">\r\n <input\r\n type=\"checkbox\"\r\n [id]=\"'select-all-' + inputId\"\r\n [checked]=\"selectAllChecked\"\r\n tabindex=\"-1\"\r\n (click)=\"$event.preventDefault()\" />\r\n <label [for]=\"'select-all-' + inputId\">\r\n {{ selectAllChecked ? 'Desselecionar todos' : 'Selecionar todos' }}\r\n </label>\r\n </div>\r\n </div>\r\n\r\n <!-- Itens -->\r\n <div *ngFor=\"let option of filteredOptions; let i = index\"\r\n class=\"br-item\"\r\n role=\"option\"\r\n tabindex=\"-1\"\r\n [id]=\"'option-' + inputId + '-' + i\"\r\n [attr.aria-selected]=\"isOptionSelected(option)\"\r\n [class.selected]=\"isOptionSelected(option)\"\r\n [class.is-focused]=\"highlightedIndex === (showSelectAll && multiSelect ? i + 1 : i)\"\r\n (click)=\"toggleSelection(option, $event)\"\r\n (keydown)=\"handleItemKeyDown($event, option)\">\r\n\r\n <!-- M\u00FAltipla sele\u00E7\u00E3o: checkbox -->\r\n <div class=\"br-checkbox\" *ngIf=\"multiSelect\">\r\n <input\r\n type=\"checkbox\"\r\n [id]=\"'option-checkbox-' + inputId + '-' + i\"\r\n [checked]=\"isOptionSelected(option)\"\r\n tabindex=\"-1\"\r\n (click)=\"$event.preventDefault()\" />\r\n <label [for]=\"'option-checkbox-' + inputId + '-' + i\">{{ option.label }}</label>\r\n </div>\r\n\r\n <!-- Sele\u00E7\u00E3o \u00FAnica: radio -->\r\n <div class=\"br-radio\" *ngIf=\"!multiSelect\">\r\n <input\r\n type=\"radio\"\r\n [id]=\"'option-radio-' + inputId + '-' + i\"\r\n [name]=\"'radio-' + inputId\"\r\n [value]=\"option.value\"\r\n [checked]=\"isOptionSelected(option)\"\r\n tabindex=\"-1\"\r\n (click)=\"$event.preventDefault()\" />\r\n <label [for]=\"'option-radio-' + inputId + '-' + i\">{{ option.label }}</label>\r\n </div>\r\n </div>\r\n\r\n <!-- Estado vazio -->\r\n <div *ngIf=\"filteredOptions.length === 0\"\r\n class=\"br-item empty-state\"\r\n role=\"option\"\r\n aria-disabled=\"true\">\r\n Nenhum item encontrado.\r\n </div>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"feedbackMessage\"\r\n class=\"select-feedback\"\r\n [ngClass]=\"feedbackState\"\r\n [id]=\"'feedback-' + inputId\"\r\n aria-live=\"polite\">\r\n {{ feedbackMessage }}\r\n </div>\r\n</div>\r\n", styles: ["@charset \"UTF-8\";:host{display:block;width:100%}.br-select{width:100%;max-width:none}.br-select .br-input{cursor:pointer}.br-select .br-input label.required:after{content:\"*\";color:var(--danger, #e52207);margin-left:4px}.br-select .br-item.is-focused:not(.selected){background-color:var(--gray-2, #f8f8f8);outline:2px solid var(--focus-color, #c5d4eb);outline-offset:-2px}.br-select .br-item.selected{background-color:#1351b4}.br-select .br-item.selected,.br-select .br-item.selected label,.br-select .br-item.selected .br-radio label,.br-select .br-item.selected .br-checkbox label{color:#fff}.br-select .br-item.selected.is-focused{background-color:#1351b4}.br-select .br-item.empty-state{color:var(--gray-60, #888);font-style:italic;padding:var(--spacing-scale-2x, 16px);cursor:default}.select-feedback{font-size:14px;margin-top:4px}.select-feedback.danger{color:#e52207}.select-feedback.success{color:#168821}.select-feedback.warning{color:#c98a00}.select-feedback.info{color:#155bcb}.br-select.pagination-select{min-width:0}.br-select.pagination-select .br-input input{text-align:center;font-weight:500}.br-select.pagination-select .br-list{text-align:center}\n"] }]
}], ctorParameters: () => [{ type: i0.Renderer2 }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }], propDecorators: { options: [{
type: Input
}], id: [{
type: Input
}], label: [{
type: Input
}], placeholder: [{
type: Input
}], labelInline: [{
type: Input
}], multiSelect: [{
type: Input
}], feedbackMessage: [{
type: Input
}], feedbackState: [{
type: Input
}], showSearchIcon: [{
type: Input
}], showSelectAll: [{
type: Input
}], required: [{
type: Input
}], ariaLabel: [{
type: Input
}], ariaDescribedBy: [{
type: Input
}], disabled: [{
type: Input
}], type: [{
type: Input
}], onChange: [{
type: Output
}], onOpen: [{
type: Output
}], onClose: [{
type: Output
}], onClick: [{
type: HostListener,
args: ['document:click', ['$event']]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NmYy1kcy9zcmMvbGliL2NvbXBvbmVudHMvc2VsZWN0L3NlbGVjdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jZmMtZHMvc3JjL2xpYi9jb21wb25lbnRzL3NlbGVjdC9zZWxlY3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUdMLFNBQVMsRUFFVCxZQUFZLEVBQ1osVUFBVSxFQUNWLFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUdQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsYUFBYSxFQUFnRCxNQUFNLGdCQUFnQixDQUFDO0FBRXRJLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQTs7OztBQW1CekQsTUFBTSxPQUFPLGVBQWU7SUF5Q2hCO0lBQ0E7SUFDQTtJQTFDVixTQUFTO0lBQ0EsT0FBTyxHQUFVLEVBQUUsQ0FBQztJQUNwQixFQUFFLENBQVU7SUFDWixLQUFLLENBQVU7SUFDZixXQUFXLEdBQVksRUFBRSxDQUFDO0lBQzFCLFdBQVcsR0FBRyxLQUFLLENBQUM7SUFDcEIsV0FBVyxHQUFHLEtBQUssQ0FBQztJQUNwQixlQUFlLENBQVU7SUFDekIsYUFBYSxDQUFnQjtJQUM3QixjQUFjLEdBQVksSUFBSSxDQUFDO0lBQy9CLGFBQWEsR0FBWSxLQUFLLENBQUM7SUFDL0IsUUFBUSxHQUFZLEtBQUssQ0FBQztJQUMxQixTQUFTLENBQVU7SUFDbkIsZUFBZSxDQUFVO0lBQ3pCLFFBQVEsR0FBWSxLQUFLLENBQUM7SUFDMUIsSUFBSSxHQUFlLFVBQVUsQ0FBQyxPQUFPLENBQUM7SUFFL0MsVUFBVTtJQUNBLFFBQVEsR0FBd0IsSUFBSSxZQUFZLEVBQVMsQ0FBQztJQUMxRCxNQUFNLEdB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