@seniorsistemas/angular-components 19.9.3 → 19.9.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/checkbox/lib/checkbox/checkbox.component.d.ts +1 -6
- package/checkbox-list/lib/checkbox-list/checkbox-list.component.d.ts +8 -0
- package/content-generator/lib/content-generator/content-generator.component.d.ts +2 -2
- package/country-phone-picker/lib/country-phone-picker/country-phone-picker.component.d.ts +2 -0
- package/drawer/README.md +9 -2
- package/drawer/lib/drawer/drawer.component.d.ts +12 -1
- package/editor/lib/editor/editor.component.d.ts +1 -1
- package/esm2022/button/lib/button/button.component.mjs +3 -3
- package/esm2022/checkbox/lib/checkbox/checkbox.component.mjs +3 -9
- package/esm2022/checkbox-list/lib/checkbox-list/checkbox-list.component.mjs +17 -5
- package/esm2022/content-generator/lib/content-generator/content-generator.component.mjs +9 -8
- package/esm2022/country-phone-picker/lib/country-phone-picker/country-phone-picker.component.mjs +18 -3
- package/esm2022/drawer/lib/drawer/drawer.component.mjs +33 -11
- package/esm2022/drawer/lib/drawer/drawer.module.mjs +2 -2
- package/esm2022/dynamic-form/dynamic-form/components/lookup/lookup.component.mjs +3 -3
- package/esm2022/dynamic-form/dynamic-form/form-field/fields/bignumber/bignumber-field.component.mjs +3 -3
- package/esm2022/dynamic-form/dynamic-form/form-field/fields/boolean/boolean-switch-field/boolean-switch-field.component.mjs +3 -3
- package/esm2022/dynamic-form/dynamic-form/form-field/fields/checkbox/checkbox-field.component.mjs +4 -3
- package/esm2022/dynamic-form/dynamic-form/form-field/fields/currency/currency-field.component.mjs +3 -3
- package/esm2022/dynamic-form/dynamic-form/form-field/fields/number/number-field.component.mjs +3 -3
- package/esm2022/dynamic-form/dynamic-form/form-field/fields/password/password-field.component.mjs +3 -3
- package/esm2022/dynamic-form/dynamic-form/form-field/fields/text/text-field.component.mjs +3 -3
- package/esm2022/editor/lib/editor/editor.component.mjs +8 -8
- package/esm2022/file-picker/lib/file-picker/file-picker.component.mjs +4 -4
- package/esm2022/global-search/lib/global-search/components/dropdown/global-search-dropdown-item.component.mjs +4 -4
- package/esm2022/global-search/lib/global-search/global-search.module.mjs +2 -2
- package/esm2022/inline-edit/lib/inline-edit/components/fields/inline-edit-number/inline-edit-number.component.mjs +3 -3
- package/esm2022/inline-edit/lib/inline-edit/components/fields/inline-edit-text/inline-edit-text.component.mjs +2 -3
- package/esm2022/paginator/lib/models/paginator.models.mjs +1 -1
- package/esm2022/paginator/lib/paginator/paginator.component.mjs +19 -13
- package/esm2022/profile-picture-picker/lib/profile-picture-picker/profile-picture-picker.component.mjs +19 -8
- package/esm2022/profile-picture-picker/lib/profile-picture-picker/profile-picture-picker.module.mjs +3 -4
- package/esm2022/select/lib/select/select.component.mjs +3 -3
- package/esm2022/side-sheet/lib/side-sheet/side-sheet.component.mjs +6 -5
- package/esm2022/slider/lib/slider/slider.component.mjs +3 -3
- package/esm2022/speech-recognition/lib/speech-recognition/speech-recognition/speech-recognition.component.mjs +54 -8
- package/esm2022/star-rating/star-rating/star-rating.component.mjs +3 -3
- package/esm2022/table-header/lib/table-header/table-header-checkbox.component.mjs +14 -21
- package/esm2022/text-area/lib/text-area/text-area.component.mjs +3 -3
- package/esm2022/tooltip/lib/tooltip/tooltip.directive.mjs +3 -2
- package/esm2022/utils/lib/utils/utils.mjs +49 -3
- package/fesm2022/seniorsistemas-angular-components-button.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-button.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-checkbox-list.mjs +16 -4
- package/fesm2022/seniorsistemas-angular-components-checkbox-list.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-checkbox.mjs +2 -8
- package/fesm2022/seniorsistemas-angular-components-checkbox.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-content-generator.mjs +8 -6
- package/fesm2022/seniorsistemas-angular-components-content-generator.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-country-phone-picker.mjs +17 -2
- package/fesm2022/seniorsistemas-angular-components-country-phone-picker.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-drawer.mjs +32 -9
- package/fesm2022/seniorsistemas-angular-components-drawer.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs +16 -16
- package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-editor.mjs +7 -7
- package/fesm2022/seniorsistemas-angular-components-editor.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-file-picker.mjs +3 -3
- package/fesm2022/seniorsistemas-angular-components-file-picker.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-global-search.mjs +3 -3
- package/fesm2022/seniorsistemas-angular-components-global-search.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-inline-edit.mjs +3 -4
- package/fesm2022/seniorsistemas-angular-components-inline-edit.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-paginator.mjs +18 -12
- package/fesm2022/seniorsistemas-angular-components-paginator.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-profile-picture-picker.mjs +20 -9
- package/fesm2022/seniorsistemas-angular-components-profile-picture-picker.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-select.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-select.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-side-sheet.mjs +5 -4
- package/fesm2022/seniorsistemas-angular-components-side-sheet.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-slider.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-slider.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-speech-recognition.mjs +53 -7
- package/fesm2022/seniorsistemas-angular-components-speech-recognition.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-star-rating.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-star-rating.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-table-header.mjs +13 -20
- package/fesm2022/seniorsistemas-angular-components-table-header.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-text-area.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-text-area.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-tooltip.mjs +2 -1
- package/fesm2022/seniorsistemas-angular-components-tooltip.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-utils.mjs +49 -3
- package/fesm2022/seniorsistemas-angular-components-utils.mjs.map +1 -1
- package/global-search/lib/global-search/global-search.module.d.ts +1 -1
- package/package.json +7 -9
- package/paginator/lib/models/paginator.models.d.ts +1 -0
- package/paginator/lib/paginator/paginator.component.d.ts +3 -1
- package/profile-picture-picker/lib/profile-picture-picker/profile-picture-picker.component.d.ts +3 -1
- package/side-sheet/README.md +4 -4
- package/side-sheet/lib/side-sheet/side-sheet.component.d.ts +1 -0
- package/speech-recognition/lib/speech-recognition/speech-recognition/speech-recognition.component.d.ts +2 -1
- package/table-header/lib/table-header/table-header-checkbox.component.d.ts +1 -4
- package/utils/lib/utils/utils.d.ts +21 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"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';\r\n\r\nimport { CheckboxComponent } from '@seniorsistemas/angular-components/checkbox';\r\n\r\n@Component({\r\n selector: 's-select-option',\r\n templateUrl: './select-option.component.html',\r\n standalone: true,\r\n imports: [CheckboxComponent],\r\n})\r\nexport class SelectOptionComponent {\r\n public id = input.required<string>();\r\n public label = input.required<string>();\r\n public multiple = input.required<boolean>();\r\n public checkmark = input.required<boolean>();\r\n public isGrouper = input.required<boolean>();\r\n public isFocused = input.required<boolean>();\r\n\r\n public isSelected = model.required<boolean>();\r\n\r\n public selected = output();\r\n\r\n public onClick(): void {\r\n if (this.isGrouper()) {\r\n return;\r\n }\r\n\r\n this.selected.emit();\r\n }\r\n}\r\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';\n\nimport {\n AfterViewInit,\n Component,\n computed,\n ElementRef,\n forwardRef,\n inject,\n input,\n model,\n OnDestroy,\n OnInit,\n Renderer2,\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 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, AfterViewInit, OnDestroy {\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 private readonly _externalAriaLabelledBy = signal('');\n\n /**\n * ID do label resolvido para `aria-labelledby` do combobox interno.\n * Prioriza o valor explícito de `ariaLabelledBy`; caso contrário, usa o id de um\n * `<label for=\"...\">` externo associado ao host (detectado em runtime).\n */\n public readonly resolvedAriaLabelledBy = computed(() => {\n return this.ariaLabelledBy() || this._externalAriaLabelledBy();\n });\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 _clickableLabel: HTMLLabelElement | null = null;\n\n private readonly _translateService = inject(TranslateService);\n private readonly _hostRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly _renderer = inject(Renderer2);\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 // A escrita em value/values é necessária para sincronizar o ControlValueAccessor.\n effect(\n () => {\n const opts = this.options();\n if (opts.length && this._pendingValue !== null) {\n this._applyPendingValue();\n }\n },\n { allowSignalWrites: true },\n );\n }\n\n public ngOnInit(): void {\n this._validateInputs();\n }\n\n public ngAfterViewInit(): void {\n this._associateExternalLabel();\n }\n\n public ngOnDestroy(): void {\n this._clickableLabel?.removeEventListener('click', this._onLabelClick);\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 blocos @for 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 * Associa um `<label for=\"...\">` externo (que aponta para o `id` do host) ao\n * combobox interno, resolvendo o problema de \"orphaned label\".\n *\n * Como o host `s-select` não é um elemento rotulável (labelable), o `for` não\n * cria vínculo programático. Este método:\n * - localiza o label que referencia o `id` do host;\n * - garante que esse label tenha um `id`;\n * - aponta o `aria-labelledby` do combobox para esse label;\n * - adiciona um clique no label para focar o combobox (equivalente ao `for`).\n *\n * Não sobrescreve um `ariaLabelledBy` explícito informado pelo consumidor.\n * @private\n */\n private _associateExternalLabel(): void {\n if (this.ariaLabelledBy()) {\n return;\n }\n\n const hostId = this._hostRef.nativeElement.id;\n if (!hostId) {\n return;\n }\n\n const label = this._findLabelFor(hostId);\n if (!label) {\n return;\n }\n\n if (!label.id) {\n this._renderer.setAttribute(label, 'id', `${this.componentId}-label`);\n }\n\n this._externalAriaLabelledBy.set(label.id);\n\n // O atributo `for` não funcionlda em host não-rotulável, então replicamos\n // o comportamento de \"clicar no label foca o controle\" manualmente.\n this._clickableLabel = label;\n label.addEventListener('click', this._onLabelClick);\n }\n\n /**\n * Localiza o `<label>` cujo atributo `for` corresponde ao id informado.\n * @private\n * @param hostId Id do host referenciado pelo label.\n * @returns O elemento label correspondente ou `null`.\n */\n private _findLabelFor(hostId: string): HTMLLabelElement | null {\n const labels = document.querySelectorAll<HTMLLabelElement>('label[for]');\n for (const label of Array.from(labels)) {\n if (label.getAttribute('for') === hostId) {\n return label;\n }\n }\n return null;\n }\n\n /**\n * Move o foco para o combobox interno ao clicar no label externo associado.\n * @private\n */\n private readonly _onLabelClick = (): void => {\n if (this.disabled()) {\n return;\n }\n this._containerDiv()?.nativeElement.focus();\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","<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 [id]=\"componentId + '-combobox'\"\n (click)=\"onContainerDivClick()\"\n (keydown)=\"onKeyDown($event)\"\n tabindex=\"0\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [attr.aria-labelledby]=\"resolvedAriaLabelledBy() || 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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"}
|
|
1
|
+
{"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';\r\n\r\nimport { CheckboxComponent } from '@seniorsistemas/angular-components/checkbox';\r\n\r\n@Component({\r\n selector: 's-select-option',\r\n templateUrl: './select-option.component.html',\r\n standalone: true,\r\n imports: [CheckboxComponent],\r\n})\r\nexport class SelectOptionComponent {\r\n public id = input.required<string>();\r\n public label = input.required<string>();\r\n public multiple = input.required<boolean>();\r\n public checkmark = input.required<boolean>();\r\n public isGrouper = input.required<boolean>();\r\n public isFocused = input.required<boolean>();\r\n\r\n public isSelected = model.required<boolean>();\r\n\r\n public selected = output();\r\n\r\n public onClick(): void {\r\n if (this.isGrouper()) {\r\n return;\r\n }\r\n\r\n this.selected.emit();\r\n }\r\n}\r\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';\n\nimport {\n AfterViewInit,\n Component,\n computed,\n ElementRef,\n forwardRef,\n inject,\n input,\n model,\n OnDestroy,\n OnInit,\n Renderer2,\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 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, AfterViewInit, OnDestroy {\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 private readonly _externalAriaLabelledBy = signal('');\n\n /**\n * ID do label resolvido para `aria-labelledby` do combobox interno.\n * Prioriza o valor explícito de `ariaLabelledBy`; caso contrário, usa o id de um\n * `<label for=\"...\">` externo associado ao host (detectado em runtime).\n */\n public readonly resolvedAriaLabelledBy = computed(() => {\n return this.ariaLabelledBy() || this._externalAriaLabelledBy();\n });\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 _clickableLabel: HTMLLabelElement | null = null;\n\n private readonly _translateService = inject(TranslateService);\n private readonly _hostRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly _renderer = inject(Renderer2);\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 // A escrita em value/values é necessária para sincronizar o ControlValueAccessor.\n effect(\n () => {\n const opts = this.options();\n if (opts.length && this._pendingValue !== null) {\n this._applyPendingValue();\n }\n },\n { allowSignalWrites: true },\n );\n }\n\n public ngOnInit(): void {\n this._validateInputs();\n }\n\n public ngAfterViewInit(): void {\n this._associateExternalLabel();\n }\n\n public ngOnDestroy(): void {\n this._clickableLabel?.removeEventListener('click', this._onLabelClick);\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 blocos @for 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 * Associa um `<label for=\"...\">` externo (que aponta para o `id` do host) ao\n * combobox interno, resolvendo o problema de \"orphaned label\".\n *\n * Como o host `s-select` não é um elemento rotulável (labelable), o `for` não\n * cria vínculo programático. Este método:\n * - localiza o label que referencia o `id` do host;\n * - garante que esse label tenha um `id`;\n * - aponta o `aria-labelledby` do combobox para esse label;\n * - adiciona um clique no label para focar o combobox (equivalente ao `for`).\n *\n * Não sobrescreve um `ariaLabelledBy` explícito informado pelo consumidor.\n * @private\n */\n private _associateExternalLabel(): void {\n if (this.ariaLabelledBy()) {\n return;\n }\n\n const hostId = this._hostRef.nativeElement.id;\n if (!hostId) {\n return;\n }\n\n const label = this._findLabelFor(hostId);\n if (!label) {\n return;\n }\n\n if (!label.id) {\n this._renderer.setAttribute(label, 'id', `${this.componentId}-label`);\n }\n\n this._externalAriaLabelledBy.set(label.id);\n\n // O atributo `for` não funcionlda em host não-rotulável, então replicamos\n // o comportamento de \"clicar no label foca o controle\" manualmente.\n this._clickableLabel = label;\n label.addEventListener('click', this._onLabelClick);\n }\n\n /**\n * Localiza o `<label>` cujo atributo `for` corresponde ao id informado.\n * @private\n * @param hostId Id do host referenciado pelo label.\n * @returns O elemento label correspondente ou `null`.\n */\n private _findLabelFor(hostId: string): HTMLLabelElement | null {\n const labels = document.querySelectorAll<HTMLLabelElement>('label[for]');\n for (const label of Array.from(labels)) {\n if (label.getAttribute('for') === hostId) {\n return label;\n }\n }\n return null;\n }\n\n /**\n * Move o foco para o combobox interno ao clicar no label externo associado.\n * @private\n */\n private readonly _onLabelClick = (): void => {\n if (this.disabled()) {\n return;\n }\n this._containerDiv()?.nativeElement.focus();\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","<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 [id]=\"componentId + '-combobox'\"\n (click)=\"onContainerDivClick()\"\n (keydown)=\"onKeyDown($event)\"\n [attr.tabindex]=\"disabled() ? -1 : 0\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [attr.aria-labelledby]=\"resolvedAriaLabelledBy() || 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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"}
|
|
@@ -3,7 +3,7 @@ import { trigger, transition, style, animate } from '@angular/animations';
|
|
|
3
3
|
import { CdkTrapFocus } from '@angular/cdk/a11y';
|
|
4
4
|
import * as i0 from '@angular/core';
|
|
5
5
|
import { signal, inject, isDevMode, Injectable, viewChild, computed, DestroyRef, effect, untracked, Component } from '@angular/core';
|
|
6
|
-
import { randomHash,
|
|
6
|
+
import { randomHash, createScrollLock } from '@seniorsistemas/angular-components/utils';
|
|
7
7
|
import { Router, NavigationStart } from '@angular/router';
|
|
8
8
|
import { filter } from 'rxjs';
|
|
9
9
|
|
|
@@ -142,6 +142,7 @@ class SideSheetComponent {
|
|
|
142
142
|
? '[@media(min-width:1024px)]:w-[400px] [@media(min-width:1366px)]:w-[max(400px,50vw)]'
|
|
143
143
|
: '[@media(min-width:1024px)]:w-[400px] [@media(min-width:1920px)]:w-[480px] [@media(min-width:2560px)]:w-[560px] [@media(min-width:3440px)]:w-[640px]');
|
|
144
144
|
_elementToRefocus = null;
|
|
145
|
+
_scrollLock = createScrollLock();
|
|
145
146
|
constructor() {
|
|
146
147
|
const destroyRef = inject(DestroyRef);
|
|
147
148
|
this.sideSheetService._registerInstance();
|
|
@@ -155,10 +156,10 @@ class SideSheetComponent {
|
|
|
155
156
|
effect(() => {
|
|
156
157
|
const shouldLockScroll = this.sideSheetService.visible() && this.isOverlayMode();
|
|
157
158
|
if (shouldLockScroll) {
|
|
158
|
-
|
|
159
|
+
this._scrollLock.lock();
|
|
159
160
|
}
|
|
160
161
|
else {
|
|
161
|
-
|
|
162
|
+
this._scrollLock.unlock();
|
|
162
163
|
}
|
|
163
164
|
});
|
|
164
165
|
effect(() => {
|
|
@@ -173,7 +174,7 @@ class SideSheetComponent {
|
|
|
173
174
|
this._elementToRefocus = null;
|
|
174
175
|
}
|
|
175
176
|
});
|
|
176
|
-
destroyRef.onDestroy(() =>
|
|
177
|
+
destroyRef.onDestroy(() => this._scrollLock.unlock());
|
|
177
178
|
}
|
|
178
179
|
closeSideSheet() {
|
|
179
180
|
this.sideSheetService.close();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"seniorsistemas-angular-components-side-sheet.mjs","sources":["../../projects/angular-components/side-sheet/src/lib/side-sheet/services/side-sheet.service.ts","../../projects/angular-components/side-sheet/src/lib/side-sheet/side-sheet.component.ts","../../projects/angular-components/side-sheet/src/lib/side-sheet/side-sheet.component.html","../../projects/angular-components/side-sheet/src/seniorsistemas-angular-components-side-sheet.ts"],"sourcesContent":["import { Injectable, TemplateRef, inject, isDevMode, signal } from '@angular/core';\nimport { NavigationStart, Router } from '@angular/router';\n\nimport { filter } from 'rxjs';\n\nimport { SideSheetConfig } from '../models/side-sheet-config';\nimport { SideSheetSize } from '../models/side-sheet-size';\n\n/**\n * @description Controla remotamente a única instância de `s-side-sheet` da aplicação —\n * declarada uma vez no shell do app (ex: em `app.component.html`, logo abaixo da topbar), sem\n * nenhum input — a partir de qualquer componente de rota.\n *\n * O componente que solicita a abertura declara seu próprio `<ng-template>` e passa o\n * `TemplateRef` correspondente; o `s-side-sheet` do shell projeta esse template internamente.\n * Fecha automaticamente a cada navegação de rota — tanto por UX (não deixar conteúdo de uma\n * página antiga empurrando uma página nova) quanto por segurança técnica (o `TemplateRef`\n * pertence a um componente que a navegação pode destruir).\n *\n * @example\n * ```typescript\n * private readonly sideSheetService = inject(SideSheetService);\n * private readonly panelBody = viewChild<TemplateRef<unknown>>('panelBody');\n *\n * protected selectOrder(order: Order): void {\n * this.sideSheetService.open({ header: order.number, template: this.panelBody()! });\n * }\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class SideSheetService {\n private readonly _header = signal('');\n private readonly _template = signal<TemplateRef<unknown> | null>(null);\n private readonly _context = signal<unknown>(undefined);\n private readonly _size = signal<SideSheetSize>('default');\n private _mountedInstanceCount = 0;\n\n /** @description Visibilidade do painel. Controlada internamente pelo `s-side-sheet`. */\n public readonly visible = signal(false);\n public readonly header = this._header.asReadonly();\n public readonly template = this._template.asReadonly();\n public readonly context = this._context.asReadonly();\n public readonly size = this._size.asReadonly();\n\n constructor() {\n const router = inject(Router, { optional: true });\n router?.events.pipe(filter((event) => event instanceof NavigationStart)).subscribe(() => this.close());\n }\n\n /** @description Abre (ou atualiza, se já aberto) o painel com o cabeçalho e o template informados. */\n public open<T>(config: SideSheetConfig<T>): void {\n if (this._mountedInstanceCount === 0 && isDevMode()) {\n console.warn(\n '[SideSheetService] open() foi chamado, mas nenhum <s-side-sheet> está montado ' +\n 'no shell do app. Declare um em app.component.html.',\n );\n }\n\n this._header.set(config.header);\n this._template.set(config.template as TemplateRef<unknown>);\n this._context.set(config.context);\n this._size.set(config.size ?? 'default');\n this.visible.set(true);\n }\n\n /** @description Fecha o painel e limpa o cabeçalho, template, contexto e tamanho armazenados. */\n public close(): void {\n this.visible.set(false);\n this._header.set('');\n this._template.set(null);\n this._context.set(undefined);\n this._size.set('default');\n }\n\n /** @internal Chamado por SideSheetComponent ao ser criado. */\n public _registerInstance(): void {\n if (this._mountedInstanceCount > 0 && isDevMode()) {\n throw new Error(\n '[SideSheetComponent] Já existe uma instância montada nesta aplicação. ' +\n 'Declare <s-side-sheet> uma única vez, no ponto mais alto da árvore ' +\n '(ex: app.component.html).',\n );\n }\n this._mountedInstanceCount++;\n }\n\n /** @internal Chamado por SideSheetComponent ao ser destruído. */\n public _unregisterInstance(): void {\n this._mountedInstanceCount = Math.max(0, this._mountedInstanceCount - 1);\n }\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport { animate, style, transition, trigger } from '@angular/animations';\nimport { CdkTrapFocus } from '@angular/cdk/a11y';\nimport { Component, DestroyRef, ElementRef, computed, effect, inject, signal, untracked, viewChild } from '@angular/core';\nimport { disableScroll, enableScroll, randomHash } from '@seniorsistemas/angular-components/utils';\n\nimport { SideSheetService } from './services/side-sheet.service';\n\n/** Mantida em sincronia com o breakpoint `[@media(min-width:1024px)]` usado no template e em `panelWidthClasses`. */\nconst OVERLAY_QUERY = '(min-width: 1024px)';\n\n/**\n * @description Painel que empurra o conteúdo adjacente para a esquerda, dividindo o espaço\n * horizontal com ele — sem escurecer a tela e sem sobrepor o conteúdo, no modo desktop\n * (>= 1024px). Abaixo de 1024px o painel passa a funcionar como um overlay em tela cheia,\n * com fundo escurecido, igual a um Drawer.\n *\n * Fecha somente pelo botão de fechar (X) do cabeçalho — não há fechamento por tecla Escape\n * ou clique fora, em nenhuma resolução. Essa é uma decisão de produto deliberada: o conteúdo\n * por trás do painel permanece interativo (filtros, dropdowns, autocomplete) e um atalho\n * global de Escape entraria em conflito com outros overlays já abertos sobre esse conteúdo.\n *\n * Sem inputs: é uma instância **única** por aplicação, declarada uma vez no shell do app (ex:\n * `app.component.html`, logo abaixo da topbar) e controlada remotamente por\n * `SideSheetService.open()`/`close()` a partir de qualquer componente de rota. Uma segunda\n * instância montada simultaneamente lança um erro em modo de desenvolvimento. O conteúdo\n * projetado dentro do `<s-side-sheet>` é o conteúdo principal da página (ex: o\n * `router-outlet`), empurrado pelo painel quando ele abre.\n *\n * @example\n * ```html\n * <!-- app.component.html -->\n * <s-side-sheet>\n * <router-outlet />\n * </s-side-sheet>\n * ```\n * ```typescript\n * // pedidos.component.ts\n * private readonly sideSheetService = inject(SideSheetService);\n * private readonly panelBody = viewChild<TemplateRef<unknown>>('panelBody');\n *\n * protected selecionarPedido(pedido: Pedido): void {\n * this.sideSheetService.open({ header: pedido.numero, template: this.panelBody()! });\n * }\n * ```\n *\n * @category Overlay\n */\n@Component({\n selector: 's-side-sheet',\n standalone: true,\n templateUrl: './side-sheet.component.html',\n host: {\n class: 'block h-full w-full flex-1 min-h-0',\n },\n imports: [CdkTrapFocus, NgTemplateOutlet],\n animations: [\n trigger('panelVisibility', [\n transition('void => push', [\n style({ width: 0 }),\n animate('300ms cubic-bezier(0.4, 0, 0.2, 1)', style({ width: '*' })),\n ]),\n transition('push => void', [\n style({ width: '*' }),\n animate('300ms cubic-bezier(0.4, 0, 0.2, 1)', style({ width: 0 })),\n ]),\n transition('void => overlay', [\n style({ transform: 'translateX(100%)' }),\n animate('300ms cubic-bezier(0.4, 0, 0.2, 1)', style({ transform: 'translateX(0)' })),\n ]),\n transition('overlay => void', [\n style({ transform: 'translateX(0)' }),\n animate('300ms cubic-bezier(0.4, 0, 0.2, 1)', style({ transform: 'translateX(100%)' })),\n ]),\n // Resize cruzando o breakpoint com o painel já aberto: não existe um tween visualmente\n // coerente entre width:400px/static (push) e width:100%/absolute (overlay) — aplica o\n // estado final imediatamente, sem transição residual.\n transition('push => overlay', []),\n transition('overlay => push', []),\n ]),\n trigger('backdropVisibility', [\n transition(':enter', [style({ opacity: 0 }), animate('300ms ease', style({ opacity: 1 }))]),\n transition(':leave', [style({ opacity: 1 }), animate('300ms ease', style({ opacity: 0 }))]),\n ]),\n ],\n})\nexport class SideSheetComponent {\n protected readonly sideSheetService = inject(SideSheetService);\n\n /** @description Id único usado para associar o título ao painel via `aria-labelledby`. */\n protected readonly titleId = randomHash('side-sheet-title');\n\n private readonly titleRef = viewChild<ElementRef<HTMLHeadingElement>>('titleRef');\n private readonly isDesktopViewport = signal(this._matchesDesktop());\n\n /** @description `true` quando o painel funciona como overlay em tela cheia (< 1024px). */\n protected readonly isOverlayMode = computed(() => !this.isDesktopViewport());\n protected readonly animationMode = computed<'push' | 'overlay'>(() =>\n this.isOverlayMode() ? 'overlay' : 'push',\n );\n\n /**\n * @description Largura do painel no modo push, por breakpoint. `half` só passa a ser\n * fluido a partir de 1366px — entre 1024–1365px herda os mesmos 400px do `default`\n * (conversão de \"Half\" para \"Default\" descrita na especificação de produto).\n */\n protected readonly panelWidthClasses = computed(() =>\n this.sideSheetService.size() === 'half'\n ? '[@media(min-width:1024px)]:w-[400px] [@media(min-width:1366px)]:w-[max(400px,50vw)]'\n : '[@media(min-width:1024px)]:w-[400px] [@media(min-width:1920px)]:w-[480px] [@media(min-width:2560px)]:w-[560px] [@media(min-width:3440px)]:w-[640px]',\n );\n\n private _elementToRefocus: HTMLElement | null = null;\n\n constructor() {\n const destroyRef = inject(DestroyRef);\n\n this.sideSheetService._registerInstance();\n destroyRef.onDestroy(() => this.sideSheetService._unregisterInstance());\n\n if (typeof window !== 'undefined' && typeof window.matchMedia === 'function') {\n const mediaQueryList = window.matchMedia(OVERLAY_QUERY);\n const listener = (event: MediaQueryListEvent): void => this.isDesktopViewport.set(event.matches);\n mediaQueryList.addEventListener('change', listener);\n destroyRef.onDestroy(() => mediaQueryList.removeEventListener('change', listener));\n }\n\n effect(() => {\n const shouldLockScroll = this.sideSheetService.visible() && this.isOverlayMode();\n if (shouldLockScroll) {\n disableScroll();\n } else {\n enableScroll();\n }\n });\n\n effect(() => {\n if (this.sideSheetService.visible()) {\n this._elementToRefocus = document.activeElement as HTMLElement | null;\n if (!untracked(this.isOverlayMode)) {\n queueMicrotask(() => this.titleRef()?.nativeElement.focus());\n }\n } else {\n this._elementToRefocus?.focus();\n this._elementToRefocus = null;\n }\n });\n\n destroyRef.onDestroy(() => enableScroll());\n }\n\n protected closeSideSheet(): void {\n this.sideSheetService.close();\n }\n\n private _matchesDesktop(): boolean {\n return typeof window !== 'undefined' && typeof window.matchMedia === 'function'\n ? window.matchMedia(OVERLAY_QUERY).matches\n : true;\n }\n}\n","<div class=\"side-sheet relative flex h-full w-full\">\n <div class=\"side-sheet__content min-w-0 flex-1 overflow-auto\">\n <ng-content></ng-content>\n </div>\n\n @if (sideSheetService.visible()) {\n @if (isOverlayMode()) {\n <div class=\"side-sheet__backdrop absolute inset-0 z-20 bg-[rgba(0,0,0,0.5)]\" @backdropVisibility></div>\n }\n\n <aside\n cdkTrapFocus\n [cdkTrapFocusAutoCapture]=\"isOverlayMode()\"\n [@panelVisibility]=\"animationMode()\"\n class=\"side-sheet__panel z-30 flex flex-col gap-4 border-l border-grayscale-20 bg-grayscale-0 p-4 shadow-[0px_2px_4px_rgba(0,0,0,0.2),0px_1px_10px_rgba(0,0,0,0.12),0px_4px_5px_rgba(0,0,0,0.14)] absolute inset-0 w-full [@media(min-width:1024px)]:static [@media(min-width:1024px)]:inset-auto\"\n [class]=\"panelWidthClasses()\"\n [class.side-sheet__panel--half]=\"sideSheetService.size() === 'half'\"\n [attr.role]=\"isOverlayMode() ? 'dialog' : 'complementary'\"\n [attr.aria-modal]=\"isOverlayMode() ? true : null\"\n [attr.aria-labelledby]=\"titleId\"\n >\n <div class=\"side-sheet__header flex flex-col gap-3\">\n <div class=\"flex items-center gap-4\">\n <h2\n #titleRef\n [id]=\"titleId\"\n tabindex=\"-1\"\n class=\"min-w-0 flex-1 break-words font-open-sans text-base font-normal uppercase text-grayscale-90 outline-none\"\n >\n {{ sideSheetService.header() }}\n </h2>\n <button\n type=\"button\"\n class=\"flex shrink-0 cursor-pointer items-center justify-center rounded-medium border-none bg-transparent p-2 outline-none focus-visible:ring-2 focus-visible:ring-primary\"\n aria-label=\"Fechar\"\n (click)=\"closeSideSheet()\"\n >\n <i class=\"fas fa-times text-xs\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <hr class=\"h-px w-full border-0 bg-grayscale-20\" />\n </div>\n\n <div class=\"side-sheet__body min-h-0 flex-1 overflow-auto\">\n <ng-container\n *ngTemplateOutlet=\"sideSheetService.template(); context: sideSheetService.context()\"\n ></ng-container>\n </div>\n </aside>\n }\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;;;AAQA;;;;;;;;;;;;;;;;;;;;AAoBG;MAEU,gBAAgB,CAAA;AACR,IAAA,OAAO,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC;AACrB,IAAA,SAAS,GAAG,MAAM,CAA8B,IAAI,CAAC,CAAC;AACtD,IAAA,QAAQ,GAAG,MAAM,CAAU,SAAS,CAAC,CAAC;AACtC,IAAA,KAAK,GAAG,MAAM,CAAgB,SAAS,CAAC,CAAC;IAClD,qBAAqB,GAAG,CAAC,CAAC;;AAGlB,IAAA,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;AACxB,IAAA,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;AACnC,IAAA,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC;AACvC,IAAA,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;AACrC,IAAA,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;AAE/C,IAAA,WAAA,GAAA;AACI,QAAA,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;AAClD,QAAA,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,KAAK,KAAK,YAAY,eAAe,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;KAC1G;;AAGM,IAAA,IAAI,CAAI,MAA0B,EAAA;QACrC,IAAI,IAAI,CAAC,qBAAqB,KAAK,CAAC,IAAI,SAAS,EAAE,EAAE;YACjD,OAAO,CAAC,IAAI,CACR,gFAAgF;AAC5E,gBAAA,oDAAoD,CAC3D,CAAC;SACL;QAED,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAChC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,QAAgC,CAAC,CAAC;QAC5D,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,SAAS,CAAC,CAAC;AACzC,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;KAC1B;;IAGM,KAAK,GAAA;AACR,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AACxB,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AACrB,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACzB,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AAC7B,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;KAC7B;;IAGM,iBAAiB,GAAA;QACpB,IAAI,IAAI,CAAC,qBAAqB,GAAG,CAAC,IAAI,SAAS,EAAE,EAAE;YAC/C,MAAM,IAAI,KAAK,CACX,wEAAwE;gBACpE,qEAAqE;AACrE,gBAAA,2BAA2B,CAClC,CAAC;SACL;QACD,IAAI,CAAC,qBAAqB,EAAE,CAAC;KAChC;;IAGM,mBAAmB,GAAA;AACtB,QAAA,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,qBAAqB,GAAG,CAAC,CAAC,CAAC;KAC5E;wGA3DQ,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAhB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,gBAAgB,cADH,MAAM,EAAA,CAAA,CAAA;;4FACnB,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAD5B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE,CAAA;;;ACrBlC;AACA,MAAM,aAAa,GAAG,qBAAqB,CAAC;AAE5C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCG;MAuCU,kBAAkB,CAAA;AACR,IAAA,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC;;AAG5C,IAAA,OAAO,GAAG,UAAU,CAAC,kBAAkB,CAAC,CAAC;AAE3C,IAAA,QAAQ,GAAG,SAAS,CAAiC,UAAU,CAAC,CAAC;IACjE,iBAAiB,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC;;AAGjD,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC;AAC1D,IAAA,aAAa,GAAG,QAAQ,CAAqB,MAC5D,IAAI,CAAC,aAAa,EAAE,GAAG,SAAS,GAAG,MAAM,CAC5C,CAAC;AAEF;;;;AAIG;AACgB,IAAA,iBAAiB,GAAG,QAAQ,CAAC,MAC5C,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,KAAK,MAAM;AACnC,UAAE,qFAAqF;UACrF,qJAAqJ,CAC9J,CAAC;IAEM,iBAAiB,GAAuB,IAAI,CAAC;AAErD,IAAA,WAAA,GAAA;AACI,QAAA,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;AAEtC,QAAA,IAAI,CAAC,gBAAgB,CAAC,iBAAiB,EAAE,CAAC;AAC1C,QAAA,UAAU,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,gBAAgB,CAAC,mBAAmB,EAAE,CAAC,CAAC;AAExE,QAAA,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,OAAO,MAAM,CAAC,UAAU,KAAK,UAAU,EAAE;YAC1E,MAAM,cAAc,GAAG,MAAM,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AACxD,YAAA,MAAM,QAAQ,GAAG,CAAC,KAA0B,KAAW,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AACjG,YAAA,cAAc,CAAC,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AACpD,YAAA,UAAU,CAAC,SAAS,CAAC,MAAM,cAAc,CAAC,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;SACtF;QAED,MAAM,CAAC,MAAK;AACR,YAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACjF,IAAI,gBAAgB,EAAE;AAClB,gBAAA,aAAa,EAAE,CAAC;aACnB;iBAAM;AACH,gBAAA,YAAY,EAAE,CAAC;aAClB;AACL,SAAC,CAAC,CAAC;QAEH,MAAM,CAAC,MAAK;AACR,YAAA,IAAI,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,EAAE;AACjC,gBAAA,IAAI,CAAC,iBAAiB,GAAG,QAAQ,CAAC,aAAmC,CAAC;gBACtE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE;AAChC,oBAAA,cAAc,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,EAAE,aAAa,CAAC,KAAK,EAAE,CAAC,CAAC;iBAChE;aACJ;iBAAM;AACH,gBAAA,IAAI,CAAC,iBAAiB,EAAE,KAAK,EAAE,CAAC;AAChC,gBAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;aACjC;AACL,SAAC,CAAC,CAAC;QAEH,UAAU,CAAC,SAAS,CAAC,MAAM,YAAY,EAAE,CAAC,CAAC;KAC9C;IAES,cAAc,GAAA;AACpB,QAAA,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC;KACjC;IAEO,eAAe,GAAA;QACnB,OAAO,OAAO,MAAM,KAAK,WAAW,IAAI,OAAO,MAAM,CAAC,UAAU,KAAK,UAAU;cACzE,MAAM,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,OAAO;cACxC,IAAI,CAAC;KACd;wGAzEQ,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAlB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,kBAAkB,8PCtF/B,kjFAmDA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDIc,YAAY,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,cAAA,EAAA,yBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,gBAAgB,EAC5B,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA;YACR,OAAO,CAAC,iBAAiB,EAAE;gBACvB,UAAU,CAAC,cAAc,EAAE;AACvB,oBAAA,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;oBACnB,OAAO,CAAC,oCAAoC,EAAE,KAAK,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;iBACvE,CAAC;gBACF,UAAU,CAAC,cAAc,EAAE;AACvB,oBAAA,KAAK,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;oBACrB,OAAO,CAAC,oCAAoC,EAAE,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;iBACrE,CAAC;gBACF,UAAU,CAAC,iBAAiB,EAAE;AAC1B,oBAAA,KAAK,CAAC,EAAE,SAAS,EAAE,kBAAkB,EAAE,CAAC;oBACxC,OAAO,CAAC,oCAAoC,EAAE,KAAK,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC,CAAC;iBACvF,CAAC;gBACF,UAAU,CAAC,iBAAiB,EAAE;AAC1B,oBAAA,KAAK,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC;oBACrC,OAAO,CAAC,oCAAoC,EAAE,KAAK,CAAC,EAAE,SAAS,EAAE,kBAAkB,EAAE,CAAC,CAAC;iBAC1F,CAAC;;;;AAIF,gBAAA,UAAU,CAAC,iBAAiB,EAAE,EAAE,CAAC;AACjC,gBAAA,UAAU,CAAC,iBAAiB,EAAE,EAAE,CAAC;aACpC,CAAC;YACF,OAAO,CAAC,oBAAoB,EAAE;gBAC1B,UAAU,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,YAAY,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC3F,UAAU,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,YAAY,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;aAC9F,CAAC;AACL,SAAA,EAAA,CAAA,CAAA;;4FAEQ,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAtC9B,SAAS;+BACI,cAAc,EAAA,UAAA,EACZ,IAAI,EAEV,IAAA,EAAA;AACF,wBAAA,KAAK,EAAE,oCAAoC;AAC9C,qBAAA,EAAA,OAAA,EACQ,CAAC,YAAY,EAAE,gBAAgB,CAAC,EAC7B,UAAA,EAAA;wBACR,OAAO,CAAC,iBAAiB,EAAE;4BACvB,UAAU,CAAC,cAAc,EAAE;AACvB,gCAAA,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;gCACnB,OAAO,CAAC,oCAAoC,EAAE,KAAK,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;6BACvE,CAAC;4BACF,UAAU,CAAC,cAAc,EAAE;AACvB,gCAAA,KAAK,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;gCACrB,OAAO,CAAC,oCAAoC,EAAE,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;6BACrE,CAAC;4BACF,UAAU,CAAC,iBAAiB,EAAE;AAC1B,gCAAA,KAAK,CAAC,EAAE,SAAS,EAAE,kBAAkB,EAAE,CAAC;gCACxC,OAAO,CAAC,oCAAoC,EAAE,KAAK,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC,CAAC;6BACvF,CAAC;4BACF,UAAU,CAAC,iBAAiB,EAAE;AAC1B,gCAAA,KAAK,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC;gCACrC,OAAO,CAAC,oCAAoC,EAAE,KAAK,CAAC,EAAE,SAAS,EAAE,kBAAkB,EAAE,CAAC,CAAC;6BAC1F,CAAC;;;;AAIF,4BAAA,UAAU,CAAC,iBAAiB,EAAE,EAAE,CAAC;AACjC,4BAAA,UAAU,CAAC,iBAAiB,EAAE,EAAE,CAAC;yBACpC,CAAC;wBACF,OAAO,CAAC,oBAAoB,EAAE;4BAC1B,UAAU,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,YAAY,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;4BAC3F,UAAU,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,YAAY,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;yBAC9F,CAAC;AACL,qBAAA,EAAA,QAAA,EAAA,kjFAAA,EAAA,CAAA;;;AEpFL;;AAEG;;;;"}
|
|
1
|
+
{"version":3,"file":"seniorsistemas-angular-components-side-sheet.mjs","sources":["../../projects/angular-components/side-sheet/src/lib/side-sheet/services/side-sheet.service.ts","../../projects/angular-components/side-sheet/src/lib/side-sheet/side-sheet.component.ts","../../projects/angular-components/side-sheet/src/lib/side-sheet/side-sheet.component.html","../../projects/angular-components/side-sheet/src/seniorsistemas-angular-components-side-sheet.ts"],"sourcesContent":["import { Injectable, TemplateRef, inject, isDevMode, signal } from '@angular/core';\nimport { NavigationStart, Router } from '@angular/router';\n\nimport { filter } from 'rxjs';\n\nimport { SideSheetConfig } from '../models/side-sheet-config';\nimport { SideSheetSize } from '../models/side-sheet-size';\n\n/**\n * @description Controla remotamente a única instância de `s-side-sheet` da aplicação —\n * declarada uma vez no shell do app (ex: em `app.component.html`, logo abaixo da topbar), sem\n * nenhum input — a partir de qualquer componente de rota.\n *\n * O componente que solicita a abertura declara seu próprio `<ng-template>` e passa o\n * `TemplateRef` correspondente; o `s-side-sheet` do shell projeta esse template internamente.\n * Fecha automaticamente a cada navegação de rota — tanto por UX (não deixar conteúdo de uma\n * página antiga empurrando uma página nova) quanto por segurança técnica (o `TemplateRef`\n * pertence a um componente que a navegação pode destruir).\n *\n * @example\n * ```typescript\n * private readonly sideSheetService = inject(SideSheetService);\n * private readonly panelBody = viewChild<TemplateRef<unknown>>('panelBody');\n *\n * protected selectOrder(order: Order): void {\n * this.sideSheetService.open({ header: order.number, template: this.panelBody()! });\n * }\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class SideSheetService {\n private readonly _header = signal('');\n private readonly _template = signal<TemplateRef<unknown> | null>(null);\n private readonly _context = signal<unknown>(undefined);\n private readonly _size = signal<SideSheetSize>('default');\n private _mountedInstanceCount = 0;\n\n /** @description Visibilidade do painel. Controlada internamente pelo `s-side-sheet`. */\n public readonly visible = signal(false);\n public readonly header = this._header.asReadonly();\n public readonly template = this._template.asReadonly();\n public readonly context = this._context.asReadonly();\n public readonly size = this._size.asReadonly();\n\n constructor() {\n const router = inject(Router, { optional: true });\n router?.events.pipe(filter((event) => event instanceof NavigationStart)).subscribe(() => this.close());\n }\n\n /** @description Abre (ou atualiza, se já aberto) o painel com o cabeçalho e o template informados. */\n public open<T>(config: SideSheetConfig<T>): void {\n if (this._mountedInstanceCount === 0 && isDevMode()) {\n console.warn(\n '[SideSheetService] open() foi chamado, mas nenhum <s-side-sheet> está montado ' +\n 'no shell do app. Declare um em app.component.html.',\n );\n }\n\n this._header.set(config.header);\n this._template.set(config.template as TemplateRef<unknown>);\n this._context.set(config.context);\n this._size.set(config.size ?? 'default');\n this.visible.set(true);\n }\n\n /** @description Fecha o painel e limpa o cabeçalho, template, contexto e tamanho armazenados. */\n public close(): void {\n this.visible.set(false);\n this._header.set('');\n this._template.set(null);\n this._context.set(undefined);\n this._size.set('default');\n }\n\n /** @internal Chamado por SideSheetComponent ao ser criado. */\n public _registerInstance(): void {\n if (this._mountedInstanceCount > 0 && isDevMode()) {\n throw new Error(\n '[SideSheetComponent] Já existe uma instância montada nesta aplicação. ' +\n 'Declare <s-side-sheet> uma única vez, no ponto mais alto da árvore ' +\n '(ex: app.component.html).',\n );\n }\n this._mountedInstanceCount++;\n }\n\n /** @internal Chamado por SideSheetComponent ao ser destruído. */\n public _unregisterInstance(): void {\n this._mountedInstanceCount = Math.max(0, this._mountedInstanceCount - 1);\n }\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport { animate, style, transition, trigger } from '@angular/animations';\nimport { CdkTrapFocus } from '@angular/cdk/a11y';\nimport { Component, DestroyRef, ElementRef, computed, effect, inject, signal, untracked, viewChild } from '@angular/core';\nimport { createScrollLock, randomHash } from '@seniorsistemas/angular-components/utils';\n\nimport { SideSheetService } from './services/side-sheet.service';\n\n/** Mantida em sincronia com o breakpoint `[@media(min-width:1024px)]` usado no template e em `panelWidthClasses`. */\nconst OVERLAY_QUERY = '(min-width: 1024px)';\n\n/**\n * @description Painel que empurra o conteúdo adjacente para a esquerda, dividindo o espaço\n * horizontal com ele — sem escurecer a tela e sem sobrepor o conteúdo, no modo desktop\n * (>= 1024px). Abaixo de 1024px o painel passa a funcionar como um overlay em tela cheia,\n * com fundo escurecido, igual a um Drawer.\n *\n * Fecha somente pelo botão de fechar (X) do cabeçalho — não há fechamento por tecla Escape\n * ou clique fora, em nenhuma resolução. Essa é uma decisão de produto deliberada: o conteúdo\n * por trás do painel permanece interativo (filtros, dropdowns, autocomplete) e um atalho\n * global de Escape entraria em conflito com outros overlays já abertos sobre esse conteúdo.\n *\n * Sem inputs: é uma instância **única** por aplicação, declarada uma vez no shell do app (ex:\n * `app.component.html`, logo abaixo da topbar) e controlada remotamente por\n * `SideSheetService.open()`/`close()` a partir de qualquer componente de rota. Uma segunda\n * instância montada simultaneamente lança um erro em modo de desenvolvimento. O conteúdo\n * projetado dentro do `<s-side-sheet>` é o conteúdo principal da página (ex: o\n * `router-outlet`), empurrado pelo painel quando ele abre.\n *\n * @example\n * ```html\n * <!-- app.component.html -->\n * <s-side-sheet>\n * <router-outlet />\n * </s-side-sheet>\n * ```\n * ```typescript\n * // pedidos.component.ts\n * private readonly sideSheetService = inject(SideSheetService);\n * private readonly panelBody = viewChild<TemplateRef<unknown>>('panelBody');\n *\n * protected selecionarPedido(pedido: Pedido): void {\n * this.sideSheetService.open({ header: pedido.numero, template: this.panelBody()! });\n * }\n * ```\n *\n * @category Overlay\n */\n@Component({\n selector: 's-side-sheet',\n standalone: true,\n templateUrl: './side-sheet.component.html',\n host: {\n class: 'block h-full w-full flex-1 min-h-0',\n },\n imports: [CdkTrapFocus, NgTemplateOutlet],\n animations: [\n trigger('panelVisibility', [\n transition('void => push', [\n style({ width: 0 }),\n animate('300ms cubic-bezier(0.4, 0, 0.2, 1)', style({ width: '*' })),\n ]),\n transition('push => void', [\n style({ width: '*' }),\n animate('300ms cubic-bezier(0.4, 0, 0.2, 1)', style({ width: 0 })),\n ]),\n transition('void => overlay', [\n style({ transform: 'translateX(100%)' }),\n animate('300ms cubic-bezier(0.4, 0, 0.2, 1)', style({ transform: 'translateX(0)' })),\n ]),\n transition('overlay => void', [\n style({ transform: 'translateX(0)' }),\n animate('300ms cubic-bezier(0.4, 0, 0.2, 1)', style({ transform: 'translateX(100%)' })),\n ]),\n // Resize cruzando o breakpoint com o painel já aberto: não existe um tween visualmente\n // coerente entre width:400px/static (push) e width:100%/absolute (overlay) — aplica o\n // estado final imediatamente, sem transição residual.\n transition('push => overlay', []),\n transition('overlay => push', []),\n ]),\n trigger('backdropVisibility', [\n transition(':enter', [style({ opacity: 0 }), animate('300ms ease', style({ opacity: 1 }))]),\n transition(':leave', [style({ opacity: 1 }), animate('300ms ease', style({ opacity: 0 }))]),\n ]),\n ],\n})\nexport class SideSheetComponent {\n protected readonly sideSheetService = inject(SideSheetService);\n\n /** @description Id único usado para associar o título ao painel via `aria-labelledby`. */\n protected readonly titleId = randomHash('side-sheet-title');\n\n private readonly titleRef = viewChild<ElementRef<HTMLHeadingElement>>('titleRef');\n private readonly isDesktopViewport = signal(this._matchesDesktop());\n\n /** @description `true` quando o painel funciona como overlay em tela cheia (< 1024px). */\n protected readonly isOverlayMode = computed(() => !this.isDesktopViewport());\n protected readonly animationMode = computed<'push' | 'overlay'>(() =>\n this.isOverlayMode() ? 'overlay' : 'push',\n );\n\n /**\n * @description Largura do painel no modo push, por breakpoint. `half` só passa a ser\n * fluido a partir de 1366px — entre 1024–1365px herda os mesmos 400px do `default`\n * (conversão de \"Half\" para \"Default\" descrita na especificação de produto).\n */\n protected readonly panelWidthClasses = computed(() =>\n this.sideSheetService.size() === 'half'\n ? '[@media(min-width:1024px)]:w-[400px] [@media(min-width:1366px)]:w-[max(400px,50vw)]'\n : '[@media(min-width:1024px)]:w-[400px] [@media(min-width:1920px)]:w-[480px] [@media(min-width:2560px)]:w-[560px] [@media(min-width:3440px)]:w-[640px]',\n );\n\n private _elementToRefocus: HTMLElement | null = null;\n private readonly _scrollLock = createScrollLock();\n\n constructor() {\n const destroyRef = inject(DestroyRef);\n\n this.sideSheetService._registerInstance();\n destroyRef.onDestroy(() => this.sideSheetService._unregisterInstance());\n\n if (typeof window !== 'undefined' && typeof window.matchMedia === 'function') {\n const mediaQueryList = window.matchMedia(OVERLAY_QUERY);\n const listener = (event: MediaQueryListEvent): void => this.isDesktopViewport.set(event.matches);\n mediaQueryList.addEventListener('change', listener);\n destroyRef.onDestroy(() => mediaQueryList.removeEventListener('change', listener));\n }\n\n effect(() => {\n const shouldLockScroll = this.sideSheetService.visible() && this.isOverlayMode();\n if (shouldLockScroll) {\n this._scrollLock.lock();\n } else {\n this._scrollLock.unlock();\n }\n });\n\n effect(() => {\n if (this.sideSheetService.visible()) {\n this._elementToRefocus = document.activeElement as HTMLElement | null;\n if (!untracked(this.isOverlayMode)) {\n queueMicrotask(() => this.titleRef()?.nativeElement.focus());\n }\n } else {\n this._elementToRefocus?.focus();\n this._elementToRefocus = null;\n }\n });\n\n destroyRef.onDestroy(() => this._scrollLock.unlock());\n }\n\n protected closeSideSheet(): void {\n this.sideSheetService.close();\n }\n\n private _matchesDesktop(): boolean {\n return typeof window !== 'undefined' && typeof window.matchMedia === 'function'\n ? window.matchMedia(OVERLAY_QUERY).matches\n : true;\n }\n}\n","<div class=\"side-sheet relative flex h-full w-full\">\n <div class=\"side-sheet__content min-w-0 flex-1 overflow-auto\">\n <ng-content></ng-content>\n </div>\n\n @if (sideSheetService.visible()) {\n @if (isOverlayMode()) {\n <div class=\"side-sheet__backdrop absolute inset-0 z-20 bg-[rgba(0,0,0,0.5)]\" @backdropVisibility></div>\n }\n\n <aside\n cdkTrapFocus\n [cdkTrapFocusAutoCapture]=\"isOverlayMode()\"\n [@panelVisibility]=\"animationMode()\"\n class=\"side-sheet__panel z-30 flex flex-col gap-4 border-l border-grayscale-20 bg-grayscale-0 p-4 shadow-[0px_2px_4px_rgba(0,0,0,0.2),0px_1px_10px_rgba(0,0,0,0.12),0px_4px_5px_rgba(0,0,0,0.14)] absolute inset-0 w-full [@media(min-width:1024px)]:static [@media(min-width:1024px)]:inset-auto\"\n [class]=\"panelWidthClasses()\"\n [class.side-sheet__panel--half]=\"sideSheetService.size() === 'half'\"\n [attr.role]=\"isOverlayMode() ? 'dialog' : 'complementary'\"\n [attr.aria-modal]=\"isOverlayMode() ? true : null\"\n [attr.aria-labelledby]=\"titleId\"\n >\n <div class=\"side-sheet__header flex flex-col gap-3\">\n <div class=\"flex items-center gap-4\">\n <h2\n #titleRef\n [id]=\"titleId\"\n tabindex=\"-1\"\n class=\"min-w-0 flex-1 break-words font-open-sans text-base font-normal uppercase text-grayscale-90 outline-none\"\n >\n {{ sideSheetService.header() }}\n </h2>\n <button\n type=\"button\"\n class=\"flex shrink-0 cursor-pointer items-center justify-center rounded-medium border-none bg-transparent p-2 outline-none focus-visible:ring-2 focus-visible:ring-primary\"\n aria-label=\"Fechar\"\n (click)=\"closeSideSheet()\"\n >\n <i class=\"fas fa-times text-xs\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <hr class=\"h-px w-full border-0 bg-grayscale-20\" />\n </div>\n\n <div class=\"side-sheet__body min-h-0 flex-1 overflow-auto\">\n <ng-container\n *ngTemplateOutlet=\"sideSheetService.template(); context: sideSheetService.context()\"\n ></ng-container>\n </div>\n </aside>\n }\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
@@ -614,7 +614,7 @@ class SliderComponent {
|
|
|
614
614
|
useExisting: forwardRef(() => SliderComponent),
|
|
615
615
|
multi: true,
|
|
616
616
|
},
|
|
617
|
-
], viewQueries: [{ propertyName: "track", first: true, predicate: ["track"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div\r\n class=\"slider-container\"\r\n [ngClass]=\"{ 'slider-container--disabled': disabled }\"\r\n [tabindex]=\"tabindex\"\r\n (click)=\"onTrackClick($event)\"\r\n (focus)=\"onFocusIn()\"\r\n (blur)=\"onBlur()\"\r\n>\r\n <div\r\n #track\r\n class=\"slider-track\"\r\n [ngClass]=\"{\r\n 'slider-track--hidden-thumb': hiddenThumb,\r\n 'slider-track--moving-multiple-thumbs': movingProgressBar,\r\n }\"\r\n >\r\n <div\r\n class=\"slider-progress\"\r\n (mousedown)=\"onProgressMouseDown($event)\"\r\n [style.left.%]=\"progressLeft\"\r\n [style.width]=\"progressWidth\"\r\n ></div>\r\n @if (multiple) {\r\n <div\r\n class=\"slider-thumb\"\r\n [sTooltip]=\"tooltipStartText\"\r\n [showDelay]=\"0\"\r\n (mousedown)=\"onMouseDown($event, 'start')\"\r\n [style.left.%]=\"startValue\"\r\n ></div>\r\n }\r\n <div\r\n [sTooltip]=\"tooltipEndText\"\r\n class=\"slider-thumb\"\r\n [showDelay]=\"0\"\r\n (mousedown)=\"onMouseDown($event, 'end')\"\r\n [style.left.%]=\"endValue\"\r\n ></div>\r\n </div>\r\n <div class=\"footer\">\r\n <span>{{ minValueLabel || min }}</span>\r\n <span>{{ maxValueLabel || max }}</span>\r\n </div>\r\n</div>\r\n", styles: [".slider-container{height:20px;padding:16px 0 40px;position:relative;-webkit-user-select:none;user-select:none;width:100%}.slider-container .slider-track{background-color:#ddd;border-radius:3px;cursor:pointer;height:6px;position:relative;width:100%}.slider-container .slider-track .slider-progress{background-color:#428bca;border-radius:3px;cursor:pointer;height:100%;left:0;position:absolute;top:0;width:0}.slider-container .slider-track .slider-thumb{background-color:#fff;border:2px solid #428bca;border-radius:50%;cursor:pointer;height:20px;position:absolute;transform:translateY(-50%);top:50%;width:20px}.slider-container .slider-track .slider-thumb:active{box-shadow:0 0 0 4px #428bca33}.slider-container .slider-track--hidden-thumb:not(:hover) .slider-thumb{opacity:0}.slider-container .slider-track--moving-multiple-thumbs .slider-thumb{box-shadow:0 0 0 4px #428bca33}.slider-container .footer{color:#212533;display:flex;font-family:Open Sans,sans-serif;font-size:14px;justify-content:space-between;margin-top:8px}.slider-container--disabled .slider-track{cursor:default}.slider-container--disabled .slider-track .slider-thumb{border-color:#a5a5b2;cursor:default}.slider-container--disabled .slider-track .slider-thumb:active{box-shadow:none}.slider-container--disabled .slider-track .slider-progress{background-color:#a5a5b2;cursor:default}.slider-container:focus-visible{outline:none}.slider-container:focus-visible .slider-thumb{box-shadow:0 0 0 4px #428bca33}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: TooltipDirective, selector: "[sTooltip]", inputs: ["sTooltip", "tooltipPosition", "showDelay", "displayTime", "tooltipEvent", "escape", "visible", "mobileBehavior", "focusedInputRef", "checkTruncatedText"] }] });
|
|
617
|
+
], viewQueries: [{ propertyName: "track", first: true, predicate: ["track"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div\r\n class=\"slider-container\"\r\n [ngClass]=\"{ 'slider-container--disabled': disabled }\"\r\n [tabindex]=\"disabled ? '-1' : tabindex\"\r\n (click)=\"onTrackClick($event)\"\r\n (focus)=\"onFocusIn()\"\r\n (blur)=\"onBlur()\"\r\n>\r\n <div\r\n #track\r\n class=\"slider-track\"\r\n [ngClass]=\"{\r\n 'slider-track--hidden-thumb': hiddenThumb,\r\n 'slider-track--moving-multiple-thumbs': movingProgressBar,\r\n }\"\r\n >\r\n <div\r\n class=\"slider-progress\"\r\n (mousedown)=\"onProgressMouseDown($event)\"\r\n [style.left.%]=\"progressLeft\"\r\n [style.width]=\"progressWidth\"\r\n ></div>\r\n @if (multiple) {\r\n <div\r\n class=\"slider-thumb\"\r\n [sTooltip]=\"tooltipStartText\"\r\n [showDelay]=\"0\"\r\n (mousedown)=\"onMouseDown($event, 'start')\"\r\n [style.left.%]=\"startValue\"\r\n ></div>\r\n }\r\n <div\r\n [sTooltip]=\"tooltipEndText\"\r\n class=\"slider-thumb\"\r\n [showDelay]=\"0\"\r\n (mousedown)=\"onMouseDown($event, 'end')\"\r\n [style.left.%]=\"endValue\"\r\n ></div>\r\n </div>\r\n <div class=\"footer\">\r\n <span>{{ minValueLabel || min }}</span>\r\n <span>{{ maxValueLabel || max }}</span>\r\n </div>\r\n</div>\r\n", styles: [".slider-container{height:20px;padding:16px 0 40px;position:relative;-webkit-user-select:none;user-select:none;width:100%}.slider-container .slider-track{background-color:#ddd;border-radius:3px;cursor:pointer;height:6px;position:relative;width:100%}.slider-container .slider-track .slider-progress{background-color:#428bca;border-radius:3px;cursor:pointer;height:100%;left:0;position:absolute;top:0;width:0}.slider-container .slider-track .slider-thumb{background-color:#fff;border:2px solid #428bca;border-radius:50%;cursor:pointer;height:20px;position:absolute;transform:translateY(-50%);top:50%;width:20px}.slider-container .slider-track .slider-thumb:active{box-shadow:0 0 0 4px #428bca33}.slider-container .slider-track--hidden-thumb:not(:hover) .slider-thumb{opacity:0}.slider-container .slider-track--moving-multiple-thumbs .slider-thumb{box-shadow:0 0 0 4px #428bca33}.slider-container .footer{color:#212533;display:flex;font-family:Open Sans,sans-serif;font-size:14px;justify-content:space-between;margin-top:8px}.slider-container--disabled .slider-track{cursor:default}.slider-container--disabled .slider-track .slider-thumb{border-color:#a5a5b2;cursor:default}.slider-container--disabled .slider-track .slider-thumb:active{box-shadow:none}.slider-container--disabled .slider-track .slider-progress{background-color:#a5a5b2;cursor:default}.slider-container:focus-visible{outline:none}.slider-container:focus-visible .slider-thumb{box-shadow:0 0 0 4px #428bca33}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: TooltipDirective, selector: "[sTooltip]", inputs: ["sTooltip", "tooltipPosition", "showDelay", "displayTime", "tooltipEvent", "escape", "visible", "mobileBehavior", "focusedInputRef", "checkTruncatedText"] }] });
|
|
618
618
|
}
|
|
619
619
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SliderComponent, decorators: [{
|
|
620
620
|
type: Component,
|
|
@@ -624,7 +624,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
624
624
|
useExisting: forwardRef(() => SliderComponent),
|
|
625
625
|
multi: true,
|
|
626
626
|
},
|
|
627
|
-
], standalone: true, imports: [NgClass, TooltipDirective], template: "<div\r\n class=\"slider-container\"\r\n [ngClass]=\"{ 'slider-container--disabled': disabled }\"\r\n [tabindex]=\"tabindex\"\r\n (click)=\"onTrackClick($event)\"\r\n (focus)=\"onFocusIn()\"\r\n (blur)=\"onBlur()\"\r\n>\r\n <div\r\n #track\r\n class=\"slider-track\"\r\n [ngClass]=\"{\r\n 'slider-track--hidden-thumb': hiddenThumb,\r\n 'slider-track--moving-multiple-thumbs': movingProgressBar,\r\n }\"\r\n >\r\n <div\r\n class=\"slider-progress\"\r\n (mousedown)=\"onProgressMouseDown($event)\"\r\n [style.left.%]=\"progressLeft\"\r\n [style.width]=\"progressWidth\"\r\n ></div>\r\n @if (multiple) {\r\n <div\r\n class=\"slider-thumb\"\r\n [sTooltip]=\"tooltipStartText\"\r\n [showDelay]=\"0\"\r\n (mousedown)=\"onMouseDown($event, 'start')\"\r\n [style.left.%]=\"startValue\"\r\n ></div>\r\n }\r\n <div\r\n [sTooltip]=\"tooltipEndText\"\r\n class=\"slider-thumb\"\r\n [showDelay]=\"0\"\r\n (mousedown)=\"onMouseDown($event, 'end')\"\r\n [style.left.%]=\"endValue\"\r\n ></div>\r\n </div>\r\n <div class=\"footer\">\r\n <span>{{ minValueLabel || min }}</span>\r\n <span>{{ maxValueLabel || max }}</span>\r\n </div>\r\n</div>\r\n", styles: [".slider-container{height:20px;padding:16px 0 40px;position:relative;-webkit-user-select:none;user-select:none;width:100%}.slider-container .slider-track{background-color:#ddd;border-radius:3px;cursor:pointer;height:6px;position:relative;width:100%}.slider-container .slider-track .slider-progress{background-color:#428bca;border-radius:3px;cursor:pointer;height:100%;left:0;position:absolute;top:0;width:0}.slider-container .slider-track .slider-thumb{background-color:#fff;border:2px solid #428bca;border-radius:50%;cursor:pointer;height:20px;position:absolute;transform:translateY(-50%);top:50%;width:20px}.slider-container .slider-track .slider-thumb:active{box-shadow:0 0 0 4px #428bca33}.slider-container .slider-track--hidden-thumb:not(:hover) .slider-thumb{opacity:0}.slider-container .slider-track--moving-multiple-thumbs .slider-thumb{box-shadow:0 0 0 4px #428bca33}.slider-container .footer{color:#212533;display:flex;font-family:Open Sans,sans-serif;font-size:14px;justify-content:space-between;margin-top:8px}.slider-container--disabled .slider-track{cursor:default}.slider-container--disabled .slider-track .slider-thumb{border-color:#a5a5b2;cursor:default}.slider-container--disabled .slider-track .slider-thumb:active{box-shadow:none}.slider-container--disabled .slider-track .slider-progress{background-color:#a5a5b2;cursor:default}.slider-container:focus-visible{outline:none}.slider-container:focus-visible .slider-thumb{box-shadow:0 0 0 4px #428bca33}\n"] }]
|
|
627
|
+
], standalone: true, imports: [NgClass, TooltipDirective], template: "<div\r\n class=\"slider-container\"\r\n [ngClass]=\"{ 'slider-container--disabled': disabled }\"\r\n [tabindex]=\"disabled ? '-1' : tabindex\"\r\n (click)=\"onTrackClick($event)\"\r\n (focus)=\"onFocusIn()\"\r\n (blur)=\"onBlur()\"\r\n>\r\n <div\r\n #track\r\n class=\"slider-track\"\r\n [ngClass]=\"{\r\n 'slider-track--hidden-thumb': hiddenThumb,\r\n 'slider-track--moving-multiple-thumbs': movingProgressBar,\r\n }\"\r\n >\r\n <div\r\n class=\"slider-progress\"\r\n (mousedown)=\"onProgressMouseDown($event)\"\r\n [style.left.%]=\"progressLeft\"\r\n [style.width]=\"progressWidth\"\r\n ></div>\r\n @if (multiple) {\r\n <div\r\n class=\"slider-thumb\"\r\n [sTooltip]=\"tooltipStartText\"\r\n [showDelay]=\"0\"\r\n (mousedown)=\"onMouseDown($event, 'start')\"\r\n [style.left.%]=\"startValue\"\r\n ></div>\r\n }\r\n <div\r\n [sTooltip]=\"tooltipEndText\"\r\n class=\"slider-thumb\"\r\n [showDelay]=\"0\"\r\n (mousedown)=\"onMouseDown($event, 'end')\"\r\n [style.left.%]=\"endValue\"\r\n ></div>\r\n </div>\r\n <div class=\"footer\">\r\n <span>{{ minValueLabel || min }}</span>\r\n <span>{{ maxValueLabel || max }}</span>\r\n </div>\r\n</div>\r\n", styles: [".slider-container{height:20px;padding:16px 0 40px;position:relative;-webkit-user-select:none;user-select:none;width:100%}.slider-container .slider-track{background-color:#ddd;border-radius:3px;cursor:pointer;height:6px;position:relative;width:100%}.slider-container .slider-track .slider-progress{background-color:#428bca;border-radius:3px;cursor:pointer;height:100%;left:0;position:absolute;top:0;width:0}.slider-container .slider-track .slider-thumb{background-color:#fff;border:2px solid #428bca;border-radius:50%;cursor:pointer;height:20px;position:absolute;transform:translateY(-50%);top:50%;width:20px}.slider-container .slider-track .slider-thumb:active{box-shadow:0 0 0 4px #428bca33}.slider-container .slider-track--hidden-thumb:not(:hover) .slider-thumb{opacity:0}.slider-container .slider-track--moving-multiple-thumbs .slider-thumb{box-shadow:0 0 0 4px #428bca33}.slider-container .footer{color:#212533;display:flex;font-family:Open Sans,sans-serif;font-size:14px;justify-content:space-between;margin-top:8px}.slider-container--disabled .slider-track{cursor:default}.slider-container--disabled .slider-track .slider-thumb{border-color:#a5a5b2;cursor:default}.slider-container--disabled .slider-track .slider-thumb:active{box-shadow:none}.slider-container--disabled .slider-track .slider-progress{background-color:#a5a5b2;cursor:default}.slider-container:focus-visible{outline:none}.slider-container:focus-visible .slider-thumb{box-shadow:0 0 0 4px #428bca33}\n"] }]
|
|
628
628
|
}], propDecorators: { track: [{
|
|
629
629
|
type: ViewChild,
|
|
630
630
|
args: ['track']
|