UNPKG

cfc-ds

Version:

Design System do Conselho Federal de Contabilidade baseado no govbr-ds

530 lines 83.7 kB
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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